Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_odm.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2013 - 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
*****************************************************************************/
15
16
#include <rtw_odm.h>
17
#include <hal_data.h>
18
19
u32 rtw_phydm_ability_ops(_adapter *adapter, HAL_PHYDM_OPS ops, u32 ability)
20
{
21
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
22
struct dm_struct *podmpriv = &pHalData->odmpriv;
23
u32 result = 0;
24
25
switch (ops) {
26
case HAL_PHYDM_DIS_ALL_FUNC:
27
podmpriv->support_ability = DYNAMIC_FUNC_DISABLE;
28
halrf_cmn_info_set(podmpriv, HALRF_CMNINFO_ABILITY, DYNAMIC_FUNC_DISABLE);
29
break;
30
case HAL_PHYDM_FUNC_SET:
31
podmpriv->support_ability |= ability;
32
break;
33
case HAL_PHYDM_FUNC_CLR:
34
podmpriv->support_ability &= ~(ability);
35
break;
36
case HAL_PHYDM_ABILITY_BK:
37
/* dm flag backup*/
38
podmpriv->bk_support_ability = podmpriv->support_ability;
39
pHalData->bk_rf_ability = halrf_cmn_info_get(podmpriv, HALRF_CMNINFO_ABILITY);
40
break;
41
case HAL_PHYDM_ABILITY_RESTORE:
42
/* restore dm flag */
43
podmpriv->support_ability = podmpriv->bk_support_ability;
44
halrf_cmn_info_set(podmpriv, HALRF_CMNINFO_ABILITY, pHalData->bk_rf_ability);
45
break;
46
case HAL_PHYDM_ABILITY_SET:
47
podmpriv->support_ability = ability;
48
break;
49
case HAL_PHYDM_ABILITY_GET:
50
result = podmpriv->support_ability;
51
break;
52
}
53
return result;
54
}
55
56
/* set ODM_CMNINFO_IC_TYPE based on chip_type */
57
void rtw_odm_init_ic_type(_adapter *adapter)
58
{
59
struct dm_struct *odm = adapter_to_phydm(adapter);
60
u32 ic_type = chip_type_to_odm_ic_type(rtw_get_chip_type(adapter));
61
62
rtw_warn_on(!ic_type);
63
64
odm_cmn_info_init(odm, ODM_CMNINFO_IC_TYPE, ic_type);
65
}
66
67
void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter)
68
{
69
RTW_PRINT_SEL(sel, "ADAPTIVITY_VERSION "ADAPTIVITY_VERSION"\n");
70
}
71
72
#define RTW_ADAPTIVITY_EN_DISABLE 0
73
#define RTW_ADAPTIVITY_EN_ENABLE 1
74
75
void rtw_odm_adaptivity_en_msg(void *sel, _adapter *adapter)
76
{
77
struct registry_priv *regsty = &adapter->registrypriv;
78
79
RTW_PRINT_SEL(sel, "RTW_ADAPTIVITY_EN_");
80
81
if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_DISABLE)
82
_RTW_PRINT_SEL(sel, "DISABLE\n");
83
else if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE)
84
_RTW_PRINT_SEL(sel, "ENABLE\n");
85
else
86
_RTW_PRINT_SEL(sel, "INVALID\n");
87
}
88
89
#define RTW_ADAPTIVITY_MODE_NORMAL 0
90
#define RTW_ADAPTIVITY_MODE_CARRIER_SENSE 1
91
92
void rtw_odm_adaptivity_mode_msg(void *sel, _adapter *adapter)
93
{
94
struct registry_priv *regsty = &adapter->registrypriv;
95
96
RTW_PRINT_SEL(sel, "RTW_ADAPTIVITY_MODE_");
97
98
if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_NORMAL)
99
_RTW_PRINT_SEL(sel, "NORMAL\n");
100
else if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_CARRIER_SENSE)
101
_RTW_PRINT_SEL(sel, "CARRIER_SENSE\n");
102
else
103
_RTW_PRINT_SEL(sel, "INVALID\n");
104
}
105
106
void rtw_odm_adaptivity_config_msg(void *sel, _adapter *adapter)
107
{
108
rtw_odm_adaptivity_ver_msg(sel, adapter);
109
rtw_odm_adaptivity_en_msg(sel, adapter);
110
rtw_odm_adaptivity_mode_msg(sel, adapter);
111
}
112
113
bool rtw_odm_adaptivity_needed(_adapter *adapter)
114
{
115
struct registry_priv *regsty = &adapter->registrypriv;
116
bool ret = _FALSE;
117
118
if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE)
119
ret = _TRUE;
120
121
return ret;
122
}
123
124
void rtw_odm_adaptivity_parm_msg(void *sel, _adapter *adapter)
125
{
126
struct dm_struct *odm = adapter_to_phydm(adapter);
127
128
rtw_odm_adaptivity_config_msg(sel, adapter);
129
130
RTW_PRINT_SEL(sel, "%10s %16s\n"
131
, "th_l2h_ini", "th_edcca_hl_diff");
132
RTW_PRINT_SEL(sel, "0x%-8x %-16d\n"
133
, (u8)odm->th_l2h_ini
134
, odm->th_edcca_hl_diff
135
);
136
}
137
138
void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 th_l2h_ini, s8 th_edcca_hl_diff)
139
{
140
struct dm_struct *odm = adapter_to_phydm(adapter);
141
142
odm->th_l2h_ini = th_l2h_ini;
143
odm->th_edcca_hl_diff = th_edcca_hl_diff;
144
}
145
146
void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter)
147
{
148
struct dm_struct *odm = adapter_to_phydm(adapter);
149
150
RTW_PRINT_SEL(sel, "rx_rate = %s, rssi_a = %d(%%), rssi_b = %d(%%)\n",
151
HDATA_RATE(odm->rx_rate), odm->rssi_a, odm->rssi_b);
152
}
153
154
155
void rtw_odm_acquirespinlock(_adapter *adapter, enum rt_spinlock_type type)
156
{
157
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
158
_irqL irqL;
159
160
switch (type) {
161
case RT_IQK_SPINLOCK:
162
_enter_critical_bh(&pHalData->IQKSpinLock, &irqL);
163
default:
164
break;
165
}
166
}
167
168
void rtw_odm_releasespinlock(_adapter *adapter, enum rt_spinlock_type type)
169
{
170
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
171
_irqL irqL;
172
173
switch (type) {
174
case RT_IQK_SPINLOCK:
175
_exit_critical_bh(&pHalData->IQKSpinLock, &irqL);
176
default:
177
break;
178
}
179
}
180
181
inline u8 rtw_odm_get_dfs_domain(struct dvobj_priv *dvobj)
182
{
183
#ifdef CONFIG_DFS_MASTER
184
struct dm_struct *pDM_Odm = dvobj_to_phydm(dvobj);
185
186
return pDM_Odm->dfs_region_domain;
187
#else
188
return PHYDM_DFS_DOMAIN_UNKNOWN;
189
#endif
190
}
191
192
inline u8 rtw_odm_dfs_domain_unknown(struct dvobj_priv *dvobj)
193
{
194
#ifdef CONFIG_DFS_MASTER
195
return rtw_odm_get_dfs_domain(dvobj) == PHYDM_DFS_DOMAIN_UNKNOWN;
196
#else
197
return 1;
198
#endif
199
}
200
201
#ifdef CONFIG_DFS_MASTER
202
inline void rtw_odm_radar_detect_reset(_adapter *adapter)
203
{
204
phydm_radar_detect_reset(adapter_to_phydm(adapter));
205
}
206
207
inline void rtw_odm_radar_detect_disable(_adapter *adapter)
208
{
209
phydm_radar_detect_disable(adapter_to_phydm(adapter));
210
}
211
212
/* called after ch, bw is set */
213
inline void rtw_odm_radar_detect_enable(_adapter *adapter)
214
{
215
phydm_radar_detect_enable(adapter_to_phydm(adapter));
216
}
217
218
inline BOOLEAN rtw_odm_radar_detect(_adapter *adapter)
219
{
220
return phydm_radar_detect(adapter_to_phydm(adapter));
221
}
222
223
inline u8 rtw_odm_radar_detect_polling_int_ms(struct dvobj_priv *dvobj)
224
{
225
return phydm_dfs_polling_time(dvobj_to_phydm(dvobj));
226
}
227
#endif /* CONFIG_DFS_MASTER */
228
229
void rtw_odm_parse_rx_phy_status_chinfo(union recv_frame *rframe, u8 *phys)
230
{
231
#ifndef DBG_RX_PHYSTATUS_CHINFO
232
#define DBG_RX_PHYSTATUS_CHINFO 0
233
#endif
234
235
#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1)
236
_adapter *adapter = rframe->u.hdr.adapter;
237
struct dm_struct *phydm = adapter_to_phydm(adapter);
238
struct rx_pkt_attrib *attrib = &rframe->u.hdr.attrib;
239
u8 *wlanhdr = get_recvframe_data(rframe);
240
241
if (phydm->support_ic_type & PHYSTS_2ND_TYPE_IC) {
242
/*
243
* 8723D:
244
* type_0(CCK)
245
* l_rxsc
246
* is filled with primary channel SC, not real rxsc.
247
* 0:LSC, 1:USC
248
* type_1(OFDM)
249
* rf_mode
250
* RF bandwidth when RX
251
* l_rxsc(legacy), ht_rxsc
252
* see below RXSC N-series
253
* type_2(Not used)
254
*/
255
/*
256
* 8821C, 8822B:
257
* type_0(CCK)
258
* l_rxsc
259
* is filled with primary channel SC, not real rxsc.
260
* 0:LSC, 1:USC
261
* type_1(OFDM)
262
* rf_mode
263
* RF bandwidth when RX
264
* l_rxsc(legacy), ht_rxsc
265
* see below RXSC AC-series
266
* type_2(Not used)
267
*/
268
269
if ((*phys & 0xf) == 0) {
270
struct phy_sts_rpt_jgr2_type0 *phys_t0 = (struct phy_sts_rpt_jgr2_type0 *)phys;
271
272
if (DBG_RX_PHYSTATUS_CHINFO) {
273
RTW_PRINT("phys_t%u ta="MAC_FMT" %s, %s(band:%u, ch:%u, l_rxsc:%u)\n"
274
, *phys & 0xf
275
, MAC_ARG(get_ta(wlanhdr))
276
, is_broadcast_mac_addr(get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(get_ra(wlanhdr)) ? "MC" : "UC"
277
, HDATA_RATE(attrib->data_rate)
278
, phys_t0->band, phys_t0->channel, phys_t0->rxsc
279
);
280
}
281
282
} else if ((*phys & 0xf) == 1) {
283
struct phy_sts_rpt_jgr2_type1 *phys_t1 = (struct phy_sts_rpt_jgr2_type1 *)phys;
284
u8 rxsc = (attrib->data_rate > DESC_RATE11M && attrib->data_rate < DESC_RATEMCS0) ? phys_t1->l_rxsc : phys_t1->ht_rxsc;
285
u8 pkt_cch = 0;
286
u8 pkt_bw = CHANNEL_WIDTH_20;
287
288
#if ODM_IC_11N_SERIES_SUPPORT
289
if (phydm->support_ic_type & ODM_IC_11N_SERIES) {
290
/* RXSC N-series */
291
#define RXSC_DUP 0
292
#define RXSC_LSC 1
293
#define RXSC_USC 2
294
#define RXSC_40M 3
295
296
static const s8 cch_offset_by_rxsc[4] = {0, -2, 2, 0};
297
298
if (phys_t1->rf_mode == 0) {
299
pkt_cch = phys_t1->channel;
300
pkt_bw = CHANNEL_WIDTH_20;
301
} else if (phys_t1->rf_mode == 1) {
302
if (rxsc == RXSC_LSC || rxsc == RXSC_USC) {
303
pkt_cch = phys_t1->channel + cch_offset_by_rxsc[rxsc];
304
pkt_bw = CHANNEL_WIDTH_20;
305
} else if (rxsc == RXSC_40M) {
306
pkt_cch = phys_t1->channel;
307
pkt_bw = CHANNEL_WIDTH_40;
308
}
309
} else
310
rtw_warn_on(1);
311
312
goto type1_end;
313
}
314
#endif /* ODM_IC_11N_SERIES_SUPPORT */
315
316
#if ODM_IC_11AC_SERIES_SUPPORT
317
if (phydm->support_ic_type & ODM_IC_11AC_SERIES) {
318
/* RXSC AC-series */
319
#define RXSC_DUP 0 /* 0: RX from all SC of current rf_mode */
320
321
#define RXSC_LL20M_OF_160M 8 /* 1~8: RX from 20MHz SC */
322
#define RXSC_L20M_OF_160M 6
323
#define RXSC_L20M_OF_80M 4
324
#define RXSC_L20M_OF_40M 2
325
#define RXSC_U20M_OF_40M 1
326
#define RXSC_U20M_OF_80M 3
327
#define RXSC_U20M_OF_160M 5
328
#define RXSC_UU20M_OF_160M 7
329
330
#define RXSC_L40M_OF_160M 12 /* 9~12: RX from 40MHz SC */
331
#define RXSC_L40M_OF_80M 10
332
#define RXSC_U40M_OF_80M 9
333
#define RXSC_U40M_OF_160M 11
334
335
#define RXSC_L80M_OF_160M 14 /* 13~14: RX from 80MHz SC */
336
#define RXSC_U80M_OF_160M 13
337
338
static const s8 cch_offset_by_rxsc[15] = {0, 2, -2, 6, -6, 10, -10, 14, -14, 4, -4, 12, -12, 8, -8};
339
340
if (phys_t1->rf_mode == 0) {
341
/* RF 20MHz */
342
pkt_cch = phys_t1->channel;
343
pkt_bw = CHANNEL_WIDTH_20;
344
goto type1_end;
345
}
346
347
if (rxsc == 0) {
348
/* RF and RX with same BW */
349
if (attrib->data_rate >= DESC_RATEMCS0) {
350
pkt_cch = phys_t1->channel;
351
pkt_bw = phys_t1->rf_mode;
352
}
353
goto type1_end;
354
}
355
356
if ((phys_t1->rf_mode == 1 && rxsc >= 1 && rxsc <= 2) /* RF 40MHz, RX 20MHz */
357
|| (phys_t1->rf_mode == 2 && rxsc >= 1 && rxsc <= 4) /* RF 80MHz, RX 20MHz */
358
|| (phys_t1->rf_mode == 3 && rxsc >= 1 && rxsc <= 8) /* RF 160MHz, RX 20MHz */
359
) {
360
pkt_cch = phys_t1->channel + cch_offset_by_rxsc[rxsc];
361
pkt_bw = CHANNEL_WIDTH_20;
362
} else if ((phys_t1->rf_mode == 2 && rxsc >= 9 && rxsc <= 10) /* RF 80MHz, RX 40MHz */
363
|| (phys_t1->rf_mode == 3 && rxsc >= 9 && rxsc <= 12) /* RF 160MHz, RX 40MHz */
364
) {
365
if (attrib->data_rate >= DESC_RATEMCS0) {
366
pkt_cch = phys_t1->channel + cch_offset_by_rxsc[rxsc];
367
pkt_bw = CHANNEL_WIDTH_40;
368
}
369
} else if ((phys_t1->rf_mode == 3 && rxsc >= 13 && rxsc <= 14) /* RF 160MHz, RX 80MHz */
370
) {
371
if (attrib->data_rate >= DESC_RATEMCS0) {
372
pkt_cch = phys_t1->channel + cch_offset_by_rxsc[rxsc];
373
pkt_bw = CHANNEL_WIDTH_80;
374
}
375
} else
376
rtw_warn_on(1);
377
378
}
379
#endif /* ODM_IC_11AC_SERIES_SUPPORT */
380
381
type1_end:
382
if (DBG_RX_PHYSTATUS_CHINFO) {
383
RTW_PRINT("phys_t%u ta="MAC_FMT" %s, %s(band:%u, ch:%u, rf_mode:%u, l_rxsc:%u, ht_rxsc:%u) => %u,%u\n"
384
, *phys & 0xf
385
, MAC_ARG(get_ta(wlanhdr))
386
, is_broadcast_mac_addr(get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(get_ra(wlanhdr)) ? "MC" : "UC"
387
, HDATA_RATE(attrib->data_rate)
388
, phys_t1->band, phys_t1->channel, phys_t1->rf_mode, phys_t1->l_rxsc, phys_t1->ht_rxsc
389
, pkt_cch, pkt_bw
390
);
391
}
392
393
/* for now, only return cneter channel of 20MHz packet */
394
if (pkt_cch && pkt_bw == CHANNEL_WIDTH_20)
395
attrib->ch = pkt_cch;
396
397
} else {
398
struct phy_sts_rpt_jgr2_type2 *phys_t2 = (struct phy_sts_rpt_jgr2_type2 *)phys;
399
400
if (DBG_RX_PHYSTATUS_CHINFO) {
401
RTW_PRINT("phys_t%u ta="MAC_FMT" %s, %s(band:%u, ch:%u, l_rxsc:%u, ht_rxsc:%u)\n"
402
, *phys & 0xf
403
, MAC_ARG(get_ta(wlanhdr))
404
, is_broadcast_mac_addr(get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(get_ra(wlanhdr)) ? "MC" : "UC"
405
, HDATA_RATE(attrib->data_rate)
406
, phys_t2->band, phys_t2->channel, phys_t2->l_rxsc, phys_t2->ht_rxsc
407
);
408
}
409
}
410
}
411
#endif /* (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1) */
412
413
}
414
415
#if defined(CONFIG_RTL8822C) && defined(CONFIG_LPS_PG)
416
void
417
debug_DACK(
418
struct dm_struct *dm
419
)
420
{
421
//P_PHYDM_FUNC dm;
422
//dm = &(SysMib.ODM.Phydm);
423
//PIQK_OFFLOAD_PARM pIQK_info;
424
//pIQK_info= &(SysMib.ODM.IQKParm);
425
u8 i;
426
u32 temp1, temp2, temp3;
427
428
temp1 = odm_get_bb_reg(dm, 0x1860, bMaskDWord);
429
temp2 = odm_get_bb_reg(dm, 0x4160, bMaskDWord);
430
temp3 = odm_get_bb_reg(dm, 0x9b4, bMaskDWord);
431
432
odm_set_bb_reg(dm, 0x9b4, bMaskDWord, 0xdb66db00);
433
434
//pathA
435
odm_set_bb_reg(dm, 0x1830, BIT(30), 0x0);
436
odm_set_bb_reg(dm, 0x1860, 0xfc000000, 0x3c);
437
438
RTW_INFO("path A i\n");
439
//i
440
for (i = 0; i < 0xf; i++) {
441
odm_set_bb_reg(dm, 0x18b0, 0xf0000000, i);
442
RTW_INFO("[0][0][%d] = 0x%08x\n", i, (u16)odm_get_bb_reg(dm,0x2810,0x7fc0000));
443
//pIQK_info->msbk_d[0][0][i] = (u16)odm_get_bb_reg(dm,0x2810,0x7fc0000);
444
}
445
RTW_INFO("path A q\n");
446
//q
447
for (i = 0; i < 0xf; i++) {
448
odm_set_bb_reg(dm, 0x18cc, 0xf0000000, i);
449
RTW_INFO("[0][1][%d] = 0x%08x\n", i, (u16)odm_get_bb_reg(dm,0x283c,0x7fc0000));
450
//pIQK_info->msbk_d[0][1][i] = (u16)odm_get_bb_reg(dm,0x283c,0x7fc0000);
451
}
452
//pathB
453
odm_set_bb_reg(dm, 0x4130, BIT(30), 0x0);
454
odm_set_bb_reg(dm, 0x4160, 0xfc000000, 0x3c);
455
456
RTW_INFO("\npath B i\n");
457
//i
458
for (i = 0; i < 0xf; i++) {
459
odm_set_bb_reg(dm, 0x41b0, 0xf0000000, i);
460
RTW_INFO("[1][0][%d] = 0x%08x\n", i, (u16)odm_get_bb_reg(dm,0x4510,0x7fc0000));
461
//pIQK_info->msbk_d[1][0][i] = (u16)odm_get_bb_reg(dm,0x2810,0x7fc0000);
462
}
463
RTW_INFO("path B q\n");
464
//q
465
for (i = 0; i < 0xf; i++) {
466
odm_set_bb_reg(dm, 0x41cc, 0xf0000000, i);
467
RTW_INFO("[1][1][%d] = 0x%08x\n", i, (u16)odm_get_bb_reg(dm,0x453c,0x7fc0000));
468
//pIQK_info->msbk_d[1][1][i] = (u16)odm_get_bb_reg(dm,0x283c,0x7fc0000);
469
}
470
471
//restore to normal
472
odm_set_bb_reg(dm, 0x1830, BIT(30), 0x1);
473
odm_set_bb_reg(dm, 0x4130, BIT(30), 0x1);
474
odm_set_bb_reg(dm, 0x1860, bMaskDWord, temp1);
475
odm_set_bb_reg(dm, 0x4160, bMaskDWord, temp2);
476
odm_set_bb_reg(dm, 0x9b4, bMaskDWord, temp3);
477
478
479
}
480
481
void
482
debug_IQK(
483
struct dm_struct *dm,
484
IN u8 idx,
485
IN u8 path
486
)
487
{
488
u8 i, ch;
489
u32 tmp;
490
u32 bit_mask_20_16 = BIT(20) | BIT(19) | BIT(18) | BIT(17) | BIT(16);
491
492
RTW_INFO("idx = %d, path = %d\n", idx, path);
493
494
odm_set_bb_reg(dm, 0x1b00, MASKDWORD, 0x8 | path << 1);
495
496
if (idx == TX_IQK) {//TXCFIR
497
odm_set_bb_reg(dm, R_0x1b20, BIT(31) | BIT(30), 0x3);
498
} else {//RXCFIR
499
odm_set_bb_reg(dm, R_0x1b20, BIT(31) | BIT(30), 0x1);
500
}
501
odm_set_bb_reg(dm, R_0x1bd4, BIT(21), 0x1);
502
odm_set_bb_reg(dm, R_0x1bd4, bit_mask_20_16, 0x10);
503
for (i = 0; i <= 16; i++) {
504
odm_set_bb_reg(dm, R_0x1bd8, MASKDWORD, 0xe0000001 | i << 2);
505
tmp = odm_get_bb_reg(dm, R_0x1bfc, MASKDWORD);
506
RTW_INFO("iqk_cfir_real[%d][%d][%d] = 0x%x\n", path, idx, i, ((tmp & 0x0fff0000) >> 16));
507
//iqk_info->iqk_cfir_real[ch][path][idx][i] =
508
// (tmp & 0x0fff0000) >> 16;
509
RTW_INFO("iqk_cfir_imag[%d][%d][%d] = 0x%x\n", path, idx, i, (tmp & 0x0fff));
510
//iqk_info->iqk_cfir_imag[ch][path][idx][i] = tmp & 0x0fff;
511
}
512
odm_set_bb_reg(dm, R_0x1b20, BIT(31) | BIT(30), 0x0);
513
//odm_set_bb_reg(dm, R_0x1bd8, MASKDWORD, 0x0);
514
}
515
516
__odm_func__ void
517
debug_information_8822c(
518
struct dm_struct *dm)
519
{
520
struct dm_dpk_info *dpk_info = &dm->dpk_info;
521
522
u32 reg_rf18;
523
524
if (odm_get_bb_reg(dm, R_0x1e7c, BIT(30)))
525
dpk_info->is_tssi_mode = true;
526
else
527
dpk_info->is_tssi_mode = false;
528
529
reg_rf18 = odm_get_rf_reg(dm, RF_PATH_A, RF_0x18, RFREG_MASK);
530
531
dpk_info->dpk_band = (u8)((reg_rf18 & BIT(16)) >> 16); /*0/1:G/A*/
532
dpk_info->dpk_ch = (u8)reg_rf18 & 0xff;
533
dpk_info->dpk_bw = (u8)((reg_rf18 & 0x3000) >> 12); /*3/2/1:20/40/80*/
534
535
RTW_INFO("[DPK] TSSI/ Band/ CH/ BW = %d / %s / %d / %s\n",
536
dpk_info->is_tssi_mode, dpk_info->dpk_band == 0 ? "2G" : "5G",
537
dpk_info->dpk_ch,
538
dpk_info->dpk_bw == 3 ? "20M" : (dpk_info->dpk_bw == 2 ? "40M" : "80M"));
539
}
540
541
extern void _dpk_get_coef_8822c(void *dm_void, u8 path);
542
543
__odm_func__ void
544
debug_reload_data_8822c(
545
void *dm_void)
546
{
547
struct dm_struct *dm = (struct dm_struct *)dm_void;
548
struct dm_dpk_info *dpk_info = &dm->dpk_info;
549
550
u8 path;
551
u32 u32tmp;
552
553
debug_information_8822c(dm);
554
555
for (path = 0; path < DPK_RF_PATH_NUM_8822C; path++) {
556
557
RTW_INFO("[DPK] Reload path: 0x%x\n", path);
558
559
odm_set_bb_reg(dm, R_0x1b00, MASKDWORD, 0x8 | (path << 1));
560
561
/*txagc bnd*/
562
if (dpk_info->dpk_band == 0x0)
563
u32tmp = odm_get_bb_reg(dm, R_0x1b60, MASKDWORD);
564
else
565
u32tmp = odm_get_bb_reg(dm, R_0x1b60, MASKDWORD);
566
567
RTW_INFO("[DPK] txagc bnd = 0x%08x\n", u32tmp);
568
569
u32tmp = odm_get_bb_reg(dm, R_0x1b64, MASKBYTE3);
570
RTW_INFO("[DPK] dpk_txagc = 0x%08x\n", u32tmp);
571
572
//debug_coef_write_8822c(dm, path, dpk_info->dpk_path_ok & BIT(path) >> path);
573
_dpk_get_coef_8822c(dm, path);
574
575
//debug_one_shot_8822c(dm, path, DPK_ON);
576
577
odm_set_bb_reg(dm, R_0x1b00, 0x0000000f, 0xc);
578
579
if (path == RF_PATH_A)
580
u32tmp = odm_get_bb_reg(dm, R_0x1b04, 0x0fffffff);
581
else
582
u32tmp = odm_get_bb_reg(dm, R_0x1b5c, 0x0fffffff);
583
584
RTW_INFO("[DPK] dpk_gs = 0x%08x\n", u32tmp);
585
586
}
587
}
588
589
void odm_lps_pg_debug_8822c(void *dm_void)
590
{
591
struct dm_struct *dm = (struct dm_struct *)dm_void;
592
593
debug_DACK(dm);
594
debug_IQK(dm, TX_IQK, RF_PATH_A);
595
debug_IQK(dm, RX_IQK, RF_PATH_A);
596
debug_IQK(dm, TX_IQK, RF_PATH_B);
597
debug_IQK(dm, RX_IQK, RF_PATH_B);
598
debug_reload_data_8822c(dm);
599
}
600
#endif /* defined(CONFIG_RTL8822C) && defined(CONFIG_LPS_PG) */
601
602
603