Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_ccx.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
#include "mp_precomp.h"
27
#include "phydm_precomp.h"
28
29
void phydm_ccx_hw_restart(void *dm_void)
30
/*@Will Restart NHM/CLM/FAHM simultaneously*/
31
{
32
struct dm_struct *dm = (struct dm_struct *)dm_void;
33
u32 reg1 = 0;
34
35
if (dm->support_ic_type & ODM_IC_11AC_SERIES)
36
reg1 = R_0x994;
37
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
38
else if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
39
reg1 = R_0x1e60;
40
#endif
41
else
42
reg1 = R_0x890;
43
44
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
45
/*@disable NHM,CLM, FAHM*/
46
odm_set_bb_reg(dm, reg1, 0x7, 0x0);
47
odm_set_bb_reg(dm, reg1, BIT(8), 0x0);
48
odm_set_bb_reg(dm, reg1, BIT(8), 0x1);
49
}
50
51
#ifdef FAHM_SUPPORT
52
53
u16 phydm_hw_divider(void *dm_void, u16 numerator, u16 denumerator)
54
{
55
struct dm_struct *dm = (struct dm_struct *)dm_void;
56
u16 result = DEVIDER_ERROR;
57
u32 tmp_u32 = ((numerator << 16) | denumerator);
58
u32 reg_devider_input;
59
u32 reg;
60
u8 i;
61
62
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
63
64
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
65
reg_devider_input = 0x1cbc;
66
reg = 0x1f98;
67
} else {
68
reg_devider_input = 0x980;
69
reg = 0x9f0;
70
}
71
72
odm_set_bb_reg(dm, reg_devider_input, MASKDWORD, tmp_u32);
73
74
for (i = 0; i < 10; i++) {
75
ODM_delay_ms(1);
76
if (odm_get_bb_reg(dm, reg, BIT(24))) {
77
/*@Chk HW rpt is ready*/
78
79
result = (u16)odm_get_bb_reg(dm, reg, MASKBYTE2);
80
break;
81
}
82
}
83
return result;
84
}
85
86
void phydm_fahm_trigger(void *dm_void, u16 tgr_period)
87
{ /*@unit (4us)*/
88
struct dm_struct *dm = (struct dm_struct *)dm_void;
89
u32 fahm_reg1;
90
91
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
92
odm_set_bb_reg(dm, R_0x1cf8, 0xffff00, tgr_period);
93
94
fahm_reg1 = 0x994;
95
} else {
96
odm_set_bb_reg(dm, R_0x978, 0xff000000, (tgr_period & 0xff));
97
odm_set_bb_reg(dm, R_0x97c, 0xff, (tgr_period & 0xff00) >> 8);
98
99
fahm_reg1 = 0x890;
100
}
101
102
odm_set_bb_reg(dm, fahm_reg1, BIT(2), 0);
103
odm_set_bb_reg(dm, fahm_reg1, BIT(2), 1);
104
}
105
106
void phydm_fahm_set_valid_cnt(void *dm_void, u8 numerator_sel,
107
u8 denominator_sel)
108
{
109
struct dm_struct *dm = (struct dm_struct *)dm_void;
110
struct ccx_info *ccx_info = &dm->dm_ccx_info;
111
u32 fahm_reg1;
112
113
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
114
115
if (ccx_info->fahm_nume_sel == numerator_sel &&
116
ccx_info->fahm_denom_sel == denominator_sel) {
117
PHYDM_DBG(dm, DBG_ENV_MNTR, "no need to update\n");
118
return;
119
}
120
121
ccx_info->fahm_nume_sel = numerator_sel;
122
ccx_info->fahm_denom_sel = denominator_sel;
123
124
if (dm->support_ic_type & ODM_IC_11AC_SERIES)
125
fahm_reg1 = 0x994;
126
else
127
fahm_reg1 = 0x890;
128
129
odm_set_bb_reg(dm, fahm_reg1, 0xe0, numerator_sel);
130
odm_set_bb_reg(dm, fahm_reg1, 0x7000, denominator_sel);
131
}
132
133
void phydm_fahm_get_result(void *dm_void)
134
{
135
struct dm_struct *dm = (struct dm_struct *)dm_void;
136
u16 fahm_cnt[12]; /*packet count*/
137
u16 fahm_rpt[12]; /*percentage*/
138
u16 denominator; /*@fahm_denominator packet count*/
139
u32 reg_rpt, reg_rpt_2;
140
u32 reg_tmp;
141
boolean is_ready = false;
142
u8 i;
143
144
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
145
146
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
147
reg_rpt = 0x1f80;
148
reg_rpt_2 = 0x1f98;
149
} else {
150
reg_rpt = 0x9d8;
151
reg_rpt_2 = 0x9f0;
152
}
153
154
for (i = 0; i < 3; i++) {
155
if (odm_get_bb_reg(dm, reg_rpt_2, BIT(31))) {
156
/*@Chk HW rpt is ready*/
157
is_ready = true;
158
break;
159
}
160
ODM_delay_ms(1);
161
}
162
163
if (!is_ready)
164
return;
165
166
/*@Get FAHM Denominator*/
167
denominator = (u16)odm_get_bb_reg(dm, reg_rpt_2, MASKLWORD);
168
169
PHYDM_DBG(dm, DBG_ENV_MNTR, "Reg[0x%x] fahm_denmrtr = %d\n", reg_rpt_2,
170
denominator);
171
172
/*@Get FAHM nemerator*/
173
for (i = 0; i < 6; i++) {
174
reg_tmp = odm_get_bb_reg(dm, reg_rpt + (i << 2), MASKDWORD);
175
176
PHYDM_DBG(dm, DBG_ENV_MNTR, "Reg[0x%x] fahm_denmrtr = %d\n",
177
reg_rpt + (i * 4), reg_tmp);
178
179
fahm_cnt[i * 2] = (u16)(reg_tmp & MASKLWORD);
180
fahm_cnt[i * 2 + 1] = (u16)((reg_tmp & MASKHWORD) >> 16);
181
}
182
183
for (i = 0; i < 12; i++)
184
fahm_rpt[i] = phydm_hw_divider(dm, fahm_cnt[i], denominator);
185
186
PHYDM_DBG(dm, DBG_ENV_MNTR,
187
"FAHM_RPT_cnt[10:0]=[%d, %d, %d, %d, %d(IGI), %d, %d, %d, %d, %d, %d, %d]\n",
188
fahm_cnt[11], fahm_cnt[10], fahm_cnt[9],
189
fahm_cnt[8], fahm_cnt[7], fahm_cnt[6],
190
fahm_cnt[5], fahm_cnt[4], fahm_cnt[3],
191
fahm_cnt[2], fahm_cnt[1], fahm_cnt[0]);
192
193
PHYDM_DBG(dm, DBG_ENV_MNTR,
194
"FAHM_RPT[10:0]=[%d, %d, %d, %d, %d(IGI), %d, %d, %d, %d, %d, %d, %d]\n",
195
fahm_rpt[11], fahm_rpt[10], fahm_rpt[9], fahm_rpt[8],
196
fahm_rpt[7], fahm_rpt[6], fahm_rpt[5], fahm_rpt[4],
197
fahm_rpt[3], fahm_rpt[2], fahm_rpt[1], fahm_rpt[0]);
198
}
199
200
void phydm_fahm_set_th_by_igi(void *dm_void, u8 igi)
201
{
202
struct dm_struct *dm = (struct dm_struct *)dm_void;
203
struct ccx_info *ccx_info = &dm->dm_ccx_info;
204
u32 val = 0;
205
u8 f_th[11]; /*@FAHM Threshold*/
206
u8 rssi_th[11]; /*@in RSSI scale*/
207
u8 th_gap = 2 * IGI_TO_NHM_TH_MULTIPLIER; /*unit is 0.5dB for FAHM*/
208
u8 i;
209
210
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
211
212
if (ccx_info->env_mntr_igi == igi) {
213
PHYDM_DBG(dm, DBG_ENV_MNTR,
214
"No need to update FAHM_th, IGI=0x%x\n",
215
ccx_info->env_mntr_igi);
216
return;
217
}
218
219
ccx_info->env_mntr_igi = igi; /*@bkp IGI*/
220
221
if (igi >= CCA_CAP)
222
f_th[0] = (igi - CCA_CAP) * IGI_TO_NHM_TH_MULTIPLIER;
223
else
224
f_th[0] = 0;
225
226
rssi_th[0] = igi - 10 - CCA_CAP;
227
228
for (i = 1; i <= 10; i++) {
229
f_th[i] = f_th[0] + th_gap * i;
230
rssi_th[i] = rssi_th[0] + (i << 1);
231
}
232
233
PHYDM_DBG(dm, DBG_ENV_MNTR,
234
"FAHM_RSSI_th[10:0]=[%d, %d, %d, (IGI)%d, %d, %d, %d, %d, %d, %d, %d]\n",
235
rssi_th[10], rssi_th[9], rssi_th[8], rssi_th[7], rssi_th[6],
236
rssi_th[5], rssi_th[4], rssi_th[3], rssi_th[2], rssi_th[1],
237
rssi_th[0]);
238
239
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
240
val = BYTE_2_DWORD(0, f_th[2], f_th[1], f_th[0]);
241
odm_set_bb_reg(dm, R_0x1c38, 0xffffff00, val);
242
val = BYTE_2_DWORD(0, f_th[5], f_th[4], f_th[3]);
243
odm_set_bb_reg(dm, R_0x1c78, 0xffffff00, val);
244
val = BYTE_2_DWORD(0, 0, f_th[7], f_th[6]);
245
odm_set_bb_reg(dm, R_0x1c7c, 0xffff0000, val);
246
val = BYTE_2_DWORD(0, f_th[10], f_th[9], f_th[8]);
247
odm_set_bb_reg(dm, R_0x1cb8, 0xffffff00, val);
248
} else {
249
val = BYTE_2_DWORD(f_th[3], f_th[2], f_th[1], f_th[0]);
250
odm_set_bb_reg(dm, R_0x970, MASKDWORD, val);
251
val = BYTE_2_DWORD(f_th[7], f_th[6], f_th[5], f_th[4]);
252
odm_set_bb_reg(dm, R_0x974, MASKDWORD, val);
253
val = BYTE_2_DWORD(0, f_th[10], f_th[9], f_th[8]);
254
odm_set_bb_reg(dm, R_0x978, 0xffffff, val);
255
}
256
}
257
258
void phydm_fahm_init(void *dm_void)
259
{
260
struct dm_struct *dm = (struct dm_struct *)dm_void;
261
struct ccx_info *ccx_info = &dm->dm_ccx_info;
262
u32 fahm_reg1;
263
u8 denumerator_sel = 0;
264
265
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
266
PHYDM_DBG(dm, DBG_ENV_MNTR, "IGI=0x%x\n",
267
dm->dm_dig_table.cur_ig_value);
268
269
if (dm->support_ic_type & ODM_IC_11AC_SERIES)
270
fahm_reg1 = 0x994;
271
else
272
fahm_reg1 = 0x890;
273
274
ccx_info->fahm_period = 65535;
275
276
odm_set_bb_reg(dm, fahm_reg1, 0x6, 3); /*@FAHM HW block enable*/
277
278
denumerator_sel = FAHM_INCLD_FA | FAHM_INCLD_CRC_OK | FAHM_INCLD_CRC_ER;
279
phydm_fahm_set_valid_cnt(dm, FAHM_INCLD_FA, denumerator_sel);
280
phydm_fahm_set_th_by_igi(dm, dm->dm_dig_table.cur_ig_value);
281
}
282
283
void phydm_fahm_dbg(void *dm_void, char input[][16], u32 *_used, char *output,
284
u32 *_out_len)
285
{
286
struct dm_struct *dm = (struct dm_struct *)dm_void;
287
struct ccx_info *ccx_info = &dm->dm_ccx_info;
288
char help[] = "-h";
289
u32 var1[10] = {0};
290
u32 used = *_used;
291
u32 out_len = *_out_len;
292
u32 i;
293
294
for (i = 0; i < 2; i++) {
295
if (input[i + 1])
296
PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);
297
}
298
299
if ((strcmp(input[1], help) == 0)) {
300
PDM_SNPF(out_len, used, output + used, out_len - used,
301
"{1: trigger, 2:get result}\n");
302
PDM_SNPF(out_len, used, output + used, out_len - used,
303
"{3: MNTR mode sel} {1: driver, 2. FW}\n");
304
return;
305
} else if (var1[0] == 1) { /* Set & trigger CLM */
306
307
phydm_fahm_set_th_by_igi(dm, dm->dm_dig_table.cur_ig_value);
308
phydm_fahm_trigger(dm, ccx_info->fahm_period);
309
PDM_SNPF(out_len, used, output + used, out_len - used,
310
"Monitor FAHM for %d * 4us\n", ccx_info->fahm_period);
311
312
} else if (var1[0] == 2) { /* @Get CLM results */
313
314
phydm_fahm_get_result(dm);
315
PDM_SNPF(out_len, used, output + used, out_len - used,
316
"FAHM_result=%d us\n", (ccx_info->clm_result << 2));
317
318
} else {
319
PDM_SNPF(out_len, used, output + used, out_len - used,
320
"Error\n");
321
}
322
323
*_used = used;
324
*_out_len = out_len;
325
}
326
327
#endif /*@#ifdef FAHM_SUPPORT*/
328
329
#ifdef NHM_SUPPORT
330
331
void phydm_nhm_racing_release(void *dm_void)
332
{
333
struct dm_struct *dm = (struct dm_struct *)dm_void;
334
struct ccx_info *ccx = &dm->dm_ccx_info;
335
u32 value32 = 0;
336
337
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
338
PHYDM_DBG(dm, DBG_ENV_MNTR, "lv:(%d)->(0)\n", ccx->nhm_set_lv);
339
340
ccx->nhm_ongoing = false;
341
ccx->nhm_set_lv = NHM_RELEASE;
342
343
if (!(ccx->nhm_app == NHM_BACKGROUND || ccx->nhm_app == NHM_ACS)) {
344
phydm_pause_func(dm, F00_DIG, PHYDM_RESUME,
345
PHYDM_PAUSE_LEVEL_1, 1, &value32);
346
}
347
348
ccx->nhm_app = NHM_BACKGROUND;
349
}
350
351
u8 phydm_nhm_racing_ctrl(void *dm_void, enum phydm_nhm_level nhm_lv)
352
{
353
struct dm_struct *dm = (struct dm_struct *)dm_void;
354
struct ccx_info *ccx = &dm->dm_ccx_info;
355
u8 set_result = PHYDM_SET_SUCCESS;
356
/*@acquire to control NHM API*/
357
358
PHYDM_DBG(dm, DBG_ENV_MNTR, "nhm_ongoing=%d, lv:(%d)->(%d)\n",
359
ccx->nhm_ongoing, ccx->nhm_set_lv, nhm_lv);
360
if (ccx->nhm_ongoing) {
361
if (nhm_lv <= ccx->nhm_set_lv) {
362
set_result = PHYDM_SET_FAIL;
363
} else {
364
phydm_ccx_hw_restart(dm);
365
ccx->nhm_ongoing = false;
366
}
367
}
368
369
if (set_result)
370
ccx->nhm_set_lv = nhm_lv;
371
372
PHYDM_DBG(dm, DBG_ENV_MNTR, "nhm racing success=%d\n", set_result);
373
return set_result;
374
}
375
376
void phydm_nhm_trigger(void *dm_void)
377
{
378
struct dm_struct *dm = (struct dm_struct *)dm_void;
379
struct ccx_info *ccx = &dm->dm_ccx_info;
380
u32 nhm_reg1 = 0;
381
382
if (dm->support_ic_type & ODM_IC_11AC_SERIES)
383
nhm_reg1 = R_0x994;
384
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
385
else if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
386
nhm_reg1 = R_0x1e60;
387
#endif
388
else
389
nhm_reg1 = R_0x890;
390
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
391
392
/* @Trigger NHM*/
393
pdm_set_reg(dm, nhm_reg1, BIT(1), 0);
394
pdm_set_reg(dm, nhm_reg1, BIT(1), 1);
395
ccx->nhm_trigger_time = dm->phydm_sys_up_time;
396
ccx->nhm_rpt_stamp++;
397
ccx->nhm_ongoing = true;
398
}
399
400
boolean
401
phydm_nhm_check_rdy(void *dm_void)
402
{
403
struct dm_struct *dm = (struct dm_struct *)dm_void;
404
boolean is_ready = false;
405
u32 reg1 = 0, reg1_bit = 0;
406
407
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
408
reg1 = R_0xfb4;
409
reg1_bit = 16;
410
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
411
} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
412
reg1 = R_0x2d4c;
413
reg1_bit = 16;
414
#endif
415
} else {
416
reg1 = R_0x8b4;
417
if (dm->support_ic_type & (ODM_RTL8710B | ODM_RTL8721D |
418
ODM_RTL8710C))
419
reg1_bit = 25;
420
else
421
reg1_bit = 17;
422
}
423
if (odm_get_bb_reg(dm, reg1, BIT(reg1_bit)))
424
is_ready = true;
425
426
PHYDM_DBG(dm, DBG_ENV_MNTR, "NHM rdy=%d\n", is_ready);
427
428
return is_ready;
429
}
430
431
void phydm_nhm_get_utility(void *dm_void)
432
{
433
struct dm_struct *dm = (struct dm_struct *)dm_void;
434
struct ccx_info *ccx = &dm->dm_ccx_info;
435
u8 nhm_rpt_non_0 = 0;
436
437
if (ccx->nhm_rpt_sum >= ccx->nhm_result[0]) {
438
nhm_rpt_non_0 = ccx->nhm_rpt_sum - ccx->nhm_result[0];
439
ccx->nhm_ratio = (nhm_rpt_non_0 * 100) >> 8;
440
} else {
441
PHYDM_DBG(dm, DBG_ENV_MNTR, "[warning] nhm_rpt_sum invalid\n");
442
ccx->nhm_ratio = 0;
443
}
444
445
PHYDM_DBG(dm, DBG_ENV_MNTR, "nhm_ratio=%d\n", ccx->nhm_ratio);
446
}
447
448
boolean
449
phydm_nhm_get_result(void *dm_void)
450
{
451
struct dm_struct *dm = (struct dm_struct *)dm_void;
452
struct ccx_info *ccx = &dm->dm_ccx_info;
453
u32 value32 = 0;
454
u8 i = 0;
455
u32 nhm_reg1 = 0;
456
u16 nhm_rpt_sum_tmp = 0;
457
458
if (dm->support_ic_type & ODM_IC_11AC_SERIES)
459
nhm_reg1 = R_0x994;
460
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
461
else if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
462
nhm_reg1 = R_0x1e60;
463
#endif
464
else
465
nhm_reg1 = R_0x890;
466
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
467
468
if (!(dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8812F |
469
ODM_RTL8197G)))
470
pdm_set_reg(dm, nhm_reg1, BIT(1), 0);
471
472
if (!(phydm_nhm_check_rdy(dm))) {
473
PHYDM_DBG(dm, DBG_ENV_MNTR, "Get NHM report Fail\n");
474
phydm_nhm_racing_release(dm);
475
return false;
476
}
477
478
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
479
value32 = odm_read_4byte(dm, R_0xfa8);
480
odm_move_memory(dm, &ccx->nhm_result[0], &value32, 4);
481
482
value32 = odm_read_4byte(dm, R_0xfac);
483
odm_move_memory(dm, &ccx->nhm_result[4], &value32, 4);
484
485
value32 = odm_read_4byte(dm, R_0xfb0);
486
odm_move_memory(dm, &ccx->nhm_result[8], &value32, 4);
487
488
/*@Get NHM duration*/
489
value32 = odm_read_4byte(dm, R_0xfb4);
490
ccx->nhm_duration = (u16)(value32 & MASKLWORD);
491
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
492
} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
493
value32 = odm_read_4byte(dm, R_0x2d40);
494
odm_move_memory(dm, &ccx->nhm_result[0], &value32, 4);
495
496
value32 = odm_read_4byte(dm, R_0x2d44);
497
odm_move_memory(dm, &ccx->nhm_result[4], &value32, 4);
498
499
value32 = odm_read_4byte(dm, R_0x2d48);
500
odm_move_memory(dm, &ccx->nhm_result[8], &value32, 4);
501
502
/*@Get NHM duration*/
503
value32 = odm_read_4byte(dm, R_0x2d4c);
504
ccx->nhm_duration = (u16)(value32 & MASKLWORD);
505
#endif
506
} else {
507
value32 = odm_read_4byte(dm, R_0x8d8);
508
odm_move_memory(dm, &ccx->nhm_result[0], &value32, 4);
509
510
value32 = odm_read_4byte(dm, R_0x8dc);
511
odm_move_memory(dm, &ccx->nhm_result[4], &value32, 4);
512
513
value32 = odm_get_bb_reg(dm, R_0x8d0, 0xffff0000);
514
odm_move_memory(dm, &ccx->nhm_result[8], &value32, 2);
515
516
value32 = odm_read_4byte(dm, R_0x8d4);
517
518
ccx->nhm_result[10] = (u8)((value32 & MASKBYTE2) >> 16);
519
ccx->nhm_result[11] = (u8)((value32 & MASKBYTE3) >> 24);
520
521
/*@Get NHM duration*/
522
ccx->nhm_duration = (u16)(value32 & MASKLWORD);
523
}
524
525
/* sum all nhm_result */
526
if (ccx->nhm_period >= 65530) {
527
value32 = (ccx->nhm_duration * 100) >> 16;
528
PHYDM_DBG(dm, DBG_ENV_MNTR,
529
"NHM valid time = %d, valid: %d percent\n",
530
ccx->nhm_duration, value32);
531
}
532
533
for (i = 0; i < NHM_RPT_NUM; i++)
534
nhm_rpt_sum_tmp += (u16)ccx->nhm_result[i];
535
536
ccx->nhm_rpt_sum = (u8)nhm_rpt_sum_tmp;
537
538
PHYDM_DBG(dm, DBG_ENV_MNTR,
539
"NHM_Rpt[%d](H->L)[%d %d %d %d %d %d %d %d %d %d %d %d]\n",
540
ccx->nhm_rpt_stamp, ccx->nhm_result[11], ccx->nhm_result[10],
541
ccx->nhm_result[9], ccx->nhm_result[8], ccx->nhm_result[7],
542
ccx->nhm_result[6], ccx->nhm_result[5], ccx->nhm_result[4],
543
ccx->nhm_result[3], ccx->nhm_result[2], ccx->nhm_result[1],
544
ccx->nhm_result[0]);
545
546
phydm_nhm_racing_release(dm);
547
548
if (nhm_rpt_sum_tmp > 255) {
549
PHYDM_DBG(dm, DBG_ENV_MNTR,
550
"[Warning] Invalid NHM RPT, total=%d\n",
551
nhm_rpt_sum_tmp);
552
return false;
553
}
554
555
return true;
556
}
557
558
void phydm_nhm_set_th_reg(void *dm_void)
559
{
560
struct dm_struct *dm = (struct dm_struct *)dm_void;
561
struct ccx_info *ccx = &dm->dm_ccx_info;
562
u32 reg1 = 0, reg2 = 0, reg3 = 0, reg4 = 0, reg4_bit = 0;
563
u32 val = 0;
564
565
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
566
567
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
568
reg1 = R_0x994;
569
reg2 = R_0x998;
570
reg3 = R_0x99c;
571
reg4 = R_0x9a0;
572
reg4_bit = MASKBYTE0;
573
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
574
} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
575
reg1 = R_0x1e60;
576
reg2 = R_0x1e44;
577
reg3 = R_0x1e48;
578
reg4 = R_0x1e5c;
579
reg4_bit = MASKBYTE2;
580
#endif
581
} else {
582
reg1 = R_0x890;
583
reg2 = R_0x898;
584
reg3 = R_0x89c;
585
reg4 = R_0xe28;
586
reg4_bit = MASKBYTE0;
587
}
588
589
/*Set NHM threshold*/ /*Unit: PWdB U(8,1)*/
590
val = BYTE_2_DWORD(ccx->nhm_th[3], ccx->nhm_th[2],
591
ccx->nhm_th[1], ccx->nhm_th[0]);
592
pdm_set_reg(dm, reg2, MASKDWORD, val);
593
val = BYTE_2_DWORD(ccx->nhm_th[7], ccx->nhm_th[6],
594
ccx->nhm_th[5], ccx->nhm_th[4]);
595
pdm_set_reg(dm, reg3, MASKDWORD, val);
596
pdm_set_reg(dm, reg4, reg4_bit, ccx->nhm_th[8]);
597
val = BYTE_2_DWORD(0, 0, ccx->nhm_th[10], ccx->nhm_th[9]);
598
pdm_set_reg(dm, reg1, 0xffff0000, val);
599
600
PHYDM_DBG(dm, DBG_ENV_MNTR,
601
"Update NHM_th[H->L]=[%d %d %d %d %d %d %d %d %d %d %d]\n",
602
ccx->nhm_th[10], ccx->nhm_th[9], ccx->nhm_th[8],
603
ccx->nhm_th[7], ccx->nhm_th[6], ccx->nhm_th[5],
604
ccx->nhm_th[4], ccx->nhm_th[3], ccx->nhm_th[2],
605
ccx->nhm_th[1], ccx->nhm_th[0]);
606
}
607
608
boolean
609
phydm_nhm_th_update_chk(void *dm_void, enum nhm_application nhm_app, u8 *nhm_th,
610
u32 *igi_new)
611
{
612
struct dm_struct *dm = (struct dm_struct *)dm_void;
613
struct ccx_info *ccx = &dm->dm_ccx_info;
614
boolean is_update = false;
615
u8 igi_curr = phydm_get_igi(dm, BB_PATH_A);
616
u8 nhm_igi_th_11k_low[NHM_TH_NUM] = {0x12, 0x15, 0x18, 0x1b, 0x1e,
617
0x23, 0x28, 0x2c, 0x78,
618
0x78, 0x78};
619
u8 nhm_igi_th_11k_high[NHM_TH_NUM] = {0x1e, 0x23, 0x28, 0x2d, 0x32,
620
0x37, 0x78, 0x78, 0x78, 0x78,
621
0x78};
622
u8 nhm_igi_th_xbox[NHM_TH_NUM] = {0x1a, 0x2c, 0x2e, 0x30, 0x32, 0x34,
623
0x36, 0x38, 0x3a, 0x3c, 0x3d};
624
u8 i = 0;
625
u8 th_tmp = igi_curr - CCA_CAP;
626
u8 th_step = 2;
627
628
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
629
PHYDM_DBG(dm, DBG_ENV_MNTR, "App=%d, nhm_igi=0x%x, igi_curr=0x%x\n",
630
nhm_app, ccx->nhm_igi, igi_curr);
631
632
if (igi_curr < 0x10) /* Protect for invalid IGI*/
633
return false;
634
635
switch (nhm_app) {
636
case NHM_BACKGROUND: /* @Get IGI form driver parameter(cur_ig_value)*/
637
if (ccx->nhm_igi != igi_curr || ccx->nhm_app != nhm_app) {
638
is_update = true;
639
*igi_new = (u32)igi_curr;
640
641
#ifdef NHM_DYM_PW_TH_SUPPORT
642
if ((dm->support_ic_type & ODM_IC_JGR3_SERIES) &&
643
ccx->nhm_dym_pw_th_en) {
644
th_tmp = MAX_2(igi_curr - DYM_PWTH_CCA_CAP, 0);
645
th_step = 3;
646
}
647
#endif
648
649
nhm_th[0] = (u8)IGI_2_NHM_TH(th_tmp);
650
651
for (i = 1; i <= 10; i++)
652
nhm_th[i] = nhm_th[0] +
653
IGI_2_NHM_TH(th_step * i);
654
655
}
656
break;
657
658
case NHM_ACS:
659
if (ccx->nhm_igi != igi_curr || ccx->nhm_app != nhm_app) {
660
is_update = true;
661
*igi_new = (u32)igi_curr;
662
nhm_th[0] = (u8)IGI_2_NHM_TH(igi_curr - CCA_CAP);
663
for (i = 1; i <= 10; i++)
664
nhm_th[i] = nhm_th[0] + IGI_2_NHM_TH(2 * i);
665
}
666
break;
667
668
case IEEE_11K_HIGH:
669
is_update = true;
670
*igi_new = 0x2c;
671
for (i = 0; i < NHM_TH_NUM; i++)
672
nhm_th[i] = IGI_2_NHM_TH(nhm_igi_th_11k_high[i]);
673
break;
674
675
case IEEE_11K_LOW:
676
is_update = true;
677
*igi_new = 0x20;
678
for (i = 0; i < NHM_TH_NUM; i++)
679
nhm_th[i] = IGI_2_NHM_TH(nhm_igi_th_11k_low[i]);
680
break;
681
682
case INTEL_XBOX:
683
is_update = true;
684
*igi_new = 0x36;
685
for (i = 0; i < NHM_TH_NUM; i++)
686
nhm_th[i] = IGI_2_NHM_TH(nhm_igi_th_xbox[i]);
687
break;
688
689
case NHM_DBG: /*@Get IGI form register*/
690
igi_curr = phydm_get_igi(dm, BB_PATH_A);
691
if (ccx->nhm_igi != igi_curr || ccx->nhm_app != nhm_app) {
692
is_update = true;
693
*igi_new = (u32)igi_curr;
694
nhm_th[0] = (u8)IGI_2_NHM_TH(igi_curr - CCA_CAP);
695
for (i = 1; i <= 10; i++)
696
nhm_th[i] = nhm_th[0] + IGI_2_NHM_TH(2 * i);
697
}
698
break;
699
}
700
701
if (is_update) {
702
PHYDM_DBG(dm, DBG_ENV_MNTR, "[Update NHM_TH] igi_RSSI=%d\n",
703
IGI_2_RSSI(*igi_new));
704
705
for (i = 0; i < NHM_TH_NUM; i++) {
706
PHYDM_DBG(dm, DBG_ENV_MNTR, "NHM_th[%d](RSSI) = %d\n",
707
i, NTH_TH_2_RSSI(nhm_th[i]));
708
}
709
} else {
710
PHYDM_DBG(dm, DBG_ENV_MNTR, "No need to update NHM_TH\n");
711
}
712
return is_update;
713
}
714
715
void phydm_nhm_set(void *dm_void, enum nhm_option_txon_all include_tx,
716
enum nhm_option_cca_all include_cca,
717
enum nhm_divider_opt_all divi_opt,
718
enum nhm_application nhm_app, u16 period)
719
{
720
struct dm_struct *dm = (struct dm_struct *)dm_void;
721
struct ccx_info *ccx = &dm->dm_ccx_info;
722
u8 nhm_th[NHM_TH_NUM] = {0};
723
u32 igi = 0x20;
724
u32 reg1 = 0, reg2 = 0;
725
u32 val_tmp = 0;
726
727
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
728
729
PHYDM_DBG(dm, DBG_ENV_MNTR,
730
"incld{tx, cca}={%d, %d}, divi_opt=%d, period=%d\n",
731
include_tx, include_cca, divi_opt, period);
732
733
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
734
reg1 = R_0x994;
735
reg2 = R_0x990;
736
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
737
} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
738
reg1 = R_0x1e60;
739
reg2 = R_0x1e40;
740
#endif
741
} else {
742
reg1 = R_0x890;
743
reg2 = R_0x894;
744
}
745
746
/*Set disable_ignore_cca, disable_ignore_txon, ccx_en*/
747
if (include_tx != ccx->nhm_include_txon ||
748
include_cca != ccx->nhm_include_cca ||
749
divi_opt != ccx->nhm_divider_opt) {
750
/* some old ic is not supported on NHM divider option */
751
if (dm->support_ic_type & (ODM_RTL8188E | ODM_RTL8723B |
752
ODM_RTL8195A | ODM_RTL8192E)) {
753
val_tmp = (u32)((include_tx << 2) |
754
(include_cca << 1) | 1);
755
pdm_set_reg(dm, reg1, 0x700, val_tmp);
756
} else {
757
val_tmp = (u32)BIT_2_BYTE(divi_opt, include_tx,
758
include_cca, 1);
759
pdm_set_reg(dm, reg1, 0xf00, val_tmp);
760
}
761
ccx->nhm_include_txon = include_tx;
762
ccx->nhm_include_cca = include_cca;
763
ccx->nhm_divider_opt = divi_opt;
764
#if 0
765
PHYDM_DBG(dm, DBG_ENV_MNTR,
766
"val_tmp=%d, incld{tx, cca}={%d, %d}, divi_opt=%d, period=%d\n",
767
val_tmp, include_tx, include_cca, divi_opt, period);
768
769
PHYDM_DBG(dm, DBG_ENV_MNTR, "0x994=0x%x\n",
770
odm_get_bb_reg(dm, 0x994, 0xf00));
771
#endif
772
}
773
774
/*Set NHM period*/
775
if (period != ccx->nhm_period) {
776
pdm_set_reg(dm, reg2, MASKHWORD, period);
777
PHYDM_DBG(dm, DBG_ENV_MNTR,
778
"Update NHM period ((%d)) -> ((%d))\n",
779
ccx->nhm_period, period);
780
781
ccx->nhm_period = period;
782
}
783
784
/*Set NHM threshold*/
785
if (phydm_nhm_th_update_chk(dm, nhm_app, &(nhm_th[0]), &igi)) {
786
/*Pause IGI*/
787
if (nhm_app == NHM_BACKGROUND || nhm_app == NHM_ACS) {
788
PHYDM_DBG(dm, DBG_ENV_MNTR, "DIG Free Run\n");
789
} else if (phydm_pause_func(dm, F00_DIG, PHYDM_PAUSE,
790
PHYDM_PAUSE_LEVEL_1, 1, &igi)
791
== PAUSE_FAIL) {
792
PHYDM_DBG(dm, DBG_ENV_MNTR, "pause DIG Fail\n");
793
return;
794
} else {
795
PHYDM_DBG(dm, DBG_ENV_MNTR, "pause DIG=0x%x\n", igi);
796
}
797
ccx->nhm_app = nhm_app;
798
ccx->nhm_igi = (u8)igi;
799
odm_move_memory(dm, &ccx->nhm_th[0], &nhm_th, NHM_TH_NUM);
800
801
/*Set NHM th*/
802
phydm_nhm_set_th_reg(dm);
803
}
804
}
805
806
u8 phydm_nhm_mntr_set(void *dm_void, struct nhm_para_info *nhm_para)
807
{
808
struct dm_struct *dm = (struct dm_struct *)dm_void;
809
u16 nhm_time = 0; /*unit: 4us*/
810
811
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
812
813
if (nhm_para->mntr_time == 0)
814
return PHYDM_SET_FAIL;
815
816
if (nhm_para->nhm_lv >= NHM_MAX_NUM) {
817
PHYDM_DBG(dm, DBG_ENV_MNTR, "Wrong LV=%d\n", nhm_para->nhm_lv);
818
return PHYDM_SET_FAIL;
819
}
820
821
if (phydm_nhm_racing_ctrl(dm, nhm_para->nhm_lv) == PHYDM_SET_FAIL)
822
return PHYDM_SET_FAIL;
823
824
if (nhm_para->mntr_time >= 262)
825
nhm_time = NHM_PERIOD_MAX;
826
else
827
nhm_time = nhm_para->mntr_time * MS_TO_4US_RATIO;
828
829
phydm_nhm_set(dm, nhm_para->incld_txon, nhm_para->incld_cca,
830
nhm_para->div_opt, nhm_para->nhm_app, nhm_time);
831
832
return PHYDM_SET_SUCCESS;
833
}
834
835
void phydm_nhm_cal_noise(void *dm_void, u8 start_i, u8 end_i, u8 n_sum)
836
{
837
struct dm_struct *dm = (struct dm_struct *)dm_void;
838
struct ccx_info *ccx = &dm->dm_ccx_info;
839
u8 i = 0;
840
u32 noise_tmp = 0;
841
u8 noise = 0;
842
u8 th_step = 2;
843
u32 nhm_valid = 0;
844
845
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
846
847
if (n_sum == 0) {
848
PHYDM_DBG(dm, DBG_ENV_MNTR,
849
"n_sum = 0, don't need to update noise\n");
850
return;
851
} else if (end_i > NHM_RPT_NUM - 1) {
852
PHYDM_DBG(dm, DBG_ENV_MNTR,
853
"[WARNING]end_i is larger than 11!!\n");
854
return;
855
}
856
857
#ifdef NHM_DYM_PW_TH_SUPPORT
858
if ((dm->support_ic_type & ODM_IC_JGR3_SERIES) &&
859
ccx->nhm_dym_pw_th_en)
860
th_step = 3;
861
#endif
862
863
for (i = start_i; i <= end_i; i++)
864
noise_tmp += ccx->nhm_result[i] * (ccx->nhm_th[0] - th_step +
865
th_step * i * 2);
866
867
/* protection for the case of minus noise(RSSI)*/
868
noise = (u8)(NTH_TH_2_RSSI(MAX_2(PHYDM_DIV(noise_tmp, n_sum), 20)));
869
ccx->nhm_noise_pwr = noise;
870
ccx->nhm_noise_pwr_point = n_sum;
871
nhm_valid = (n_sum * 100) >> 8;
872
PHYDM_DBG(dm, DBG_ENV_MNTR,
873
"valid: ((%d)) percent, noise(RSSI)=((%d)), nhm_r[11](RSSI > %d)=((%d))\n",
874
nhm_valid, noise, NTH_TH_2_RSSI(ccx->nhm_th[NHM_TH_NUM - 1]),
875
ccx->nhm_result[NHM_RPT_NUM - 1]);
876
}
877
878
#ifdef NHM_DYM_PW_TH_SUPPORT
879
void
880
phydm_nhm_restore_pw_th(void *dm_void)
881
{
882
struct dm_struct *dm = (struct dm_struct *)dm_void;
883
struct ccx_info *ccx = &dm->dm_ccx_info;
884
885
odm_set_bb_reg(dm, R_0x82c, 0x3f, ccx->nhm_pw_th_rf20_dft);
886
}
887
888
void
889
phydm_nhm_set_pw_th(void *dm_void, u8 noise, boolean chk_succ)
890
{
891
struct dm_struct *dm = (struct dm_struct *)dm_void;
892
struct ccx_info *ccx = &dm->dm_ccx_info;
893
u8 pre_pw_th_rf20 = 0;
894
u8 new_pw_th_rf20 = 0;
895
u8 pw_th_u_bnd = 0;
896
s8 noise_diff = 0;
897
u8 point_mean = 15;
898
899
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
900
901
if (*dm->band_width != CHANNEL_WIDTH_20 ||
902
*dm->band_type == ODM_BAND_5G) {
903
PHYDM_DBG(dm, DBG_ENV_MNTR, "bandwidth=((%d)), band=((%d))\n",
904
*dm->band_width, *dm->band_type);
905
phydm_nhm_restore_pw_th(dm);
906
return;
907
}
908
909
pre_pw_th_rf20 = (u8)odm_get_bb_reg(dm, R_0x82c, 0x3f);
910
911
/* @pre_pw_th can not be lower than default value*/
912
if (pre_pw_th_rf20 < ccx->nhm_pw_th_rf20_dft) {
913
PHYDM_DBG(dm, DBG_ENV_MNTR,
914
"pre_pw_th=((%d)), new_pw_th=((%d))\n",
915
pre_pw_th_rf20, ccx->nhm_pw_th_rf20_dft);
916
917
phydm_nhm_restore_pw_th(dm);
918
return;
919
}
920
921
if (chk_succ) {
922
noise_diff = noise - (ccx->nhm_igi - 10);
923
pw_th_u_bnd = (u8)(noise_diff + 32 + point_mean);
924
925
pw_th_u_bnd = MIN_2(pw_th_u_bnd, ccx->nhm_pw_th_max);
926
927
PHYDM_DBG(dm, DBG_ENV_MNTR,
928
"noise_diff=((%d)), max=((%d)), pw_th_u_bnd=((%d))\n",
929
noise_diff, ccx->nhm_pw_th_max, pw_th_u_bnd);
930
931
if (pw_th_u_bnd > pre_pw_th_rf20) {
932
new_pw_th_rf20 = pre_pw_th_rf20 + 1;
933
} else if (pw_th_u_bnd == pre_pw_th_rf20) {
934
new_pw_th_rf20 = pre_pw_th_rf20;
935
} else {
936
if (pre_pw_th_rf20 > ccx->nhm_pw_th_rf20_dft)
937
new_pw_th_rf20 = pre_pw_th_rf20 - 1;
938
else /* @pre_pw_th = ccx->nhm_pw_th_dft*/
939
new_pw_th_rf20 = pre_pw_th_rf20;
940
}
941
} else {
942
if (pre_pw_th_rf20 > ccx->nhm_pw_th_rf20_dft)
943
new_pw_th_rf20 = pre_pw_th_rf20 - 1;
944
else /* @pre_pw_th = ccx->nhm_pw_th_dft*/
945
new_pw_th_rf20 = pre_pw_th_rf20;
946
}
947
948
PHYDM_DBG(dm, DBG_ENV_MNTR, "pre_pw_th=((%d)), new_pw_th=((%d))\n",
949
pre_pw_th_rf20, new_pw_th_rf20);
950
951
if (new_pw_th_rf20 != pre_pw_th_rf20)
952
odm_set_bb_reg(dm, R_0x82c, 0x3f, new_pw_th_rf20);
953
}
954
955
void
956
phydm_nhm_dym_pw_th_1peak(void *dm_void)
957
{
958
struct dm_struct *dm = (struct dm_struct *)dm_void;
959
struct ccx_info *ccx = &dm->dm_ccx_info;
960
u8 i = 0;
961
u8 max_i = 0;
962
u8 m_dif_l1 = 0;
963
u8 m_dif_r1 = 0;
964
u8 patt_case = 0;
965
u8 l1_dif_r2 = 0;
966
u8 l2_dif_r1 = 0;
967
u8 l1_dif_r1 = 0;
968
u8 n_sum = 0;
969
u8 r1_dif_r2 = 0;
970
u8 l1_dif_l2 = 0;
971
u8 noise = 0;
972
boolean chk_succ = false;
973
974
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
975
976
/* @step1*/
977
for (i = 1; i < NHM_RPT_NUM; i++) {
978
if (ccx->nhm_result[i] >= ccx->nhm_result[max_i])
979
max_i = i;
980
}
981
982
if (max_i == 0 || max_i == (NHM_RPT_NUM - 1)) {
983
PHYDM_DBG(dm, DBG_ENV_MNTR, "max index can not be 0 or 11\n");
984
phydm_nhm_set_pw_th(dm, 0, chk_succ);
985
return;
986
}
987
988
/* @step2*/
989
m_dif_l1 = ccx->nhm_result[max_i] - ccx->nhm_result[max_i - 1];
990
m_dif_r1 = ccx->nhm_result[max_i] - ccx->nhm_result[max_i + 1];
991
992
if (m_dif_r1 <= NHM_TH1 && (max_i != NHM_RPT_NUM - 1))
993
patt_case = NHM_1PEAK_PS;
994
else if ((m_dif_l1 <= NHM_TH1) && (max_i != 0))
995
patt_case = NHM_1PEAK_NS;
996
else
997
patt_case = NHM_1PEAK_SYM;
998
999
switch (patt_case) {
1000
case NHM_1PEAK_PS:
1001
/* @step3*/
1002
l1_dif_r2 = DIFF_2(ccx->nhm_result[max_i - 1],
1003
ccx->nhm_result[max_i + 2]);
1004
if (l1_dif_r2 > NHM_TH2) {
1005
PHYDM_DBG(dm, DBG_ENV_MNTR, "S3 fail:c1((%d))\n",
1006
l1_dif_r2);
1007
break;
1008
}
1009
/* @step4*/
1010
n_sum = ccx->nhm_result[max_i - 1] + ccx->nhm_result[max_i] +
1011
ccx->nhm_result[max_i + 1] + ccx->nhm_result[max_i + 2];
1012
if (n_sum < NHM_TH4) {
1013
PHYDM_DBG(dm, DBG_ENV_MNTR, "S4 fail:((%d))\n", n_sum);
1014
break;
1015
}
1016
/* @step5*/
1017
r1_dif_r2 = DIFF_2(ccx->nhm_result[max_i + 1],
1018
ccx->nhm_result[max_i + 2]);
1019
if (m_dif_l1 < NHM_TH5 || r1_dif_r2 < NHM_TH5) {
1020
PHYDM_DBG(dm, DBG_ENV_MNTR, "S5 fail:c1((%d, %d))\n",
1021
m_dif_l1, r1_dif_r2);
1022
break;
1023
}
1024
/* @step6*/
1025
chk_succ = true;
1026
phydm_nhm_cal_noise(dm, max_i - 1, max_i + 2, n_sum);
1027
break;
1028
case NHM_1PEAK_NS:
1029
/* @step3*/
1030
l2_dif_r1 = DIFF_2(ccx->nhm_result[max_i - 2],
1031
ccx->nhm_result[max_i + 1]);
1032
if (l2_dif_r1 > NHM_TH2) {
1033
PHYDM_DBG(dm, DBG_ENV_MNTR, "S3 fail:c2((%d))\n",
1034
l2_dif_r1);
1035
break;
1036
}
1037
/* @step4*/
1038
n_sum = ccx->nhm_result[max_i - 2] +
1039
ccx->nhm_result[max_i - 1] +
1040
ccx->nhm_result[max_i] + ccx->nhm_result[max_i + 1];
1041
if (n_sum < NHM_TH4) {
1042
PHYDM_DBG(dm, DBG_ENV_MNTR, "S4 fail:((%d))\n", n_sum);
1043
break;
1044
}
1045
/* @step5*/
1046
l1_dif_l2 = DIFF_2(ccx->nhm_result[max_i - 1],
1047
ccx->nhm_result[max_i - 2]);
1048
if (m_dif_r1 < NHM_TH5 || l1_dif_l2 < NHM_TH5) {
1049
PHYDM_DBG(dm, DBG_ENV_MNTR, "S5 fail:c2((%d, %d))\n",
1050
m_dif_r1, l1_dif_l2);
1051
break;
1052
}
1053
/* @step6*/
1054
chk_succ = true;
1055
phydm_nhm_cal_noise(dm, max_i - 2, max_i + 1, n_sum);
1056
break;
1057
case NHM_1PEAK_SYM:
1058
/* @step3*/
1059
l1_dif_r1 = DIFF_2(ccx->nhm_result[max_i - 1],
1060
ccx->nhm_result[max_i + 1]);
1061
if (l1_dif_r1 > NHM_TH3) {
1062
PHYDM_DBG(dm, DBG_ENV_MNTR, "S3 fail: c3((%d))\n",
1063
l1_dif_r1);
1064
break;
1065
}
1066
/* @step4*/
1067
n_sum = ccx->nhm_result[max_i - 1] + ccx->nhm_result[max_i] +
1068
ccx->nhm_result[max_i + 1];
1069
if (n_sum < NHM_TH4) {
1070
PHYDM_DBG(dm, DBG_ENV_MNTR, "S4 fail:((%d))\n", n_sum);
1071
break;
1072
}
1073
/* @step5*/
1074
if (m_dif_l1 < NHM_TH6 || m_dif_r1 < NHM_TH6) {
1075
PHYDM_DBG(dm, DBG_ENV_MNTR, "S5 fail:c3((%d, %d))\n",
1076
m_dif_l1, m_dif_r1);
1077
break;
1078
}
1079
/* @step6*/
1080
chk_succ = true;
1081
phydm_nhm_cal_noise(dm, max_i - 1, max_i + 1, n_sum);
1082
break;
1083
}
1084
phydm_nhm_set_pw_th(dm, ccx->nhm_noise_pwr, chk_succ);
1085
}
1086
1087
void
1088
phydm_nhm_dym_pw_th_sl(void *dm_void)
1089
{
1090
struct dm_struct *dm = (struct dm_struct *)dm_void;
1091
struct ccx_info *ccx = &dm->dm_ccx_info;
1092
u8 i = 0;
1093
u8 n_sum = 0;
1094
u8 noise = 0;
1095
boolean chk_succ = false;
1096
1097
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
1098
1099
for (i = 0; i < NHM_RPT_NUM - 3; i++) {
1100
n_sum = ccx->nhm_result[i] + ccx->nhm_result[i + 1] +
1101
ccx->nhm_result[i + 2] + ccx->nhm_result[i + 3];
1102
if (n_sum >= ccx->nhm_sl_pw_th) {
1103
PHYDM_DBG(dm, DBG_ENV_MNTR, "Do sl[%d:%d]\n", i, i + 3);
1104
chk_succ = true;
1105
phydm_nhm_cal_noise(dm, i, i + 3, n_sum);
1106
break;
1107
}
1108
}
1109
1110
if (!chk_succ)
1111
PHYDM_DBG(dm, DBG_ENV_MNTR, "SL method failed!\n");
1112
1113
phydm_nhm_set_pw_th(dm, ccx->nhm_noise_pwr, chk_succ);
1114
}
1115
1116
void
1117
phydm_nhm_dym_pw_th(void *dm_void)
1118
{
1119
struct dm_struct *dm = (struct dm_struct *)dm_void;
1120
struct ccx_info *ccx = &dm->dm_ccx_info;
1121
1122
if (ccx->nhm_dym_1_peak_en)
1123
phydm_nhm_dym_pw_th_1peak(dm);
1124
else
1125
phydm_nhm_dym_pw_th_sl(dm);
1126
}
1127
1128
void
1129
phydm_nhm_dym_pw_th_patch_id_chk(void *dm_void)
1130
{
1131
struct dm_struct *dm = (struct dm_struct *)dm_void;
1132
struct ccx_info *ccx = &dm->dm_ccx_info;
1133
1134
if (dm->iot_table.phydm_patch_id == 0x100f0401) {
1135
ccx->nhm_dym_pw_th_en = true;
1136
} else {
1137
if (ccx->nhm_dym_pw_th_en) {
1138
phydm_nhm_restore_pw_th(dm);
1139
ccx->nhm_dym_pw_th_en = false;
1140
}
1141
}
1142
}
1143
#endif
1144
1145
/*@Environment Monitor*/
1146
boolean
1147
phydm_nhm_mntr_chk(void *dm_void, u16 monitor_time /*unit ms*/)
1148
{
1149
struct dm_struct *dm = (struct dm_struct *)dm_void;
1150
struct ccx_info *ccx = &dm->dm_ccx_info;
1151
struct nhm_para_info nhm_para = {0};
1152
boolean nhm_chk_result = false;
1153
u32 sys_return_time = 0;
1154
1155
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
1156
1157
if (ccx->nhm_manual_ctrl) {
1158
PHYDM_DBG(dm, DBG_ENV_MNTR, "NHM in manual ctrl\n");
1159
return nhm_chk_result;
1160
}
1161
sys_return_time = ccx->nhm_trigger_time + MAX_ENV_MNTR_TIME;
1162
if (ccx->nhm_app != NHM_BACKGROUND &&
1163
(sys_return_time > dm->phydm_sys_up_time)) {
1164
PHYDM_DBG(dm, DBG_ENV_MNTR,
1165
"nhm_app=%d, trigger_time %d, sys_time=%d\n",
1166
ccx->nhm_app, ccx->nhm_trigger_time,
1167
dm->phydm_sys_up_time);
1168
1169
return nhm_chk_result;
1170
}
1171
1172
/*@[NHM get result & calculate Utility----------------------------*/
1173
#ifdef NHM_DYM_PW_TH_SUPPORT
1174
if (!(ccx->dym_pwth_manual_ctrl))
1175
phydm_nhm_dym_pw_th_patch_id_chk(dm);
1176
#endif
1177
1178
if (phydm_nhm_get_result(dm)) {
1179
PHYDM_DBG(dm, DBG_ENV_MNTR, "Get NHM_rpt success\n");
1180
phydm_nhm_get_utility(dm);
1181
1182
#ifdef NHM_DYM_PW_TH_SUPPORT
1183
if ((dm->support_ic_type & ODM_IC_JGR3_SERIES) &&
1184
ccx->nhm_dym_pw_th_en)
1185
phydm_nhm_dym_pw_th(dm);
1186
else
1187
#endif
1188
/* bypass r[11]*/
1189
phydm_nhm_cal_noise(dm, 0, NHM_RPT_NUM - 2,
1190
ccx->nhm_rpt_sum -
1191
ccx->nhm_result[11]);
1192
} else {
1193
#ifdef NHM_DYM_PW_TH_SUPPORT
1194
if ((dm->support_ic_type & ODM_IC_JGR3_SERIES) &&
1195
ccx->nhm_dym_pw_th_en)
1196
phydm_nhm_set_pw_th(dm, 0, false);
1197
#endif
1198
}
1199
1200
/*@[NHM trigger setting]------------------------------------------*/
1201
nhm_para.incld_txon = NHM_EXCLUDE_TXON;
1202
nhm_para.incld_cca = NHM_EXCLUDE_CCA;
1203
#ifdef NHM_DYM_PW_TH_SUPPORT
1204
if ((dm->support_ic_type & ODM_IC_JGR3_SERIES) &&
1205
ccx->nhm_app == NHM_BACKGROUND && ccx->nhm_dym_pw_th_en)
1206
nhm_para.div_opt = NHM_VALID;
1207
else
1208
#endif
1209
nhm_para.div_opt = NHM_CNT_ALL;
1210
1211
nhm_para.nhm_app = NHM_BACKGROUND;
1212
nhm_para.nhm_lv = NHM_LV_1;
1213
#ifdef NHM_DYM_PW_TH_SUPPORT
1214
if ((dm->support_ic_type & ODM_IC_JGR3_SERIES) &&
1215
ccx->nhm_app == NHM_BACKGROUND && ccx->nhm_dym_pw_th_en)
1216
nhm_para.mntr_time = monitor_time >> ccx->nhm_period_decre;
1217
else
1218
#endif
1219
nhm_para.mntr_time = monitor_time;
1220
1221
nhm_chk_result = phydm_nhm_mntr_set(dm, &nhm_para);
1222
1223
return nhm_chk_result;
1224
}
1225
1226
void phydm_nhm_init(void *dm_void)
1227
{
1228
struct dm_struct *dm = (struct dm_struct *)dm_void;
1229
struct ccx_info *ccx = &dm->dm_ccx_info;
1230
1231
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
1232
PHYDM_DBG(dm, DBG_ENV_MNTR, "cur_igi=0x%x\n",
1233
dm->dm_dig_table.cur_ig_value);
1234
1235
ccx->nhm_app = NHM_BACKGROUND;
1236
ccx->nhm_igi = 0xff;
1237
1238
/*Set NHM threshold*/
1239
ccx->nhm_ongoing = false;
1240
ccx->nhm_set_lv = NHM_RELEASE;
1241
1242
if (phydm_nhm_th_update_chk(dm, ccx->nhm_app, &ccx->nhm_th[0],
1243
(u32 *)&ccx->nhm_igi))
1244
phydm_nhm_set_th_reg(dm);
1245
1246
ccx->nhm_period = 0;
1247
1248
ccx->nhm_include_cca = NHM_CCA_INIT;
1249
ccx->nhm_include_txon = NHM_TXON_INIT;
1250
ccx->nhm_divider_opt = NHM_CNT_INIT;
1251
1252
ccx->nhm_manual_ctrl = 0;
1253
ccx->nhm_rpt_stamp = 0;
1254
1255
#ifdef NHM_DYM_PW_TH_SUPPORT
1256
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1257
ccx->nhm_dym_pw_th_en = false;
1258
ccx->nhm_dym_1_peak_en = false;
1259
ccx->nhm_pw_th_rf20_dft = (u8)odm_get_bb_reg(dm, R_0x82c, 0x3f);
1260
ccx->nhm_pw_th_max = 63;
1261
ccx->nhm_sl_pw_th = 100; /* @39%*/
1262
ccx->nhm_period_decre = 1;
1263
ccx->dym_pwth_manual_ctrl = false;
1264
}
1265
#endif
1266
}
1267
1268
void phydm_nhm_dbg(void *dm_void, char input[][16], u32 *_used, char *output,
1269
u32 *_out_len)
1270
{
1271
struct dm_struct *dm = (struct dm_struct *)dm_void;
1272
struct ccx_info *ccx = &dm->dm_ccx_info;
1273
struct nhm_para_info nhm_para;
1274
char help[] = "-h";
1275
u32 var1[10] = {0};
1276
u32 used = *_used;
1277
u32 out_len = *_out_len;
1278
boolean nhm_rpt_success = true;
1279
u8 result_tmp = 0;
1280
u8 i;
1281
1282
PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
1283
1284
if ((strcmp(input[1], help) == 0)) {
1285
PDM_SNPF(out_len, used, output + used, out_len - used,
1286
"NHM Basic-Trigger 262ms: {1}\n");
1287
1288
PDM_SNPF(out_len, used, output + used, out_len - used,
1289
"NHM Adv-Trigger: {2} {Include TXON} {Include CCA}\n{0:Cnt_all, 1:Cnt valid} {App} {LV} {0~262ms}\n");
1290
#ifdef NHM_DYM_PW_TH_SUPPORT
1291
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1292
PDM_SNPF(out_len, used, output + used, out_len - used,
1293
"NHM dym_pw_th: {3} {0:off}\n");
1294
PDM_SNPF(out_len, used, output + used, out_len - used,
1295
"NHM dym_pw_th: {3} {1:on} {en_1-peak} {max} {period_decre} {sl_th}\n");
1296
PDM_SNPF(out_len, used, output + used, out_len - used,
1297
"NHM dym_pw_th: {3} {2:fast on}\n");
1298
}
1299
#endif
1300
1301
PDM_SNPF(out_len, used, output + used, out_len - used,
1302
"NHM Get Result: {100}\n");
1303
} else if (var1[0] == 100) { /*@Get NHM results*/
1304
1305
PDM_SNPF(out_len, used, output + used, out_len - used,
1306
"IGI=0x%x, rpt_stamp=%d\n", ccx->nhm_igi,
1307
ccx->nhm_rpt_stamp);
1308
1309
nhm_rpt_success = phydm_nhm_get_result(dm);
1310
1311
if (nhm_rpt_success) {
1312
for (i = 0; i <= 11; i++) {
1313
result_tmp = ccx->nhm_result[i];
1314
PDM_SNPF(out_len, used, output + used,
1315
out_len - used,
1316
"nhm_rpt[%d] = %d (%d percent)\n",
1317
i, result_tmp,
1318
(((result_tmp * 100) + 128) >> 8));
1319
}
1320
} else {
1321
PDM_SNPF(out_len, used, output + used, out_len - used,
1322
"Get NHM_rpt Fail\n");
1323
}
1324
ccx->nhm_manual_ctrl = 0;
1325
#ifdef NHM_DYM_PW_TH_SUPPORT
1326
} else if (var1[0] == 3) { /* @NMH dym_pw_th*/
1327
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1328
for (i = 1; i < 7; i++) {
1329
if (input[i + 1]) {
1330
PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL,
1331
&var1[i]);
1332
}
1333
}
1334
1335
if (var1[1] == 1) {
1336
ccx->nhm_dym_pw_th_en = true;
1337
ccx->nhm_dym_1_peak_en = (boolean)var1[2];
1338
ccx->nhm_pw_th_max = (u8)var1[3];
1339
ccx->nhm_period_decre = (u8)var1[4];
1340
ccx->nhm_sl_pw_th = (u8)var1[5];
1341
ccx->dym_pwth_manual_ctrl = true;
1342
} else if (var1[1] == 2) {
1343
ccx->nhm_dym_pw_th_en = true;
1344
ccx->nhm_dym_1_peak_en = false;
1345
ccx->nhm_pw_th_max = 63;
1346
ccx->nhm_period_decre = 1;
1347
ccx->nhm_sl_pw_th = 100;
1348
ccx->dym_pwth_manual_ctrl = true;
1349
} else {
1350
ccx->nhm_dym_pw_th_en = false;
1351
phydm_nhm_restore_pw_th(dm);
1352
ccx->dym_pwth_manual_ctrl = false;
1353
}
1354
}
1355
#endif
1356
} else { /*NMH trigger*/
1357
1358
ccx->nhm_manual_ctrl = 1;
1359
1360
for (i = 1; i < 7; i++) {
1361
if (input[i + 1]) {
1362
PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL,
1363
&var1[i]);
1364
}
1365
}
1366
1367
if (var1[0] == 1) {
1368
nhm_para.incld_txon = NHM_EXCLUDE_TXON;
1369
nhm_para.incld_cca = NHM_EXCLUDE_CCA;
1370
nhm_para.div_opt = NHM_CNT_ALL;
1371
nhm_para.nhm_app = NHM_DBG;
1372
nhm_para.nhm_lv = NHM_LV_4;
1373
nhm_para.mntr_time = 262;
1374
} else {
1375
nhm_para.incld_txon = (enum nhm_option_txon_all)var1[1];
1376
nhm_para.incld_cca = (enum nhm_option_cca_all)var1[2];
1377
nhm_para.div_opt = (enum nhm_divider_opt_all)var1[3];
1378
nhm_para.nhm_app = (enum nhm_application)var1[4];
1379
nhm_para.nhm_lv = (enum phydm_nhm_level)var1[5];
1380
nhm_para.mntr_time = (u16)var1[6];
1381
1382
/* some old ic is not supported on NHM divider option */
1383
if (dm->support_ic_type & (ODM_RTL8188E | ODM_RTL8723B |
1384
ODM_RTL8195A | ODM_RTL8192E)) {
1385
nhm_para.div_opt = NHM_CNT_ALL;
1386
}
1387
}
1388
1389
PDM_SNPF(out_len, used, output + used, out_len - used,
1390
"txon=%d, cca=%d, dev=%d, app=%d, lv=%d, time=%d ms\n",
1391
nhm_para.incld_txon, nhm_para.incld_cca,
1392
nhm_para.div_opt, nhm_para.nhm_app,
1393
nhm_para.nhm_lv, nhm_para.mntr_time);
1394
1395
if (phydm_nhm_mntr_set(dm, &nhm_para) == PHYDM_SET_SUCCESS)
1396
phydm_nhm_trigger(dm);
1397
1398
PDM_SNPF(out_len, used, output + used, out_len - used,
1399
"IGI=0x%x, rpt_stamp=%d\n", ccx->nhm_igi,
1400
ccx->nhm_rpt_stamp);
1401
1402
for (i = 0; i <= 10; i++) {
1403
PDM_SNPF(out_len, used, output + used, out_len - used,
1404
"NHM_th[%d] RSSI = %d\n", i,
1405
NTH_TH_2_RSSI(ccx->nhm_th[i]));
1406
}
1407
}
1408
1409
*_used = used;
1410
*_out_len = out_len;
1411
}
1412
1413
#endif /*@#ifdef NHM_SUPPORT*/
1414
1415
#ifdef CLM_SUPPORT
1416
1417
void phydm_clm_racing_release(void *dm_void)
1418
{
1419
struct dm_struct *dm = (struct dm_struct *)dm_void;
1420
struct ccx_info *ccx = &dm->dm_ccx_info;
1421
1422
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
1423
PHYDM_DBG(dm, DBG_ENV_MNTR, "lv:(%d)->(0)\n", ccx->clm_set_lv);
1424
1425
ccx->clm_ongoing = false;
1426
ccx->clm_set_lv = CLM_RELEASE;
1427
ccx->clm_app = CLM_BACKGROUND;
1428
}
1429
1430
u8 phydm_clm_racing_ctrl(void *dm_void, enum phydm_clm_level clm_lv)
1431
{
1432
struct dm_struct *dm = (struct dm_struct *)dm_void;
1433
struct ccx_info *ccx = &dm->dm_ccx_info;
1434
u8 set_result = PHYDM_SET_SUCCESS;
1435
/*@acquire to control CLM API*/
1436
1437
PHYDM_DBG(dm, DBG_ENV_MNTR, "clm_ongoing=%d, lv:(%d)->(%d)\n",
1438
ccx->clm_ongoing, ccx->clm_set_lv, clm_lv);
1439
if (ccx->clm_ongoing) {
1440
if (clm_lv <= ccx->clm_set_lv) {
1441
set_result = PHYDM_SET_FAIL;
1442
} else {
1443
phydm_ccx_hw_restart(dm);
1444
ccx->clm_ongoing = false;
1445
}
1446
}
1447
1448
if (set_result)
1449
ccx->clm_set_lv = clm_lv;
1450
1451
PHYDM_DBG(dm, DBG_ENV_MNTR, "clm racing success=%d\n", set_result);
1452
return set_result;
1453
}
1454
1455
void phydm_clm_c2h_report_handler(void *dm_void, u8 *cmd_buf, u8 cmd_len)
1456
{
1457
struct dm_struct *dm = (struct dm_struct *)dm_void;
1458
struct ccx_info *ccx_info = &dm->dm_ccx_info;
1459
u8 clm_report = cmd_buf[0];
1460
/*@u8 clm_report_idx = cmd_buf[1];*/
1461
1462
if (cmd_len >= 12)
1463
return;
1464
1465
ccx_info->clm_fw_result_acc += clm_report;
1466
ccx_info->clm_fw_result_cnt++;
1467
1468
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%d] clm_report= %d\n",
1469
ccx_info->clm_fw_result_cnt, clm_report);
1470
}
1471
1472
void phydm_clm_h2c(void *dm_void, u16 obs_time, u8 fw_clm_en)
1473
{
1474
struct dm_struct *dm = (struct dm_struct *)dm_void;
1475
u8 h2c_val[H2C_MAX_LENGTH] = {0};
1476
u8 i = 0;
1477
u8 obs_time_idx = 0;
1478
1479
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s] ======>\n", __func__);
1480
PHYDM_DBG(dm, DBG_ENV_MNTR, "obs_time_index=%d *4 us\n", obs_time);
1481
1482
for (i = 1; i <= 16; i++) {
1483
if (obs_time & BIT(16 - i)) {
1484
obs_time_idx = 16 - i;
1485
break;
1486
}
1487
}
1488
#if 0
1489
obs_time = (2 ^ 16 - 1)~(2 ^ 15) => obs_time_idx = 15 (65535 ~32768)
1490
obs_time = (2 ^ 15 - 1)~(2 ^ 14) => obs_time_idx = 14
1491
...
1492
...
1493
...
1494
obs_time = (2 ^ 1 - 1)~(2 ^ 0) => obs_time_idx = 0
1495
1496
#endif
1497
1498
h2c_val[0] = obs_time_idx | (((fw_clm_en) ? 1 : 0) << 7);
1499
h2c_val[1] = CLM_MAX_REPORT_TIME;
1500
1501
PHYDM_DBG(dm, DBG_ENV_MNTR, "PHYDM h2c[0x4d]=0x%x %x %x %x %x %x %x\n",
1502
h2c_val[6], h2c_val[5], h2c_val[4], h2c_val[3], h2c_val[2],
1503
h2c_val[1], h2c_val[0]);
1504
1505
odm_fill_h2c_cmd(dm, PHYDM_H2C_FW_CLM_MNTR, H2C_MAX_LENGTH, h2c_val);
1506
}
1507
1508
void phydm_clm_setting(void *dm_void, u16 clm_period /*@4us sample 1 time*/)
1509
{
1510
struct dm_struct *dm = (struct dm_struct *)dm_void;
1511
struct ccx_info *ccx = &dm->dm_ccx_info;
1512
1513
if (ccx->clm_period != clm_period) {
1514
if (dm->support_ic_type & ODM_IC_11AC_SERIES)
1515
odm_set_bb_reg(dm, R_0x990, MASKLWORD, clm_period);
1516
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1517
else if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1518
odm_set_bb_reg(dm, R_0x1e40, MASKLWORD, clm_period);
1519
#endif
1520
else if (dm->support_ic_type & ODM_IC_11N_SERIES)
1521
odm_set_bb_reg(dm, R_0x894, MASKLWORD, clm_period);
1522
1523
ccx->clm_period = clm_period;
1524
PHYDM_DBG(dm, DBG_ENV_MNTR,
1525
"Update CLM period ((%d)) -> ((%d))\n",
1526
ccx->clm_period, clm_period);
1527
}
1528
1529
PHYDM_DBG(dm, DBG_ENV_MNTR, "Set CLM period=%d * 4us\n",
1530
ccx->clm_period);
1531
}
1532
1533
void phydm_clm_trigger(void *dm_void)
1534
{
1535
struct dm_struct *dm = (struct dm_struct *)dm_void;
1536
struct ccx_info *ccx = &dm->dm_ccx_info;
1537
u32 reg1 = 0;
1538
1539
if (dm->support_ic_type & ODM_IC_11AC_SERIES)
1540
reg1 = R_0x994;
1541
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1542
else if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1543
reg1 = R_0x1e60;
1544
#endif
1545
else
1546
reg1 = R_0x890;
1547
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
1548
1549
odm_set_bb_reg(dm, reg1, BIT(0), 0x0);
1550
odm_set_bb_reg(dm, reg1, BIT(0), 0x1);
1551
1552
ccx->clm_trigger_time = dm->phydm_sys_up_time;
1553
ccx->clm_rpt_stamp++;
1554
ccx->clm_ongoing = true;
1555
}
1556
1557
boolean
1558
phydm_clm_check_rdy(void *dm_void)
1559
{
1560
struct dm_struct *dm = (struct dm_struct *)dm_void;
1561
boolean is_ready = false;
1562
u32 reg1 = 0, reg1_bit = 0;
1563
1564
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
1565
reg1 = R_0xfa4;
1566
reg1_bit = 16;
1567
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1568
} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1569
reg1 = R_0x2d88;
1570
reg1_bit = 16;
1571
#endif
1572
} else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
1573
if (dm->support_ic_type & (ODM_RTL8710B | ODM_RTL8721D |
1574
ODM_RTL8710C)) {
1575
reg1 = R_0x8b4;
1576
reg1_bit = 24;
1577
} else {
1578
reg1 = R_0x8b4;
1579
reg1_bit = 16;
1580
}
1581
}
1582
if (odm_get_bb_reg(dm, reg1, BIT(reg1_bit)))
1583
is_ready = true;
1584
1585
PHYDM_DBG(dm, DBG_ENV_MNTR, "CLM rdy=%d\n", is_ready);
1586
1587
return is_ready;
1588
}
1589
1590
void phydm_clm_get_utility(void *dm_void)
1591
{
1592
struct dm_struct *dm = (struct dm_struct *)dm_void;
1593
struct ccx_info *ccx = &dm->dm_ccx_info;
1594
u32 clm_result_tmp;
1595
1596
if (ccx->clm_period == 0) {
1597
PHYDM_DBG(dm, DBG_ENV_MNTR, "[warning] clm_period = 0\n");
1598
ccx->clm_ratio = 0;
1599
} else if (ccx->clm_period >= 65530) {
1600
clm_result_tmp = (u32)(ccx->clm_result * 100);
1601
ccx->clm_ratio = (u8)((clm_result_tmp + (1 << 15)) >> 16);
1602
} else {
1603
clm_result_tmp = (u32)(ccx->clm_result * 100);
1604
ccx->clm_ratio = (u8)(clm_result_tmp / (u32)ccx->clm_period);
1605
}
1606
}
1607
1608
boolean
1609
phydm_clm_get_result(void *dm_void)
1610
{
1611
struct dm_struct *dm = (struct dm_struct *)dm_void;
1612
struct ccx_info *ccx_info = &dm->dm_ccx_info;
1613
u32 reg1 = 0;
1614
u32 val = 0;
1615
1616
if (dm->support_ic_type & ODM_IC_11AC_SERIES)
1617
reg1 = R_0x994;
1618
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1619
else if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1620
reg1 = R_0x1e60;
1621
#endif
1622
else
1623
reg1 = R_0x890;
1624
if (!(dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8812F |
1625
ODM_RTL8197G)))
1626
odm_set_bb_reg(dm, reg1, BIT(0), 0x0);
1627
if (!(phydm_clm_check_rdy(dm))) {
1628
PHYDM_DBG(dm, DBG_ENV_MNTR, "Get CLM report Fail\n");
1629
phydm_clm_racing_release(dm);
1630
return false;
1631
}
1632
1633
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
1634
val = odm_get_bb_reg(dm, R_0xfa4, MASKLWORD);
1635
ccx_info->clm_result = (u16)val;
1636
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1637
} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1638
val = odm_get_bb_reg(dm, R_0x2d88, MASKLWORD);
1639
ccx_info->clm_result = (u16)val;
1640
#endif
1641
} else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
1642
val = odm_get_bb_reg(dm, R_0x8d0, MASKLWORD);
1643
ccx_info->clm_result = (u16)val;
1644
}
1645
1646
PHYDM_DBG(dm, DBG_ENV_MNTR, "CLM result = %d *4 us\n",
1647
ccx_info->clm_result);
1648
phydm_clm_racing_release(dm);
1649
return true;
1650
}
1651
1652
void phydm_clm_mntr_fw(void *dm_void, u16 monitor_time /*unit ms*/)
1653
{
1654
struct dm_struct *dm = (struct dm_struct *)dm_void;
1655
struct ccx_info *ccx = &dm->dm_ccx_info;
1656
u32 val = 0;
1657
1658
/*@[Get CLM report]*/
1659
if (ccx->clm_fw_result_cnt != 0) {
1660
val = ccx->clm_fw_result_acc / ccx->clm_fw_result_cnt;
1661
ccx->clm_ratio = (u8)val;
1662
} else {
1663
ccx->clm_ratio = 0;
1664
}
1665
1666
PHYDM_DBG(dm, DBG_ENV_MNTR,
1667
"clm_fw_result_acc=%d, clm_fw_result_cnt=%d\n",
1668
ccx->clm_fw_result_acc, ccx->clm_fw_result_cnt);
1669
1670
ccx->clm_fw_result_acc = 0;
1671
ccx->clm_fw_result_cnt = 0;
1672
1673
/*@[CLM trigger]*/
1674
if (monitor_time >= 262)
1675
ccx->clm_period = 65535;
1676
else
1677
ccx->clm_period = monitor_time * MS_TO_4US_RATIO;
1678
1679
phydm_clm_h2c(dm, ccx->clm_period, true);
1680
}
1681
1682
u8 phydm_clm_mntr_set(void *dm_void, struct clm_para_info *clm_para)
1683
{
1684
/*@Driver Monitor CLM*/
1685
struct dm_struct *dm = (struct dm_struct *)dm_void;
1686
struct ccx_info *ccx = &dm->dm_ccx_info;
1687
u16 clm_period = 0;
1688
1689
if (clm_para->mntr_time == 0)
1690
return PHYDM_SET_FAIL;
1691
1692
if (clm_para->clm_lv >= CLM_MAX_NUM) {
1693
PHYDM_DBG(dm, DBG_ENV_MNTR, "[WARNING] Wrong LV=%d\n",
1694
clm_para->clm_lv);
1695
return PHYDM_SET_FAIL;
1696
}
1697
1698
if (phydm_clm_racing_ctrl(dm, clm_para->clm_lv) == PHYDM_SET_FAIL)
1699
return PHYDM_SET_FAIL;
1700
1701
if (clm_para->mntr_time >= 262)
1702
clm_period = CLM_PERIOD_MAX;
1703
else
1704
clm_period = clm_para->mntr_time * MS_TO_4US_RATIO;
1705
1706
ccx->clm_app = clm_para->clm_app;
1707
phydm_clm_setting(dm, clm_period);
1708
1709
return PHYDM_SET_SUCCESS;
1710
}
1711
1712
boolean
1713
phydm_clm_mntr_chk(void *dm_void, u16 monitor_time /*unit ms*/)
1714
{
1715
struct dm_struct *dm = (struct dm_struct *)dm_void;
1716
struct ccx_info *ccx = &dm->dm_ccx_info;
1717
struct clm_para_info clm_para = {0};
1718
boolean clm_chk_result = false;
1719
u32 sys_return_time = 0;
1720
1721
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s] ======>\n", __func__);
1722
if (ccx->clm_manual_ctrl) {
1723
PHYDM_DBG(dm, DBG_ENV_MNTR, "CLM in manual ctrl\n");
1724
return clm_chk_result;
1725
}
1726
1727
sys_return_time = ccx->clm_trigger_time + MAX_ENV_MNTR_TIME;
1728
1729
if (ccx->clm_app != CLM_BACKGROUND &&
1730
sys_return_time > dm->phydm_sys_up_time) {
1731
PHYDM_DBG(dm, DBG_ENV_MNTR, "trigger_time %d, sys_time=%d\n",
1732
ccx->clm_trigger_time, dm->phydm_sys_up_time);
1733
1734
return clm_chk_result;
1735
}
1736
1737
clm_para.clm_app = CLM_BACKGROUND;
1738
clm_para.clm_lv = CLM_LV_1;
1739
clm_para.mntr_time = monitor_time;
1740
if (ccx->clm_mntr_mode == CLM_DRIVER_MNTR) {
1741
/*@[Get CLM report]*/
1742
if (phydm_clm_get_result(dm)) {
1743
PHYDM_DBG(dm, DBG_ENV_MNTR, "Get CLM_rpt success\n");
1744
phydm_clm_get_utility(dm);
1745
}
1746
1747
/*@[CLM trigger]----------------------------------------------*/
1748
if (phydm_clm_mntr_set(dm, &clm_para) == PHYDM_SET_SUCCESS)
1749
clm_chk_result = true;
1750
} else {
1751
phydm_clm_mntr_fw(dm, monitor_time);
1752
}
1753
1754
PHYDM_DBG(dm, DBG_ENV_MNTR, "clm_ratio=%d\n", ccx->clm_ratio);
1755
1756
/*@PHYDM_DBG(dm, DBG_ENV_MNTR, "clm_chk_result=%d\n",clm_chk_result);*/
1757
1758
return clm_chk_result;
1759
}
1760
1761
void phydm_set_clm_mntr_mode(void *dm_void, enum clm_monitor_mode mode)
1762
{
1763
struct dm_struct *dm = (struct dm_struct *)dm_void;
1764
struct ccx_info *ccx_info = &dm->dm_ccx_info;
1765
1766
if (ccx_info->clm_mntr_mode != mode) {
1767
ccx_info->clm_mntr_mode = mode;
1768
phydm_ccx_hw_restart(dm);
1769
1770
if (mode == CLM_DRIVER_MNTR)
1771
phydm_clm_h2c(dm, 0, 0);
1772
}
1773
}
1774
1775
void phydm_clm_init(void *dm_void)
1776
{
1777
struct dm_struct *dm = (struct dm_struct *)dm_void;
1778
struct ccx_info *ccx = &dm->dm_ccx_info;
1779
1780
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
1781
ccx->clm_ongoing = false;
1782
ccx->clm_manual_ctrl = 0;
1783
ccx->clm_mntr_mode = CLM_DRIVER_MNTR;
1784
ccx->clm_period = 0;
1785
ccx->clm_rpt_stamp = 0;
1786
phydm_clm_setting(dm, 65535);
1787
}
1788
1789
void phydm_clm_dbg(void *dm_void, char input[][16], u32 *_used, char *output,
1790
u32 *_out_len)
1791
{
1792
struct dm_struct *dm = (struct dm_struct *)dm_void;
1793
struct ccx_info *ccx = &dm->dm_ccx_info;
1794
char help[] = "-h";
1795
u32 var1[10] = {0};
1796
u32 used = *_used;
1797
u32 out_len = *_out_len;
1798
struct clm_para_info clm_para = {0};
1799
u32 i;
1800
1801
for (i = 0; i < 4; i++) {
1802
if (input[i + 1])
1803
PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);
1804
}
1805
1806
if ((strcmp(input[1], help) == 0)) {
1807
PDM_SNPF(out_len, used, output + used, out_len - used,
1808
"CLM Driver Basic-Trigger 262ms: {1}\n");
1809
PDM_SNPF(out_len, used, output + used, out_len - used,
1810
"CLM Driver Adv-Trigger: {2} {app} {LV} {0~262ms}\n");
1811
PDM_SNPF(out_len, used, output + used, out_len - used,
1812
"CLM FW Trigger: {3} {1:drv, 2:fw}\n");
1813
PDM_SNPF(out_len, used, output + used, out_len - used,
1814
"CLM Get Result: {100}\n");
1815
} else if (var1[0] == 100) { /* @Get CLM results */
1816
1817
if (phydm_clm_get_result(dm))
1818
phydm_clm_get_utility(dm);
1819
1820
PDM_SNPF(out_len, used, output + used, out_len - used,
1821
"clm_rpt_stamp=%d\n", ccx->clm_rpt_stamp);
1822
1823
PDM_SNPF(out_len, used, output + used, out_len - used,
1824
"clm_ratio:((%d percent)) = (%d us/ %d us)\n",
1825
ccx->clm_ratio, ccx->clm_result << 2,
1826
ccx->clm_period << 2);
1827
1828
ccx->clm_manual_ctrl = 0;
1829
} else if (var1[0] == 3) {
1830
phydm_set_clm_mntr_mode(dm, (enum clm_monitor_mode)var1[1]);
1831
PDM_SNPF(out_len, used, output + used, out_len - used,
1832
"CLM mode: %s mode\n",
1833
((ccx->clm_mntr_mode == CLM_FW_MNTR) ? "FW" : "Drv"));
1834
} else { /* Set & trigger CLM */
1835
ccx->clm_manual_ctrl = 1;
1836
1837
if (var1[0] == 1) {
1838
clm_para.clm_app = CLM_BACKGROUND;
1839
clm_para.clm_lv = CLM_LV_4;
1840
clm_para.mntr_time = 262;
1841
ccx->clm_mntr_mode = CLM_DRIVER_MNTR;
1842
} else if (var1[0] == 2) {
1843
clm_para.clm_app = (enum clm_application)var1[1];
1844
clm_para.clm_lv = (enum phydm_clm_level)var1[2];
1845
ccx->clm_mntr_mode = CLM_DRIVER_MNTR;
1846
clm_para.mntr_time = (u16)var1[3];
1847
}
1848
1849
PDM_SNPF(out_len, used, output + used, out_len - used,
1850
"app=%d, lv=%d, mode=%s, time=%d ms\n",
1851
clm_para.clm_app, clm_para.clm_lv,
1852
((ccx->clm_mntr_mode == CLM_FW_MNTR) ? "FW" :
1853
"driver"), clm_para.mntr_time);
1854
1855
if (phydm_clm_mntr_set(dm, &clm_para) == PHYDM_SET_SUCCESS)
1856
phydm_clm_trigger(dm);
1857
1858
PDM_SNPF(out_len, used, output + used, out_len - used,
1859
"clm_rpt_stamp=%d\n", ccx->clm_rpt_stamp);
1860
}
1861
1862
*_used = used;
1863
*_out_len = out_len;
1864
}
1865
1866
#endif /*@#ifdef CLM_SUPPORT*/
1867
1868
u8 phydm_env_mntr_trigger(void *dm_void, struct nhm_para_info *nhm_para,
1869
struct clm_para_info *clm_para,
1870
struct env_trig_rpt *trig_rpt)
1871
{
1872
#if (defined(NHM_SUPPORT) && defined(CLM_SUPPORT))
1873
struct dm_struct *dm = (struct dm_struct *)dm_void;
1874
struct ccx_info *ccx = &dm->dm_ccx_info;
1875
boolean nhm_set_ok = false;
1876
boolean clm_set_ok = false;
1877
u8 trigger_result = 0;
1878
1879
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s] ======>\n", __func__);
1880
1881
/*@[NHM]*/
1882
nhm_set_ok = phydm_nhm_mntr_set(dm, nhm_para);
1883
1884
/*@[CLM]*/
1885
if (ccx->clm_mntr_mode == CLM_DRIVER_MNTR) {
1886
clm_set_ok = phydm_clm_mntr_set(dm, clm_para);
1887
} else if (ccx->clm_mntr_mode == CLM_FW_MNTR) {
1888
phydm_clm_h2c(dm, CLM_PERIOD_MAX, true);
1889
trigger_result |= CLM_SUCCESS;
1890
}
1891
1892
if (nhm_set_ok) {
1893
phydm_nhm_trigger(dm);
1894
trigger_result |= NHM_SUCCESS;
1895
}
1896
1897
if (clm_set_ok) {
1898
phydm_clm_trigger(dm);
1899
trigger_result |= CLM_SUCCESS;
1900
}
1901
1902
/*@monitor for the test duration*/
1903
ccx->start_time = odm_get_current_time(dm);
1904
1905
trig_rpt->nhm_rpt_stamp = ccx->nhm_rpt_stamp;
1906
trig_rpt->clm_rpt_stamp = ccx->clm_rpt_stamp;
1907
1908
PHYDM_DBG(dm, DBG_ENV_MNTR, "nhm_rpt_stamp=%d, clm_rpt_stamp=%d,\n\n",
1909
trig_rpt->nhm_rpt_stamp, trig_rpt->clm_rpt_stamp);
1910
1911
return trigger_result;
1912
#endif
1913
}
1914
1915
u8 phydm_env_mntr_result(void *dm_void, struct env_mntr_rpt *rpt)
1916
{
1917
#if (defined(NHM_SUPPORT) && defined(CLM_SUPPORT))
1918
struct dm_struct *dm = (struct dm_struct *)dm_void;
1919
struct ccx_info *ccx = &dm->dm_ccx_info;
1920
u8 env_mntr_rpt = 0;
1921
u64 progressing_time = 0;
1922
u32 val_tmp = 0;
1923
1924
/*@monitor for the test duration*/
1925
progressing_time = odm_get_progressing_time(dm, ccx->start_time);
1926
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s] ======>\n", __func__);
1927
PHYDM_DBG(dm, DBG_ENV_MNTR, "env_time=%lld\n", progressing_time);
1928
1929
/*@Get NHM result*/
1930
if (phydm_nhm_get_result(dm)) {
1931
PHYDM_DBG(dm, DBG_ENV_MNTR, "Get NHM_rpt success\n");
1932
phydm_nhm_get_utility(dm);
1933
/* bypass r[11]*/
1934
phydm_nhm_cal_noise(dm, 0, NHM_RPT_NUM - 2,
1935
ccx->nhm_rpt_sum - ccx->nhm_result[11]);
1936
rpt->nhm_ratio = ccx->nhm_ratio;
1937
rpt->nhm_noise_pwr = ccx->nhm_noise_pwr;
1938
env_mntr_rpt |= NHM_SUCCESS;
1939
1940
odm_move_memory(dm, &rpt->nhm_result[0],
1941
&ccx->nhm_result[0], NHM_RPT_NUM);
1942
} else {
1943
rpt->nhm_ratio = ENV_MNTR_FAIL;
1944
}
1945
1946
/*@Get CLM result*/
1947
if (ccx->clm_mntr_mode == CLM_DRIVER_MNTR) {
1948
if (phydm_clm_get_result(dm)) {
1949
PHYDM_DBG(dm, DBG_ENV_MNTR, "Get CLM_rpt success\n");
1950
phydm_clm_get_utility(dm);
1951
env_mntr_rpt |= CLM_SUCCESS;
1952
rpt->clm_ratio = ccx->clm_ratio;
1953
} else {
1954
rpt->clm_ratio = ENV_MNTR_FAIL;
1955
}
1956
1957
} else {
1958
if (ccx->clm_fw_result_cnt != 0) {
1959
val_tmp = ccx->clm_fw_result_acc
1960
/ ccx->clm_fw_result_cnt;
1961
ccx->clm_ratio = (u8)val_tmp;
1962
} else {
1963
ccx->clm_ratio = 0;
1964
}
1965
1966
rpt->clm_ratio = ccx->clm_ratio;
1967
PHYDM_DBG(dm, DBG_ENV_MNTR,
1968
"clm_fw_result_acc=%d, clm_fw_result_cnt=%d\n",
1969
ccx->clm_fw_result_acc, ccx->clm_fw_result_cnt);
1970
1971
ccx->clm_fw_result_acc = 0;
1972
ccx->clm_fw_result_cnt = 0;
1973
env_mntr_rpt |= CLM_SUCCESS;
1974
}
1975
1976
rpt->nhm_rpt_stamp = ccx->nhm_rpt_stamp;
1977
rpt->clm_rpt_stamp = ccx->clm_rpt_stamp;
1978
1979
PHYDM_DBG(dm, DBG_ENV_MNTR,
1980
"IGI=0x%x, nhm_ratio=%d, clm_ratio=%d, nhm_rpt_stamp=%d, clm_rpt_stamp=%d\n\n",
1981
ccx->nhm_igi, rpt->nhm_ratio, rpt->clm_ratio,
1982
rpt->nhm_rpt_stamp, rpt->clm_rpt_stamp);
1983
1984
return env_mntr_rpt;
1985
#endif
1986
}
1987
1988
/*@Environment Monitor*/
1989
void phydm_env_mntr_watchdog(void *dm_void)
1990
{
1991
#if (defined(NHM_SUPPORT) && defined(CLM_SUPPORT))
1992
struct dm_struct *dm = (struct dm_struct *)dm_void;
1993
struct ccx_info *ccx = &dm->dm_ccx_info;
1994
boolean nhm_chk_ok = false;
1995
boolean clm_chk_ok = false;
1996
1997
if (!(dm->support_ability & ODM_BB_ENV_MONITOR))
1998
return;
1999
2000
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
2001
nhm_chk_ok = phydm_nhm_mntr_chk(dm, 262); /*@monitor 262ms*/
2002
clm_chk_ok = phydm_clm_mntr_chk(dm, 262); /*@monitor 262ms*/
2003
2004
/*@PHYDM_DBG(dm, DBG_ENV_MNTR, "nhm_chk_ok %d\n\n",nhm_chk_ok);*/
2005
/*@PHYDM_DBG(dm, DBG_ENV_MNTR, "clm_chk_ok %d\n\n",clm_chk_ok);*/
2006
2007
if (nhm_chk_ok)
2008
phydm_nhm_trigger(dm);
2009
2010
if (clm_chk_ok)
2011
phydm_clm_trigger(dm);
2012
2013
PHYDM_DBG(dm, DBG_ENV_MNTR,
2014
"Summary: nhm_ratio=((%d)) clm_ratio=((%d))\n\n",
2015
ccx->nhm_ratio, ccx->clm_ratio);
2016
#endif
2017
}
2018
2019
void phydm_env_monitor_init(void *dm_void)
2020
{
2021
#if (defined(NHM_SUPPORT) && defined(CLM_SUPPORT))
2022
struct dm_struct *dm = (struct dm_struct *)dm_void;
2023
2024
if (!(dm->support_ability & ODM_BB_ENV_MONITOR))
2025
return;
2026
2027
PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__);
2028
phydm_ccx_hw_restart(dm);
2029
phydm_nhm_init(dm);
2030
phydm_clm_init(dm);
2031
#endif
2032
}
2033
2034
void phydm_env_mntr_dbg(void *dm_void, char input[][16], u32 *_used,
2035
char *output, u32 *_out_len)
2036
{
2037
struct dm_struct *dm = (struct dm_struct *)dm_void;
2038
char help[] = "-h";
2039
u32 var1[10] = {0};
2040
u32 used = *_used;
2041
u32 out_len = *_out_len;
2042
struct clm_para_info clm_para = {0};
2043
struct nhm_para_info nhm_para = {0};
2044
struct env_mntr_rpt rpt = {0};
2045
struct env_trig_rpt trig_rpt = {0};
2046
u8 set_result;
2047
u8 i;
2048
2049
PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
2050
2051
if ((strcmp(input[1], help) == 0)) {
2052
PDM_SNPF(out_len, used, output + used, out_len - used,
2053
"Basic-Trigger 262ms: {1}\n");
2054
PDM_SNPF(out_len, used, output + used, out_len - used,
2055
"Get Result: {100}\n");
2056
} else if (var1[0] == 100) { /* @Get CLM results */
2057
set_result = phydm_env_mntr_result(dm, &rpt);
2058
2059
PDM_SNPF(out_len, used, output + used, out_len - used,
2060
"Set Result=%d\n nhm_ratio=%d clm_ratio=%d\n nhm_rpt_stamp=%d, clm_rpt_stamp=%d,\n",
2061
set_result, rpt.nhm_ratio, rpt.clm_ratio,
2062
rpt.nhm_rpt_stamp, rpt.clm_rpt_stamp);
2063
2064
for (i = 0; i <= 11; i++) {
2065
PDM_SNPF(out_len, used, output + used, out_len - used,
2066
"nhm_rpt[%d] = %d (%d percent)\n", i,
2067
rpt.nhm_result[i],
2068
(((rpt.nhm_result[i] * 100) + 128) >> 8));
2069
}
2070
2071
} else { /* Set & trigger CLM */
2072
/*nhm para*/
2073
nhm_para.incld_txon = NHM_EXCLUDE_TXON;
2074
nhm_para.incld_cca = NHM_EXCLUDE_CCA;
2075
nhm_para.div_opt = NHM_CNT_ALL;
2076
nhm_para.nhm_app = NHM_ACS;
2077
nhm_para.nhm_lv = NHM_LV_2;
2078
nhm_para.mntr_time = 262;
2079
2080
/*@clm para*/
2081
clm_para.clm_app = CLM_ACS;
2082
clm_para.clm_lv = CLM_LV_2;
2083
clm_para.mntr_time = 262;
2084
2085
set_result = phydm_env_mntr_trigger(dm, &nhm_para,
2086
&clm_para, &trig_rpt);
2087
2088
PDM_SNPF(out_len, used, output + used, out_len - used,
2089
"Set Result=%d, nhm_rpt_stamp=%d, clm_rpt_stamp=%d\n",
2090
set_result, trig_rpt.nhm_rpt_stamp,
2091
trig_rpt.clm_rpt_stamp);
2092
}
2093
2094
*_used = used;
2095
*_out_len = out_len;
2096
}
2097
2098
2099