1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include "odm_precomp.h"
17
18static const u16 dB_Invert_Table[8][12] = {
19 {1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4},
20 {4, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16},
21 {18, 20, 22, 25, 28, 32, 35, 40, 45, 50, 56, 63},
22 {71, 79, 89, 100, 112, 126, 141, 158, 178, 200, 224, 251},
23 {282, 316, 355, 398, 447, 501, 562, 631, 708, 794, 891, 1000},
24 {1122, 1259, 1413, 1585, 1778, 1995, 2239, 2512, 2818, 3162, 3548, 3981},
25 {4467, 5012, 5623, 6310, 7079, 7943, 8913, 10000, 11220, 12589, 14125,
26 15849},
27 {17783, 19953, 22387, 25119, 28184, 31623, 35481, 39811, 44668, 50119,
28 56234, 65535}
29 };
30
31
32
33u32 OFDMSwingTable[OFDM_TABLE_SIZE] = {
34 0x7f8001fe,
35 0x788001e2,
36 0x71c001c7,
37 0x6b8001ae,
38 0x65400195,
39 0x5fc0017f,
40 0x5a400169,
41 0x55400155,
42 0x50800142,
43 0x4c000130,
44 0x47c0011f,
45 0x43c0010f,
46 0x40000100,
47 0x3c8000f2,
48 0x390000e4,
49 0x35c000d7,
50 0x32c000cb,
51 0x300000c0,
52 0x2d4000b5,
53 0x2ac000ab,
54 0x288000a2,
55 0x26000098,
56 0x24000090,
57 0x22000088,
58 0x20000080,
59 0x1e400079,
60 0x1c800072,
61 0x1b00006c,
62 0x19800066,
63 0x18000060,
64 0x16c0005b,
65 0x15800056,
66 0x14400051,
67 0x1300004c,
68 0x12000048,
69 0x11000044,
70 0x10000040,
71};
72
73u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = {
74 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},
75 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},
76 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},
77 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},
78 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},
79 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},
80 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},
81 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},
82 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},
83 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},
84 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},
85 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},
86 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},
87 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},
88 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},
89 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},
90 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},
91 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},
92 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},
93 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
94 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
95 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},
96 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},
97 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},
98 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},
99 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},
100 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},
101 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},
102 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},
103 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},
104 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},
105 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},
106 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}
107};
108
109u8 CCKSwingTable_Ch14[CCK_TABLE_SIZE][8] = {
110 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},
111 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},
112 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},
113 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},
114 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},
115 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},
116 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},
117 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},
118 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},
119 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},
120 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},
121 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},
122 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},
123 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},
124 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},
125 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},
126 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},
127 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},
128 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},
129 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
130 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
131 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},
132 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},
133 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},
134 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},
135 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},
136 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},
137 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},
138 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},
139 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},
140 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},
141 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},
142 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}
143};
144
145u32 OFDMSwingTable_New[OFDM_TABLE_SIZE] = {
146 0x0b40002d,
147 0x0c000030,
148 0x0cc00033,
149 0x0d800036,
150 0x0e400039,
151 0x0f00003c,
152 0x10000040,
153 0x11000044,
154 0x12000048,
155 0x1300004c,
156 0x14400051,
157 0x15800056,
158 0x16c0005b,
159 0x18000060,
160 0x19800066,
161 0x1b00006c,
162 0x1c800072,
163 0x1e400079,
164 0x20000080,
165 0x22000088,
166 0x24000090,
167 0x26000098,
168 0x288000a2,
169 0x2ac000ab,
170 0x2d4000b5,
171 0x300000c0,
172 0x32c000cb,
173 0x35c000d7,
174 0x390000e4,
175 0x3c8000f2,
176 0x40000100,
177 0x43c0010f,
178 0x47c0011f,
179 0x4c000130,
180 0x50800142,
181 0x55400155,
182 0x5a400169,
183 0x5fc0017f,
184 0x65400195,
185 0x6b8001ae,
186 0x71c001c7,
187 0x788001e2,
188 0x7f8001fe
189};
190
191u8 CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8] = {
192 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01},
193 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},
194 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},
195 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},
196 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},
197 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},
198 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},
199 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},
200 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},
201 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},
202 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},
203 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},
204 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
205 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
206 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},
207 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},
208 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},
209 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},
210 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},
211 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},
212 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},
213 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},
214 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},
215 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},
216 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},
217 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},
218 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},
219 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},
220 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},
221 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},
222 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},
223 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},
224 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}
225};
226
227u8 CCKSwingTable_Ch14_New[CCK_TABLE_SIZE][8] = {
228 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00},
229 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},
230 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},
231 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},
232 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},
233 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},
234 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},
235 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},
236 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},
237 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},
238 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},
239 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},
240 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
241 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
242 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},
243 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},
244 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},
245 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},
246 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},
247 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},
248 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},
249 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},
250 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},
251 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},
252 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},
253 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},
254 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},
255 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},
256 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},
257 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},
258 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},
259 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},
260 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}
261};
262
263u32 TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE] = {
264 0x081,
265 0x088,
266 0x090,
267 0x099,
268 0x0A2,
269 0x0AC,
270 0x0B6,
271 0x0C0,
272 0x0CC,
273 0x0D8,
274 0x0E5,
275 0x0F2,
276 0x101,
277 0x110,
278 0x120,
279 0x131,
280 0x143,
281 0x156,
282 0x16A,
283 0x180,
284 0x197,
285 0x1AF,
286 0x1C8,
287 0x1E3,
288 0x200,
289 0x21E,
290 0x23E,
291 0x261,
292 0x285,
293 0x2AB,
294 0x2D3,
295 0x2FE,
296 0x32B,
297 0x35C,
298 0x38E,
299 0x3C4,
300 0x3FE
301};
302
303
304
305
306void odm_CommonInfoSelfInit(PDM_ODM_T pDM_Odm);
307
308void odm_CommonInfoSelfUpdate(PDM_ODM_T pDM_Odm);
309
310void odm_CmnInfoInit_Debug(PDM_ODM_T pDM_Odm);
311
312void odm_BasicDbgMessage(PDM_ODM_T pDM_Odm);
313
314
315
316
317
318
319
320
321
322
323
324
325
326void odm_RefreshRateAdaptiveMaskCE(PDM_ODM_T pDM_Odm);
327
328
329
330void odm_RSSIMonitorInit(PDM_ODM_T pDM_Odm);
331
332void odm_RSSIMonitorCheckCE(PDM_ODM_T pDM_Odm);
333
334void odm_RSSIMonitorCheck(PDM_ODM_T pDM_Odm);
335
336void odm_SwAntDetectInit(PDM_ODM_T pDM_Odm);
337
338void odm_SwAntDivChkAntSwitchCallback(void *FunctionContext);
339
340
341
342void odm_GlobalAdapterCheck(void);
343
344void odm_RefreshRateAdaptiveMask(PDM_ODM_T pDM_Odm);
345
346void ODM_TXPowerTrackingCheck(PDM_ODM_T pDM_Odm);
347
348void odm_RateAdaptiveMaskInit(PDM_ODM_T pDM_Odm);
349
350void odm_TXPowerTrackingThermalMeterInit(PDM_ODM_T pDM_Odm);
351
352
353void odm_TXPowerTrackingInit(PDM_ODM_T pDM_Odm);
354
355void odm_TXPowerTrackingCheckCE(PDM_ODM_T pDM_Odm);
356
357
358
359
360#define RxDefaultAnt1 0x65a9
361#define RxDefaultAnt2 0x569a
362
363void odm_InitHybridAntDiv(PDM_ODM_T pDM_Odm);
364
365bool odm_StaDefAntSel(
366 PDM_ODM_T pDM_Odm,
367 u32 OFDM_Ant1_Cnt,
368 u32 OFDM_Ant2_Cnt,
369 u32 CCK_Ant1_Cnt,
370 u32 CCK_Ant2_Cnt,
371 u8 *pDefAnt
372);
373
374void odm_SetRxIdleAnt(PDM_ODM_T pDM_Odm, u8 Ant, bool bDualPath);
375
376
377
378void odm_HwAntDiv(PDM_ODM_T pDM_Odm);
379
380
381
382
383
384
385
386
387
388void ODM_DMInit(PDM_ODM_T pDM_Odm)
389{
390
391 odm_CommonInfoSelfInit(pDM_Odm);
392 odm_CmnInfoInit_Debug(pDM_Odm);
393 odm_DIGInit(pDM_Odm);
394 odm_NHMCounterStatisticsInit(pDM_Odm);
395 odm_AdaptivityInit(pDM_Odm);
396 odm_RateAdaptiveMaskInit(pDM_Odm);
397 ODM_CfoTrackingInit(pDM_Odm);
398 ODM_EdcaTurboInit(pDM_Odm);
399 odm_RSSIMonitorInit(pDM_Odm);
400 odm_TXPowerTrackingInit(pDM_Odm);
401
402 ODM_ClearTxPowerTrackingState(pDM_Odm);
403
404 if (*(pDM_Odm->mp_mode) != 1)
405 odm_PathDiversityInit(pDM_Odm);
406
407 odm_DynamicBBPowerSavingInit(pDM_Odm);
408 odm_DynamicTxPowerInit(pDM_Odm);
409
410 odm_SwAntDetectInit(pDM_Odm);
411}
412
413
414
415
416
417
418void ODM_DMWatchdog(PDM_ODM_T pDM_Odm)
419{
420 odm_CommonInfoSelfUpdate(pDM_Odm);
421 odm_BasicDbgMessage(pDM_Odm);
422 odm_FalseAlarmCounterStatistics(pDM_Odm);
423 odm_NHMCounterStatistics(pDM_Odm);
424 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI = 0x%x\n", pDM_Odm->RSSI_Min));
425
426 odm_RSSIMonitorCheck(pDM_Odm);
427
428
429
430
431
432 if ((adapter_to_pwrctl(pDM_Odm->Adapter)->pwr_mode != PS_MODE_ACTIVE)
433
434
435
436
437 ) {
438 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("----Step1: odm_DIG is in LPS mode\n"));
439 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("---Step2: 8723AS is in LPS mode\n"));
440 odm_DIGbyRSSI_LPS(pDM_Odm);
441 } else
442 odm_DIG(pDM_Odm);
443
444 {
445 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
446
447 odm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);
448 }
449 odm_CCKPacketDetectionThresh(pDM_Odm);
450
451 if (*(pDM_Odm->pbPowerSaving) == true)
452 return;
453
454
455 odm_RefreshRateAdaptiveMask(pDM_Odm);
456 odm_EdcaTurboCheck(pDM_Odm);
457 odm_PathDiversity(pDM_Odm);
458 ODM_CfoTracking(pDM_Odm);
459
460 ODM_TXPowerTrackingCheck(pDM_Odm);
461
462
463
464
465
466 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0;
467}
468
469
470
471
472
473void ODM_CmnInfoInit(PDM_ODM_T pDM_Odm, ODM_CMNINFO_E CmnInfo, u32 Value)
474{
475
476
477
478 switch (CmnInfo) {
479
480
481
482 case ODM_CMNINFO_ABILITY:
483 pDM_Odm->SupportAbility = (u32)Value;
484 break;
485
486 case ODM_CMNINFO_RF_TYPE:
487 pDM_Odm->RFType = (u8)Value;
488 break;
489
490 case ODM_CMNINFO_PLATFORM:
491 pDM_Odm->SupportPlatform = (u8)Value;
492 break;
493
494 case ODM_CMNINFO_INTERFACE:
495 pDM_Odm->SupportInterface = (u8)Value;
496 break;
497
498 case ODM_CMNINFO_MP_TEST_CHIP:
499 pDM_Odm->bIsMPChip = (u8)Value;
500 break;
501
502 case ODM_CMNINFO_IC_TYPE:
503 pDM_Odm->SupportICType = Value;
504 break;
505
506 case ODM_CMNINFO_CUT_VER:
507 pDM_Odm->CutVersion = (u8)Value;
508 break;
509
510 case ODM_CMNINFO_FAB_VER:
511 pDM_Odm->FabVersion = (u8)Value;
512 break;
513
514 case ODM_CMNINFO_RFE_TYPE:
515 pDM_Odm->RFEType = (u8)Value;
516 break;
517
518 case ODM_CMNINFO_RF_ANTENNA_TYPE:
519 pDM_Odm->AntDivType = (u8)Value;
520 break;
521
522 case ODM_CMNINFO_BOARD_TYPE:
523 pDM_Odm->BoardType = (u8)Value;
524 break;
525
526 case ODM_CMNINFO_PACKAGE_TYPE:
527 pDM_Odm->PackageType = (u8)Value;
528 break;
529
530 case ODM_CMNINFO_EXT_LNA:
531 pDM_Odm->ExtLNA = (u8)Value;
532 break;
533
534 case ODM_CMNINFO_5G_EXT_LNA:
535 pDM_Odm->ExtLNA5G = (u8)Value;
536 break;
537
538 case ODM_CMNINFO_EXT_PA:
539 pDM_Odm->ExtPA = (u8)Value;
540 break;
541
542 case ODM_CMNINFO_5G_EXT_PA:
543 pDM_Odm->ExtPA5G = (u8)Value;
544 break;
545
546 case ODM_CMNINFO_GPA:
547 pDM_Odm->TypeGPA = (ODM_TYPE_GPA_E)Value;
548 break;
549 case ODM_CMNINFO_APA:
550 pDM_Odm->TypeAPA = (ODM_TYPE_APA_E)Value;
551 break;
552 case ODM_CMNINFO_GLNA:
553 pDM_Odm->TypeGLNA = (ODM_TYPE_GLNA_E)Value;
554 break;
555 case ODM_CMNINFO_ALNA:
556 pDM_Odm->TypeALNA = (ODM_TYPE_ALNA_E)Value;
557 break;
558
559 case ODM_CMNINFO_EXT_TRSW:
560 pDM_Odm->ExtTRSW = (u8)Value;
561 break;
562 case ODM_CMNINFO_PATCH_ID:
563 pDM_Odm->PatchID = (u8)Value;
564 break;
565 case ODM_CMNINFO_BINHCT_TEST:
566 pDM_Odm->bInHctTest = (bool)Value;
567 break;
568 case ODM_CMNINFO_BWIFI_TEST:
569 pDM_Odm->bWIFITest = (bool)Value;
570 break;
571
572 case ODM_CMNINFO_SMART_CONCURRENT:
573 pDM_Odm->bDualMacSmartConcurrent = (bool)Value;
574 break;
575
576
577 default:
578
579 break;
580 }
581
582}
583
584
585void ODM_CmnInfoHook(PDM_ODM_T pDM_Odm, ODM_CMNINFO_E CmnInfo, void *pValue)
586{
587
588
589
590 switch (CmnInfo) {
591
592
593
594 case ODM_CMNINFO_MAC_PHY_MODE:
595 pDM_Odm->pMacPhyMode = pValue;
596 break;
597
598 case ODM_CMNINFO_TX_UNI:
599 pDM_Odm->pNumTxBytesUnicast = pValue;
600 break;
601
602 case ODM_CMNINFO_RX_UNI:
603 pDM_Odm->pNumRxBytesUnicast = pValue;
604 break;
605
606 case ODM_CMNINFO_WM_MODE:
607 pDM_Odm->pwirelessmode = pValue;
608 break;
609
610 case ODM_CMNINFO_BAND:
611 pDM_Odm->pBandType = pValue;
612 break;
613
614 case ODM_CMNINFO_SEC_CHNL_OFFSET:
615 pDM_Odm->pSecChOffset = pValue;
616 break;
617
618 case ODM_CMNINFO_SEC_MODE:
619 pDM_Odm->pSecurity = pValue;
620 break;
621
622 case ODM_CMNINFO_BW:
623 pDM_Odm->pBandWidth = pValue;
624 break;
625
626 case ODM_CMNINFO_CHNL:
627 pDM_Odm->pChannel = pValue;
628 break;
629
630 case ODM_CMNINFO_DMSP_GET_VALUE:
631 pDM_Odm->pbGetValueFromOtherMac = pValue;
632 break;
633
634 case ODM_CMNINFO_BUDDY_ADAPTOR:
635 pDM_Odm->pBuddyAdapter = pValue;
636 break;
637
638 case ODM_CMNINFO_DMSP_IS_MASTER:
639 pDM_Odm->pbMasterOfDMSP = pValue;
640 break;
641
642 case ODM_CMNINFO_SCAN:
643 pDM_Odm->pbScanInProcess = pValue;
644 break;
645
646 case ODM_CMNINFO_POWER_SAVING:
647 pDM_Odm->pbPowerSaving = pValue;
648 break;
649
650 case ODM_CMNINFO_ONE_PATH_CCA:
651 pDM_Odm->pOnePathCCA = pValue;
652 break;
653
654 case ODM_CMNINFO_DRV_STOP:
655 pDM_Odm->pbDriverStopped = pValue;
656 break;
657
658 case ODM_CMNINFO_PNP_IN:
659 pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep = pValue;
660 break;
661
662 case ODM_CMNINFO_INIT_ON:
663 pDM_Odm->pinit_adpt_in_progress = pValue;
664 break;
665
666 case ODM_CMNINFO_ANT_TEST:
667 pDM_Odm->pAntennaTest = pValue;
668 break;
669
670 case ODM_CMNINFO_NET_CLOSED:
671 pDM_Odm->pbNet_closed = pValue;
672 break;
673
674 case ODM_CMNINFO_FORCED_RATE:
675 pDM_Odm->pForcedDataRate = pValue;
676 break;
677
678 case ODM_CMNINFO_FORCED_IGI_LB:
679 pDM_Odm->pu1ForcedIgiLb = pValue;
680 break;
681
682 case ODM_CMNINFO_MP_MODE:
683 pDM_Odm->mp_mode = pValue;
684 break;
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705 default:
706
707 break;
708 }
709
710}
711
712
713void ODM_CmnInfoPtrArrayHook(
714 PDM_ODM_T pDM_Odm,
715 ODM_CMNINFO_E CmnInfo,
716 u16 Index,
717 void *pValue
718)
719{
720
721
722
723 switch (CmnInfo) {
724
725
726
727 case ODM_CMNINFO_STA_STATUS:
728 pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue;
729 break;
730
731 default:
732
733 break;
734 }
735
736}
737
738
739
740
741
742void ODM_CmnInfoUpdate(PDM_ODM_T pDM_Odm, u32 CmnInfo, u64 Value)
743{
744
745
746
747 switch (CmnInfo) {
748 case ODM_CMNINFO_LINK_IN_PROGRESS:
749 pDM_Odm->bLinkInProcess = (bool)Value;
750 break;
751
752 case ODM_CMNINFO_ABILITY:
753 pDM_Odm->SupportAbility = (u32)Value;
754 break;
755
756 case ODM_CMNINFO_RF_TYPE:
757 pDM_Odm->RFType = (u8)Value;
758 break;
759
760 case ODM_CMNINFO_WIFI_DIRECT:
761 pDM_Odm->bWIFI_Direct = (bool)Value;
762 break;
763
764 case ODM_CMNINFO_WIFI_DISPLAY:
765 pDM_Odm->bWIFI_Display = (bool)Value;
766 break;
767
768 case ODM_CMNINFO_LINK:
769 pDM_Odm->bLinked = (bool)Value;
770 break;
771
772 case ODM_CMNINFO_STATION_STATE:
773 pDM_Odm->bsta_state = (bool)Value;
774 break;
775
776 case ODM_CMNINFO_RSSI_MIN:
777 pDM_Odm->RSSI_Min = (u8)Value;
778 break;
779
780 case ODM_CMNINFO_DBG_COMP:
781 pDM_Odm->DebugComponents = Value;
782 break;
783
784 case ODM_CMNINFO_DBG_LEVEL:
785 pDM_Odm->DebugLevel = (u32)Value;
786 break;
787 case ODM_CMNINFO_RA_THRESHOLD_HIGH:
788 pDM_Odm->RateAdaptive.HighRSSIThresh = (u8)Value;
789 break;
790
791 case ODM_CMNINFO_RA_THRESHOLD_LOW:
792 pDM_Odm->RateAdaptive.LowRSSIThresh = (u8)Value;
793 break;
794
795 case ODM_CMNINFO_BT_ENABLED:
796 pDM_Odm->bBtEnabled = (bool)Value;
797 break;
798
799 case ODM_CMNINFO_BT_HS_CONNECT_PROCESS:
800 pDM_Odm->bBtConnectProcess = (bool)Value;
801 break;
802
803 case ODM_CMNINFO_BT_HS_RSSI:
804 pDM_Odm->btHsRssi = (u8)Value;
805 break;
806
807 case ODM_CMNINFO_BT_OPERATION:
808 pDM_Odm->bBtHsOperation = (bool)Value;
809 break;
810
811 case ODM_CMNINFO_BT_LIMITED_DIG:
812 pDM_Odm->bBtLimitedDig = (bool)Value;
813 break;
814
815 case ODM_CMNINFO_BT_DISABLE_EDCA:
816 pDM_Odm->bBtDisableEdcaTurbo = (bool)Value;
817 break;
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848 default:
849
850 break;
851 }
852
853
854}
855
856void odm_CommonInfoSelfInit(PDM_ODM_T pDM_Odm)
857{
858 pDM_Odm->bCckHighPower = (bool) PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG(CCK_RPT_FORMAT, pDM_Odm), ODM_BIT(CCK_RPT_FORMAT, pDM_Odm));
859 pDM_Odm->RFPathRxEnable = (u8) PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG(BB_RX_PATH, pDM_Odm), ODM_BIT(BB_RX_PATH, pDM_Odm));
860
861 ODM_InitDebugSetting(pDM_Odm);
862
863 pDM_Odm->TxRate = 0xFF;
864}
865
866void odm_CommonInfoSelfUpdate(PDM_ODM_T pDM_Odm)
867{
868 u8 EntryCnt = 0;
869 u8 i;
870 PSTA_INFO_T pEntry;
871
872 if (*(pDM_Odm->pBandWidth) == ODM_BW40M) {
873 if (*(pDM_Odm->pSecChOffset) == 1)
874 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel)-2;
875 else if (*(pDM_Odm->pSecChOffset) == 2)
876 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel)+2;
877 } else
878 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel);
879
880 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
881 pEntry = pDM_Odm->pODM_StaInfo[i];
882 if (IS_STA_VALID(pEntry))
883 EntryCnt++;
884 }
885
886 if (EntryCnt == 1)
887 pDM_Odm->bOneEntryOnly = true;
888 else
889 pDM_Odm->bOneEntryOnly = false;
890}
891
892void odm_CmnInfoInit_Debug(PDM_ODM_T pDM_Odm)
893{
894 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoInit_Debug ==>\n"));
895 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportPlatform =%d\n", pDM_Odm->SupportPlatform));
896 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportAbility = 0x%x\n", pDM_Odm->SupportAbility));
897 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportInterface =%d\n", pDM_Odm->SupportInterface));
898 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportICType = 0x%x\n", pDM_Odm->SupportICType));
899 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("CutVersion =%d\n", pDM_Odm->CutVersion));
900 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("FabVersion =%d\n", pDM_Odm->FabVersion));
901 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("RFType =%d\n", pDM_Odm->RFType));
902 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("BoardType =%d\n", pDM_Odm->BoardType));
903 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtLNA =%d\n", pDM_Odm->ExtLNA));
904 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtPA =%d\n", pDM_Odm->ExtPA));
905 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtTRSW =%d\n", pDM_Odm->ExtTRSW));
906 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("PatchID =%d\n", pDM_Odm->PatchID));
907 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("bInHctTest =%d\n", pDM_Odm->bInHctTest));
908 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFITest =%d\n", pDM_Odm->bWIFITest));
909 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("bDualMacSmartConcurrent =%d\n", pDM_Odm->bDualMacSmartConcurrent));
910
911}
912
913void odm_BasicDbgMessage(PDM_ODM_T pDM_Odm)
914{
915 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_BasicDbgMsg ==>\n"));
916 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked = %d, RSSI_Min = %d,\n",
917 pDM_Odm->bLinked, pDM_Odm->RSSI_Min));
918 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("RxRate = 0x%x, RSSI_A = %d, RSSI_B = %d\n",
919 pDM_Odm->RxRate, pDM_Odm->RSSI_A, pDM_Odm->RSSI_B));
920}
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960void odm_RateAdaptiveMaskInit(PDM_ODM_T pDM_Odm)
961{
962 PODM_RATE_ADAPTIVE pOdmRA = &pDM_Odm->RateAdaptive;
963
964 pOdmRA->Type = DM_Type_ByDriver;
965 if (pOdmRA->Type == DM_Type_ByDriver)
966 pDM_Odm->bUseRAMask = true;
967 else
968 pDM_Odm->bUseRAMask = false;
969
970 pOdmRA->RATRState = DM_RATR_STA_INIT;
971 pOdmRA->LdpcThres = 35;
972 pOdmRA->bUseLdpc = false;
973 pOdmRA->HighRSSIThresh = 50;
974 pOdmRA->LowRSSIThresh = 20;
975}
976
977u32 ODM_Get_Rate_Bitmap(
978 PDM_ODM_T pDM_Odm,
979 u32 macid,
980 u32 ra_mask,
981 u8 rssi_level
982)
983{
984 PSTA_INFO_T pEntry;
985 u32 rate_bitmap = 0;
986 u8 WirelessMode;
987
988 pEntry = pDM_Odm->pODM_StaInfo[macid];
989 if (!IS_STA_VALID(pEntry))
990 return ra_mask;
991
992 WirelessMode = pEntry->wireless_mode;
993
994 switch (WirelessMode) {
995 case ODM_WM_B:
996 if (ra_mask & 0x0000000c)
997 rate_bitmap = 0x0000000d;
998 else
999 rate_bitmap = 0x0000000f;
1000 break;
1001
1002 case (ODM_WM_G):
1003 case (ODM_WM_A):
1004 if (rssi_level == DM_RATR_STA_HIGH)
1005 rate_bitmap = 0x00000f00;
1006 else
1007 rate_bitmap = 0x00000ff0;
1008 break;
1009
1010 case (ODM_WM_B|ODM_WM_G):
1011 if (rssi_level == DM_RATR_STA_HIGH)
1012 rate_bitmap = 0x00000f00;
1013 else if (rssi_level == DM_RATR_STA_MIDDLE)
1014 rate_bitmap = 0x00000ff0;
1015 else
1016 rate_bitmap = 0x00000ff5;
1017 break;
1018
1019 case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G):
1020 case (ODM_WM_B|ODM_WM_N24G):
1021 case (ODM_WM_G|ODM_WM_N24G):
1022 case (ODM_WM_A|ODM_WM_N5G):
1023 if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) {
1024 if (rssi_level == DM_RATR_STA_HIGH)
1025 rate_bitmap = 0x000f0000;
1026 else if (rssi_level == DM_RATR_STA_MIDDLE)
1027 rate_bitmap = 0x000ff000;
1028 else {
1029 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
1030 rate_bitmap = 0x000ff015;
1031 else
1032 rate_bitmap = 0x000ff005;
1033 }
1034 } else {
1035 if (rssi_level == DM_RATR_STA_HIGH)
1036 rate_bitmap = 0x0f8f0000;
1037 else if (rssi_level == DM_RATR_STA_MIDDLE)
1038 rate_bitmap = 0x0f8ff000;
1039 else {
1040 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
1041 rate_bitmap = 0x0f8ff015;
1042 else
1043 rate_bitmap = 0x0f8ff005;
1044 }
1045 }
1046 break;
1047
1048 case (ODM_WM_AC|ODM_WM_G):
1049 if (rssi_level == 1)
1050 rate_bitmap = 0xfc3f0000;
1051 else if (rssi_level == 2)
1052 rate_bitmap = 0xfffff000;
1053 else
1054 rate_bitmap = 0xffffffff;
1055 break;
1056
1057 case (ODM_WM_AC|ODM_WM_A):
1058
1059 if (pDM_Odm->RFType == RF_1T1R) {
1060 if (rssi_level == 1)
1061 rate_bitmap = 0x003f8000;
1062 else if (rssi_level == 2)
1063 rate_bitmap = 0x003ff000;
1064 else
1065 rate_bitmap = 0x003ff010;
1066 } else {
1067 if (rssi_level == 1)
1068 rate_bitmap = 0xfe3f8000;
1069 else if (rssi_level == 2)
1070 rate_bitmap = 0xfffff000;
1071 else
1072 rate_bitmap = 0xfffff010;
1073 }
1074 break;
1075
1076 default:
1077 if (pDM_Odm->RFType == RF_1T2R)
1078 rate_bitmap = 0x000fffff;
1079 else
1080 rate_bitmap = 0x0fffffff;
1081 break;
1082 }
1083
1084
1085 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (" ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x\n", rssi_level, WirelessMode, rate_bitmap));
1086
1087 return (ra_mask&rate_bitmap);
1088
1089}
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108void odm_RefreshRateAdaptiveMask(PDM_ODM_T pDM_Odm)
1109{
1110
1111 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask()---------->\n"));
1112 if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK)) {
1113 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask(): Return cos not supported\n"));
1114 return;
1115 }
1116 odm_RefreshRateAdaptiveMaskCE(pDM_Odm);
1117}
1118
1119void odm_RefreshRateAdaptiveMaskCE(PDM_ODM_T pDM_Odm)
1120{
1121 u8 i;
1122 struct adapter *padapter = pDM_Odm->Adapter;
1123
1124 if (padapter->bDriverStopped) {
1125 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
1126 return;
1127 }
1128
1129 if (!pDM_Odm->bUseRAMask) {
1130 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
1131 return;
1132 }
1133
1134
1135
1136 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
1137 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
1138
1139 if (IS_STA_VALID(pstat)) {
1140 if (IS_MCAST(pstat->hwaddr))
1141 continue;
1142 if (IS_MCAST(pstat->hwaddr))
1143 continue;
1144
1145 if (true == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, false, &pstat->rssi_level)) {
1146 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level));
1147
1148 rtw_hal_update_ra_mask(pstat, pstat->rssi_level);
1149 }
1150
1151 }
1152 }
1153}
1154
1155
1156
1157bool ODM_RAStateCheck(
1158 PDM_ODM_T pDM_Odm,
1159 s32 RSSI,
1160 bool bForceUpdate,
1161 u8 *pRATRState
1162)
1163{
1164 PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;
1165 const u8 GoUpGap = 5;
1166 u8 HighRSSIThreshForRA = pRA->HighRSSIThresh;
1167 u8 LowRSSIThreshForRA = pRA->LowRSSIThresh;
1168 u8 RATRState;
1169
1170
1171
1172
1173 switch (*pRATRState) {
1174 case DM_RATR_STA_INIT:
1175 case DM_RATR_STA_HIGH:
1176 break;
1177
1178 case DM_RATR_STA_MIDDLE:
1179 HighRSSIThreshForRA += GoUpGap;
1180 break;
1181
1182 case DM_RATR_STA_LOW:
1183 HighRSSIThreshForRA += GoUpGap;
1184 LowRSSIThreshForRA += GoUpGap;
1185 break;
1186
1187 default:
1188 ODM_RT_ASSERT(pDM_Odm, false, ("wrong rssi level setting %d !", *pRATRState));
1189 break;
1190 }
1191
1192
1193 if (RSSI > HighRSSIThreshForRA)
1194 RATRState = DM_RATR_STA_HIGH;
1195 else if (RSSI > LowRSSIThreshForRA)
1196 RATRState = DM_RATR_STA_MIDDLE;
1197 else
1198 RATRState = DM_RATR_STA_LOW;
1199
1200
1201 if (*pRATRState != RATRState || bForceUpdate) {
1202 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI Level %d -> %d\n", *pRATRState, RATRState));
1203 *pRATRState = RATRState;
1204 return true;
1205 }
1206
1207 return false;
1208}
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223void odm_RSSIMonitorInit(PDM_ODM_T pDM_Odm)
1224{
1225 pRA_T pRA_Table = &pDM_Odm->DM_RA_Table;
1226
1227 pRA_Table->firstconnect = false;
1228
1229}
1230
1231void odm_RSSIMonitorCheck(PDM_ODM_T pDM_Odm)
1232{
1233 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
1234 return;
1235
1236 odm_RSSIMonitorCheckCE(pDM_Odm);
1237
1238}
1239
1240static void FindMinimumRSSI(struct adapter *padapter)
1241{
1242 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1243 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1244 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
1245
1246
1247
1248 if (
1249 (pDM_Odm->bLinked != true) &&
1250 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)
1251 ) {
1252 pdmpriv->MinUndecoratedPWDBForDM = 0;
1253
1254 } else
1255 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
1256
1257
1258
1259}
1260
1261void odm_RSSIMonitorCheckCE(PDM_ODM_T pDM_Odm)
1262{
1263 struct adapter *Adapter = pDM_Odm->Adapter;
1264 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
1265 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1266 int i;
1267 int tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff;
1268 u8 sta_cnt = 0;
1269 u32 PWDB_rssi[NUM_STA] = {0};
1270 bool FirstConnect = false;
1271 pRA_T pRA_Table = &pDM_Odm->DM_RA_Table;
1272
1273 if (pDM_Odm->bLinked != true)
1274 return;
1275
1276 FirstConnect = (pDM_Odm->bLinked) && (pRA_Table->firstconnect == false);
1277 pRA_Table->firstconnect = pDM_Odm->bLinked;
1278
1279
1280 {
1281 struct sta_info *psta;
1282
1283 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
1284 psta = pDM_Odm->pODM_StaInfo[i];
1285 if (IS_STA_VALID(psta)) {
1286 if (IS_MCAST(psta->hwaddr))
1287 continue;
1288
1289 if (psta->rssi_stat.UndecoratedSmoothedPWDB == (-1))
1290 continue;
1291
1292 if (psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
1293 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
1294
1295 if (psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
1296 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
1297
1298 if (psta->rssi_stat.UndecoratedSmoothedPWDB != (-1))
1299 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
1300 }
1301 }
1302
1303
1304
1305 for (i = 0; i < sta_cnt; i++) {
1306 if (PWDB_rssi[i] != (0)) {
1307 if (pHalData->fw_ractrl == true)
1308 rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
1309 }
1310 }
1311 }
1312
1313
1314
1315 if (tmpEntryMaxPWDB != 0)
1316 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;
1317 else
1318 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0;
1319
1320 if (tmpEntryMinPWDB != 0xff)
1321 pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;
1322 else
1323 pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0;
1324
1325 FindMinimumRSSI(Adapter);
1326
1327 pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
1328
1329}
1330
1331
1332
1333
1334
1335void odm_TXPowerTrackingInit(PDM_ODM_T pDM_Odm)
1336{
1337 odm_TXPowerTrackingThermalMeterInit(pDM_Odm);
1338}
1339
1340static u8 getSwingIndex(PDM_ODM_T pDM_Odm)
1341{
1342 struct adapter *Adapter = pDM_Odm->Adapter;
1343 u8 i = 0;
1344 u32 bbSwing;
1345 u32 swingTableSize;
1346 u32 *pSwingTable;
1347
1348 bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000);
1349
1350 pSwingTable = OFDMSwingTable_New;
1351 swingTableSize = OFDM_TABLE_SIZE;
1352
1353 for (i = 0; i < swingTableSize; ++i) {
1354 u32 tableValue = pSwingTable[i];
1355
1356 if (tableValue >= 0x100000)
1357 tableValue >>= 22;
1358 if (bbSwing == tableValue)
1359 break;
1360 }
1361 return i;
1362}
1363
1364void odm_TXPowerTrackingThermalMeterInit(PDM_ODM_T pDM_Odm)
1365{
1366 u8 defaultSwingIndex = getSwingIndex(pDM_Odm);
1367 u8 p = 0;
1368 struct adapter *Adapter = pDM_Odm->Adapter;
1369 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
1370
1371
1372 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1373
1374 pdmpriv->bTXPowerTracking = true;
1375 pdmpriv->TXPowercount = 0;
1376 pdmpriv->bTXPowerTrackingInit = false;
1377
1378 if (*(pDM_Odm->mp_mode) != 1)
1379 pdmpriv->TxPowerTrackControl = true;
1380 else
1381 pdmpriv->TxPowerTrackControl = false;
1382
1383
1384
1385
1386
1387 pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
1388 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
1389 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;
1390
1391
1392 pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex;
1393 pDM_Odm->DefaultCckIndex = 20;
1394
1395 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
1396 pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex;
1397
1398 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p) {
1399 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;
1400 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;
1401 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
1402 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
1403 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
1404 }
1405
1406}
1407
1408
1409void ODM_TXPowerTrackingCheck(PDM_ODM_T pDM_Odm)
1410{
1411 odm_TXPowerTrackingCheckCE(pDM_Odm);
1412}
1413
1414void odm_TXPowerTrackingCheckCE(PDM_ODM_T pDM_Odm)
1415{
1416 struct adapter *Adapter = pDM_Odm->Adapter;
1417
1418 if (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
1419 return;
1420
1421 if (!pDM_Odm->RFCalibrateInfo.TM_Trigger) {
1422 PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03);
1423
1424
1425
1426 pDM_Odm->RFCalibrateInfo.TM_Trigger = 1;
1427 return;
1428 } else {
1429
1430 ODM_TXPowerTrackingCallback_ThermalMeter(Adapter);
1431 pDM_Odm->RFCalibrateInfo.TM_Trigger = 0;
1432 }
1433}
1434
1435
1436
1437
1438void odm_SwAntDetectInit(PDM_ODM_T pDM_Odm)
1439{
1440 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
1441
1442 pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = rtw_read32(pDM_Odm->Adapter, rDPDT_control);
1443 pDM_SWAT_Table->PreAntenna = MAIN_ANT;
1444 pDM_SWAT_Table->CurAntenna = MAIN_ANT;
1445 pDM_SWAT_Table->SWAS_NoLink_State = 0;
1446}
1447