Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/hal_dm.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2014 - 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 <drv_types.h>
17
#include <hal_data.h>
18
19
/* A mapping from HalData to ODM. */
20
enum odm_board_type boardType(u8 InterfaceSel)
21
{
22
enum odm_board_type board = ODM_BOARD_DEFAULT;
23
24
#ifdef CONFIG_PCI_HCI
25
INTERFACE_SELECT_PCIE pcie = (INTERFACE_SELECT_PCIE)InterfaceSel;
26
switch (pcie) {
27
case INTF_SEL0_SOLO_MINICARD:
28
board |= ODM_BOARD_MINICARD;
29
break;
30
case INTF_SEL1_BT_COMBO_MINICARD:
31
board |= ODM_BOARD_BT;
32
board |= ODM_BOARD_MINICARD;
33
break;
34
default:
35
board = ODM_BOARD_DEFAULT;
36
break;
37
}
38
39
#elif defined(CONFIG_USB_HCI)
40
INTERFACE_SELECT_USB usb = (INTERFACE_SELECT_USB)InterfaceSel;
41
switch (usb) {
42
case INTF_SEL1_USB_High_Power:
43
board |= ODM_BOARD_EXT_LNA;
44
board |= ODM_BOARD_EXT_PA;
45
break;
46
case INTF_SEL2_MINICARD:
47
board |= ODM_BOARD_MINICARD;
48
break;
49
case INTF_SEL4_USB_Combo:
50
board |= ODM_BOARD_BT;
51
break;
52
case INTF_SEL5_USB_Combo_MF:
53
board |= ODM_BOARD_BT;
54
break;
55
case INTF_SEL0_USB:
56
case INTF_SEL3_USB_Solo:
57
default:
58
board = ODM_BOARD_DEFAULT;
59
break;
60
}
61
62
#endif
63
/* RTW_INFO("===> boardType(): (pHalData->InterfaceSel, pDM_Odm->BoardType) = (%d, %d)\n", InterfaceSel, board); */
64
65
return board;
66
}
67
68
void rtw_hal_update_iqk_fw_offload_cap(_adapter *adapter)
69
{
70
PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
71
struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
72
73
if (hal->RegIQKFWOffload) {
74
rtw_sctx_init(&hal->iqk_sctx, 0);
75
phydm_fwoffload_ability_init(p_dm_odm, PHYDM_RF_IQK_OFFLOAD);
76
} else
77
phydm_fwoffload_ability_clear(p_dm_odm, PHYDM_RF_IQK_OFFLOAD);
78
79
RTW_INFO("IQK FW offload:%s\n", hal->RegIQKFWOffload ? "enable" : "disable");
80
81
if (rtw_mi_check_status(adapter, MI_LINKED)) {
82
#ifdef CONFIG_LPS
83
LPS_Leave(adapter, "SWITCH_IQK_OFFLOAD");
84
#endif
85
halrf_iqk_trigger(p_dm_odm, _FALSE);
86
}
87
}
88
89
#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))
90
void rtw_phydm_iqk_trigger(_adapter *adapter)
91
{
92
struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
93
u8 clear = _TRUE;
94
u8 segment = _FALSE;
95
u8 rfk_forbidden = _FALSE;
96
97
halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);
98
#if (RTL8822C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1)
99
/* halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_IQK_SEGMENT, segment); to do */
100
halrf_rf_k_connect_trigger(p_dm_odm, _TRUE, SEGMENT_FREE);
101
#else
102
/*segment = _rtw_phydm_iqk_segment_chk(adapter);*/
103
halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_IQK_SEGMENT, segment);
104
halrf_segment_iqk_trigger(p_dm_odm, clear, segment);
105
#endif
106
}
107
#endif
108
109
void rtw_phydm_iqk_trigger_dbg(_adapter *adapter, bool recovery, bool clear, bool segment)
110
{
111
struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
112
113
#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))
114
halrf_segment_iqk_trigger(p_dm_odm, clear, segment);
115
#else
116
halrf_iqk_trigger(p_dm_odm, recovery);
117
#endif
118
}
119
void rtw_phydm_lck_trigger(_adapter *adapter)
120
{
121
struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
122
123
halrf_lck_trigger(p_dm_odm);
124
}
125
#ifdef CONFIG_DBG_RF_CAL
126
void rtw_hal_iqk_test(_adapter *adapter, bool recovery, bool clear, bool segment)
127
{
128
struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
129
130
rtw_ps_deny(adapter, PS_DENY_IOCTL);
131
LeaveAllPowerSaveModeDirect(adapter);
132
133
rtw_phydm_ability_backup(adapter);
134
rtw_phydm_func_disable_all(adapter);
135
136
halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_ABILITY, HAL_RF_IQK);
137
138
rtw_phydm_iqk_trigger_dbg(adapter, recovery, clear, segment);
139
rtw_phydm_ability_restore(adapter);
140
141
rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
142
}
143
144
void rtw_hal_lck_test(_adapter *adapter)
145
{
146
struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
147
148
rtw_ps_deny(adapter, PS_DENY_IOCTL);
149
LeaveAllPowerSaveModeDirect(adapter);
150
151
rtw_phydm_ability_backup(adapter);
152
rtw_phydm_func_disable_all(adapter);
153
154
halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_ABILITY, HAL_RF_LCK);
155
156
rtw_phydm_lck_trigger(adapter);
157
158
rtw_phydm_ability_restore(adapter);
159
rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
160
}
161
#endif
162
163
#ifdef CONFIG_FW_OFFLOAD_PARAM_INIT
164
void rtw_hal_update_param_init_fw_offload_cap(_adapter *adapter)
165
{
166
struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
167
168
if (adapter->registrypriv.fw_param_init)
169
phydm_fwoffload_ability_init(p_dm_odm, PHYDM_PHY_PARAM_OFFLOAD);
170
else
171
phydm_fwoffload_ability_clear(p_dm_odm, PHYDM_PHY_PARAM_OFFLOAD);
172
173
RTW_INFO("Init-Parameter FW offload:%s\n", adapter->registrypriv.fw_param_init ? "enable" : "disable");
174
}
175
#endif
176
177
void record_ra_info(void *p_dm_void, u8 macid, struct cmn_sta_info *p_sta, u64 ra_mask)
178
{
179
struct dm_struct *p_dm = (struct dm_struct *)p_dm_void;
180
_adapter *adapter = p_dm->adapter;
181
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
182
struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
183
184
if (p_sta) {
185
rtw_macid_ctl_set_bw(macid_ctl, macid, p_sta->ra_info.ra_bw_mode);
186
rtw_macid_ctl_set_vht_en(macid_ctl, macid, p_sta->ra_info.is_vht_enable);
187
rtw_macid_ctl_set_rate_bmp0(macid_ctl, macid, ra_mask);
188
rtw_macid_ctl_set_rate_bmp1(macid_ctl, macid, ra_mask >> 32);
189
190
rtw_update_tx_rate_bmp(adapter_to_dvobj(adapter));
191
}
192
}
193
194
#ifdef CONFIG_SUPPORT_DYNAMIC_TXPWR
195
void rtw_phydm_fill_desc_dpt(void *dm, u8 *desc, u8 dpt_lv)
196
{
197
struct dm_struct *p_dm = (struct dm_struct *)dm;
198
_adapter *adapter = p_dm->adapter;
199
200
switch (rtw_get_chip_type(adapter)) {
201
/*
202
#ifdef CONFIG_RTL8188F
203
case RTL8188F:
204
break;
205
#endif
206
207
#ifdef CONFIG_RTL8723B
208
case RTL8723B :
209
break;
210
#endif
211
212
#ifdef CONFIG_RTL8703B
213
case RTL8703B :
214
break;
215
#endif
216
217
#ifdef CONFIG_RTL8812A
218
case RTL8812 :
219
break;
220
#endif
221
222
#ifdef CONFIG_RTL8821A
223
case RTL8821:
224
break;
225
#endif
226
227
#ifdef CONFIG_RTL8814A
228
case RTL8814A :
229
break;
230
#endif
231
232
#ifdef CONFIG_RTL8192F
233
case RTL8192F :
234
break;
235
#endif
236
*/
237
/*
238
#ifdef CONFIG_RTL8192E
239
case RTL8192E :
240
SET_TX_DESC_TX_POWER_0_PSET_92E(desc, dpt_lv);
241
break;
242
#endif
243
*/
244
#ifdef CONFIG_RTL8822B
245
case RTL8822B :
246
SET_TX_DESC_TXPWR_OFSET_8822B(desc, dpt_lv);
247
break;
248
#endif
249
250
#ifdef CONFIG_RTL8821C
251
case RTL8821C :
252
SET_TX_DESC_TXPWR_OFSET_8821C(desc, dpt_lv);
253
break;
254
#endif
255
256
default :
257
RTW_ERR("%s IC not support dynamic tx power\n", __func__);
258
break;
259
}
260
}
261
void rtw_phydm_set_dyntxpwr(_adapter *adapter, u8 *desc, u8 mac_id)
262
{
263
struct dm_struct *dm = adapter_to_phydm(adapter);
264
265
odm_set_dyntxpwr(dm, desc, mac_id);
266
}
267
#endif
268
269
#ifdef CONFIG_TDMADIG
270
void rtw_phydm_tdmadig(_adapter *adapter, u8 state)
271
{
272
struct registry_priv *pregistrypriv = &adapter->registrypriv;
273
struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
274
struct dm_struct *dm = adapter_to_phydm(adapter);
275
u8 tdma_dig_en;
276
277
switch (state) {
278
case TDMADIG_INIT:
279
phydm_tdma_dig_para_upd(dm, ENABLE_TDMA, pregistrypriv->tdmadig_en);
280
phydm_tdma_dig_para_upd(dm, MODE_DECISION, pregistrypriv->tdmadig_mode);
281
break;
282
case TDMADIG_NON_INIT:
283
if(pregistrypriv->tdmadig_dynamic) {
284
if(pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)
285
tdma_dig_en = 0;
286
else
287
tdma_dig_en = pregistrypriv->tdmadig_en;
288
phydm_tdma_dig_para_upd(dm, ENABLE_TDMA, tdma_dig_en);
289
}
290
break;
291
default:
292
break;
293
294
}
295
}
296
#endif/*CONFIG_TDMADIG*/
297
void rtw_phydm_ops_func_init(struct dm_struct *p_phydm)
298
{
299
struct ra_table *p_ra_t = &p_phydm->dm_ra_table;
300
301
p_ra_t->record_ra_info = record_ra_info;
302
#ifdef CONFIG_SUPPORT_DYNAMIC_TXPWR
303
p_phydm->fill_desc_dyntxpwr = rtw_phydm_fill_desc_dpt;
304
#endif
305
}
306
void rtw_phydm_priv_init(_adapter *adapter)
307
{
308
PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
309
struct dm_struct *phydm = &(hal->odmpriv);
310
311
phydm->adapter = adapter;
312
odm_cmn_info_init(phydm, ODM_CMNINFO_PLATFORM, ODM_CE);
313
}
314
315
void Init_ODM_ComInfo(_adapter *adapter)
316
{
317
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
318
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
319
struct dm_struct *pDM_Odm = &(pHalData->odmpriv);
320
struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
321
int i;
322
323
/*phydm_op_mode could be change for different scenarios: ex: SoftAP - PHYDM_BALANCE_MODE*/
324
pHalData->phydm_op_mode = PHYDM_PERFORMANCE_MODE;/*Service one device*/
325
rtw_odm_init_ic_type(adapter);
326
327
if (rtw_get_intf_type(adapter) == RTW_GSPI)
328
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_INTERFACE, ODM_ITRF_SDIO);
329
else
330
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_INTERFACE, rtw_get_intf_type(adapter));
331
332
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->version_id));
333
334
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);
335
336
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, adapter->registrypriv.wifi_spec);
337
338
#ifdef CONFIG_ADVANCE_OTA
339
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_ADVANCE_OTA, adapter->registrypriv.adv_ota);
340
#endif
341
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, pHalData->rf_type);
342
343
{
344
/* 1 ======= BoardType: ODM_CMNINFO_BOARD_TYPE ======= */
345
u8 odm_board_type = ODM_BOARD_DEFAULT;
346
347
if (pHalData->ExternalLNA_2G != 0) {
348
odm_board_type |= ODM_BOARD_EXT_LNA;
349
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1);
350
}
351
if (pHalData->external_lna_5g != 0) {
352
odm_board_type |= ODM_BOARD_EXT_LNA_5G;
353
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_5G_EXT_LNA, 1);
354
}
355
if (pHalData->ExternalPA_2G != 0) {
356
odm_board_type |= ODM_BOARD_EXT_PA;
357
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_PA, 1);
358
}
359
if (pHalData->external_pa_5g != 0) {
360
odm_board_type |= ODM_BOARD_EXT_PA_5G;
361
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_5G_EXT_PA, 1);
362
}
363
if (pHalData->EEPROMBluetoothCoexist)
364
odm_board_type |= ODM_BOARD_BT;
365
366
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BOARD_TYPE, odm_board_type);
367
/* 1 ============== End of BoardType ============== */
368
}
369
370
rtw_hal_set_odm_var(adapter, HAL_ODM_REGULATION, NULL, _TRUE);
371
372
#ifdef CONFIG_DFS_MASTER
373
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_DFS_REGION_DOMAIN, adapter->registrypriv.dfs_region_domain);
374
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_DFS_MASTER_ENABLE, &(adapter_to_rfctl(adapter)->radar_detect_enabled));
375
#endif
376
377
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_GPA, pHalData->TypeGPA);
378
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_APA, pHalData->TypeAPA);
379
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_GLNA, pHalData->TypeGLNA);
380
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_ALNA, pHalData->TypeALNA);
381
382
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RFE_TYPE, pHalData->rfe_type);
383
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_X_CAP_SETTING, pHalData->crystal_cap);
384
385
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_TRSW, 0);
386
387
/*Add by YuChen for kfree init*/
388
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_REGRFKFREEENABLE, adapter->registrypriv.RegPwrTrimEnable);
389
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RFKFREEENABLE, pHalData->RfKFreeEnable);
390
391
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType);
392
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BE_FIX_TX_ANT, pHalData->b_fix_tx_ant);
393
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_WITH_EXT_ANTENNA_SWITCH, pHalData->with_extenal_ant_switch);
394
395
/* (8822B) efuse 0x3D7 & 0x3D8 for TX PA bias */
396
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EFUSE0X3D7, pHalData->efuse0x3d7);
397
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EFUSE0X3D8, pHalData->efuse0x3d8);
398
399
/* waiting for PhyDMV034 support*/
400
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_MANUAL_SUPPORTABILITY, &(adapter->registrypriv.phydm_ability));
401
/*Add by YuChen for adaptivity init*/
402
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ADAPTIVITY, &(adapter->registrypriv.adaptivity_en));
403
phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_CARRIER_SENSE_ENABLE, (adapter->registrypriv.adaptivity_mode != 0) ? TRUE : FALSE);
404
phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_TH_L2H_INI, adapter->registrypriv.adaptivity_th_l2h_ini);
405
phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_TH_EDCCA_HL_DIFF, adapter->registrypriv.adaptivity_th_edcca_hl_diff);
406
407
/*halrf info init*/
408
halrf_cmn_info_init(pDM_Odm, HALRF_CMNINFO_EEPROM_THERMAL_VALUE, pHalData->eeprom_thermal_meter);
409
halrf_cmn_info_init(pDM_Odm, HALRF_CMNINFO_PWT_TYPE, 0);
410
411
if (rtw_odm_adaptivity_needed(adapter) == _TRUE)
412
rtw_odm_adaptivity_config_msg(RTW_DBGDUMP, adapter);
413
414
#ifdef CONFIG_IQK_PA_OFF
415
odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_IQKPAOFF, 1);
416
#endif
417
rtw_hal_update_iqk_fw_offload_cap(adapter);
418
#ifdef CONFIG_FW_OFFLOAD_PARAM_INIT
419
rtw_hal_update_param_init_fw_offload_cap(adapter);
420
#endif
421
422
/* Pointer reference */
423
/*Antenna diversity relative parameters*/
424
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ANT_DIV, &(pHalData->AntDivCfg));
425
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_MP_MODE, &(adapter->registrypriv.mp_mode));
426
427
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BB_OPERATION_MODE, &(pHalData->phydm_op_mode));
428
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));
429
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));
430
431
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BAND, &(pHalData->current_band_type));
432
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));
433
434
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));
435
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(adapter->securitypriv.dot11PrivacyAlgrthm));
436
#ifdef CONFIG_NARROWBAND_SUPPORTING
437
if ((adapter->registrypriv.rtw_nb_config == RTW_NB_CONFIG_WIDTH_10)
438
|| (adapter->registrypriv.rtw_nb_config == RTW_NB_CONFIG_WIDTH_5)) {
439
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BW, &(adapter->registrypriv.rtw_nb_config));
440
}
441
else
442
#endif
443
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->current_channel_bw));
444
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->current_channel));
445
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(adapter->net_closed));
446
447
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SCAN, &(pHalData->bScanInProcess));
448
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctl->bpower_saving));
449
/*Add by Yuchen for phydm beamforming*/
450
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_TX_TP, &(dvobj->traffic_stat.cur_tx_tp));
451
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RX_TP, &(dvobj->traffic_stat.cur_rx_tp));
452
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ANT_TEST, &(pHalData->antenna_test));
453
#ifdef CONFIG_RTL8723B
454
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_IS1ANTENNA, &pHalData->EEPROMBluetoothAntNum);
455
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RFDEFAULTPATH, &pHalData->ant_path);
456
#endif /*CONFIG_RTL8723B*/
457
#ifdef CONFIG_USB_HCI
458
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_HUBUSBMODE, &(dvobj->usb_speed));
459
#endif
460
461
#ifdef CONFIG_DYNAMIC_SOML
462
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ADAPTIVE_SOML, &(adapter->registrypriv.dyn_soml_en));
463
#endif
464
#ifdef CONFIG_RTW_PATH_DIV
465
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_PATH_DIV, &(adapter->registrypriv.path_div));
466
#endif
467
odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_FCS_MODE, &(pHalData->multi_ch_switch_mode));
468
469
/*halrf info hook*/
470
/* waiting for PhyDMV034 support*/
471
halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_MANUAL_RF_SUPPORTABILITY, &(adapter->registrypriv.halrf_ability));
472
#ifdef CONFIG_MP_INCLUDED
473
halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_CON_TX, &(adapter->mppriv.mpt_ctx.is_start_cont_tx));
474
halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_SINGLE_TONE, &(adapter->mppriv.mpt_ctx.is_single_tone));
475
halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_CARRIER_SUPPRESSION, &(adapter->mppriv.mpt_ctx.is_carrier_suppression));
476
halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_MP_RATE_INDEX, &(adapter->mppriv.mpt_ctx.mpt_rate_index));
477
#endif/*CONFIG_MP_INCLUDED*/
478
for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
479
phydm_cmn_sta_info_hook(pDM_Odm, i, NULL);
480
481
rtw_phydm_ops_func_init(pDM_Odm);
482
phydm_dm_early_init(pDM_Odm);
483
/* TODO */
484
/* odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BT_OPERATION, _FALSE); */
485
/* odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BT_DISABLE_EDCA, _FALSE); */
486
}
487
488
489
static u32 edca_setting_UL[HT_IOT_PEER_MAX] =
490
/*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
491
/*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP(DownLink/Tx) */
492
{ 0x5e4322, 0xa44f, 0x5e4322, 0x5ea32b, 0x5ea422, 0x5ea322, 0x3ea430, 0x5ea42b, 0x5ea44f, 0x5e4322, 0x5e4322};
493
494
static u32 edca_setting_DL[HT_IOT_PEER_MAX] =
495
/*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
496
/*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP(UpLink/Rx)*/
497
{ 0xa44f, 0x5ea44f, 0x5e4322, 0x5ea42b, 0xa44f, 0xa630, 0x5ea630, 0x5ea42b, 0xa44f, 0xa42b, 0xa42b};
498
499
static u32 edca_setting_dl_g_mode[HT_IOT_PEER_MAX] =
500
/*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
501
/*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP */
502
{ 0x4322, 0xa44f, 0x5e4322, 0xa42b, 0x5e4322, 0x4322, 0xa42b, 0x5ea42b, 0xa44f, 0x5e4322, 0x5ea42b};
503
504
505
struct turbo_edca_setting{
506
u32 edca_ul; /* uplink, tx */
507
u32 edca_dl; /* downlink, rx */
508
};
509
510
#define TURBO_EDCA_ENT(UL, DL) {UL, DL}
511
512
#if 0
513
#define TURBO_EDCA_MODE_NUM 18
514
static struct turbo_edca_setting rtw_turbo_edca[TURBO_EDCA_MODE_NUM] = {
515
TURBO_EDCA_ENT(0xa42b, 0xa42b), /* mode 0 */
516
TURBO_EDCA_ENT(0x431c, 0x431c), /* mode 1 */
517
TURBO_EDCA_ENT(0x4319, 0x4319), /* mode 2 */
518
519
TURBO_EDCA_ENT(0x5ea42b, 0x5ea42b), /* mode 3 */
520
TURBO_EDCA_ENT(0x5e431c, 0x5e431c), /* mode 4 */
521
TURBO_EDCA_ENT(0x5e4319, 0x5e4319), /* mode 5 */
522
523
TURBO_EDCA_ENT(0x6ea42b, 0x6ea42b), /* mode 6 */
524
TURBO_EDCA_ENT(0x6e431c, 0x6e431c), /* mode 7 */
525
TURBO_EDCA_ENT(0x6e4319, 0x6e4319), /* mode 8 */
526
527
TURBO_EDCA_ENT(0x5ea42b, 0xa42b), /* mode 9 */
528
TURBO_EDCA_ENT(0x5e431c, 0x431c), /* mode 10 */
529
TURBO_EDCA_ENT(0x5e4319, 0x4319), /* mode 11 */
530
531
TURBO_EDCA_ENT(0x6ea42b, 0xa42b), /* mode 12 */
532
TURBO_EDCA_ENT(0x6e431c, 0x431c), /* mode 13 */
533
TURBO_EDCA_ENT(0x6e4319, 0x4319), /* mode 14 */
534
535
TURBO_EDCA_ENT(0x431c, 0x5e431c), /* mode 15 */
536
537
TURBO_EDCA_ENT(0xa42b, 0x5ea42b), /* mode 16 */
538
539
TURBO_EDCA_ENT(0x138642b, 0x431c), /* mode 17 */
540
};
541
#else
542
#define TURBO_EDCA_MODE_NUM 8
543
static struct turbo_edca_setting rtw_turbo_edca[TURBO_EDCA_MODE_NUM] = {
544
/* { UL, DL } */
545
TURBO_EDCA_ENT(0x5e431c, 0x431c), /* mode 0 */
546
547
TURBO_EDCA_ENT(0x431c, 0x431c), /* mode 1 */
548
549
TURBO_EDCA_ENT(0x5e431c, 0x5e431c), /* mode 2 */
550
551
TURBO_EDCA_ENT(0x5ea42b, 0x5ea42b), /* mode 3 */
552
553
TURBO_EDCA_ENT(0x5ea42b, 0x431c), /* mode 4 */
554
555
TURBO_EDCA_ENT(0x6ea42b, 0x6ea42b), /* mode 5 */
556
557
TURBO_EDCA_ENT(0xa42b, 0xa42b), /* mode 6 */
558
559
TURBO_EDCA_ENT(0x5e431c, 0xa42b), /* mode 7 */
560
};
561
#endif
562
563
void rtw_hal_turbo_edca(_adapter *adapter)
564
{
565
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
566
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
567
struct recv_priv *precvpriv = &(adapter->recvpriv);
568
struct registry_priv *pregpriv = &adapter->registrypriv;
569
struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
570
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
571
572
/* Parameter suggested by Scott */
573
#if 0
574
u32 EDCA_BE_UL = edca_setting_UL[p_mgnt_info->iot_peer];
575
u32 EDCA_BE_DL = edca_setting_DL[p_mgnt_info->iot_peer];
576
#endif
577
u32 EDCA_BE_UL = 0x5ea42b;
578
u32 EDCA_BE_DL = 0x00a42b;
579
u8 ic_type = rtw_get_chip_type(adapter);
580
581
u8 iot_peer = 0;
582
u8 wireless_mode = 0xFF; /* invalid value */
583
u8 traffic_index;
584
u32 edca_param;
585
u64 cur_tx_bytes = 0;
586
u64 cur_rx_bytes = 0;
587
u8 bbtchange = _TRUE;
588
u8 is_bias_on_rx = _FALSE;
589
u8 is_linked = _FALSE;
590
u8 interface_type;
591
592
if (hal_data->dis_turboedca == 1)
593
return;
594
595
if (rtw_mi_check_status(adapter, MI_ASSOC))
596
is_linked = _TRUE;
597
598
if (is_linked != _TRUE) {
599
precvpriv->is_any_non_be_pkts = _FALSE;
600
return;
601
}
602
603
if ((pregpriv->wifi_spec == 1)) { /* || (pmlmeinfo->HT_enable == 0)) */
604
precvpriv->is_any_non_be_pkts = _FALSE;
605
return;
606
}
607
608
interface_type = rtw_get_intf_type(adapter);
609
wireless_mode = pmlmeext->cur_wireless_mode;
610
611
iot_peer = pmlmeinfo->assoc_AP_vendor;
612
613
if (iot_peer >= HT_IOT_PEER_MAX) {
614
precvpriv->is_any_non_be_pkts = _FALSE;
615
return;
616
}
617
618
if (ic_type == RTL8188E) {
619
if ((iot_peer == HT_IOT_PEER_RALINK) || (iot_peer == HT_IOT_PEER_ATHEROS))
620
is_bias_on_rx = _TRUE;
621
}
622
623
/* Check if the status needs to be changed. */
624
if ((bbtchange) || (!precvpriv->is_any_non_be_pkts)) {
625
cur_tx_bytes = dvobj->traffic_stat.cur_tx_bytes;
626
cur_rx_bytes = dvobj->traffic_stat.cur_rx_bytes;
627
628
/* traffic, TX or RX */
629
if (is_bias_on_rx) {
630
if (cur_tx_bytes > (cur_rx_bytes << 2)) {
631
/* Uplink TP is present. */
632
traffic_index = UP_LINK;
633
} else {
634
/* Balance TP is present. */
635
traffic_index = DOWN_LINK;
636
}
637
} else {
638
if (cur_rx_bytes > (cur_tx_bytes << 2)) {
639
/* Downlink TP is present. */
640
traffic_index = DOWN_LINK;
641
} else {
642
/* Balance TP is present. */
643
traffic_index = UP_LINK;
644
}
645
}
646
#if 0
647
if ((p_dm_odm->dm_edca_table.prv_traffic_idx != traffic_index)
648
|| (!p_dm_odm->dm_edca_table.is_current_turbo_edca))
649
#endif
650
{
651
if (interface_type == RTW_PCIE) {
652
EDCA_BE_UL = 0x6ea42b;
653
EDCA_BE_DL = 0x6ea42b;
654
}
655
656
/* 92D txop can't be set to 0x3e for cisco1250 */
657
if ((iot_peer == HT_IOT_PEER_CISCO) && (wireless_mode == ODM_WM_N24G)) {
658
EDCA_BE_DL = edca_setting_DL[iot_peer];
659
EDCA_BE_UL = edca_setting_UL[iot_peer];
660
}
661
/* merge from 92s_92c_merge temp*/
662
else if ((iot_peer == HT_IOT_PEER_CISCO) && ((wireless_mode == ODM_WM_G) || (wireless_mode == (ODM_WM_B | ODM_WM_G)) || (wireless_mode == ODM_WM_A) || (wireless_mode == ODM_WM_B)))
663
EDCA_BE_DL = edca_setting_dl_g_mode[iot_peer];
664
else if ((iot_peer == HT_IOT_PEER_AIRGO) && ((wireless_mode == ODM_WM_G) || (wireless_mode == ODM_WM_A)))
665
EDCA_BE_DL = 0xa630;
666
else if (iot_peer == HT_IOT_PEER_MARVELL) {
667
EDCA_BE_DL = edca_setting_DL[iot_peer];
668
EDCA_BE_UL = edca_setting_UL[iot_peer];
669
} else if (iot_peer == HT_IOT_PEER_ATHEROS) {
670
/* Set DL EDCA for Atheros peer to 0x3ea42b.*/
671
/* Suggested by SD3 Wilson for ASUS TP issue.*/
672
EDCA_BE_DL = edca_setting_DL[iot_peer];
673
}
674
675
if ((ic_type == RTL8812) || (ic_type == RTL8821) || (ic_type == RTL8192E) || (ic_type == RTL8192F)) { /* add 8812AU/8812AE */
676
EDCA_BE_UL = 0x5ea42b;
677
EDCA_BE_DL = 0x5ea42b;
678
679
RTW_DBG("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x\n", EDCA_BE_UL, EDCA_BE_DL);
680
}
681
682
if (interface_type == RTW_PCIE &&
683
((ic_type == RTL8822B)
684
|| (ic_type == RTL8822C)
685
|| (ic_type == RTL8814A) || (ic_type == RTL8814B))) {
686
EDCA_BE_UL = 0x6ea42b;
687
EDCA_BE_DL = 0x6ea42b;
688
}
689
690
if ((ic_type == RTL8822B)
691
&& (interface_type == RTW_SDIO))
692
EDCA_BE_DL = 0x00431c;
693
694
#ifdef CONFIG_RTW_TPT_MODE
695
if ( dvobj->tpt_mode > 0 ) {
696
EDCA_BE_UL = dvobj->edca_be_ul;
697
EDCA_BE_DL = dvobj->edca_be_dl;
698
}
699
#endif /* CONFIG_RTW_TPT_MODE */
700
701
/* keep this condition at last check */
702
if (hal_data->dis_turboedca == 2) {
703
704
if (hal_data->edca_param_mode < TURBO_EDCA_MODE_NUM) {
705
706
struct turbo_edca_setting param;
707
708
param = rtw_turbo_edca[hal_data->edca_param_mode];
709
710
EDCA_BE_UL = param.edca_ul;
711
EDCA_BE_DL = param.edca_dl;
712
713
} else {
714
715
EDCA_BE_UL = hal_data->edca_param_mode;
716
EDCA_BE_DL = hal_data->edca_param_mode;
717
}
718
}
719
720
if (traffic_index == DOWN_LINK)
721
edca_param = EDCA_BE_DL;
722
else
723
edca_param = EDCA_BE_UL;
724
725
#ifdef CONFIG_EXTEND_LOWRATE_TXOP
726
#define TXOP_CCK1M 0x01A6
727
#define TXOP_CCK2M 0x00E6
728
#define TXOP_CCK5M 0x006B
729
#define TXOP_OFD6M 0x0066
730
#define TXOP_MCS6M 0x0061
731
{
732
struct sta_info *psta;
733
struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
734
u8 mac_id, role, current_rate_id;
735
736
/* search all used & connect2AP macid */
737
for (mac_id = 0; mac_id < macid_ctl->num; mac_id++) {
738
if (rtw_macid_is_used(macid_ctl, mac_id)) {
739
role = GET_H2CCMD_MSRRPT_PARM_ROLE(&(macid_ctl->h2c_msr[mac_id]));
740
if (role != H2C_MSR_ROLE_AP)
741
continue;
742
743
psta = macid_ctl->sta[mac_id];
744
current_rate_id = rtw_get_current_tx_rate(adapter, psta);
745
/* Check init tx_rate==1M and set 0x508[31:16]==0x019B(unit 32us) if it is */
746
switch (current_rate_id) {
747
case DESC_RATE1M:
748
edca_param &= 0x0000FFFF;
749
edca_param |= (TXOP_CCK1M<<16);
750
break;
751
case DESC_RATE2M:
752
edca_param &= 0x0000FFFF;
753
edca_param |= (TXOP_CCK2M<<16);
754
break;
755
case DESC_RATE5_5M:
756
edca_param &= 0x0000FFFF;
757
edca_param |= (TXOP_CCK5M<<16);
758
break;
759
case DESC_RATE6M:
760
edca_param &= 0x0000FFFF;
761
edca_param |= (TXOP_OFD6M<<16);
762
break;
763
case DESC_RATEMCS0:
764
edca_param &= 0x0000FFFF;
765
edca_param |= (TXOP_MCS6M<<16);
766
break;
767
default:
768
break;
769
}
770
}
771
}
772
}
773
#endif /* CONFIG_EXTEND_LOWRATE_TXOP */
774
775
#ifdef CONFIG_RTW_CUSTOMIZE_BEEDCA
776
edca_param = CONFIG_RTW_CUSTOMIZE_BEEDCA;
777
#endif
778
779
if ( edca_param != hal_data->ac_param_be) {
780
781
rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param));
782
783
RTW_DBG("Turbo EDCA =0x%x\n", edca_param);
784
}
785
786
hal_data->prv_traffic_idx = traffic_index;
787
}
788
789
hal_data->is_turbo_edca = _TRUE;
790
} else {
791
/* */
792
/* Turn Off EDCA turbo here. */
793
/* Restore original EDCA according to the declaration of AP. */
794
/* */
795
if (hal_data->is_turbo_edca) {
796
edca_param = hal_data->ac_param_be;
797
rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param));
798
hal_data->is_turbo_edca = _FALSE;
799
}
800
}
801
802
}
803
804
s8 rtw_dm_get_min_rssi(_adapter *adapter)
805
{
806
struct macid_ctl_t *macid_ctl = adapter_to_macidctl(adapter);
807
struct sta_info *sta;
808
s8 min_rssi = 127, rssi;
809
int i;
810
811
for (i = 0; i < MACID_NUM_SW_LIMIT; i++) {
812
sta = macid_ctl->sta[i];
813
if (!sta || !GET_H2CCMD_MSRRPT_PARM_OPMODE(macid_ctl->h2c_msr + i)
814
|| is_broadcast_mac_addr(sta->cmn.mac_addr))
815
continue;
816
rssi = sta->cmn.rssi_stat.rssi;
817
if (rssi >= 0 && min_rssi > rssi)
818
min_rssi = rssi;
819
}
820
821
return min_rssi == 127 ? 0 : min_rssi;
822
}
823
824
s8 rtw_phydm_get_min_rssi(_adapter *adapter)
825
{
826
struct dm_struct *phydm = adapter_to_phydm(adapter);
827
s8 rssi_min = 0;
828
829
rssi_min = phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_RSSI_MIN);
830
return rssi_min;
831
}
832
833
u8 rtw_phydm_get_cur_igi(_adapter *adapter)
834
{
835
struct dm_struct *phydm = adapter_to_phydm(adapter);
836
u8 cur_igi = 0;
837
838
cur_igi = phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CURR_IGI);
839
return cur_igi;
840
}
841
842
u32 rtw_phydm_get_phy_cnt(_adapter *adapter, enum phy_cnt cnt)
843
{
844
struct dm_struct *phydm = adapter_to_phydm(adapter);
845
846
if (cnt == FA_OFDM)
847
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_OFDM);
848
else if (cnt == FA_CCK)
849
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_CCK);
850
else if (cnt == FA_TOTAL)
851
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_TOTAL);
852
else if (cnt == CCA_OFDM)
853
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_OFDM);
854
else if (cnt == CCA_CCK)
855
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_CCK);
856
else if (cnt == CCA_ALL)
857
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_ALL);
858
else if (cnt == CRC32_OK_VHT)
859
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_VHT);
860
else if (cnt == CRC32_OK_HT)
861
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_HT);
862
else if (cnt == CRC32_OK_LEGACY)
863
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_LEGACY);
864
else if (cnt == CRC32_OK_CCK)
865
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_CCK);
866
else if (cnt == CRC32_ERROR_VHT)
867
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_VHT);
868
else if (cnt == CRC32_ERROR_HT)
869
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_HT);
870
else if (cnt == CRC32_ERROR_LEGACY)
871
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_LEGACY);
872
else if (cnt == CRC32_ERROR_CCK)
873
return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_CCK);
874
else
875
return 0;
876
}
877
878
u8 rtw_phydm_is_iqk_in_progress(_adapter *adapter)
879
{
880
u8 rts = _FALSE;
881
struct dm_struct *podmpriv = adapter_to_phydm(adapter);
882
883
odm_acquire_spin_lock(podmpriv, RT_IQK_SPINLOCK);
884
if (podmpriv->rf_calibrate_info.is_iqk_in_progress == _TRUE) {
885
RTW_ERR("IQK InProgress\n");
886
rts = _TRUE;
887
}
888
odm_release_spin_lock(podmpriv, RT_IQK_SPINLOCK);
889
890
return rts;
891
}
892
893
void SetHalODMVar(
894
PADAPTER Adapter,
895
HAL_ODM_VARIABLE eVariable,
896
void *pValue1,
897
BOOLEAN bSet)
898
{
899
struct dm_struct *podmpriv = adapter_to_phydm(Adapter);
900
/* _irqL irqL; */
901
switch (eVariable) {
902
case HAL_ODM_STA_INFO: {
903
struct sta_info *psta = (struct sta_info *)pValue1;
904
905
if (bSet) {
906
RTW_INFO("### Set STA_(%d) info ###\n", psta->cmn.mac_id);
907
psta->cmn.dm_ctrl = STA_DM_CTRL_ACTIVE;
908
phydm_cmn_sta_info_hook(podmpriv, psta->cmn.mac_id, &(psta->cmn));
909
} else {
910
RTW_INFO("### Clean STA_(%d) info ###\n", psta->cmn.mac_id);
911
/* _enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL); */
912
psta->cmn.dm_ctrl = 0;
913
phydm_cmn_sta_info_hook(podmpriv, psta->cmn.mac_id, NULL);
914
915
/* _exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL); */
916
}
917
}
918
break;
919
case HAL_ODM_P2P_STATE:
920
odm_cmn_info_update(podmpriv, ODM_CMNINFO_WIFI_DIRECT, bSet);
921
break;
922
case HAL_ODM_WIFI_DISPLAY_STATE:
923
odm_cmn_info_update(podmpriv, ODM_CMNINFO_WIFI_DISPLAY, bSet);
924
break;
925
case HAL_ODM_REGULATION:
926
/* used to auto enable/disable adaptivity by SD7 */
927
phydm_adaptivity_info_update(podmpriv, PHYDM_ADAPINFO_DOMAIN_CODE_2G, 0);
928
phydm_adaptivity_info_update(podmpriv, PHYDM_ADAPINFO_DOMAIN_CODE_5G, 0);
929
break;
930
case HAL_ODM_INITIAL_GAIN: {
931
u8 rx_gain = *((u8 *)(pValue1));
932
/*printk("rx_gain:%x\n",rx_gain);*/
933
if (rx_gain == 0xff) {/*restore rx gain*/
934
/*odm_write_dig(podmpriv,pDigTable->backup_ig_value);*/
935
odm_pause_dig(podmpriv, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_0, rx_gain);
936
} else {
937
/*pDigTable->backup_ig_value = pDigTable->cur_ig_value;*/
938
/*odm_write_dig(podmpriv,rx_gain);*/
939
odm_pause_dig(podmpriv, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_0, rx_gain);
940
}
941
}
942
break;
943
case HAL_ODM_RX_INFO_DUMP: {
944
u8 cur_igi = 0;
945
s8 rssi_min;
946
void *sel;
947
948
sel = pValue1;
949
cur_igi = rtw_phydm_get_cur_igi(Adapter);
950
rssi_min = rtw_phydm_get_min_rssi(Adapter);
951
952
_RTW_PRINT_SEL(sel, "============ Rx Info dump ===================\n");
953
_RTW_PRINT_SEL(sel, "is_linked = %d, rssi_min = %d(%%)(%d(%%)), current_igi = 0x%x\n"
954
, podmpriv->is_linked, rssi_min, rtw_dm_get_min_rssi(Adapter), cur_igi);
955
_RTW_PRINT_SEL(sel, "cnt_cck_fail = %d, cnt_ofdm_fail = %d, Total False Alarm = %d\n",
956
rtw_phydm_get_phy_cnt(Adapter, FA_CCK),
957
rtw_phydm_get_phy_cnt(Adapter, FA_OFDM),
958
rtw_phydm_get_phy_cnt(Adapter, FA_TOTAL));
959
960
if (podmpriv->is_linked) {
961
_RTW_PRINT_SEL(sel, "rx_rate = %s", HDATA_RATE(podmpriv->rx_rate));
962
if (IS_HARDWARE_TYPE_8814A(Adapter))
963
_RTW_PRINT_SEL(sel, " rssi_a = %d(%%), rssi_b = %d(%%), rssi_c = %d(%%), rssi_d = %d(%%)\n",
964
podmpriv->rssi_a, podmpriv->rssi_b, podmpriv->rssi_c, podmpriv->rssi_d);
965
else
966
_RTW_PRINT_SEL(sel, " rssi_a = %d(%%), rssi_b = %d(%%)\n", podmpriv->rssi_a, podmpriv->rssi_b);
967
#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
968
rtw_dump_raw_rssi_info(Adapter, sel);
969
#endif
970
}
971
}
972
break;
973
case HAL_ODM_RX_Dframe_INFO: {
974
void *sel;
975
976
sel = pValue1;
977
978
/*_RTW_PRINT_SEL(sel , "HAL_ODM_RX_Dframe_INFO\n");*/
979
#ifdef DBG_RX_DFRAME_RAW_DATA
980
rtw_dump_rx_dframe_info(Adapter, sel);
981
#endif
982
}
983
break;
984
985
#ifdef CONFIG_ANTENNA_DIVERSITY
986
case HAL_ODM_ANTDIV_SELECT: {
987
u8 antenna = (*(u8 *)pValue1);
988
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
989
/*switch antenna*/
990
odm_update_rx_idle_ant(&pHalData->odmpriv, antenna);
991
/*RTW_INFO("==> HAL_ODM_ANTDIV_SELECT, Ant_(%s)\n", (antenna == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");*/
992
993
}
994
break;
995
#endif
996
997
default:
998
break;
999
}
1000
}
1001
1002
void GetHalODMVar(
1003
PADAPTER Adapter,
1004
HAL_ODM_VARIABLE eVariable,
1005
void *pValue1,
1006
void *pValue2)
1007
{
1008
struct dm_struct *podmpriv = adapter_to_phydm(Adapter);
1009
1010
switch (eVariable) {
1011
#ifdef CONFIG_ANTENNA_DIVERSITY
1012
case HAL_ODM_ANTDIV_SELECT: {
1013
struct phydm_fat_struct *pDM_FatTable = &podmpriv->dm_fat_table;
1014
*((u8 *)pValue1) = pDM_FatTable->rx_idle_ant;
1015
}
1016
break;
1017
#endif
1018
case HAL_ODM_INITIAL_GAIN:
1019
*((u8 *)pValue1) = rtw_phydm_get_cur_igi(Adapter);
1020
break;
1021
default:
1022
break;
1023
}
1024
}
1025
1026
#ifdef RTW_HALMAC
1027
#include "../hal_halmac.h"
1028
#endif
1029
1030
enum hal_status
1031
rtw_phydm_fw_iqk(
1032
struct dm_struct *p_dm_odm,
1033
u8 clear,
1034
u8 segment
1035
)
1036
{
1037
#ifdef RTW_HALMAC
1038
struct _ADAPTER *adapter = p_dm_odm->adapter;
1039
1040
if (rtw_halmac_iqk(adapter_to_dvobj(adapter), clear, segment) == 0)
1041
return HAL_STATUS_SUCCESS;
1042
#endif
1043
return HAL_STATUS_FAILURE;
1044
}
1045
1046
enum hal_status
1047
rtw_phydm_cfg_phy_para(
1048
struct dm_struct *p_dm_odm,
1049
enum phydm_halmac_param config_type,
1050
u32 offset,
1051
u32 data,
1052
u32 mask,
1053
enum rf_path e_rf_path,
1054
u32 delay_time)
1055
{
1056
#ifdef RTW_HALMAC
1057
struct _ADAPTER *adapter = p_dm_odm->adapter;
1058
struct rtw_phy_parameter para;
1059
1060
switch (config_type) {
1061
case PHYDM_HALMAC_CMD_MAC_W8:
1062
para.cmd = 0; /* MAC register */
1063
para.data.mac.offset = offset;
1064
para.data.mac.value = data;
1065
para.data.mac.msk = mask;
1066
para.data.mac.msk_en = (mask) ? 1 : 0;
1067
para.data.mac.size = 1;
1068
break;
1069
case PHYDM_HALMAC_CMD_MAC_W16:
1070
para.cmd = 0; /* MAC register */
1071
para.data.mac.offset = offset;
1072
para.data.mac.value = data;
1073
para.data.mac.msk = mask;
1074
para.data.mac.msk_en = (mask) ? 1 : 0;
1075
para.data.mac.size = 2;
1076
break;
1077
case PHYDM_HALMAC_CMD_MAC_W32:
1078
para.cmd = 0; /* MAC register */
1079
para.data.mac.offset = offset;
1080
para.data.mac.value = data;
1081
para.data.mac.msk = mask;
1082
para.data.mac.msk_en = (mask) ? 1 : 0;
1083
para.data.mac.size = 4;
1084
break;
1085
case PHYDM_HALMAC_CMD_BB_W8:
1086
para.cmd = 1; /* BB register */
1087
para.data.bb.offset = offset;
1088
para.data.bb.value = data;
1089
para.data.bb.msk = mask;
1090
para.data.bb.msk_en = (mask) ? 1 : 0;
1091
para.data.bb.size = 1;
1092
break;
1093
case PHYDM_HALMAC_CMD_BB_W16:
1094
para.cmd = 1; /* BB register */
1095
para.data.bb.offset = offset;
1096
para.data.bb.value = data;
1097
para.data.bb.msk = mask;
1098
para.data.bb.msk_en = (mask) ? 1 : 0;
1099
para.data.bb.size = 2;
1100
break;
1101
case PHYDM_HALMAC_CMD_BB_W32:
1102
para.cmd = 1; /* BB register */
1103
para.data.bb.offset = offset;
1104
para.data.bb.value = data;
1105
para.data.bb.msk = mask;
1106
para.data.bb.msk_en = (mask) ? 1 : 0;
1107
para.data.bb.size = 4;
1108
break;
1109
case PHYDM_HALMAC_CMD_RF_W:
1110
para.cmd = 2; /* RF register */
1111
para.data.rf.offset = offset;
1112
para.data.rf.value = data;
1113
para.data.rf.msk = mask;
1114
para.data.rf.msk_en = (mask) ? 1 : 0;
1115
if (e_rf_path == RF_PATH_A)
1116
para.data.rf.path = 0;
1117
else if (e_rf_path == RF_PATH_B)
1118
para.data.rf.path = 1;
1119
else if (e_rf_path == RF_PATH_C)
1120
para.data.rf.path = 2;
1121
else if (e_rf_path == RF_PATH_D)
1122
para.data.rf.path = 3;
1123
else
1124
para.data.rf.path = 0;
1125
break;
1126
case PHYDM_HALMAC_CMD_DELAY_US:
1127
para.cmd = 3; /* Delay */
1128
para.data.delay.unit = 0; /* microsecond */
1129
para.data.delay.value = delay_time;
1130
break;
1131
case PHYDM_HALMAC_CMD_DELAY_MS:
1132
para.cmd = 3; /* Delay */
1133
para.data.delay.unit = 1; /* millisecond */
1134
para.data.delay.value = delay_time;
1135
break;
1136
case PHYDM_HALMAC_CMD_END:
1137
para.cmd = 0xFF; /* End command */
1138
break;
1139
default:
1140
return HAL_STATUS_FAILURE;
1141
}
1142
1143
if (rtw_halmac_cfg_phy_para(adapter_to_dvobj(adapter), &para))
1144
return HAL_STATUS_FAILURE;
1145
#endif /*RTW_HALMAC*/
1146
return HAL_STATUS_SUCCESS;
1147
}
1148
1149
1150
#ifdef CONFIG_LPS_LCLK_WD_TIMER
1151
void rtw_phydm_wd_lps_lclk_hdl(_adapter *adapter)
1152
{
1153
struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1154
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
1155
struct sta_priv *pstapriv = &adapter->stapriv;
1156
struct sta_info *psta = NULL;
1157
bool is_linked = _FALSE;
1158
1159
if (!rtw_is_hw_init_completed(adapter))
1160
return;
1161
1162
if (rtw_mi_check_status(adapter, MI_ASSOC))
1163
is_linked = _TRUE;
1164
1165
if (is_linked == _FALSE)
1166
return;
1167
1168
psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
1169
if (psta == NULL)
1170
return;
1171
1172
odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_LINK, is_linked);
1173
1174
phydm_watchdog_lps_32k(&pHalData->odmpriv);
1175
}
1176
1177
void rtw_phydm_watchdog_in_lps_lclk(_adapter *adapter)
1178
{
1179
struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1180
struct sta_priv *pstapriv = &adapter->stapriv;
1181
u8 cur_igi = 0;
1182
s8 min_rssi = 0;
1183
1184
if (!rtw_is_hw_init_completed(adapter))
1185
return;
1186
1187
cur_igi = rtw_phydm_get_cur_igi(adapter);
1188
min_rssi = rtw_dm_get_min_rssi(adapter);
1189
/*RTW_INFO("%s "ADPT_FMT" cur_ig_value=%d, min_rssi = %d\n", __func__, ADPT_ARG(adapter), cur_igi, min_rssi);*/
1190
1191
if (min_rssi <= 0)
1192
return;
1193
1194
if ((cur_igi > min_rssi + 5) ||
1195
(cur_igi < min_rssi - 5)) {
1196
#ifdef CONFIG_LPS
1197
rtw_dm_in_lps_wk_cmd(adapter);
1198
#endif
1199
}
1200
}
1201
#endif /*CONFIG_LPS_LCLK_WD_TIMER*/
1202
1203
void dump_sta_traffic(void *sel, _adapter *adapter, struct sta_info *psta)
1204
{
1205
struct ra_sta_info *ra_info;
1206
u8 curr_sgi = _FALSE;
1207
u32 tx_tp_mbips, rx_tp_mbips, bi_tp_mbips;
1208
1209
if (!psta)
1210
return;
1211
RTW_PRINT_SEL(sel, "\n");
1212
RTW_PRINT_SEL(sel, "====== mac_id : %d [" MAC_FMT "] ======\n",
1213
psta->cmn.mac_id, MAC_ARG(psta->cmn.mac_addr));
1214
1215
if (is_client_associated_to_ap(psta->padapter))
1216
RTW_PRINT_SEL(sel, "BCN counts : %d (per-%d second), DTIM Period:%d\n",
1217
rtw_get_bcn_cnt(psta->padapter) / 2, 1, rtw_get_bcn_dtim_period(psta->padapter));
1218
1219
ra_info = &psta->cmn.ra_info;
1220
curr_sgi = rtw_get_current_tx_sgi(adapter, psta);
1221
RTW_PRINT_SEL(sel, "tx_rate : %s(%s) rx_rate : %s, rx_rate_bmc : %s, rssi : %d %%\n"
1222
, HDATA_RATE(rtw_get_current_tx_rate(adapter, psta)), (curr_sgi) ? "S" : "L"
1223
, HDATA_RATE((psta->curr_rx_rate & 0x7F)), HDATA_RATE((psta->curr_rx_rate_bmc & 0x7F)), psta->cmn.rssi_stat.rssi
1224
);
1225
1226
if (0) {
1227
RTW_PRINT_SEL(sel, "tx_bytes:%llu(%llu - %llu)\n"
1228
, psta->sta_stats.tx_bytes - psta->sta_stats.last_tx_bytes
1229
, psta->sta_stats.tx_bytes, psta->sta_stats.last_tx_bytes
1230
);
1231
RTW_PRINT_SEL(sel, "rx_uc_bytes:%llu(%llu - %llu)\n"
1232
, sta_rx_uc_bytes(psta) - sta_last_rx_uc_bytes(psta)
1233
, sta_rx_uc_bytes(psta), sta_last_rx_uc_bytes(psta)
1234
);
1235
RTW_PRINT_SEL(sel, "rx_mc_bytes:%llu(%llu - %llu)\n"
1236
, psta->sta_stats.rx_mc_bytes - psta->sta_stats.last_rx_mc_bytes
1237
, psta->sta_stats.rx_mc_bytes, psta->sta_stats.last_rx_mc_bytes
1238
);
1239
RTW_PRINT_SEL(sel, "rx_bc_bytes:%llu(%llu - %llu)\n"
1240
, psta->sta_stats.rx_bc_bytes - psta->sta_stats.last_rx_bc_bytes
1241
, psta->sta_stats.rx_bc_bytes, psta->sta_stats.last_rx_bc_bytes
1242
);
1243
}
1244
1245
_RTW_PRINT_SEL(sel, "RTW: [TP] ");
1246
tx_tp_mbips = psta->sta_stats.tx_tp_kbits >> 10;
1247
rx_tp_mbips = psta->sta_stats.rx_tp_kbits >> 10;
1248
bi_tp_mbips = tx_tp_mbips + rx_tp_mbips;
1249
1250
if (tx_tp_mbips)
1251
_RTW_PRINT_SEL(sel, "Tx : %d(Mbps) ", tx_tp_mbips);
1252
else
1253
_RTW_PRINT_SEL(sel, "Tx : %d(Kbps) ", psta->sta_stats.tx_tp_kbits);
1254
1255
if (rx_tp_mbips)
1256
_RTW_PRINT_SEL(sel, "Rx : %d(Mbps) ", rx_tp_mbips);
1257
else
1258
_RTW_PRINT_SEL(sel, "Rx : %d(Kbps) ", psta->sta_stats.rx_tp_kbits);
1259
1260
if (bi_tp_mbips)
1261
_RTW_PRINT_SEL(sel, "Total : %d(Mbps)\n", bi_tp_mbips);
1262
else
1263
_RTW_PRINT_SEL(sel, "Total : %d(Kbps)\n", psta->sta_stats.tx_tp_kbits + psta->sta_stats.rx_tp_kbits);
1264
1265
1266
_RTW_PRINT_SEL(sel, "RTW: [Smooth TP] ");
1267
tx_tp_mbips = psta->sta_stats.smooth_tx_tp_kbits >> 10;
1268
rx_tp_mbips = psta->sta_stats.smooth_rx_tp_kbits >> 10;
1269
bi_tp_mbips = tx_tp_mbips + rx_tp_mbips;
1270
if (tx_tp_mbips)
1271
_RTW_PRINT_SEL(sel, "Tx : %d(Mbps) ", tx_tp_mbips);
1272
else
1273
_RTW_PRINT_SEL(sel, "Tx : %d(Kbps) ", psta->sta_stats.smooth_tx_tp_kbits);
1274
1275
if (rx_tp_mbips)
1276
_RTW_PRINT_SEL(sel, "Rx : %d(Mbps) ", rx_tp_mbips);
1277
else
1278
_RTW_PRINT_SEL(sel, "Rx : %d(Kbps) ", psta->sta_stats.smooth_rx_tp_kbits);
1279
1280
if (bi_tp_mbips)
1281
_RTW_PRINT_SEL(sel, "Total : %d(Mbps)\n", bi_tp_mbips);
1282
else
1283
_RTW_PRINT_SEL(sel, "Total : %d(Kbps)\n", psta->sta_stats.smooth_tx_tp_kbits + psta->sta_stats.rx_tp_kbits);
1284
1285
#if 0
1286
RTW_PRINT_SEL(sel, "Moving-AVG TP {Tx,Rx,Total} = { %d , %d , %d } Mbps\n\n",
1287
(psta->cmn.tx_moving_average_tp << 3), (psta->cmn.rx_moving_average_tp << 3),
1288
(psta->cmn.tx_moving_average_tp + psta->cmn.rx_moving_average_tp) << 3);
1289
#endif
1290
}
1291
1292
void dump_sta_info(void *sel, struct sta_info *psta)
1293
{
1294
struct ra_sta_info *ra_info;
1295
u8 curr_tx_sgi = _FALSE;
1296
u8 curr_tx_rate = 0;
1297
1298
if (!psta)
1299
return;
1300
1301
ra_info = &psta->cmn.ra_info;
1302
1303
RTW_PRINT_SEL(sel, "============ STA [" MAC_FMT "] ===================\n",
1304
MAC_ARG(psta->cmn.mac_addr));
1305
RTW_PRINT_SEL(sel, "mac_id : %d\n", psta->cmn.mac_id);
1306
RTW_PRINT_SEL(sel, "wireless_mode : 0x%02x\n", psta->wireless_mode);
1307
RTW_PRINT_SEL(sel, "mimo_type : %d\n", psta->cmn.mimo_type);
1308
RTW_PRINT_SEL(sel, "static smps : %s\n", (psta->cmn.sm_ps == SM_PS_STATIC) ? "Y" : "N");
1309
RTW_PRINT_SEL(sel, "bw_mode : %s, ra_bw_mode : %s\n",
1310
ch_width_str(psta->cmn.bw_mode), ch_width_str(ra_info->ra_bw_mode));
1311
RTW_PRINT_SEL(sel, "rate_id : %d\n", ra_info->rate_id);
1312
RTW_PRINT_SEL(sel, "rssi : %d (%%), rssi_level : %d\n", psta->cmn.rssi_stat.rssi, ra_info->rssi_level);
1313
RTW_PRINT_SEL(sel, "is_support_sgi : %s, is_vht_enable : %s\n",
1314
(ra_info->is_support_sgi) ? "Y" : "N", (ra_info->is_vht_enable) ? "Y" : "N");
1315
RTW_PRINT_SEL(sel, "disable_ra : %s, disable_pt : %s\n",
1316
(ra_info->disable_ra) ? "Y" : "N", (ra_info->disable_pt) ? "Y" : "N");
1317
RTW_PRINT_SEL(sel, "is_noisy : %s\n", (ra_info->is_noisy) ? "Y" : "N");
1318
RTW_PRINT_SEL(sel, "txrx_state : %d\n", ra_info->txrx_state);/*0: uplink, 1:downlink, 2:bi-direction*/
1319
1320
curr_tx_sgi = rtw_get_current_tx_sgi(psta->padapter, psta);
1321
curr_tx_rate = rtw_get_current_tx_rate(psta->padapter, psta);
1322
RTW_PRINT_SEL(sel, "curr_tx_rate : %s (%s)\n",
1323
HDATA_RATE(curr_tx_rate), (curr_tx_sgi) ? "S" : "L");
1324
RTW_PRINT_SEL(sel, "curr_tx_bw : %s\n", ch_width_str(ra_info->curr_tx_bw));
1325
RTW_PRINT_SEL(sel, "curr_retry_ratio : %d\n", ra_info->curr_retry_ratio);
1326
RTW_PRINT_SEL(sel, "ra_mask : 0x%016llx\n", ra_info->ramask);
1327
}
1328
1329
void rtw_phydm_ra_registed(_adapter *adapter, struct sta_info *psta)
1330
{
1331
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1332
1333
if (psta == NULL) {
1334
RTW_ERR(FUNC_ADPT_FMT" sta is NULL\n", FUNC_ADPT_ARG(adapter));
1335
rtw_warn_on(1);
1336
return;
1337
}
1338
1339
phydm_ra_registed(&hal_data->odmpriv, psta->cmn.mac_id, psta->cmn.rssi_stat.rssi);
1340
dump_sta_info(RTW_DBGDUMP, psta);
1341
}
1342
1343
static void init_phydm_info(_adapter *adapter)
1344
{
1345
PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
1346
struct dm_struct *phydm = &(hal_data->odmpriv);
1347
1348
odm_cmn_info_init(phydm, ODM_CMNINFO_FW_VER, hal_data->firmware_version);
1349
odm_cmn_info_init(phydm, ODM_CMNINFO_FW_SUB_VER, hal_data->firmware_sub_version);
1350
}
1351
1352
#ifdef CONFIG_CTRL_TXSS_BY_TP
1353
void rtw_phydm_trx_cfg(_adapter *adapter, bool tx_1ss)
1354
{
1355
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1356
enum bb_path txpath = BB_PATH_AB;
1357
enum bb_path rxpath = BB_PATH_AB;
1358
/*is_2tx = _FALSE for 8822B, or BB_PATH_AUTO for PATH_DIVERSITY for 8822B*/
1359
enum bb_path txpath_1ss = BB_PATH_A;
1360
1361
rtw_hal_get_trx_path(adapter_to_dvobj(adapter), NULL, &txpath, &rxpath);
1362
txpath = (tx_1ss) ? BB_PATH_A : txpath;
1363
1364
if (phydm_api_trx_mode(adapter_to_phydm(adapter), txpath, rxpath, txpath_1ss) == FALSE)
1365
RTW_ERR("%s failed\n", __func__);
1366
}
1367
#endif
1368
1369
1370
/*
1371
* trx_mode init - 8822B / 8822C / 8192F
1372
* 1ssNTx - 8192E / 8812A / 8822B / 8822C / 8192F
1373
* Path-diversity - 8822B / 8822C / 8192F
1374
* PHYDM API - phydm_api_trx_mode
1375
*/
1376
static u8 rtw_phydm_config_trx_path(_adapter *adapter)
1377
{
1378
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1379
enum bb_path txpath;
1380
enum bb_path rxpath;
1381
int i;
1382
u8 rst = _FAIL;
1383
1384
rtw_hal_get_trx_path(adapter_to_dvobj(adapter), NULL, &txpath, &rxpath);
1385
if (!txpath) {
1386
RTW_ERR("%s tx_path_bmp is empty\n", __func__);
1387
rtw_warn_on(1);
1388
goto exit;
1389
}
1390
if (!rxpath) {
1391
RTW_ERR("%s rx_path_bmp is empty\n", __func__);
1392
rtw_warn_on(1);
1393
goto exit;
1394
}
1395
1396
tx_path_nss_set_default(hal_data->txpath_nss, hal_data->txpath_num_nss
1397
, GET_HAL_TX_PATH_BMP(adapter));
1398
1399
#if defined(CONFIG_RTL8192F) || defined(CONFIG_RTL8822B) ||defined(CONFIG_RTL8822C)
1400
{
1401
enum bb_path txpath_1ss;
1402
1403
if (txpath == BB_PATH_AB) {
1404
switch (hal_data->max_tx_cnt) {
1405
case 2:
1406
#ifdef CONFIG_RTW_TX_NPATH_EN
1407
if (adapter->registrypriv.tx_npath == 1)
1408
txpath_1ss = BB_PATH_AB;
1409
else
1410
#endif
1411
#ifdef CONFIG_RTW_PATH_DIV
1412
if (adapter->registrypriv.path_div == 1) /* path diversity, support 2sts TX */
1413
txpath_1ss = BB_PATH_AUTO;
1414
else
1415
#endif
1416
txpath_1ss = BB_PATH_A;
1417
break;
1418
case 1:
1419
#ifdef CONFIG_RTW_PATH_DIV
1420
if (adapter->registrypriv.path_div == 1) /* path diversity, no support 2sts TX */
1421
txpath = txpath_1ss = BB_PATH_AUTO;
1422
else
1423
#endif
1424
txpath = txpath_1ss = BB_PATH_A;
1425
break;
1426
default:
1427
RTW_ERR("%s invalid max_tx_cnt:%u\n", __func__
1428
, hal_data->max_tx_cnt);
1429
rtw_warn_on(1);
1430
goto exit;
1431
}
1432
} else
1433
txpath_1ss = txpath;
1434
1435
if (phydm_api_trx_mode(adapter_to_phydm(adapter), txpath, rxpath, txpath_1ss) == FALSE) {
1436
RTW_ERR("%s txpath=0x%x, rxpath=0x%x, txpath_1ss=0x%x fail\n", __func__
1437
, txpath, rxpath, txpath_1ss);
1438
rtw_warn_on(1);
1439
goto exit;
1440
}
1441
1442
if (hal_data->txpath_nss[0] != txpath_1ss) {
1443
hal_data->txpath_nss[0] = txpath_1ss;
1444
if (txpath_1ss == BB_PATH_AUTO)
1445
hal_data->txpath_num_nss[0] = 1;
1446
else {
1447
hal_data->txpath_num_nss[0] = 0;
1448
for (i = 0; i < RF_PATH_MAX; i++) {
1449
if (txpath_1ss & BIT(i))
1450
hal_data->txpath_num_nss[0]++;
1451
}
1452
}
1453
}
1454
}
1455
#elif defined(CONFIG_RTL8814B)
1456
{
1457
if (config_phydm_trx_mode_8814b(adapter_to_phydm(adapter), txpath, rxpath) == FALSE) {
1458
RTW_ERR("%s txpath=0x%x, rxpath=0x%x fail\n", __func__
1459
, txpath, rxpath);
1460
rtw_warn_on(1);
1461
goto exit;
1462
}
1463
1464
/* 8814B is always full-TX */
1465
tx_path_nss_set_full_tx(hal_data->txpath_nss, hal_data->txpath_num_nss, txpath);
1466
}
1467
#elif defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8192E)
1468
{
1469
#ifdef CONFIG_RTW_TX_NPATH_EN
1470
if (adapter->registrypriv.tx_npath == 1) {
1471
phydm_tx_2path(adapter_to_phydm(adapter));
1472
tx_path_nss_set_full_tx(hal_data->txpath_nss, hal_data->txpath_num_nss, txpath);
1473
}
1474
#endif
1475
}
1476
#endif
1477
1478
hal_data->txpath = txpath;
1479
hal_data->rxpath = rxpath;
1480
dump_hal_runtime_trx_mode(RTW_DBGDUMP, adapter);
1481
rst = _SUCCESS;
1482
1483
exit:
1484
return rst;
1485
}
1486
1487
void rtw_phydm_init(_adapter *adapter)
1488
{
1489
PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
1490
struct dm_struct *phydm = &(hal_data->odmpriv);
1491
1492
rtw_phydm_config_trx_path(adapter);
1493
init_phydm_info(adapter);
1494
odm_dm_init(phydm);
1495
#ifdef CONFIG_CUSTOMER01_SMART_ANTENNA
1496
phydm_pathb_q_matrix_rotate_en(phydm);
1497
#endif
1498
}
1499
1500
bool rtw_phydm_set_crystal_cap(_adapter *adapter, u8 crystal_cap)
1501
{
1502
PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
1503
struct dm_struct *phydm = &(hal_data->odmpriv);
1504
1505
return phydm_set_crystal_cap_reg(phydm, crystal_cap);
1506
}
1507
1508
#ifdef CONFIG_LPS_PG
1509
/*
1510
static void _lps_pg_state_update(_adapter *adapter)
1511
{
1512
u8 is_in_lpspg = _FALSE;
1513
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
1514
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
1515
struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1516
struct sta_priv *pstapriv = &adapter->stapriv;
1517
struct sta_info *psta = NULL;
1518
1519
if ((pwrpriv->lps_level == LPS_PG) && (pwrpriv->pwr_mode != PS_MODE_ACTIVE) && (pwrpriv->rpwm <= PS_STATE_S2))
1520
is_in_lpspg = _TRUE;
1521
psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
1522
1523
if (psta)
1524
psta->cmn.ra_info.disable_ra = (is_in_lpspg) ? _TRUE : _FALSE;
1525
}
1526
*/
1527
void rtw_phydm_lps_pg_hdl(_adapter *adapter, struct sta_info *sta, bool in_lpspg)
1528
{
1529
struct dm_struct *phydm = adapter_to_phydm(adapter);
1530
/*u8 rate_id;*/
1531
1532
if(sta == NULL) {
1533
RTW_ERR("%s sta is null\n", __func__);
1534
rtw_warn_on(1);
1535
return;
1536
}
1537
1538
if (in_lpspg) {
1539
sta->cmn.ra_info.disable_ra = _TRUE;
1540
sta->cmn.ra_info.disable_pt = _TRUE;
1541
/*TODO : DRV fix tx rate*/
1542
/*rate_id = phydm_get_rate_from_rssi_lv(phydm, sta->cmn.mac_id);*/
1543
} else {
1544
sta->cmn.ra_info.disable_ra = _FALSE;
1545
sta->cmn.ra_info.disable_pt = _FALSE;
1546
}
1547
1548
rtw_phydm_ra_registed(adapter, sta);
1549
}
1550
#endif
1551
1552
/*#define DBG_PHYDM_STATE_CHK*/
1553
1554
1555
static u8 _rtw_phydm_rfk_condition_check(_adapter *adapter, u8 is_scaning, u8 ifs_linked)
1556
{
1557
u8 rfk_allowed = _TRUE;
1558
1559
#ifdef CONFIG_SKIP_RFK_IN_DM
1560
rfk_allowed = _FALSE;
1561
if (0)
1562
RTW_ERR("[RFK-CHK] RF-K not allowed due to CONFIG_SKIP_RFK_IN_DM\n");
1563
return rfk_allowed;
1564
#endif
1565
1566
#ifdef CONFIG_MCC_MODE
1567
/*not in MCC State*/
1568
if (MCC_EN(adapter) &&
1569
rtw_hal_check_mcc_status(adapter, MCC_STATUS_DOING_MCC)) {
1570
rfk_allowed = _FALSE;
1571
if (0)
1572
RTW_INFO("[RFK-CHK] RF-K not allowed due to doing MCC\n");
1573
return rfk_allowed;
1574
}
1575
#endif
1576
1577
#if defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW)
1578
1579
#endif
1580
1581
if (ifs_linked) {
1582
if (is_scaning) {
1583
rfk_allowed = _FALSE;
1584
RTW_DBG("[RFK-CHK] RF-K not allowed due to ifaces under site-survey\n");
1585
}
1586
else {
1587
rfk_allowed = rtw_mi_stayin_union_ch_chk(adapter) ? _TRUE : _FALSE;
1588
if (rfk_allowed == _FALSE)
1589
RTW_ERR("[RFK-CHK] RF-K not allowed due to ld_iface not stayin union ch\n");
1590
}
1591
}
1592
1593
return rfk_allowed;
1594
}
1595
1596
#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))
1597
static u8 _rtw_phydm_iqk_segment_chk(_adapter *adapter, u8 ifs_linked)
1598
{
1599
u8 iqk_sgt = _FALSE;
1600
1601
#if 0
1602
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1603
if (ifs_linked && (dvobj->traffic_stat.cur_tx_tp > 2 || dvobj->traffic_stat.cur_rx_tp > 2))
1604
rst = _TRUE;
1605
#else
1606
if (ifs_linked)
1607
iqk_sgt = _TRUE;
1608
#endif
1609
return iqk_sgt;
1610
}
1611
#endif
1612
1613
/*check the tx low rate while unlinked to any AP;for pwr tracking */
1614
static u8 _rtw_phydm_pwr_tracking_rate_check(_adapter *adapter)
1615
{
1616
int i;
1617
_adapter *iface;
1618
u8 if_tx_rate = 0xFF;
1619
u8 tx_rate = 0xFF;
1620
struct mlme_ext_priv *pmlmeext = NULL;
1621
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1622
1623
for (i = 0; i < dvobj->iface_nums; i++) {
1624
iface = dvobj->padapters[i];
1625
pmlmeext = &(iface->mlmeextpriv);
1626
if ((iface) && rtw_is_adapter_up(iface)) {
1627
#ifdef CONFIG_P2P
1628
if (!rtw_p2p_chk_role(&(iface)->wdinfo, P2P_ROLE_DISABLE))
1629
if_tx_rate = IEEE80211_OFDM_RATE_6MB;
1630
else
1631
#endif
1632
if_tx_rate = pmlmeext->tx_rate;
1633
if(if_tx_rate < tx_rate)
1634
tx_rate = if_tx_rate;
1635
1636
RTW_DBG("%s i=%d tx_rate =0x%x\n", __func__, i, if_tx_rate);
1637
}
1638
}
1639
RTW_DBG("%s tx_low_rate (unlinked to any AP)=0x%x\n", __func__, tx_rate);
1640
return tx_rate;
1641
}
1642
1643
#ifdef CONFIG_DYNAMIC_SOML
1644
void rtw_dyn_soml_byte_update(_adapter *adapter, u8 data_rate, u32 size)
1645
{
1646
struct dm_struct *phydm = adapter_to_phydm(adapter);
1647
1648
phydm_soml_bytes_acq(phydm, data_rate, size);
1649
}
1650
1651
void rtw_dyn_soml_para_set(_adapter *adapter, u8 train_num, u8 intvl,
1652
u8 period, u8 delay)
1653
{
1654
struct dm_struct *phydm = adapter_to_phydm(adapter);
1655
1656
phydm_adaptive_soml_para_set(phydm, train_num, intvl, period, delay);
1657
RTW_INFO("%s.\n", __func__);
1658
}
1659
1660
void rtw_dyn_soml_config(_adapter *adapter)
1661
{
1662
RTW_INFO("%s.\n", __func__);
1663
1664
if (adapter->registrypriv.dyn_soml_en == 1) {
1665
/* Must after phydm_adaptive_soml_init() */
1666
rtw_hal_set_hwreg(adapter , HW_VAR_SET_SOML_PARAM , NULL);
1667
RTW_INFO("dyn_soml_en = 1\n");
1668
} else {
1669
if (adapter->registrypriv.dyn_soml_en == 2) {
1670
rtw_dyn_soml_para_set(adapter,
1671
adapter->registrypriv.dyn_soml_train_num,
1672
adapter->registrypriv.dyn_soml_interval,
1673
adapter->registrypriv.dyn_soml_period,
1674
adapter->registrypriv.dyn_soml_delay);
1675
RTW_INFO("dyn_soml_en = 2\n");
1676
RTW_INFO("dyn_soml_en, param = %d, %d, %d, %d\n",
1677
adapter->registrypriv.dyn_soml_train_num,
1678
adapter->registrypriv.dyn_soml_interval,
1679
adapter->registrypriv.dyn_soml_period,
1680
adapter->registrypriv.dyn_soml_delay);
1681
} else if (adapter->registrypriv.dyn_soml_en == 0) {
1682
RTW_INFO("dyn_soml_en = 0\n");
1683
} else
1684
RTW_ERR("%s, wrong setting: dyn_soml_en = %d\n", __func__,
1685
adapter->registrypriv.dyn_soml_en);
1686
}
1687
}
1688
#endif
1689
1690
void rtw_phydm_set_rrsr(_adapter *adapter, u32 rrsr_value, bool write_rrsr)
1691
{
1692
1693
struct dm_struct *phydm = adapter_to_phydm(adapter);
1694
1695
odm_cmn_info_update(phydm, ODM_CMNINFO_RRSR_VAL, rrsr_value);
1696
if(write_rrsr)
1697
phydm_rrsr_set_register(phydm, rrsr_value);
1698
}
1699
void rtw_phydm_read_efuse(_adapter *adapter)
1700
{
1701
PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
1702
struct dm_struct *phydm = &(hal_data->odmpriv);
1703
1704
/*PHYDM API - thermal trim*/
1705
phydm_get_thermal_trim_offset(phydm);
1706
/*PHYDM API - power trim*/
1707
phydm_get_power_trim_offset(phydm);
1708
}
1709
1710
#ifdef CONFIG_LPS_PWR_TRACKING
1711
void rtw_phydm_pwr_tracking_directly(_adapter *adapter)
1712
{
1713
PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
1714
u8 rfk_forbidden = _TRUE;
1715
u8 is_linked = _FALSE;
1716
1717
if (rtw_mi_check_status(adapter, MI_ASSOC))
1718
is_linked = _TRUE;
1719
1720
rfk_forbidden = (_rtw_phydm_rfk_condition_check(adapter, hal_data->bScanInProcess, is_linked) == _TRUE) ? _FALSE : _TRUE;
1721
halrf_cmn_info_set(&hal_data->odmpriv, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);
1722
1723
odm_txpowertracking_direct_ce(&hal_data->odmpriv);
1724
}
1725
#endif
1726
1727
void rtw_phydm_watchdog(_adapter *adapter, bool in_lps)
1728
{
1729
u8 bLinked = _FALSE;
1730
u8 bsta_state = _FALSE;
1731
u8 bBtDisabled = _TRUE;
1732
u8 rfk_forbidden = _FALSE;
1733
#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))
1734
u8 segment_iqk = _FALSE;
1735
#endif
1736
u8 tx_unlinked_low_rate = 0xFF;
1737
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
1738
1739
if (!rtw_is_hw_init_completed(adapter)) {
1740
RTW_DBG("%s skip due to hw_init_completed == FALSE\n", __func__);
1741
return;
1742
}
1743
if (rtw_mi_check_fwstate(adapter, _FW_UNDER_SURVEY))
1744
pHalData->bScanInProcess = _TRUE;
1745
else
1746
pHalData->bScanInProcess = _FALSE;
1747
1748
if (rtw_mi_check_status(adapter, MI_ASSOC)) {
1749
bLinked = _TRUE;
1750
if (rtw_mi_check_status(adapter, MI_STA_LINKED))
1751
bsta_state = _TRUE;
1752
}
1753
1754
odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
1755
odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);
1756
1757
#ifdef CONFIG_BT_COEXIST
1758
bBtDisabled = rtw_btcoex_IsBtDisabled(adapter);
1759
odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED,
1760
(bBtDisabled == _TRUE) ? _FALSE : _TRUE);
1761
#else
1762
odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, _FALSE);
1763
#endif /* CONFIG_BT_COEXIST */
1764
1765
rfk_forbidden = (_rtw_phydm_rfk_condition_check(adapter, pHalData->bScanInProcess, bLinked) == _TRUE) ? _FALSE : _TRUE;
1766
halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);
1767
1768
#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))
1769
segment_iqk = _rtw_phydm_iqk_segment_chk(adapter, bLinked);
1770
halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_IQK_SEGMENT, segment_iqk);
1771
#endif
1772
#ifdef DBG_PHYDM_STATE_CHK
1773
RTW_INFO("%s rfk_forbidden = %s, segment_iqk = %s\n",
1774
__func__, (rfk_forbidden) ? "Y" : "N", (segment_iqk) ? "Y" : "N");
1775
#endif
1776
1777
if (bLinked == _FALSE) {
1778
tx_unlinked_low_rate = _rtw_phydm_pwr_tracking_rate_check(adapter);
1779
halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_RATE_INDEX, tx_unlinked_low_rate);
1780
}
1781
1782
/*if (!rtw_mi_stayin_union_band_chk(adapter)) {
1783
#ifdef DBG_PHYDM_STATE_CHK
1784
RTW_ERR("Not stay in union band, skip phydm\n");
1785
#endif
1786
goto _exit;
1787
}*/
1788
1789
#ifdef CONFIG_TDMADIG
1790
rtw_phydm_tdmadig(adapter, TDMADIG_NON_INIT);
1791
#endif/*CONFIG_TDMADIG*/
1792
1793
if (in_lps)
1794
phydm_watchdog_lps(&pHalData->odmpriv);
1795
else
1796
phydm_watchdog(&pHalData->odmpriv);
1797
1798
#ifdef CONFIG_RTW_ACS
1799
rtw_acs_update_current_info(adapter);
1800
#endif
1801
1802
return;
1803
}
1804
1805
1806