Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_cck_pd.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2007 - 2017 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 <[email protected]>
19
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20
* Hsinchu 300, Taiwan.
21
*
22
* Larry Finger <[email protected]>
23
*
24
*****************************************************************************/
25
26
/*@************************************************************
27
* include files
28
************************************************************/
29
30
#include "mp_precomp.h"
31
#include "phydm_precomp.h"
32
33
#ifdef PHYDM_SUPPORT_CCKPD
34
#ifdef PHYDM_COMPILE_CCKPD_TYPE1
35
void phydm_write_cck_pd_type1(void *dm_void, u8 cca_th)
36
{
37
struct dm_struct *dm = (struct dm_struct *)dm_void;
38
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
39
40
PHYDM_DBG(dm, DBG_CCKPD, "[%s] cck_cca_th=((0x%x))\n",
41
__func__, cca_th);
42
43
odm_write_1byte(dm, R_0xa0a, cca_th);
44
cckpd_t->cur_cck_cca_thres = cca_th;
45
}
46
47
void phydm_set_cckpd_lv_type1(void *dm_void, enum cckpd_lv lv)
48
{
49
struct dm_struct *dm = (struct dm_struct *)dm_void;
50
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
51
u8 pd_th = 0;
52
53
PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
54
PHYDM_DBG(dm, DBG_CCKPD, "lv: (%d) -> (%d)\n", cckpd_t->cck_pd_lv, lv);
55
56
if (cckpd_t->cck_pd_lv == lv) {
57
PHYDM_DBG(dm, DBG_CCKPD, "stay in lv=%d\n", lv);
58
return;
59
}
60
61
cckpd_t->cck_pd_lv = lv;
62
cckpd_t->cck_fa_ma = CCK_FA_MA_RESET;
63
64
if (lv == CCK_PD_LV_4)
65
pd_th = 0xed;
66
else if (lv == CCK_PD_LV_3)
67
pd_th = 0xdd;
68
else if (lv == CCK_PD_LV_2)
69
pd_th = 0xcd;
70
else if (lv == CCK_PD_LV_1)
71
pd_th = 0x83;
72
else if (lv == CCK_PD_LV_0)
73
pd_th = 0x40;
74
75
phydm_write_cck_pd_type1(dm, pd_th);
76
}
77
78
void phydm_cckpd_type1(void *dm_void)
79
{
80
struct dm_struct *dm = (struct dm_struct *)dm_void;
81
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
82
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
83
enum cckpd_lv lv = CCK_PD_LV_INIT;
84
boolean is_update = true;
85
86
if (dm->is_linked) {
87
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
88
if (dm->rssi_min > 60) {
89
lv = CCK_PD_LV_3;
90
} else if (dm->rssi_min > 35) {
91
lv = CCK_PD_LV_2;
92
} else if (dm->rssi_min > 20) {
93
if (cckpd_t->cck_fa_ma > 500)
94
lv = CCK_PD_LV_2;
95
else if (cckpd_t->cck_fa_ma < 250)
96
lv = CCK_PD_LV_1;
97
else
98
is_update = false;
99
} else { /*RSSI < 20*/
100
lv = CCK_PD_LV_1;
101
}
102
#else /*ODM_AP*/
103
if (dig_t->cur_ig_value > 0x32)
104
lv = CCK_PD_LV_4;
105
else if (dig_t->cur_ig_value > 0x2a)
106
lv = CCK_PD_LV_3;
107
else if (dig_t->cur_ig_value > 0x24)
108
lv = CCK_PD_LV_2;
109
else
110
lv = CCK_PD_LV_1;
111
#endif
112
} else {
113
if (cckpd_t->cck_fa_ma > 1000)
114
lv = CCK_PD_LV_1;
115
else if (cckpd_t->cck_fa_ma < 500)
116
lv = CCK_PD_LV_0;
117
else
118
is_update = false;
119
}
120
121
/*[Abnormal case] =================================================*/
122
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
123
/*@HP 22B LPS power consumption issue & [PCIE-1596]*/
124
if (dm->hp_hw_id && dm->traffic_load == TRAFFIC_ULTRA_LOW) {
125
lv = CCK_PD_LV_0;
126
PHYDM_DBG(dm, DBG_CCKPD, "CCKPD Abnormal case1\n");
127
} else if ((dm->p_advance_ota & PHYDM_ASUS_OTA_SETTING) &&
128
cckpd_t->cck_fa_ma > 200 && dm->rssi_min <= 20) {
129
lv = CCK_PD_LV_1;
130
cckpd_t->cck_pd_lv = lv;
131
phydm_write_cck_pd_type1(dm, 0xc3); /*@for ASUS OTA test*/
132
is_update = false;
133
PHYDM_DBG(dm, DBG_CCKPD, "CCKPD Abnormal case2\n");
134
}
135
#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))
136
#ifdef MCR_WIRELESS_EXTEND
137
lv = CCK_PD_LV_2;
138
cckpd_t->cck_pd_lv = lv;
139
phydm_write_cck_pd_type1(dm, 0x43);
140
is_update = false;
141
PHYDM_DBG(dm, DBG_CCKPD, "CCKPD Abnormal case3\n");
142
#endif
143
#endif
144
/*=================================================================*/
145
146
if (is_update)
147
phydm_set_cckpd_lv_type1(dm, lv);
148
149
PHYDM_DBG(dm, DBG_CCKPD, "is_linked=%d, lv=%d, pd_th=0x%x\n\n",
150
dm->is_linked, cckpd_t->cck_pd_lv,
151
cckpd_t->cur_cck_cca_thres);
152
}
153
#endif /*#ifdef PHYDM_COMPILE_CCKPD_TYPE1*/
154
155
#ifdef PHYDM_COMPILE_CCKPD_TYPE2
156
void phydm_write_cck_pd_type2(void *dm_void, u8 cca_th, u8 cca_th_aaa)
157
{
158
struct dm_struct *dm = (struct dm_struct *)dm_void;
159
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
160
161
PHYDM_DBG(dm, DBG_CCKPD, "[%s] pd_th=0x%x, cs_ratio=0x%x\n",
162
__func__, cca_th, cca_th_aaa);
163
164
odm_set_bb_reg(dm, R_0xa08, 0x3f0000, cca_th);
165
odm_set_bb_reg(dm, R_0xaa8, 0x1f0000, cca_th_aaa);
166
cckpd_t->cur_cck_cca_thres = cca_th;
167
cckpd_t->cck_cca_th_aaa = cca_th_aaa;
168
}
169
170
void phydm_set_cckpd_lv_type2(void *dm_void, enum cckpd_lv lv)
171
{
172
struct dm_struct *dm = (struct dm_struct *)dm_void;
173
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
174
u8 pd_th = 0, cs_ratio = 0, cs_2r_offset = 0;
175
u8 cck_n_rx = 1;
176
177
PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
178
PHYDM_DBG(dm, DBG_CCKPD, "lv: (%d) -> (%d)\n", cckpd_t->cck_pd_lv, lv);
179
180
/*@r_mrx & r_cca_mrc*/
181
cck_n_rx = (odm_get_bb_reg(dm, R_0xa2c, BIT(18)) &&
182
odm_get_bb_reg(dm, R_0xa2c, BIT(22))) ? 2 : 1;
183
184
if (cckpd_t->cck_pd_lv == lv && cckpd_t->cck_n_rx == cck_n_rx) {
185
PHYDM_DBG(dm, DBG_CCKPD, "stay in lv=%d\n", lv);
186
return;
187
}
188
189
cckpd_t->cck_n_rx = cck_n_rx;
190
cckpd_t->cck_pd_lv = lv;
191
cckpd_t->cck_fa_ma = CCK_FA_MA_RESET;
192
193
if (lv == CCK_PD_LV_4) {
194
cs_ratio = cckpd_t->aaa_default + 8;
195
cs_2r_offset = 5;
196
pd_th = 0xd;
197
} else if (lv == CCK_PD_LV_3) {
198
cs_ratio = cckpd_t->aaa_default + 6;
199
cs_2r_offset = 4;
200
pd_th = 0xd;
201
} else if (lv == CCK_PD_LV_2) {
202
cs_ratio = cckpd_t->aaa_default + 4;
203
cs_2r_offset = 3;
204
pd_th = 0xd;
205
} else if (lv == CCK_PD_LV_1) {
206
cs_ratio = cckpd_t->aaa_default + 2;
207
cs_2r_offset = 1;
208
pd_th = 0x7;
209
} else if (lv == CCK_PD_LV_0) {
210
cs_ratio = cckpd_t->aaa_default;
211
cs_2r_offset = 0;
212
pd_th = 0x3;
213
}
214
215
if (cckpd_t->cck_n_rx == 2) {
216
if (cs_ratio >= cs_2r_offset)
217
cs_ratio = cs_ratio - cs_2r_offset;
218
else
219
cs_ratio = 0;
220
}
221
phydm_write_cck_pd_type2(dm, pd_th, cs_ratio);
222
}
223
224
void phydm_cckpd_type2(void *dm_void)
225
{
226
struct dm_struct *dm = (struct dm_struct *)dm_void;
227
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
228
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
229
enum cckpd_lv lv = CCK_PD_LV_INIT;
230
u8 igi = dig_t->cur_ig_value;
231
u8 rssi_min = dm->rssi_min;
232
boolean is_update = true;
233
234
PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
235
236
if (dm->is_linked) {
237
if (igi > 0x38 && rssi_min > 32) {
238
lv = CCK_PD_LV_4;
239
} else if (igi > 0x2a && rssi_min > 32) {
240
lv = CCK_PD_LV_3;
241
} else if (igi > 0x24 || (rssi_min > 24 && rssi_min <= 30)) {
242
lv = CCK_PD_LV_2;
243
} else if (igi <= 0x24 || rssi_min < 22) {
244
if (cckpd_t->cck_fa_ma > 1000) {
245
lv = CCK_PD_LV_1;
246
} else if (cckpd_t->cck_fa_ma < 500) {
247
lv = CCK_PD_LV_0;
248
} else {
249
is_update = false;
250
}
251
} else {
252
is_update = false;
253
}
254
} else {
255
if (cckpd_t->cck_fa_ma > 1000) {
256
lv = CCK_PD_LV_1;
257
} else if (cckpd_t->cck_fa_ma < 500) {
258
lv = CCK_PD_LV_0;
259
} else {
260
is_update = false;
261
}
262
}
263
264
/*[Abnormal case] =================================================*/
265
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
266
/*@21C Miracast lag issue & [PCIE-3298]*/
267
if (dm->support_ic_type & ODM_RTL8821C && rssi_min > 60) {
268
lv = CCK_PD_LV_4;
269
cckpd_t->cck_pd_lv = lv;
270
phydm_write_cck_pd_type2(dm, 0x1d, (cckpd_t->aaa_default + 8));
271
is_update = false;
272
PHYDM_DBG(dm, DBG_CCKPD, "CCKPD Abnormal case1\n");
273
}
274
#endif
275
/*=================================================================*/
276
277
if (is_update) {
278
phydm_set_cckpd_lv_type2(dm, lv);
279
}
280
281
PHYDM_DBG(dm, DBG_CCKPD,
282
"is_linked=%d, lv=%d, n_rx=%d, cs_ratio=0x%x, pd_th=0x%x\n\n",
283
dm->is_linked, cckpd_t->cck_pd_lv, cckpd_t->cck_n_rx,
284
cckpd_t->cck_cca_th_aaa, cckpd_t->cur_cck_cca_thres);
285
}
286
#endif /*#ifdef PHYDM_COMPILE_CCKPD_TYPE2*/
287
288
#ifdef PHYDM_COMPILE_CCKPD_TYPE3
289
void phydm_write_cck_pd_type3(void *dm_void, u8 pd_th, u8 cs_ratio,
290
enum cckpd_mode mode)
291
{
292
struct dm_struct *dm = (struct dm_struct *)dm_void;
293
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
294
295
PHYDM_DBG(dm, DBG_CCKPD,
296
"[%s] mode=%d, pd_th=0x%x, cs_ratio=0x%x\n", __func__,
297
mode, pd_th, cs_ratio);
298
299
switch (mode) {
300
case CCK_BW20_1R: /*RFBW20_1R*/
301
{
302
cckpd_t->cur_cck_pd_20m_1r = pd_th;
303
cckpd_t->cur_cck_cs_ratio_20m_1r = cs_ratio;
304
odm_set_bb_reg(dm, R_0xac8, 0xff, pd_th);
305
odm_set_bb_reg(dm, R_0xad0, 0x1f, cs_ratio);
306
} break;
307
case CCK_BW20_2R: /*RFBW20_2R*/
308
{
309
cckpd_t->cur_cck_pd_20m_2r = pd_th;
310
cckpd_t->cur_cck_cs_ratio_20m_2r = cs_ratio;
311
odm_set_bb_reg(dm, R_0xac8, 0xff00, pd_th);
312
odm_set_bb_reg(dm, R_0xad0, 0x3e0, cs_ratio);
313
} break;
314
case CCK_BW40_1R: /*RFBW40_1R*/
315
{
316
cckpd_t->cur_cck_pd_40m_1r = pd_th;
317
cckpd_t->cur_cck_cs_ratio_40m_1r = cs_ratio;
318
odm_set_bb_reg(dm, R_0xacc, 0xff, pd_th);
319
odm_set_bb_reg(dm, R_0xad0, 0x1f00000, cs_ratio);
320
} break;
321
case CCK_BW40_2R: /*RFBW40_2R*/
322
{
323
cckpd_t->cur_cck_pd_40m_2r = pd_th;
324
cckpd_t->cur_cck_cs_ratio_40m_2r = cs_ratio;
325
odm_set_bb_reg(dm, R_0xacc, 0xff00, pd_th);
326
odm_set_bb_reg(dm, R_0xad0, 0x3e000000, cs_ratio);
327
} break;
328
329
default:
330
/*@pr_debug("[%s] warning!\n", __func__);*/
331
break;
332
}
333
}
334
335
void phydm_set_cckpd_lv_type3(void *dm_void, enum cckpd_lv lv)
336
{
337
struct dm_struct *dm = (struct dm_struct *)dm_void;
338
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
339
enum cckpd_mode cck_mode = CCK_BW20_2R;
340
enum channel_width cck_bw = CHANNEL_WIDTH_20;
341
u8 cck_n_rx = 1;
342
u8 pd_th;
343
u8 cs_ratio;
344
345
PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
346
PHYDM_DBG(dm, DBG_CCKPD, "lv: (%d) -> (%d)\n", cckpd_t->cck_pd_lv, lv);
347
348
/*[Check Nrx]*/
349
cck_n_rx = (odm_get_bb_reg(dm, R_0xa2c, BIT(17))) ? 2 : 1;
350
351
/*[Check BW]*/
352
if (odm_get_bb_reg(dm, R_0x800, BIT(0)))
353
cck_bw = CHANNEL_WIDTH_40;
354
else
355
cck_bw = CHANNEL_WIDTH_20;
356
357
/*[Check LV]*/
358
if (cckpd_t->cck_pd_lv == lv &&
359
cckpd_t->cck_n_rx == cck_n_rx &&
360
cckpd_t->cck_bw == cck_bw) {
361
PHYDM_DBG(dm, DBG_CCKPD, "stay in lv=%d\n", lv);
362
return;
363
}
364
365
cckpd_t->cck_bw = cck_bw;
366
cckpd_t->cck_n_rx = cck_n_rx;
367
cckpd_t->cck_pd_lv = lv;
368
cckpd_t->cck_fa_ma = CCK_FA_MA_RESET;
369
370
if (cck_n_rx == 2) {
371
if (cck_bw == CHANNEL_WIDTH_20) {
372
pd_th = cckpd_t->cck_pd_20m_2r;
373
cs_ratio = cckpd_t->cck_cs_ratio_20m_2r;
374
cck_mode = CCK_BW20_2R;
375
} else {
376
pd_th = cckpd_t->cck_pd_40m_2r;
377
cs_ratio = cckpd_t->cck_cs_ratio_40m_2r;
378
cck_mode = CCK_BW40_2R;
379
}
380
} else {
381
if (cck_bw == CHANNEL_WIDTH_20) {
382
pd_th = cckpd_t->cck_pd_20m_1r;
383
cs_ratio = cckpd_t->cck_cs_ratio_20m_1r;
384
cck_mode = CCK_BW20_1R;
385
} else {
386
pd_th = cckpd_t->cck_pd_40m_1r;
387
cs_ratio = cckpd_t->cck_cs_ratio_40m_1r;
388
cck_mode = CCK_BW40_1R;
389
}
390
}
391
392
if (lv == CCK_PD_LV_4) {
393
if (cck_n_rx == 2) {
394
pd_th += 4;
395
cs_ratio += 2;
396
} else {
397
pd_th += 4;
398
cs_ratio += 3;
399
}
400
} else if (lv == CCK_PD_LV_3) {
401
if (cck_n_rx == 2) {
402
pd_th += 3;
403
cs_ratio += 1;
404
} else {
405
pd_th += 3;
406
cs_ratio += 2;
407
}
408
} else if (lv == CCK_PD_LV_2) {
409
pd_th += 2;
410
cs_ratio += 1;
411
} else if (lv == CCK_PD_LV_1) {
412
pd_th += 1;
413
cs_ratio += 1;
414
}
415
#if 0
416
else if (lv == CCK_PD_LV_0) {
417
pd_th += 0;
418
cs_ratio += 0;
419
}
420
#endif
421
422
phydm_write_cck_pd_type3(dm, pd_th, cs_ratio, cck_mode);
423
}
424
425
void phydm_cckpd_type3(void *dm_void)
426
{
427
struct dm_struct *dm = (struct dm_struct *)dm_void;
428
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
429
enum cckpd_lv lv = CCK_PD_LV_INIT;
430
u8 igi = dm->dm_dig_table.cur_ig_value;
431
boolean is_update = true;
432
u8 pd_th = 0;
433
u8 cs_ratio = 0;
434
435
PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
436
437
if (dm->is_linked) {
438
if (igi > 0x38 && dm->rssi_min > 32) {
439
lv = CCK_PD_LV_4;
440
} else if ((igi > 0x2a) && (dm->rssi_min > 32)) {
441
lv = CCK_PD_LV_3;
442
} else if ((igi > 0x24) ||
443
(dm->rssi_min > 24 && dm->rssi_min <= 30)) {
444
lv = CCK_PD_LV_2;
445
} else if ((igi <= 0x24) || (dm->rssi_min < 22)) {
446
if (cckpd_t->cck_fa_ma > 1000)
447
lv = CCK_PD_LV_1;
448
else if (cckpd_t->cck_fa_ma < 500)
449
lv = CCK_PD_LV_0;
450
else
451
is_update = false;
452
}
453
} else {
454
if (cckpd_t->cck_fa_ma > 1000)
455
lv = CCK_PD_LV_1;
456
else if (cckpd_t->cck_fa_ma < 500)
457
lv = CCK_PD_LV_0;
458
else
459
is_update = false;
460
}
461
462
if (is_update)
463
phydm_set_cckpd_lv_type3(dm, lv);
464
465
if (cckpd_t->cck_n_rx == 2) {
466
if (cckpd_t->cck_bw == CHANNEL_WIDTH_20) {
467
pd_th = cckpd_t->cur_cck_pd_20m_2r;
468
cs_ratio = cckpd_t->cur_cck_cs_ratio_20m_2r;
469
} else {
470
pd_th = cckpd_t->cur_cck_pd_40m_2r;
471
cs_ratio = cckpd_t->cur_cck_cs_ratio_40m_2r;
472
}
473
} else {
474
if (cckpd_t->cck_bw == CHANNEL_WIDTH_20) {
475
pd_th = cckpd_t->cur_cck_pd_20m_1r;
476
cs_ratio = cckpd_t->cur_cck_cs_ratio_20m_1r;
477
} else {
478
pd_th = cckpd_t->cur_cck_pd_40m_1r;
479
cs_ratio = cckpd_t->cur_cck_cs_ratio_40m_1r;
480
}
481
}
482
PHYDM_DBG(dm, DBG_CCKPD,
483
"[%dR][%dM] is_linked=%d, lv=%d, cs_ratio=0x%x, pd_th=0x%x\n\n",
484
cckpd_t->cck_n_rx, 20 << cckpd_t->cck_bw, dm->is_linked,
485
cckpd_t->cck_pd_lv, cs_ratio, pd_th);
486
}
487
488
void phydm_cck_pd_init_type3(void *dm_void)
489
{
490
struct dm_struct *dm = (struct dm_struct *)dm_void;
491
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
492
u32 reg_tmp = 0;
493
494
/*Get Default value*/
495
cckpd_t->cck_pd_20m_1r = (u8)odm_get_bb_reg(dm, R_0xac8, 0xff);
496
cckpd_t->cck_pd_20m_2r = (u8)odm_get_bb_reg(dm, R_0xac8, 0xff00);
497
cckpd_t->cck_pd_40m_1r = (u8)odm_get_bb_reg(dm, R_0xacc, 0xff);
498
cckpd_t->cck_pd_40m_2r = (u8)odm_get_bb_reg(dm, R_0xacc, 0xff00);
499
500
reg_tmp = odm_get_bb_reg(dm, R_0xad0, MASKDWORD);
501
cckpd_t->cck_cs_ratio_20m_1r = (u8)(reg_tmp & 0x1f);
502
cckpd_t->cck_cs_ratio_20m_2r = (u8)((reg_tmp & 0x3e0) >> 5);
503
cckpd_t->cck_cs_ratio_40m_1r = (u8)((reg_tmp & 0x1f00000) >> 20);
504
cckpd_t->cck_cs_ratio_40m_2r = (u8)((reg_tmp & 0x3e000000) >> 25);
505
}
506
#endif /*#ifdef PHYDM_COMPILE_CCKPD_TYPE3*/
507
508
#ifdef PHYDM_COMPILE_CCKPD_TYPE4
509
void phydm_write_cck_pd_type4(void *dm_void, enum cckpd_lv lv,
510
enum cckpd_mode mode)
511
{
512
struct dm_struct *dm = (struct dm_struct *)dm_void;
513
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
514
u32 val = 0;
515
516
PHYDM_DBG(dm, DBG_CCKPD, "write CCK CCA parameters(CS_ratio & PD)\n");
517
switch (mode) {
518
case CCK_BW20_1R: /*RFBW20_1R*/
519
{
520
val = cckpd_t->cck_pd_table_jgr3[0][0][0][lv];
521
odm_set_bb_reg(dm, R_0x1ac8, 0xff, val);
522
val = cckpd_t->cck_pd_table_jgr3[0][0][1][lv];
523
odm_set_bb_reg(dm, R_0x1ad0, 0x1f, val);
524
} break;
525
case CCK_BW40_1R: /*RFBW40_1R*/
526
{
527
val = cckpd_t->cck_pd_table_jgr3[1][0][0][lv];
528
odm_set_bb_reg(dm, R_0x1acc, 0xff, val);
529
val = cckpd_t->cck_pd_table_jgr3[1][0][1][lv];
530
odm_set_bb_reg(dm, R_0x1ad0, 0x01F00000, val);
531
} break;
532
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
533
case CCK_BW20_2R: /*RFBW20_2R*/
534
{
535
val = cckpd_t->cck_pd_table_jgr3[0][1][0][lv];
536
odm_set_bb_reg(dm, R_0x1ac8, 0xff00, val);
537
val = cckpd_t->cck_pd_table_jgr3[0][1][1][lv];
538
odm_set_bb_reg(dm, R_0x1ad0, 0x3e0, val);
539
} break;
540
case CCK_BW40_2R: /*RFBW40_2R*/
541
{
542
val = cckpd_t->cck_pd_table_jgr3[1][1][0][lv];
543
odm_set_bb_reg(dm, R_0x1acc, 0xff00, val);
544
val = cckpd_t->cck_pd_table_jgr3[1][1][1][lv];
545
odm_set_bb_reg(dm, R_0x1ad0, 0x3E000000, val);
546
} break;
547
#endif
548
#if (defined(PHYDM_COMPILE_ABOVE_3SS))
549
case CCK_BW20_3R: /*RFBW20_3R*/
550
{
551
val = cckpd_t->cck_pd_table_jgr3[0][2][0][lv];
552
odm_set_bb_reg(dm, R_0x1ac8, 0xff0000, val);
553
val = cckpd_t->cck_pd_table_jgr3[0][2][1][lv];
554
odm_set_bb_reg(dm, R_0x1ad0, 0x7c00, val);
555
} break;
556
case CCK_BW40_3R: /*RFBW40_3R*/
557
{
558
val = cckpd_t->cck_pd_table_jgr3[1][2][0][lv];
559
odm_set_bb_reg(dm, R_0x1acc, 0xff0000, val);
560
val = cckpd_t->cck_pd_table_jgr3[1][2][1][lv] & 0x3;
561
odm_set_bb_reg(dm, R_0x1ad0, 0xC0000000, val);
562
val = (cckpd_t->cck_pd_table_jgr3[1][2][1][lv] & 0x1c) >> 2;
563
odm_set_bb_reg(dm, R_0x1ad4, 0x7, val);
564
} break;
565
#endif
566
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
567
case CCK_BW20_4R: /*RFBW20_4R*/
568
{
569
val = cckpd_t->cck_pd_table_jgr3[0][3][0][lv];
570
odm_set_bb_reg(dm, R_0x1ac8, 0xff000000, val);
571
val = cckpd_t->cck_pd_table_jgr3[0][3][1][lv];
572
odm_set_bb_reg(dm, R_0x1ad0, 0xF8000, val);
573
} break;
574
case CCK_BW40_4R: /*RFBW40_4R*/
575
{
576
val = cckpd_t->cck_pd_table_jgr3[1][3][0][lv];
577
odm_set_bb_reg(dm, R_0x1acc, 0xff000000, val);
578
val = cckpd_t->cck_pd_table_jgr3[1][3][1][lv];
579
odm_set_bb_reg(dm, R_0x1ad4, 0xf8, val);
580
} break;
581
#endif
582
default:
583
/*@pr_debug("[%s] warning!\n", __func__);*/
584
break;
585
}
586
}
587
588
void phydm_set_cck_pd_lv_type4(void *dm_void, enum cckpd_lv lv)
589
{
590
struct dm_struct *dm = (struct dm_struct *)dm_void;
591
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
592
enum cckpd_mode cck_mode = CCK_BW20_2R;
593
enum channel_width cck_bw = CHANNEL_WIDTH_20;
594
u8 cck_n_rx = 0;
595
u32 val = 0;
596
/*u32 val_dbg = 0;*/
597
598
PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
599
PHYDM_DBG(dm, DBG_CCKPD, "lv: (%d) -> (%d)\n", cckpd_t->cck_pd_lv, lv);
600
601
/*[Check Nrx]*/
602
cck_n_rx = (u8)odm_get_bb_reg(dm, R_0x1a2c, 0x60000) + 1;
603
604
/*[Check BW]*/
605
val = odm_get_bb_reg(dm, R_0x9b0, 0xc);
606
if (val == 0)
607
cck_bw = CHANNEL_WIDTH_20;
608
else if (val == 1)
609
cck_bw = CHANNEL_WIDTH_40;
610
else
611
cck_bw = CHANNEL_WIDTH_80;
612
613
/*[Check LV]*/
614
if (cckpd_t->cck_pd_lv == lv &&
615
cckpd_t->cck_n_rx == cck_n_rx &&
616
cckpd_t->cck_bw == cck_bw) {
617
PHYDM_DBG(dm, DBG_CCKPD, "stay in lv=%d\n", lv);
618
return;
619
}
620
621
cckpd_t->cck_bw = cck_bw;
622
cckpd_t->cck_n_rx = cck_n_rx;
623
cckpd_t->cck_pd_lv = lv;
624
cckpd_t->cck_fa_ma = CCK_FA_MA_RESET;
625
626
switch (cck_n_rx) {
627
case 1: /*1R*/
628
{
629
if (cck_bw == CHANNEL_WIDTH_20)
630
cck_mode = CCK_BW20_1R;
631
else if (cck_bw == CHANNEL_WIDTH_40)
632
cck_mode = CCK_BW40_1R;
633
} break;
634
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
635
case 2: /*2R*/
636
{
637
if (cck_bw == CHANNEL_WIDTH_20)
638
cck_mode = CCK_BW20_2R;
639
else if (cck_bw == CHANNEL_WIDTH_40)
640
cck_mode = CCK_BW40_2R;
641
} break;
642
#endif
643
#if (defined(PHYDM_COMPILE_ABOVE_3SS))
644
case 3: /*3R*/
645
{
646
if (cck_bw == CHANNEL_WIDTH_20)
647
cck_mode = CCK_BW20_3R;
648
else if (cck_bw == CHANNEL_WIDTH_40)
649
cck_mode = CCK_BW40_3R;
650
} break;
651
#endif
652
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
653
case 4: /*4R*/
654
{
655
if (cck_bw == CHANNEL_WIDTH_20)
656
cck_mode = CCK_BW20_4R;
657
else if (cck_bw == CHANNEL_WIDTH_40)
658
cck_mode = CCK_BW40_4R;
659
} break;
660
#endif
661
default:
662
/*@pr_debug("[%s] warning!\n", __func__);*/
663
break;
664
}
665
phydm_write_cck_pd_type4(dm, lv, cck_mode);
666
}
667
668
void phydm_read_cckpd_para_type4(void *dm_void)
669
{
670
struct dm_struct *dm = (struct dm_struct *)dm_void;
671
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
672
u8 bw = 0; /*r_RX_RF_BW*/
673
u8 n_rx = 0;
674
u8 curr_cck_pd_t[2][4][2];
675
u32 reg0 = 0;
676
u32 reg1 = 0;
677
u32 reg2 = 0;
678
u32 reg3 = 0;
679
680
bw = (u8)odm_get_bb_reg(dm, R_0x9b0, 0xc);
681
n_rx = (u8)odm_get_bb_reg(dm, R_0x1a2c, 0x60000) + 1;
682
683
reg0 = odm_get_bb_reg(dm, R_0x1ac8, MASKDWORD);
684
reg1 = odm_get_bb_reg(dm, R_0x1acc, MASKDWORD);
685
reg2 = odm_get_bb_reg(dm, R_0x1ad0, MASKDWORD);
686
reg3 = odm_get_bb_reg(dm, R_0x1ad4, MASKDWORD);
687
curr_cck_pd_t[0][0][0] = (u8)(reg0 & 0x000000ff);
688
curr_cck_pd_t[1][0][0] = (u8)(reg1 & 0x000000ff);
689
curr_cck_pd_t[0][0][1] = (u8)(reg2 & 0x0000001f);
690
curr_cck_pd_t[1][0][1] = (u8)((reg2 & 0x01f00000) >> 20);
691
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
692
if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS) {
693
curr_cck_pd_t[0][1][0] = (u8)((reg0 & 0x0000ff00) >> 8);
694
curr_cck_pd_t[1][1][0] = (u8)((reg1 & 0x0000ff00) >> 8);
695
curr_cck_pd_t[0][1][1] = (u8)((reg2 & 0x000003E0) >> 5);
696
curr_cck_pd_t[1][1][1] = (u8)((reg2 & 0x3E000000) >> 25);
697
}
698
#endif
699
#if (defined(PHYDM_COMPILE_ABOVE_3SS))
700
if (dm->support_ic_type & PHYDM_IC_ABOVE_3SS) {
701
curr_cck_pd_t[0][2][0] = (u8)((reg0 & 0x00ff0000) >> 16);
702
curr_cck_pd_t[1][2][0] = (u8)((reg1 & 0x00ff0000) >> 16);
703
curr_cck_pd_t[0][2][1] = (u8)((reg2 & 0x00007C00) >> 10);
704
curr_cck_pd_t[1][2][1] = (u8)((reg2 & 0xC0000000) >> 30) |
705
(u8)((reg3 & 0x00000007) << 3);
706
}
707
#endif
708
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
709
if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
710
curr_cck_pd_t[0][3][0] = (u8)((reg0 & 0xff000000) >> 24);
711
curr_cck_pd_t[1][3][0] = (u8)((reg1 & 0xff000000) >> 24);
712
curr_cck_pd_t[0][3][1] = (u8)((reg2 & 0x000F8000) >> 15);
713
curr_cck_pd_t[1][3][1] = (u8)((reg3 & 0x000000F8) >> 3);
714
}
715
#endif
716
717
PHYDM_DBG(dm, DBG_CCKPD, "bw=%dM, Nrx=%d\n", 20 << bw, n_rx);
718
PHYDM_DBG(dm, DBG_CCKPD, "lv=%d, readback CS_th=0x%x, PD th=0x%x\n",
719
cckpd_t->cck_pd_lv,
720
curr_cck_pd_t[bw][n_rx - 1][1],
721
curr_cck_pd_t[bw][n_rx - 1][0]);
722
}
723
724
void phydm_cckpd_type4(void *dm_void)
725
{
726
struct dm_struct *dm = (struct dm_struct *)dm_void;
727
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
728
u8 igi = dm->dm_dig_table.cur_ig_value;
729
enum cckpd_lv lv = 0;
730
boolean is_update = true;
731
732
PHYDM_DBG(dm, DBG_CCKPD, "%s ======>\n", __func__);
733
734
if (dm->is_linked) {
735
PHYDM_DBG(dm, DBG_CCKPD, "Linked!!!\n");
736
if (igi > 0x38 && dm->rssi_min > 32) {
737
lv = CCK_PD_LV_4;
738
PHYDM_DBG(dm, DBG_CCKPD, "Order 1\n");
739
} else if (igi > 0x2a && dm->rssi_min > 32) {
740
lv = CCK_PD_LV_3;
741
PHYDM_DBG(dm, DBG_CCKPD, "Order 2\n");
742
} else if (igi > 0x24 || dm->rssi_min > 24) {
743
lv = CCK_PD_LV_2;
744
PHYDM_DBG(dm, DBG_CCKPD, "Order 3\n");
745
} else {
746
if (cckpd_t->cck_fa_ma > 1000) {
747
lv = CCK_PD_LV_1;
748
PHYDM_DBG(dm, DBG_CCKPD, "Order 4-1\n");
749
} else if (cckpd_t->cck_fa_ma < 500) {
750
lv = CCK_PD_LV_0;
751
PHYDM_DBG(dm, DBG_CCKPD, "Order 4-2\n");
752
} else {
753
is_update = false;
754
PHYDM_DBG(dm, DBG_CCKPD, "Order 4-3\n");
755
}
756
}
757
} else {
758
PHYDM_DBG(dm, DBG_CCKPD, "UnLinked!!!\n");
759
if (cckpd_t->cck_fa_ma > 1000) {
760
lv = CCK_PD_LV_1;
761
PHYDM_DBG(dm, DBG_CCKPD, "Order 1\n");
762
} else if (cckpd_t->cck_fa_ma < 500) {
763
lv = CCK_PD_LV_0;
764
PHYDM_DBG(dm, DBG_CCKPD, "Order 2\n");
765
} else {
766
is_update = false;
767
PHYDM_DBG(dm, DBG_CCKPD, "Order 3\n");
768
}
769
}
770
771
if (is_update) {
772
phydm_set_cck_pd_lv_type4(dm, lv);
773
774
PHYDM_DBG(dm, DBG_CCKPD, "setting CS_th = 0x%x, PD th = 0x%x\n",
775
cckpd_t->cck_pd_table_jgr3[cckpd_t->cck_bw]
776
[cckpd_t->cck_n_rx - 1][1][lv],
777
cckpd_t->cck_pd_table_jgr3[cckpd_t->cck_bw]
778
[cckpd_t->cck_n_rx - 1][0][lv]);
779
}
780
phydm_read_cckpd_para_type4(dm);
781
}
782
783
void phydm_cck_pd_init_type4(void *dm_void)
784
{
785
struct dm_struct *dm = (struct dm_struct *)dm_void;
786
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
787
u32 reg0 = 0;
788
u32 reg1 = 0;
789
u32 reg2 = 0;
790
u32 reg3 = 0;
791
u8 pd_step = 0;
792
u8 cck_bw = 0; /*r_RX_RF_BW*/
793
u8 cck_n_rx = 0;
794
u8 val = 0;
795
u8 i = 0;
796
797
PHYDM_DBG(dm, DBG_CCKPD, "[%s]======>\n", __func__);
798
799
#if 0
800
/*@
801
*cckpd_t[0][0][0][0] = 1ac8[7:0] r_PD_lim_RFBW20_1R
802
*cckpd_t[0][1][0][0] = 1ac8[15:8] r_PD_lim_RFBW20_2R
803
*cckpd_t[0][2][0][0] = 1ac8[23:16] r_PD_lim_RFBW20_3R
804
*cckpd_t[0][3][0][0] = 1ac8[31:24] r_PD_lim_RFBW20_4R
805
*cckpd_t[1][0][0][0] = 1acc[7:0] r_PD_lim_RFBW40_1R
806
*cckpd_t[1][1][0][0] = 1acc[15:8] r_PD_lim_RFBW40_2R
807
*cckpd_t[1][2][0][0] = 1acc[23:16] r_PD_lim_RFBW40_3R
808
*cckpd_t[1][3][0][0] = 1acc[31:24] r_PD_lim_RFBW40_4R
809
*
810
*
811
*cckpd_t[0][0][1][0] = 1ad0[4:0] r_CS_ratio_RFBW20_1R[4:0]
812
*cckpd_t[0][1][1][0] = 1ad0[9:5] r_CS_ratio_RFBW20_2R[4:0]
813
*cckpd_t[0][2][1][0] = 1ad0[14:10] r_CS_ratio_RFBW20_3R[4:0]
814
*cckpd_t[0][3][1][0] = 1ad0[19:15] r_CS_ratio_RFBW20_4R[4:0]
815
*cckpd_t[1][0][1][0] = 1ad0[24:20] r_CS_ratio_RFBW40_1R[4:0]
816
*cckpd_t[1][1][1][0] = 1ad0[29:25] r_CS_ratio_RFBW40_2R[4:0]
817
*cckpd_t[1][2][1][0] = 1ad0[31:30] r_CS_ratio_RFBW40_3R[1:0]
818
* 1ad4[2:0] r_CS_ratio_RFBW40_3R[4:2]
819
*cckpd_t[1][3][1][0] = 1ad4[7:3] r_CS_ratio_RFBW40_4R[4:0]
820
*/
821
#endif
822
/*[Check Nrx]*/
823
cck_n_rx = (u8)odm_get_bb_reg(dm, R_0x1a2c, 0x60000) + 1;
824
825
/*[Check BW]*/
826
val = (u8)odm_get_bb_reg(dm, R_0x9b0, 0xc);
827
if (val == 0)
828
cck_bw = CHANNEL_WIDTH_20;
829
else if (val == 1)
830
cck_bw = CHANNEL_WIDTH_40;
831
else
832
cck_bw = CHANNEL_WIDTH_80;
833
834
cckpd_t->cck_bw = cck_bw;
835
cckpd_t->cck_n_rx = cck_n_rx;
836
reg0 = odm_get_bb_reg(dm, R_0x1ac8, MASKDWORD);
837
reg1 = odm_get_bb_reg(dm, R_0x1acc, MASKDWORD);
838
reg2 = odm_get_bb_reg(dm, R_0x1ad0, MASKDWORD);
839
reg3 = odm_get_bb_reg(dm, R_0x1ad4, MASKDWORD);
840
841
for (i = 0 ; i < CCK_PD_LV_MAX ; i++) {
842
pd_step = i * 2;
843
844
val = (u8)(reg0 & 0x000000ff) + pd_step;
845
PHYDM_DBG(dm, DBG_CCKPD, "lvl %d val = %x\n\n", i, val);
846
cckpd_t->cck_pd_table_jgr3[0][0][0][i] = val;
847
848
val = (u8)(reg1 & 0x000000ff) + pd_step;
849
cckpd_t->cck_pd_table_jgr3[1][0][0][i] = val;
850
851
val = (u8)(reg2 & 0x0000001F) + pd_step;
852
cckpd_t->cck_pd_table_jgr3[0][0][1][i] = val;
853
854
val = (u8)((reg2 & 0x01F00000) >> 20) + pd_step;
855
cckpd_t->cck_pd_table_jgr3[1][0][1][i] = val;
856
857
#ifdef PHYDM_COMPILE_ABOVE_2SS
858
if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS) {
859
val = (u8)((reg0 & 0x0000ff00) >> 8) + pd_step;
860
cckpd_t->cck_pd_table_jgr3[0][1][0][i] = val;
861
862
val = (u8)((reg1 & 0x0000ff00) >> 8) + pd_step;
863
cckpd_t->cck_pd_table_jgr3[1][1][0][i] = val;
864
865
val = (u8)((reg2 & 0x000003E0) >> 5) + pd_step;
866
cckpd_t->cck_pd_table_jgr3[0][1][1][i] = val;
867
868
val = (u8)((reg2 & 0x3E000000) >> 25) + pd_step;
869
cckpd_t->cck_pd_table_jgr3[1][1][1][i] = val;
870
}
871
#endif
872
873
#ifdef PHYDM_COMPILE_ABOVE_3SS
874
if (dm->support_ic_type & PHYDM_IC_ABOVE_3SS) {
875
val = (u8)((reg0 & 0x00ff0000) >> 16) + pd_step;
876
cckpd_t->cck_pd_table_jgr3[0][2][0][i] = val;
877
878
val = (u8)((reg1 & 0x00ff0000) >> 16) + pd_step;
879
cckpd_t->cck_pd_table_jgr3[1][2][0][i] = val;
880
val = (u8)((reg2 & 0x00007C00) >> 10) + pd_step;
881
cckpd_t->cck_pd_table_jgr3[0][2][1][i] = val;
882
val = (u8)(((reg2 & 0xC0000000) >> 30) |
883
((reg3 & 0x7) << 3)) + pd_step;
884
cckpd_t->cck_pd_table_jgr3[1][2][1][i] = val;
885
}
886
#endif
887
888
#ifdef PHYDM_COMPILE_ABOVE_4SS
889
if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
890
val = (u8)((reg0 & 0xff000000) >> 24) + pd_step;
891
cckpd_t->cck_pd_table_jgr3[0][3][0][i] = val;
892
893
val = (u8)((reg1 & 0xff000000) >> 24) + pd_step;
894
cckpd_t->cck_pd_table_jgr3[1][3][0][i] = val;
895
896
val = (u8)((reg2 & 0x000F8000) >> 15) + pd_step;
897
cckpd_t->cck_pd_table_jgr3[0][3][1][i] = val;
898
899
val = (u8)((reg3 & 0x000000F8) >> 3) + pd_step;
900
cckpd_t->cck_pd_table_jgr3[1][3][1][i] = val;
901
}
902
#endif
903
}
904
}
905
906
void phydm_invalid_cckpd_type4(void *dm_void)
907
{
908
struct dm_struct *dm = (struct dm_struct *)dm_void;
909
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
910
u8 val = 0;
911
u8 i = 0;
912
u8 k = 0;
913
914
PHYDM_DBG(dm, DBG_CCKPD, "[%s]======>\n", __func__);
915
916
for (i = 0; i < CCK_PD_LV_MAX; i++) {
917
for (k = RF_PATH_A; k < dm->num_rf_path; k++) {
918
val = cckpd_t->cck_pd_table_jgr3[0][k][1][i];
919
920
if (val == INVALID_CS_RATIO_0)
921
cckpd_t->cck_pd_table_jgr3[0][k][1][i] = 28;
922
else if (val == INVALID_CS_RATIO_1)
923
cckpd_t->cck_pd_table_jgr3[0][k][1][i] = 30;
924
else if (val > MAXVALID_CS_RATIO)
925
cckpd_t->cck_pd_table_jgr3[0][k][1][i] =
926
MAXVALID_CS_RATIO;
927
val = cckpd_t->cck_pd_table_jgr3[1][k][1][i];
928
929
if (val == INVALID_CS_RATIO_0)
930
cckpd_t->cck_pd_table_jgr3[1][k][1][i] = 28;
931
else if (val == INVALID_CS_RATIO_1)
932
cckpd_t->cck_pd_table_jgr3[1][k][1][i] = 30;
933
else if (val > MAXVALID_CS_RATIO)
934
cckpd_t->cck_pd_table_jgr3[1][k][1][i] =
935
MAXVALID_CS_RATIO;
936
val = cckpd_t->cck_pd_table_jgr3[0][k][0][i];
937
938
if (val > MAXVALID_PD_THRES)
939
cckpd_t->cck_pd_table_jgr3[0][k][0][i] =
940
MAXVALID_PD_THRES;
941
val = cckpd_t->cck_pd_table_jgr3[1][k][0][i];
942
if (val > MAXVALID_PD_THRES)
943
cckpd_t->cck_pd_table_jgr3[1][k][0][i] =
944
MAXVALID_PD_THRES;
945
}
946
}
947
}
948
949
#endif /*#ifdef PHYDM_COMPILE_CCKPD_TYPE4*/
950
951
void phydm_set_cckpd_val(void *dm_void, u32 *val_buf, u8 val_len)
952
{
953
struct dm_struct *dm = (struct dm_struct *)dm_void;
954
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
955
enum cckpd_lv lv;
956
957
if (val_len != 1) {
958
PHYDM_DBG(dm, ODM_COMP_API, "[Error][CCKPD]Need val_len=1\n");
959
return;
960
}
961
962
lv = (enum cckpd_lv)val_buf[0];
963
964
if (lv > CCK_PD_LV_4) {
965
pr_debug("[%s] warning! lv=%d\n", __func__, lv);
966
return;
967
}
968
969
switch (cckpd_t->cckpd_hw_type) {
970
#ifdef PHYDM_COMPILE_CCKPD_TYPE1
971
case 1:
972
phydm_set_cckpd_lv_type1(dm, lv);
973
break;
974
#endif
975
#ifdef PHYDM_COMPILE_CCKPD_TYPE2
976
case 2:
977
phydm_set_cckpd_lv_type2(dm, lv);
978
break;
979
#endif
980
#ifdef PHYDM_COMPILE_CCKPD_TYPE3
981
case 3:
982
phydm_set_cckpd_lv_type3(dm, lv);
983
break;
984
#endif
985
#ifdef PHYDM_COMPILE_CCKPD_TYPE4
986
case 4:
987
phydm_set_cck_pd_lv_type4(dm, lv);
988
break;
989
#endif
990
default:
991
pr_debug("[%s]warning\n", __func__);
992
break;
993
}
994
}
995
996
boolean
997
phydm_stop_cck_pd_th(void *dm_void)
998
{
999
struct dm_struct *dm = (struct dm_struct *)dm_void;
1000
1001
if (!(dm->support_ability & (ODM_BB_CCK_PD | ODM_BB_FA_CNT))) {
1002
PHYDM_DBG(dm, DBG_CCKPD, "Not Support\n");
1003
return true;
1004
}
1005
1006
if (dm->pause_ability & ODM_BB_CCK_PD) {
1007
PHYDM_DBG(dm, DBG_CCKPD, "Return: Pause CCKPD in LV=%d\n",
1008
dm->pause_lv_table.lv_cckpd);
1009
return true;
1010
}
1011
1012
if (dm->is_linked && (*dm->channel > 36)) {
1013
PHYDM_DBG(dm, DBG_CCKPD, "Return: 5G CH=%d\n", *dm->channel);
1014
return true;
1015
}
1016
return false;
1017
}
1018
1019
void phydm_cck_pd_th(void *dm_void)
1020
{
1021
struct dm_struct *dm = (struct dm_struct *)dm_void;
1022
struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
1023
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
1024
u32 cck_fa = fa_t->cnt_cck_fail;
1025
#ifdef PHYDM_TDMA_DIG_SUPPORT
1026
struct phydm_fa_acc_struct *fa_acc_t = &dm->false_alm_cnt_acc;
1027
#endif
1028
1029
PHYDM_DBG(dm, DBG_CCKPD, "[%s] ======>\n", __func__);
1030
1031
if (phydm_stop_cck_pd_th(dm))
1032
return;
1033
1034
#ifdef PHYDM_TDMA_DIG_SUPPORT
1035
if (dm->original_dig_restore)
1036
cck_fa = fa_t->cnt_cck_fail;
1037
else
1038
cck_fa = fa_acc_t->cnt_cck_fail_1sec;
1039
#endif
1040
1041
if (cckpd_t->cck_fa_ma == CCK_FA_MA_RESET)
1042
cckpd_t->cck_fa_ma = cck_fa;
1043
else
1044
cckpd_t->cck_fa_ma = (cckpd_t->cck_fa_ma * 3 + cck_fa) >> 2;
1045
1046
PHYDM_DBG(dm, DBG_CCKPD,
1047
"IGI=0x%x, rssi_min=%d, cck_fa=%d, cck_fa_ma=%d\n",
1048
dm->dm_dig_table.cur_ig_value, dm->rssi_min,
1049
cck_fa, cckpd_t->cck_fa_ma);
1050
1051
switch (cckpd_t->cckpd_hw_type) {
1052
#ifdef PHYDM_COMPILE_CCKPD_TYPE1
1053
case 1:
1054
phydm_cckpd_type1(dm);
1055
break;
1056
#endif
1057
#ifdef PHYDM_COMPILE_CCKPD_TYPE2
1058
case 2:
1059
phydm_cckpd_type2(dm);
1060
break;
1061
#endif
1062
#ifdef PHYDM_COMPILE_CCKPD_TYPE3
1063
case 3:
1064
phydm_cckpd_type3(dm);
1065
break;
1066
#endif
1067
#ifdef PHYDM_COMPILE_CCKPD_TYPE4
1068
case 4:
1069
phydm_cckpd_type4(dm);
1070
break;
1071
#endif
1072
default:
1073
pr_debug("[%s]warning\n", __func__);
1074
break;
1075
}
1076
}
1077
1078
void phydm_cck_pd_init(void *dm_void)
1079
{
1080
struct dm_struct *dm = (struct dm_struct *)dm_void;
1081
struct phydm_cckpd_struct *cckpd_t = &dm->dm_cckpd_table;
1082
1083
if (dm->support_ic_type & CCK_PD_IC_TYPE1)
1084
cckpd_t->cckpd_hw_type = 1;
1085
else if (dm->support_ic_type & CCK_PD_IC_TYPE2)
1086
cckpd_t->cckpd_hw_type = 2;
1087
else if (dm->support_ic_type & CCK_PD_IC_TYPE3)
1088
cckpd_t->cckpd_hw_type = 3;
1089
else if (dm->support_ic_type & CCK_PD_IC_TYPE4)
1090
cckpd_t->cckpd_hw_type = 4;
1091
1092
PHYDM_DBG(dm, DBG_CCKPD, "[%s] cckpd_hw_type=%d\n",
1093
__func__, cckpd_t->cckpd_hw_type);
1094
1095
cckpd_t->cck_pd_lv = CCK_PD_LV_INIT;
1096
cckpd_t->cck_n_rx = 0xff;
1097
cckpd_t->cck_bw = CHANNEL_WIDTH_MAX;
1098
1099
switch (cckpd_t->cckpd_hw_type) {
1100
#ifdef PHYDM_COMPILE_CCKPD_TYPE1
1101
case 1:
1102
phydm_set_cckpd_lv_type1(dm, CCK_PD_LV_0);
1103
break;
1104
#endif
1105
#ifdef PHYDM_COMPILE_CCKPD_TYPE2
1106
case 2:
1107
cckpd_t->aaa_default = odm_read_1byte(dm, 0xaaa) & 0x1f;
1108
phydm_set_cckpd_lv_type2(dm, CCK_PD_LV_0);
1109
break;
1110
#endif
1111
#ifdef PHYDM_COMPILE_CCKPD_TYPE3
1112
case 3:
1113
phydm_cck_pd_init_type3(dm);
1114
phydm_set_cckpd_lv_type3(dm, CCK_PD_LV_0);
1115
break;
1116
#endif
1117
#ifdef PHYDM_COMPILE_CCKPD_TYPE4
1118
case 4:
1119
phydm_cck_pd_init_type4(dm);
1120
phydm_invalid_cckpd_type4(dm);
1121
phydm_set_cck_pd_lv_type4(dm, CCK_PD_LV_0);
1122
break;
1123
#endif
1124
default:
1125
pr_debug("[%s]warning\n", __func__);
1126
break;
1127
}
1128
}
1129
#endif /*#ifdef PHYDM_SUPPORT_CCKPD*/
1130
1131
1132