Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_antdiv.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2007 - 2017 Realtek Corporation.
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms of version 2 of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
* The full GNU General Public License is included in this distribution in the
15
* file called LICENSE.
16
*
17
* Contact Information:
18
* wlanfae <[email protected]>
19
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20
* Hsinchu 300, Taiwan.
21
*
22
* Larry Finger <[email protected]>
23
*
24
*****************************************************************************/
25
26
/*************************************************************
27
* include files
28
************************************************************/
29
30
#include "mp_precomp.h"
31
#include "phydm_precomp.h"
32
33
/*******************************************************
34
* when antenna test utility is on or some testing need to disable antenna
35
* diversity call this function to disable all ODM related mechanisms which
36
* will switch antenna.
37
*****************************************************
38
*/
39
#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
40
41
#if (RTL8721D_SUPPORT == 1)
42
43
void odm_update_rx_idle_ant_8721d(void *dm_void, u8 ant, u32 default_ant,
44
u32 optional_ant)
45
{
46
struct dm_struct *dm = (struct dm_struct *)dm_void;
47
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
48
49
odm_set_bb_reg(dm, R_0x864, BIT(5) | BIT(4) | BIT(3), default_ant);
50
/*@Default RX*/
51
odm_set_bb_reg(dm, R_0x864, BIT(8) | BIT(7) | BIT(6), optional_ant);
52
/*@Optional RX*/
53
odm_set_bb_reg(dm, R_0x860, BIT(14) | BIT(13) | BIT(12), default_ant);
54
/*@Default TX*/
55
fat_tab->rx_idle_ant = ant;
56
}
57
58
void odm_trx_hw_ant_div_init_8721d(void *dm_void)
59
{
60
struct dm_struct *dm = (struct dm_struct *)dm_void;
61
62
PHYDM_DBG(dm, DBG_ANT_DIV,
63
"[8721D] AntDiv_Init => ant_div_type=[CG_TRX_HW_ANTDIV]\n");
64
65
/*@BT Coexistence*/
66
/*@keep antsel_map when GNT_BT = 1*/
67
odm_set_bb_reg(dm, R_0x864, BIT(12), 1);
68
/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */
69
odm_set_bb_reg(dm, R_0x874, BIT(23), 0);
70
/* @Disable hw antsw & fast_train.antsw when BT TX/RX */
71
odm_set_bb_reg(dm, R_0xe64, 0xFFFF0000, 0x000c);
72
73
u32 sysreg408 = HAL_READ32(SYSTEM_CTRL_BASE_LP, 0x0408);
74
75
sysreg408 &= ~0x0000001F;
76
sysreg408 |= 0x12;
77
HAL_WRITE32(SYSTEM_CTRL_BASE_LP, 0x0408, sysreg408);
78
79
u32 sysreg410 = HAL_READ32(SYSTEM_CTRL_BASE_LP, 0x0410);
80
81
sysreg410 &= ~0x0000001F;
82
sysreg410 |= 0x12;
83
HAL_WRITE32(SYSTEM_CTRL_BASE_LP, 0x0410, sysreg410);
84
85
u32 sysreg208 = HAL_READ32(SYSTEM_CTRL_BASE_LP, REG_LP_FUNC_EN0);
86
87
sysreg208 |= BIT(28);
88
HAL_WRITE32(SYSTEM_CTRL_BASE_LP, REG_LP_FUNC_EN0, sysreg208);
89
90
u32 sysreg344 =
91
HAL_READ32(SYSTEM_CTRL_BASE_LP, REG_AUDIO_SHARE_PAD_CTRL);
92
93
sysreg344 |= BIT(9);
94
HAL_WRITE32(SYSTEM_CTRL_BASE_LP, REG_AUDIO_SHARE_PAD_CTRL, sysreg344);
95
96
u32 sysreg280 = HAL_READ32(SYSTEM_CTRL_BASE_LP, REG_LP_SYSPLL_CTRL0);
97
98
sysreg280 |= 0x7;
99
HAL_WRITE32(SYSTEM_CTRL_BASE_LP, REG_LP_SYSPLL_CTRL0, sysreg280);
100
101
sysreg344 |= BIT(8);
102
HAL_WRITE32(SYSTEM_CTRL_BASE_LP, REG_AUDIO_SHARE_PAD_CTRL, sysreg344);
103
104
sysreg344 |= BIT(0);
105
HAL_WRITE32(SYSTEM_CTRL_BASE_LP, REG_AUDIO_SHARE_PAD_CTRL, sysreg344);
106
107
odm_set_bb_reg(dm, R_0x930, 0xF00, 8); /* RFE CTRL_2 ANTSEL0 */
108
odm_set_bb_reg(dm, R_0x930, 0xF000, 8); /* RFE CTRL_3 ANTSEL0 */
109
odm_set_bb_reg(dm, R_0x92c, BIT(3) | BIT(2), 2);
110
111
odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0);
112
odm_set_bb_reg(dm, R_0x804, 0xF00, 1); /* r_keep_rfpin */
113
odm_set_bb_reg(dm, R_0x944, 0x0000000C, 0x3); /* PAD in/output CTRL */
114
115
/*PTA setting: WL_BB_SEL_BTG_TRXG_anta, (1: HW CTRL 0: SW CTRL)*/
116
/*odm_set_bb_reg(dm, R_0x948, BIT6, 0);*/
117
/*odm_set_bb_reg(dm, R_0x948, BIT8, 0);*/
118
/*@GNT_WL tx*/
119
odm_set_bb_reg(dm, R_0x950, BIT(29), 0);
120
121
/*@Mapping Table*/
122
odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 0);
123
odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 1);
124
/* odm_set_bb_reg(dm, R_0x864, BIT5|BIT4|BIT3, 0); */
125
/* odm_set_bb_reg(dm, R_0x864, BIT8|BIT7|BIT6, 1); */
126
127
/* Set WLBB_SEL_RF_ON 1 if RXFIR_PWDB > 0xCcc[3:0] */
128
odm_set_bb_reg(dm, R_0xccc, BIT(12), 0);
129
/* @Low-to-High threshold for WLBB_SEL_RF_ON */
130
/*when OFDM enable */
131
odm_set_bb_reg(dm, R_0xccc, 0x0F, 0x01);
132
/* @High-to-Low threshold for WLBB_SEL_RF_ON */
133
/* when OFDM enable */
134
odm_set_bb_reg(dm, R_0xccc, 0xF0, 0x0);
135
/* @b Low-to-High threshold for WLBB_SEL_RF_ON*/
136
/*when OFDM disable ( only CCK ) */
137
odm_set_bb_reg(dm, R_0xabc, 0xFF, 0x06);
138
/* @High-to-Low threshold for WLBB_SEL_RF_ON*/
139
/* when OFDM disable ( only CCK ) */
140
odm_set_bb_reg(dm, R_0xabc, 0xFF00, 0x00);
141
142
/*OFDM HW AntDiv Parameters*/
143
odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xa0);
144
odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x00);
145
odm_set_bb_reg(dm, R_0xc5c, BIT(20) | BIT(19) | BIT(18), 0x04);
146
147
/*@CCK HW AntDiv Parameters*/
148
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
149
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);
150
odm_set_bb_reg(dm, R_0xaa8, BIT(8), 0);
151
152
odm_set_bb_reg(dm, R_0xa0c, 0x0F, 0xf);
153
odm_set_bb_reg(dm, R_0xa14, 0x1F, 0x8);
154
odm_set_bb_reg(dm, R_0xa10, BIT(13), 0x1);
155
odm_set_bb_reg(dm, R_0xa74, BIT(8), 0x0);
156
odm_set_bb_reg(dm, R_0xb34, BIT(30), 0x1);
157
158
/*@disable antenna training */
159
odm_set_bb_reg(dm, R_0xe08, BIT(16), 0);
160
odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);
161
}
162
#endif
163
164
void odm_stop_antenna_switch_dm(void *dm_void)
165
{
166
struct dm_struct *dm = (struct dm_struct *)dm_void;
167
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
168
/* @disable ODM antenna diversity */
169
dm->support_ability &= ~ODM_BB_ANT_DIV;
170
if (fat_tab->div_path_type == ANT_PATH_A)
171
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);
172
else if (fat_tab->div_path_type == ANT_PATH_B)
173
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_B);
174
else if (fat_tab->div_path_type == ANT_PATH_AB)
175
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_AB);
176
odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
177
PHYDM_DBG(dm, DBG_ANT_DIV, "STOP Antenna Diversity\n");
178
}
179
180
void phydm_enable_antenna_diversity(void *dm_void)
181
{
182
struct dm_struct *dm = (struct dm_struct *)dm_void;
183
184
dm->support_ability |= ODM_BB_ANT_DIV;
185
dm->antdiv_select = 0;
186
PHYDM_DBG(dm, DBG_ANT_DIV, "AntDiv is enabled & Re-Init AntDiv\n");
187
odm_antenna_diversity_init(dm);
188
}
189
190
void odm_set_ant_config(void *dm_void, u8 ant_setting /* @0=A, 1=B, 2=C,...*/)
191
{
192
struct dm_struct *dm = (struct dm_struct *)dm_void;
193
194
if (dm->support_ic_type == ODM_RTL8723B) {
195
if (ant_setting == 0) /* @ant A*/
196
odm_set_bb_reg(dm, R_0x948, MASKDWORD, 0x00000000);
197
else if (ant_setting == 1)
198
odm_set_bb_reg(dm, R_0x948, MASKDWORD, 0x00000280);
199
} else if (dm->support_ic_type == ODM_RTL8723D) {
200
if (ant_setting == 0) /* @ant A*/
201
odm_set_bb_reg(dm, R_0x948, MASKLWORD, 0x0000);
202
else if (ant_setting == 1)
203
odm_set_bb_reg(dm, R_0x948, MASKLWORD, 0x0280);
204
}
205
}
206
207
/* ****************************************************** */
208
209
void odm_sw_ant_div_rest_after_link(void *dm_void)
210
{
211
#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
212
struct dm_struct *dm = (struct dm_struct *)dm_void;
213
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
214
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
215
u32 i;
216
217
if (dm->ant_div_type == S0S1_SW_ANTDIV) {
218
swat_tab->try_flag = SWAW_STEP_INIT;
219
swat_tab->rssi_trying = 0;
220
swat_tab->double_chk_flag = 0;
221
fat_tab->rx_idle_ant = MAIN_ANT;
222
223
for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
224
phydm_antdiv_reset_statistic(dm, i);
225
}
226
227
#endif
228
}
229
230
void phydm_n_on_off(void *dm_void, u8 swch, u8 path)
231
{
232
struct dm_struct *dm = (struct dm_struct *)dm_void;
233
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
234
235
if (path == ANT_PATH_A) {
236
odm_set_bb_reg(dm, R_0xc50, BIT(7), swch);
237
} else if (path == ANT_PATH_B) {
238
odm_set_bb_reg(dm, R_0xc58, BIT(7), swch);
239
} else if (path == ANT_PATH_AB) {
240
odm_set_bb_reg(dm, R_0xc50, BIT(7), swch);
241
odm_set_bb_reg(dm, R_0xc58, BIT(7), swch);
242
}
243
odm_set_bb_reg(dm, R_0xa00, BIT(15), swch);
244
#if (RTL8723D_SUPPORT == 1)
245
/*@Mingzhi 2017-05-08*/
246
if (dm->support_ic_type == ODM_RTL8723D) {
247
if (swch == ANTDIV_ON) {
248
odm_set_bb_reg(dm, R_0xce0, BIT(1), 1);
249
odm_set_bb_reg(dm, R_0x948, BIT(6), 1);
250
/*@1:HW ctrl 0:SW ctrl*/
251
} else {
252
odm_set_bb_reg(dm, R_0xce0, BIT(1), 0);
253
odm_set_bb_reg(dm, R_0x948, BIT(6), 0);
254
/*@1:HW ctrl 0:SW ctrl*/
255
}
256
}
257
#endif
258
}
259
260
void phydm_ac_on_off(void *dm_void, u8 swch, u8 path)
261
{
262
struct dm_struct *dm = (struct dm_struct *)dm_void;
263
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
264
265
if (dm->support_ic_type & ODM_RTL8812) {
266
odm_set_bb_reg(dm, R_0xc50, BIT(7), swch);
267
/* OFDM AntDiv function block enable */
268
odm_set_bb_reg(dm, R_0xa00, BIT(15), swch);
269
/* @CCK AntDiv function block enable */
270
} else if (dm->support_ic_type & ODM_RTL8822B) {
271
odm_set_bb_reg(dm, R_0x800, BIT(25), swch);
272
odm_set_bb_reg(dm, R_0xa00, BIT(15), swch);
273
if (path == ANT_PATH_A) {
274
odm_set_bb_reg(dm, R_0xc50, BIT(7), swch);
275
} else if (path == ANT_PATH_B) {
276
odm_set_bb_reg(dm, R_0xe50, BIT(7), swch);
277
} else if (path == ANT_PATH_AB) {
278
odm_set_bb_reg(dm, R_0xc50, BIT(7), swch);
279
odm_set_bb_reg(dm, R_0xe50, BIT(7), swch);
280
}
281
} else {
282
odm_set_bb_reg(dm, R_0x8d4, BIT(24), swch);
283
/* OFDM AntDiv function block enable */
284
285
if (dm->cut_version >= ODM_CUT_C &&
286
dm->support_ic_type == ODM_RTL8821 &&
287
dm->ant_div_type != S0S1_SW_ANTDIV) {
288
PHYDM_DBG(dm, DBG_ANT_DIV, "(Turn %s) CCK HW-AntDiv\n",
289
(swch == ANTDIV_ON) ? "ON" : "OFF");
290
odm_set_bb_reg(dm, R_0x800, BIT(25), swch);
291
odm_set_bb_reg(dm, R_0xa00, BIT(15), swch);
292
/* @CCK AntDiv function block enable */
293
} else if (dm->support_ic_type == ODM_RTL8821C) {
294
PHYDM_DBG(dm, DBG_ANT_DIV, "(Turn %s) CCK HW-AntDiv\n",
295
(swch == ANTDIV_ON) ? "ON" : "OFF");
296
odm_set_bb_reg(dm, R_0x800, BIT(25), swch);
297
odm_set_bb_reg(dm, R_0xa00, BIT(15), swch);
298
/* @CCK AntDiv function block enable */
299
}
300
}
301
}
302
303
void odm_ant_div_on_off(void *dm_void, u8 swch, u8 path)
304
{
305
struct dm_struct *dm = (struct dm_struct *)dm_void;
306
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
307
308
if (fat_tab->ant_div_on_off != swch) {
309
if (dm->ant_div_type == S0S1_SW_ANTDIV)
310
return;
311
312
if (dm->support_ic_type & ODM_N_ANTDIV_SUPPORT) {
313
PHYDM_DBG(dm, DBG_ANT_DIV,
314
"(( Turn %s )) N-Series HW-AntDiv block\n",
315
(swch == ANTDIV_ON) ? "ON" : "OFF");
316
phydm_n_on_off(dm, swch, path);
317
318
} else if (dm->support_ic_type & ODM_AC_ANTDIV_SUPPORT) {
319
PHYDM_DBG(dm, DBG_ANT_DIV,
320
"(( Turn %s )) AC-Series HW-AntDiv block\n",
321
(swch == ANTDIV_ON) ? "ON" : "OFF");
322
phydm_ac_on_off(dm, swch, path);
323
}
324
}
325
fat_tab->ant_div_on_off = swch;
326
}
327
328
void odm_tx_by_tx_desc_or_reg(void *dm_void, u8 swch)
329
{
330
struct dm_struct *dm = (struct dm_struct *)dm_void;
331
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
332
u8 enable;
333
334
if (fat_tab->b_fix_tx_ant == NO_FIX_TX_ANT)
335
enable = (swch == TX_BY_DESC) ? 1 : 0;
336
else
337
enable = 0; /*@Force TX by Reg*/
338
339
if (dm->ant_div_type != CGCS_RX_HW_ANTDIV) {
340
if (dm->support_ic_type & ODM_N_ANTDIV_SUPPORT)
341
odm_set_bb_reg(dm, R_0x80c, BIT(21), enable);
342
else if (dm->support_ic_type & ODM_AC_ANTDIV_SUPPORT)
343
odm_set_bb_reg(dm, R_0x900, BIT(18), enable);
344
345
PHYDM_DBG(dm, DBG_ANT_DIV, "[AntDiv] TX_Ant_BY (( %s ))\n",
346
(enable == TX_BY_DESC) ? "DESC" : "REG");
347
}
348
}
349
350
void phydm_antdiv_reset_statistic(void *dm_void, u32 macid)
351
{
352
struct dm_struct *dm = (struct dm_struct *)dm_void;
353
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
354
355
fat_tab->main_sum[macid] = 0;
356
fat_tab->aux_sum[macid] = 0;
357
fat_tab->main_cnt[macid] = 0;
358
fat_tab->aux_cnt[macid] = 0;
359
fat_tab->main_sum_cck[macid] = 0;
360
fat_tab->aux_sum_cck[macid] = 0;
361
fat_tab->main_cnt_cck[macid] = 0;
362
fat_tab->aux_cnt_cck[macid] = 0;
363
}
364
365
void phydm_fast_training_enable(void *dm_void, u8 swch)
366
{
367
struct dm_struct *dm = (struct dm_struct *)dm_void;
368
u8 enable;
369
370
if (swch == FAT_ON)
371
enable = 1;
372
else
373
enable = 0;
374
375
PHYDM_DBG(dm, DBG_ANT_DIV, "Fast ant Training_en = ((%d))\n", enable);
376
377
if (dm->support_ic_type == ODM_RTL8188E) {
378
odm_set_bb_reg(dm, R_0xe08, BIT(16), enable);
379
/*@enable fast training*/
380
} else if (dm->support_ic_type == ODM_RTL8192E) {
381
odm_set_bb_reg(dm, R_0xb34, BIT(28), enable);
382
/*@enable fast training (path-A)*/
383
#if 0
384
odm_set_bb_reg(dm, R_0xb34, BIT(29), enable);
385
/*enable fast training (path-B)*/
386
#endif
387
} else if (dm->support_ic_type & (ODM_RTL8821 | ODM_RTL8822B)) {
388
odm_set_bb_reg(dm, R_0x900, BIT(19), enable);
389
/*@enable fast training */
390
}
391
}
392
393
void phydm_keep_rx_ack_ant_by_tx_ant_time(void *dm_void, u32 time)
394
{
395
struct dm_struct *dm = (struct dm_struct *)dm_void;
396
397
/* Timming issue: keep Rx ant after tx for ACK ( time x 3.2 mu sec)*/
398
if (dm->support_ic_type & ODM_N_ANTDIV_SUPPORT)
399
odm_set_bb_reg(dm, R_0xe20, 0xf00000, time);
400
else if (dm->support_ic_type & ODM_AC_ANTDIV_SUPPORT)
401
odm_set_bb_reg(dm, R_0x818, 0xf00000, time);
402
}
403
404
void phydm_update_rx_idle_ac(void *dm_void, u8 ant, u32 default_ant,
405
u32 optional_ant, u32 default_tx_ant)
406
{
407
struct dm_struct *dm = (struct dm_struct *)dm_void;
408
409
u16 value16 = odm_read_2byte(dm, ODM_REG_TRMUX_11AC + 2);
410
/* @2014/01/14 MH/Luke.Lee Add direct write for register 0xc0a to */
411
/* @prevnt incorrect 0xc08 bit0-15.We still not know why it is changed*/
412
value16 &= ~(BIT(11) | BIT(10) | BIT(9) | BIT(8) | BIT(7) | BIT(6) |
413
BIT(5) | BIT(4) | BIT(3));
414
value16 |= ((u16)default_ant << 3);
415
value16 |= ((u16)optional_ant << 6);
416
value16 |= ((u16)default_tx_ant << 9);
417
odm_write_2byte(dm, ODM_REG_TRMUX_11AC + 2, value16);
418
#if 0
419
odm_set_bb_reg(dm, ODM_REG_TRMUX_11AC, 0x380000, default_ant);
420
/* @Default RX */
421
odm_set_bb_reg(dm, ODM_REG_TRMUX_11AC, 0x1c00000, optional_ant);
422
/* Optional RX */
423
odm_set_bb_reg(dm, ODM_REG_TRMUX_11AC, 0xe000000, default_ant);
424
/* @Default TX */
425
#endif
426
}
427
428
void phydm_update_rx_idle_n(void *dm_void, u8 ant, u32 default_ant,
429
u32 optional_ant, u32 default_tx_ant)
430
{
431
struct dm_struct *dm = (struct dm_struct *)dm_void;
432
u32 value32;
433
434
if (dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8197F)) {
435
odm_set_bb_reg(dm, R_0xb38, 0x38, default_ant);
436
/* @Default RX */
437
odm_set_bb_reg(dm, R_0xb38, 0x1c0, optional_ant);
438
/* Optional RX */
439
odm_set_bb_reg(dm, R_0x860, 0x7000, default_ant);
440
/* @Default TX */
441
#if (RTL8723B_SUPPORT == 1)
442
} else if (dm->support_ic_type == ODM_RTL8723B) {
443
value32 = odm_get_bb_reg(dm, R_0x948, 0xFFF);
444
445
if (value32 != 0x280)
446
odm_update_rx_idle_ant_8723b(dm, ant, default_ant,
447
optional_ant);
448
else
449
PHYDM_DBG(dm, DBG_ANT_DIV,
450
"[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to 0x948 = 0x280\n");
451
#endif
452
453
#if (RTL8723D_SUPPORT == 1) /*@Mingzhi 2017-05-08*/
454
} else if (dm->support_ic_type == ODM_RTL8723D) {
455
phydm_set_tx_ant_pwr_8723d(dm, ant);
456
odm_update_rx_idle_ant_8723d(dm, ant, default_ant,
457
optional_ant);
458
#endif
459
460
#if (RTL8721D_SUPPORT == 1)
461
} else if (dm->support_ic_type == ODM_RTL8721D) {
462
odm_update_rx_idle_ant_8721d(dm, ant, default_ant,
463
optional_ant);
464
#endif
465
} else {
466
/*@8188E & 8188F*/
467
/*@ if (dm->support_ic_type == ODM_RTL8723D) {*/
468
/*#if (RTL8723D_SUPPORT == 1)*/
469
/* phydm_set_tx_ant_pwr_8723d(dm, ant);*/
470
/*#endif*/
471
/* }*/
472
#if (RTL8188F_SUPPORT == 1)
473
if (dm->support_ic_type == ODM_RTL8188F)
474
phydm_update_rx_idle_antenna_8188F(dm, default_ant);
475
#endif
476
477
odm_set_bb_reg(dm, R_0x864, 0x38, default_ant);/*@Default RX*/
478
odm_set_bb_reg(dm, R_0x864, 0x1c0, optional_ant);
479
/*Optional RX*/
480
odm_set_bb_reg(dm, R_0x860, 0x7000, default_tx_ant);
481
/*@Default TX*/
482
}
483
}
484
485
void odm_update_rx_idle_ant(void *dm_void, u8 ant)
486
{
487
struct dm_struct *dm = (struct dm_struct *)dm_void;
488
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
489
u32 default_ant, optional_ant, value32, default_tx_ant;
490
491
if (fat_tab->rx_idle_ant != ant) {
492
PHYDM_DBG(dm, DBG_ANT_DIV,
493
"[ Update Rx-Idle-ant ] rx_idle_ant =%s\n",
494
(ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
495
496
if (!(dm->support_ic_type & ODM_RTL8723B))
497
fat_tab->rx_idle_ant = ant;
498
499
if (ant == MAIN_ANT) {
500
default_ant = ANT1_2G;
501
optional_ant = ANT2_2G;
502
} else {
503
default_ant = ANT2_2G;
504
optional_ant = ANT1_2G;
505
}
506
507
if (fat_tab->b_fix_tx_ant != NO_FIX_TX_ANT)
508
default_tx_ant = (fat_tab->b_fix_tx_ant ==
509
FIX_TX_AT_MAIN) ? 0 : 1;
510
else
511
default_tx_ant = default_ant;
512
513
if (dm->support_ic_type & ODM_N_ANTDIV_SUPPORT) {
514
phydm_update_rx_idle_n(dm, ant, default_ant,
515
optional_ant, default_tx_ant);
516
} else if (dm->support_ic_type & ODM_AC_ANTDIV_SUPPORT) {
517
phydm_update_rx_idle_ac(dm, ant, default_ant,
518
optional_ant, default_tx_ant);
519
}
520
/*PathA Resp Tx*/
521
if (dm->support_ic_type & (ODM_RTL8821C | ODM_RTL8822B |
522
ODM_RTL8814A))
523
odm_set_mac_reg(dm, R_0x6d8, 0x7, default_tx_ant);
524
else if (dm->support_ic_type == ODM_RTL8188E)
525
odm_set_mac_reg(dm, R_0x6d8, 0xc0, default_tx_ant);
526
else
527
odm_set_mac_reg(dm, R_0x6d8, 0x700, default_tx_ant);
528
529
} else { /* @fat_tab->rx_idle_ant == ant */
530
PHYDM_DBG(dm, DBG_ANT_DIV,
531
"[ Stay in Ori-ant ] rx_idle_ant =%s\n",
532
(ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
533
fat_tab->rx_idle_ant = ant;
534
}
535
}
536
537
void phydm_update_rx_idle_ant_pathb(void *dm_void, u8 ant)
538
{
539
struct dm_struct *dm = (struct dm_struct *)dm_void;
540
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
541
u32 default_ant, optional_ant, value32, default_tx_ant;
542
543
if (fat_tab->rx_idle_ant2 != ant) {
544
PHYDM_DBG(dm, DBG_ANT_DIV,
545
"[ Update Rx-Idle-ant2 ] rx_idle_ant2 =%s\n",
546
(ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
547
if (ant == MAIN_ANT) {
548
default_ant = ANT1_2G;
549
optional_ant = ANT2_2G;
550
} else {
551
default_ant = ANT2_2G;
552
optional_ant = ANT1_2G;
553
}
554
555
if (fat_tab->b_fix_tx_ant != NO_FIX_TX_ANT)
556
default_tx_ant = (fat_tab->b_fix_tx_ant ==
557
FIX_TX_AT_MAIN) ? 0 : 1;
558
else
559
default_tx_ant = default_ant;
560
if (dm->support_ic_type & ODM_RTL8822B) {
561
u16 v16 = odm_read_2byte(dm, ODM_REG_ANT_11AC_B + 2);
562
563
v16 &= ~(0xff8);/*0xE08[11:3]*/
564
v16 |= ((u16)default_ant << 3);
565
v16 |= ((u16)optional_ant << 6);
566
v16 |= ((u16)default_tx_ant << 9);
567
odm_write_2byte(dm, ODM_REG_ANT_11AC_B + 2, v16);
568
odm_set_mac_reg(dm, R_0x6d8, 0x38, default_tx_ant);
569
/*PathB Resp Tx*/
570
}
571
} else {
572
/* fat_tab->rx_idle_ant2 == ant */
573
PHYDM_DBG(dm, DBG_ANT_DIV, "[Stay Ori Ant] rx_idle_ant2 = %s\n",
574
(ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
575
fat_tab->rx_idle_ant2 = ant;
576
}
577
}
578
579
void phydm_set_antdiv_val(void *dm_void, u32 *val_buf, u8 val_len)
580
{
581
struct dm_struct *dm = (struct dm_struct *)dm_void;
582
583
if (val_len != 1) {
584
PHYDM_DBG(dm, ODM_COMP_API, "[Error][antdiv]Need val_len=1\n");
585
return;
586
}
587
588
odm_update_rx_idle_ant(dm, (u8)(*val_buf));
589
}
590
591
void odm_update_tx_ant(void *dm_void, u8 ant, u32 mac_id)
592
{
593
struct dm_struct *dm = (struct dm_struct *)dm_void;
594
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
595
u8 tx_ant;
596
597
if (fat_tab->b_fix_tx_ant != NO_FIX_TX_ANT)
598
ant = (fat_tab->b_fix_tx_ant == FIX_TX_AT_MAIN) ?
599
MAIN_ANT : AUX_ANT;
600
601
if (dm->ant_div_type == CG_TRX_SMART_ANTDIV)
602
tx_ant = ant;
603
else {
604
if (ant == MAIN_ANT)
605
tx_ant = ANT1_2G;
606
else
607
tx_ant = ANT2_2G;
608
}
609
610
fat_tab->antsel_a[mac_id] = tx_ant & BIT(0);
611
fat_tab->antsel_b[mac_id] = (tx_ant & BIT(1)) >> 1;
612
fat_tab->antsel_c[mac_id] = (tx_ant & BIT(2)) >> 2;
613
614
PHYDM_DBG(dm, DBG_ANT_DIV,
615
"[Set TX-DESC value]: mac_id:(( %d )), tx_ant = (( %s ))\n",
616
mac_id, (ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
617
#if 0
618
PHYDM_DBG(dm, DBG_ANT_DIV,
619
"antsel_tr_mux=(( 3'b%d%d%d ))\n",
620
fat_tab->antsel_c[mac_id], fat_tab->antsel_b[mac_id],
621
fat_tab->antsel_a[mac_id]);
622
#endif
623
}
624
625
#ifdef PHYDM_BEAMFORMING_SUPPORT
626
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
627
628
void odm_bdc_init(
629
void *dm_void)
630
{
631
struct dm_struct *dm = (struct dm_struct *)dm_void;
632
struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;
633
634
PHYDM_DBG(dm, DBG_ANT_DIV, "\n[ BDC Initialization......]\n");
635
dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
636
dm_bdc_table->bdc_mode = BDC_MODE_NULL;
637
dm_bdc_table->bdc_try_flag = 0;
638
dm_bdc_table->bd_ccoex_type_wbfer = 0;
639
dm->bdc_holdstate = 0xff;
640
641
if (dm->support_ic_type == ODM_RTL8192E) {
642
odm_set_bb_reg(dm, R_0xd7c, 0x0FFFFFFF, 0x1081008);
643
odm_set_bb_reg(dm, R_0xd80, 0x0FFFFFFF, 0);
644
} else if (dm->support_ic_type == ODM_RTL8812) {
645
odm_set_bb_reg(dm, R_0x9b0, 0x0FFFFFFF, 0x1081008);
646
/* @0x9b0[30:0] = 01081008 */
647
odm_set_bb_reg(dm, R_0x9b4, 0x0FFFFFFF, 0);
648
/* @0x9b4[31:0] = 00000000 */
649
}
650
}
651
652
void odm_CSI_on_off(
653
void *dm_void,
654
u8 CSI_en)
655
{
656
struct dm_struct *dm = (struct dm_struct *)dm_void;
657
if (CSI_en == CSI_ON) {
658
if (dm->support_ic_type == ODM_RTL8192E)
659
odm_set_mac_reg(dm, R_0xd84, BIT(11), 1);
660
/* @0xd84[11]=1 */
661
else if (dm->support_ic_type == ODM_RTL8812)
662
odm_set_mac_reg(dm, R_0x9b0, BIT(31), 1);
663
/* @0x9b0[31]=1 */
664
665
} else if (CSI_en == CSI_OFF) {
666
if (dm->support_ic_type == ODM_RTL8192E)
667
odm_set_mac_reg(dm, R_0xd84, BIT(11), 0);
668
/* @0xd84[11]=0 */
669
else if (dm->support_ic_type == ODM_RTL8812)
670
odm_set_mac_reg(dm, R_0x9b0, BIT(31), 0);
671
/* @0x9b0[31]=0 */
672
}
673
}
674
675
void odm_bd_ccoex_type_with_bfer_client(
676
void *dm_void,
677
u8 swch)
678
{
679
struct dm_struct *dm = (struct dm_struct *)dm_void;
680
struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;
681
u8 bd_ccoex_type_wbfer;
682
683
if (swch == DIVON_CSIOFF) {
684
PHYDM_DBG(dm, DBG_ANT_DIV,
685
"[BDCcoexType: 1] {DIV,CSI} ={1,0}\n");
686
bd_ccoex_type_wbfer = 1;
687
688
if (bd_ccoex_type_wbfer != dm_bdc_table->bd_ccoex_type_wbfer) {
689
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);
690
odm_CSI_on_off(dm, CSI_OFF);
691
dm_bdc_table->bd_ccoex_type_wbfer = 1;
692
}
693
} else if (swch == DIVOFF_CSION) {
694
PHYDM_DBG(dm, DBG_ANT_DIV,
695
"[BDCcoexType: 2] {DIV,CSI} ={0,1}\n");
696
bd_ccoex_type_wbfer = 2;
697
698
if (bd_ccoex_type_wbfer != dm_bdc_table->bd_ccoex_type_wbfer) {
699
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);
700
odm_CSI_on_off(dm, CSI_ON);
701
dm_bdc_table->bd_ccoex_type_wbfer = 2;
702
}
703
}
704
}
705
706
void odm_bf_ant_div_mode_arbitration(
707
void *dm_void)
708
{
709
struct dm_struct *dm = (struct dm_struct *)dm_void;
710
struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;
711
u8 current_bdc_mode;
712
713
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
714
PHYDM_DBG(dm, DBG_ANT_DIV, "\n");
715
716
/* @2 mode 1 */
717
if (dm_bdc_table->num_txbfee_client != 0 &&
718
dm_bdc_table->num_txbfer_client == 0) {
719
current_bdc_mode = BDC_MODE_1;
720
721
if (current_bdc_mode != dm_bdc_table->bdc_mode) {
722
dm_bdc_table->bdc_mode = BDC_MODE_1;
723
odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);
724
dm_bdc_table->bdc_rx_idle_update_counter = 1;
725
PHYDM_DBG(dm, DBG_ANT_DIV, "Change to (( Mode1 ))\n");
726
}
727
728
PHYDM_DBG(dm, DBG_ANT_DIV,
729
"[Antdiv + BF coextance mode] : (( Mode1 ))\n");
730
}
731
/* @2 mode 2 */
732
else if ((dm_bdc_table->num_txbfee_client == 0) &&
733
(dm_bdc_table->num_txbfer_client != 0)) {
734
current_bdc_mode = BDC_MODE_2;
735
736
if (current_bdc_mode != dm_bdc_table->bdc_mode) {
737
dm_bdc_table->bdc_mode = BDC_MODE_2;
738
dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
739
dm_bdc_table->bdc_try_flag = 0;
740
PHYDM_DBG(dm, DBG_ANT_DIV, "Change to (( Mode2 ))\n");
741
}
742
PHYDM_DBG(dm, DBG_ANT_DIV,
743
"[Antdiv + BF coextance mode] : (( Mode2 ))\n");
744
}
745
/* @2 mode 3 */
746
else if ((dm_bdc_table->num_txbfee_client != 0) &&
747
(dm_bdc_table->num_txbfer_client != 0)) {
748
current_bdc_mode = BDC_MODE_3;
749
750
if (current_bdc_mode != dm_bdc_table->bdc_mode) {
751
dm_bdc_table->bdc_mode = BDC_MODE_3;
752
dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
753
dm_bdc_table->bdc_try_flag = 0;
754
dm_bdc_table->bdc_rx_idle_update_counter = 1;
755
PHYDM_DBG(dm, DBG_ANT_DIV, "Change to (( Mode3 ))\n");
756
}
757
758
PHYDM_DBG(dm, DBG_ANT_DIV,
759
"[Antdiv + BF coextance mode] : (( Mode3 ))\n");
760
}
761
/* @2 mode 4 */
762
else if ((dm_bdc_table->num_txbfee_client == 0) &&
763
(dm_bdc_table->num_txbfer_client == 0)) {
764
current_bdc_mode = BDC_MODE_4;
765
766
if (current_bdc_mode != dm_bdc_table->bdc_mode) {
767
dm_bdc_table->bdc_mode = BDC_MODE_4;
768
odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);
769
PHYDM_DBG(dm, DBG_ANT_DIV, "Change to (( Mode4 ))\n");
770
}
771
772
PHYDM_DBG(dm, DBG_ANT_DIV,
773
"[Antdiv + BF coextance mode] : (( Mode4 ))\n");
774
}
775
#endif
776
}
777
778
void odm_div_train_state_setting(
779
void *dm_void)
780
{
781
struct dm_struct *dm = (struct dm_struct *)dm_void;
782
struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;
783
784
PHYDM_DBG(dm, DBG_ANT_DIV,
785
"\n*****[S T A R T ]***** [2-0. DIV_TRAIN_STATE]\n");
786
dm_bdc_table->bdc_try_counter = 2;
787
dm_bdc_table->bdc_try_flag = 1;
788
dm_bdc_table->BDC_state = bdc_bfer_train_state;
789
odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);
790
}
791
792
void odm_bd_ccoex_bfee_rx_div_arbitration(
793
void *dm_void)
794
{
795
struct dm_struct *dm = (struct dm_struct *)dm_void;
796
struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;
797
boolean stop_bf_flag;
798
u8 bdc_active_mode;
799
800
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
801
802
PHYDM_DBG(dm, DBG_ANT_DIV,
803
"***{ num_BFee, num_BFer, num_client} = (( %d , %d , %d))\n",
804
dm_bdc_table->num_txbfee_client,
805
dm_bdc_table->num_txbfer_client, dm_bdc_table->num_client);
806
PHYDM_DBG(dm, DBG_ANT_DIV,
807
"***{ num_BF_tars, num_DIV_tars } = (( %d , %d ))\n",
808
dm_bdc_table->num_bf_tar, dm_bdc_table->num_div_tar);
809
810
/* @2 [ MIB control ] */
811
if (dm->bdc_holdstate == 2) {
812
odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);
813
dm_bdc_table->BDC_state = BDC_BF_HOLD_STATE;
814
PHYDM_DBG(dm, DBG_ANT_DIV, "Force in [ BF STATE]\n");
815
return;
816
} else if (dm->bdc_holdstate == 1) {
817
dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;
818
odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);
819
PHYDM_DBG(dm, DBG_ANT_DIV, "Force in [ DIV STATE]\n");
820
return;
821
}
822
823
/* @------------------------------------------------------------ */
824
825
/* @2 mode 2 & 3 */
826
if (dm_bdc_table->bdc_mode == BDC_MODE_2 ||
827
dm_bdc_table->bdc_mode == BDC_MODE_3) {
828
PHYDM_DBG(dm, DBG_ANT_DIV,
829
"\n{ Try_flag, Try_counter } = { %d , %d }\n",
830
dm_bdc_table->bdc_try_flag,
831
dm_bdc_table->bdc_try_counter);
832
PHYDM_DBG(dm, DBG_ANT_DIV, "BDCcoexType = (( %d ))\n\n",
833
dm_bdc_table->bd_ccoex_type_wbfer);
834
835
/* @All Client have Bfer-Cap------------------------------- */
836
if (dm_bdc_table->num_txbfer_client == dm_bdc_table->num_client) {
837
/* @BFer STA Only?: yes */
838
PHYDM_DBG(dm, DBG_ANT_DIV,
839
"BFer STA only? (( Yes ))\n");
840
dm_bdc_table->bdc_try_flag = 0;
841
dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
842
odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);
843
return;
844
} else
845
PHYDM_DBG(dm, DBG_ANT_DIV,
846
"BFer STA only? (( No ))\n");
847
if (dm_bdc_table->is_all_bf_sta_idle == false && dm_bdc_table->is_all_div_sta_idle == true) {
848
PHYDM_DBG(dm, DBG_ANT_DIV,
849
"All DIV-STA are idle, but BF-STA not\n");
850
dm_bdc_table->bdc_try_flag = 0;
851
dm_bdc_table->BDC_state = bdc_bfer_train_state;
852
odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);
853
return;
854
} else if (dm_bdc_table->is_all_bf_sta_idle == true && dm_bdc_table->is_all_div_sta_idle == false) {
855
PHYDM_DBG(dm, DBG_ANT_DIV,
856
"All BF-STA are idle, but DIV-STA not\n");
857
dm_bdc_table->bdc_try_flag = 0;
858
dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
859
odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);
860
return;
861
}
862
863
/* Select active mode-------------------------------------- */
864
if (dm_bdc_table->num_bf_tar == 0) { /* Selsect_1, Selsect_2 */
865
if (dm_bdc_table->num_div_tar == 0) { /* Selsect_3 */
866
PHYDM_DBG(dm, DBG_ANT_DIV,
867
"Select active mode (( 1 ))\n");
868
dm_bdc_table->bdc_active_mode = 1;
869
} else {
870
PHYDM_DBG(dm, DBG_ANT_DIV,
871
"Select active mode (( 2 ))\n");
872
dm_bdc_table->bdc_active_mode = 2;
873
}
874
dm_bdc_table->bdc_try_flag = 0;
875
dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
876
odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);
877
return;
878
} else { /* num_bf_tar > 0 */
879
if (dm_bdc_table->num_div_tar == 0) { /* Selsect_3 */
880
PHYDM_DBG(dm, DBG_ANT_DIV,
881
"Select active mode (( 3 ))\n");
882
dm_bdc_table->bdc_active_mode = 3;
883
dm_bdc_table->bdc_try_flag = 0;
884
dm_bdc_table->BDC_state = bdc_bfer_train_state;
885
odm_bd_ccoex_type_with_bfer_client(dm,
886
DIVOFF_CSION)
887
;
888
return;
889
} else { /* Selsect_4 */
890
bdc_active_mode = 4;
891
PHYDM_DBG(dm, DBG_ANT_DIV,
892
"Select active mode (( 4 ))\n");
893
894
if (bdc_active_mode != dm_bdc_table->bdc_active_mode) {
895
dm_bdc_table->bdc_active_mode = 4;
896
PHYDM_DBG(dm, DBG_ANT_DIV, "Change to active mode (( 4 )) & return!!!\n");
897
return;
898
}
899
}
900
}
901
902
#if 1
903
if (dm->bdc_holdstate == 0xff) {
904
dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;
905
odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);
906
PHYDM_DBG(dm, DBG_ANT_DIV, "Force in [ DIV STATE]\n");
907
return;
908
}
909
#endif
910
911
/* @Does Client number changed ? ------------------------------- */
912
if (dm_bdc_table->num_client != dm_bdc_table->pre_num_client) {
913
dm_bdc_table->bdc_try_flag = 0;
914
dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
915
PHYDM_DBG(dm, DBG_ANT_DIV,
916
"[ The number of client has been changed !!!] return to (( BDC_DIV_TRAIN_STATE ))\n");
917
}
918
dm_bdc_table->pre_num_client = dm_bdc_table->num_client;
919
920
if (dm_bdc_table->bdc_try_flag == 0) {
921
/* @2 DIV_TRAIN_STATE (mode 2-0) */
922
if (dm_bdc_table->BDC_state == BDC_DIV_TRAIN_STATE)
923
odm_div_train_state_setting(dm);
924
/* @2 BFer_TRAIN_STATE (mode 2-1) */
925
else if (dm_bdc_table->BDC_state == bdc_bfer_train_state) {
926
PHYDM_DBG(dm, DBG_ANT_DIV,
927
"*****[2-1. BFer_TRAIN_STATE ]*****\n");
928
929
#if 0
930
/* @if(dm_bdc_table->num_bf_tar==0) */
931
/* @{ */
932
/* PHYDM_DBG(dm,DBG_ANT_DIV, "BF_tars exist? : (( No )), [ bdc_bfer_train_state ] >> [BDC_DIV_TRAIN_STATE]\n"); */
933
/* odm_div_train_state_setting( dm); */
934
/* @} */
935
/* else */ /* num_bf_tar != 0 */
936
/* @{ */
937
#endif
938
dm_bdc_table->bdc_try_counter = 2;
939
dm_bdc_table->bdc_try_flag = 1;
940
dm_bdc_table->BDC_state = BDC_DECISION_STATE;
941
odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);
942
PHYDM_DBG(dm, DBG_ANT_DIV,
943
"BF_tars exist? : (( Yes )), [ bdc_bfer_train_state ] >> [BDC_DECISION_STATE]\n");
944
/* @} */
945
}
946
/* @2 DECISION_STATE (mode 2-2) */
947
else if (dm_bdc_table->BDC_state == BDC_DECISION_STATE) {
948
PHYDM_DBG(dm, DBG_ANT_DIV,
949
"*****[2-2. DECISION_STATE]*****\n");
950
#if 0
951
/* @if(dm_bdc_table->num_bf_tar==0) */
952
/* @{ */
953
/* ODM_AntDiv_Printk(("BF_tars exist? : (( No )), [ DECISION_STATE ] >> [BDC_DIV_TRAIN_STATE]\n")); */
954
/* odm_div_train_state_setting( dm); */
955
/* @} */
956
/* else */ /* num_bf_tar != 0 */
957
/* @{ */
958
#endif
959
if (dm_bdc_table->BF_pass == false || dm_bdc_table->DIV_pass == false)
960
stop_bf_flag = true;
961
else
962
stop_bf_flag = false;
963
964
PHYDM_DBG(dm, DBG_ANT_DIV,
965
"BF_tars exist? : (( Yes )), {BF_pass, DIV_pass, stop_bf_flag } = { %d, %d, %d }\n",
966
dm_bdc_table->BF_pass,
967
dm_bdc_table->DIV_pass, stop_bf_flag);
968
969
if (stop_bf_flag == true) { /* @DIV_en */
970
dm_bdc_table->bdc_hold_counter = 10; /* @20 */
971
odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);
972
dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;
973
PHYDM_DBG(dm, DBG_ANT_DIV, "[ stop_bf_flag= ((true)), BDC_DECISION_STATE ] >> [BDC_DIV_HOLD_STATE]\n");
974
} else { /* @BF_en */
975
dm_bdc_table->bdc_hold_counter = 10; /* @20 */
976
odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);
977
dm_bdc_table->BDC_state = BDC_BF_HOLD_STATE;
978
PHYDM_DBG(dm, DBG_ANT_DIV, "[stop_bf_flag= ((false)), BDC_DECISION_STATE ] >> [BDC_BF_HOLD_STATE]\n");
979
}
980
/* @} */
981
}
982
/* @2 BF-HOLD_STATE (mode 2-3) */
983
else if (dm_bdc_table->BDC_state == BDC_BF_HOLD_STATE) {
984
PHYDM_DBG(dm, DBG_ANT_DIV,
985
"*****[2-3. BF_HOLD_STATE ]*****\n");
986
987
PHYDM_DBG(dm, DBG_ANT_DIV,
988
"bdc_hold_counter = (( %d ))\n",
989
dm_bdc_table->bdc_hold_counter);
990
991
if (dm_bdc_table->bdc_hold_counter == 1) {
992
PHYDM_DBG(dm, DBG_ANT_DIV, "[ BDC_BF_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE]\n");
993
odm_div_train_state_setting(dm);
994
} else {
995
dm_bdc_table->bdc_hold_counter--;
996
997
#if 0
998
/* @if(dm_bdc_table->num_bf_tar==0) */
999
/* @{ */
1000
/* PHYDM_DBG(dm,DBG_ANT_DIV, "BF_tars exist? : (( No )), [ BDC_BF_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE]\n"); */
1001
/* odm_div_train_state_setting( dm); */
1002
/* @} */
1003
/* else */ /* num_bf_tar != 0 */
1004
/* @{ */
1005
/* PHYDM_DBG(dm,DBG_ANT_DIV, "BF_tars exist? : (( Yes ))\n"); */
1006
#endif
1007
dm_bdc_table->BDC_state = BDC_BF_HOLD_STATE;
1008
odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);
1009
PHYDM_DBG(dm, DBG_ANT_DIV, "[ BDC_BF_HOLD_STATE ] >> [BDC_BF_HOLD_STATE]\n");
1010
/* @} */
1011
}
1012
}
1013
/* @2 DIV-HOLD_STATE (mode 2-4) */
1014
else if (dm_bdc_table->BDC_state == BDC_DIV_HOLD_STATE) {
1015
PHYDM_DBG(dm, DBG_ANT_DIV,
1016
"*****[2-4. DIV_HOLD_STATE ]*****\n");
1017
1018
PHYDM_DBG(dm, DBG_ANT_DIV,
1019
"bdc_hold_counter = (( %d ))\n",
1020
dm_bdc_table->bdc_hold_counter);
1021
1022
if (dm_bdc_table->bdc_hold_counter == 1) {
1023
PHYDM_DBG(dm, DBG_ANT_DIV, "[ BDC_DIV_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE]\n");
1024
odm_div_train_state_setting(dm);
1025
} else {
1026
dm_bdc_table->bdc_hold_counter--;
1027
dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;
1028
odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);
1029
PHYDM_DBG(dm, DBG_ANT_DIV, "[ BDC_DIV_HOLD_STATE ] >> [BDC_DIV_HOLD_STATE]\n");
1030
}
1031
}
1032
1033
} else if (dm_bdc_table->bdc_try_flag == 1) {
1034
/* @2 Set Training counter */
1035
if (dm_bdc_table->bdc_try_counter > 1) {
1036
dm_bdc_table->bdc_try_counter--;
1037
if (dm_bdc_table->bdc_try_counter == 1)
1038
dm_bdc_table->bdc_try_flag = 0;
1039
1040
PHYDM_DBG(dm, DBG_ANT_DIV, "Training !!\n");
1041
/* return ; */
1042
}
1043
}
1044
}
1045
1046
PHYDM_DBG(dm, DBG_ANT_DIV, "\n[end]\n");
1047
1048
#endif /* @#if(DM_ODM_SUPPORT_TYPE == ODM_AP) */
1049
}
1050
1051
#endif
1052
#endif /* @#ifdef PHYDM_BEAMFORMING_SUPPORT*/
1053
1054
#if (RTL8188E_SUPPORT == 1)
1055
1056
void odm_rx_hw_ant_div_init_88e(void *dm_void)
1057
{
1058
struct dm_struct *dm = (struct dm_struct *)dm_void;
1059
u32 value32;
1060
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1061
1062
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
1063
1064
/* @MAC setting */
1065
value32 = odm_get_mac_reg(dm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD);
1066
odm_set_mac_reg(dm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD,
1067
value32 | (BIT(23) | BIT(25)));
1068
/* Reg4C[25]=1, Reg4C[23]=1 for pin output */
1069
/* Pin Settings */
1070
odm_set_bb_reg(dm, ODM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
1071
/* reg870[8]=1'b0, reg870[9]=1'b0 */
1072
/* antsel antselb by HW */
1073
odm_set_bb_reg(dm, ODM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
1074
/* reg864[10]=1'b0 */ /* antsel2 by HW */
1075
odm_set_bb_reg(dm, ODM_REG_LNA_SWITCH_11N, BIT(22), 1);
1076
/* regb2c[22]=1'b0 */ /* disable CS/CG switch */
1077
odm_set_bb_reg(dm, ODM_REG_LNA_SWITCH_11N, BIT(31), 1);
1078
/* regb2c[31]=1'b1 */ /* output at CG only */
1079
/* OFDM Settings */
1080
odm_set_bb_reg(dm, ODM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
1081
/* @CCK Settings */
1082
odm_set_bb_reg(dm, ODM_REG_BB_PWR_SAV4_11N, BIT(7), 1);
1083
/* @Fix CCK PHY status report issue */
1084
odm_set_bb_reg(dm, ODM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1);
1085
/* @CCK complete HW AntDiv within 64 samples */
1086
1087
odm_set_bb_reg(dm, ODM_REG_ANT_MAPPING1_11N, 0xFFFF, 0x0001);
1088
/* @antenna mapping table */
1089
1090
fat_tab->enable_ctrl_frame_antdiv = 1;
1091
}
1092
1093
void odm_trx_hw_ant_div_init_88e(void *dm_void)
1094
{
1095
struct dm_struct *dm = (struct dm_struct *)dm_void;
1096
u32 value32;
1097
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1098
1099
1100
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
1101
1102
/* @MAC setting */
1103
value32 = odm_get_mac_reg(dm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD);
1104
odm_set_mac_reg(dm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD,
1105
value32 | (BIT(23) | BIT(25)));
1106
/* Reg4C[25]=1, Reg4C[23]=1 for pin output */
1107
/* Pin Settings */
1108
odm_set_bb_reg(dm, ODM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
1109
/* reg870[8]=1'b0, reg870[9]=1'b0 */
1110
/* antsel antselb by HW */
1111
odm_set_bb_reg(dm, ODM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
1112
/* reg864[10]=1'b0 */ /* antsel2 by HW */
1113
odm_set_bb_reg(dm, ODM_REG_LNA_SWITCH_11N, BIT(22), 0);
1114
/* regb2c[22]=1'b0 */ /* disable CS/CG switch */
1115
odm_set_bb_reg(dm, ODM_REG_LNA_SWITCH_11N, BIT(31), 1);
1116
/* regb2c[31]=1'b1 */ /* output at CG only */
1117
/* OFDM Settings */
1118
odm_set_bb_reg(dm, ODM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
1119
/* @CCK Settings */
1120
odm_set_bb_reg(dm, ODM_REG_BB_PWR_SAV4_11N, BIT(7), 1);
1121
/* @Fix CCK PHY status report issue */
1122
odm_set_bb_reg(dm, ODM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1);
1123
/* @CCK complete HW AntDiv within 64 samples */
1124
1125
/* @antenna mapping table */
1126
if (!dm->is_mp_chip) { /* testchip */
1127
odm_set_bb_reg(dm, ODM_REG_RX_DEFAULT_A_11N, 0x700, 1);
1128
/* Reg858[10:8]=3'b001 */
1129
odm_set_bb_reg(dm, ODM_REG_RX_DEFAULT_A_11N, 0x3800, 2);
1130
/* Reg858[13:11]=3'b010 */
1131
} else /* @MPchip */
1132
odm_set_bb_reg(dm, ODM_REG_ANT_MAPPING1_11N, MASKDWORD, 0x0201);
1133
/*Reg914=3'b010, Reg915=3'b001*/
1134
1135
fat_tab->enable_ctrl_frame_antdiv = 1;
1136
}
1137
1138
#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
1139
void odm_smart_hw_ant_div_init_88e(
1140
void *dm_void)
1141
{
1142
struct dm_struct *dm = (struct dm_struct *)dm_void;
1143
u32 value32, i;
1144
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1145
1146
PHYDM_DBG(dm, DBG_ANT_DIV,
1147
"***8188E AntDiv_Init => ant_div_type=[CG_TRX_SMART_ANTDIV]\n");
1148
1149
#if 0
1150
if (*dm->mp_mode == true) {
1151
PHYDM_DBG(dm, ODM_COMP_INIT, "dm->ant_div_type: %d\n",
1152
dm->ant_div_type);
1153
return;
1154
}
1155
#endif
1156
1157
fat_tab->train_idx = 0;
1158
fat_tab->fat_state = FAT_PREPARE_STATE;
1159
1160
dm->fat_comb_a = 5;
1161
dm->antdiv_intvl = 0x64; /* @100ms */
1162
1163
for (i = 0; i < 6; i++)
1164
fat_tab->bssid[i] = 0;
1165
for (i = 0; i < (dm->fat_comb_a); i++) {
1166
fat_tab->ant_sum_rssi[i] = 0;
1167
fat_tab->ant_rssi_cnt[i] = 0;
1168
fat_tab->ant_ave_rssi[i] = 0;
1169
}
1170
1171
/* @MAC setting */
1172
value32 = odm_get_mac_reg(dm, R_0x4c, MASKDWORD);
1173
odm_set_mac_reg(dm, R_0x4c, MASKDWORD, value32 | (BIT(23) | BIT(25))); /* Reg4C[25]=1, Reg4C[23]=1 for pin output */
1174
value32 = odm_get_mac_reg(dm, R_0x7b4, MASKDWORD);
1175
odm_set_mac_reg(dm, R_0x7b4, MASKDWORD, value32 | (BIT(16) | BIT(17))); /* Reg7B4[16]=1 enable antenna training, Reg7B4[17]=1 enable A2 match */
1176
/* value32 = platform_efio_read_4byte(adapter, 0x7B4); */
1177
/* platform_efio_write_4byte(adapter, 0x7b4, value32|BIT(18)); */ /* append MACID in reponse packet */
1178
1179
/* @Match MAC ADDR */
1180
odm_set_mac_reg(dm, R_0x7b4, 0xFFFF, 0);
1181
odm_set_mac_reg(dm, R_0x7b0, MASKDWORD, 0);
1182
1183
odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0); /* reg870[8]=1'b0, reg870[9]=1'b0 */ /* antsel antselb by HW */
1184
odm_set_bb_reg(dm, R_0x864, BIT(10), 0); /* reg864[10]=1'b0 */ /* antsel2 by HW */
1185
odm_set_bb_reg(dm, R_0xb2c, BIT(22), 0); /* regb2c[22]=1'b0 */ /* disable CS/CG switch */
1186
odm_set_bb_reg(dm, R_0xb2c, BIT(31), 0); /* regb2c[31]=1'b1 */ /* output at CS only */
1187
odm_set_bb_reg(dm, R_0xca4, MASKDWORD, 0x000000a0);
1188
1189
/* @antenna mapping table */
1190
if (dm->fat_comb_a == 2) {
1191
if (!dm->is_mp_chip) { /* testchip */
1192
odm_set_bb_reg(dm, R_0x858, BIT(10) | BIT(9) | BIT(8), 1); /* Reg858[10:8]=3'b001 */
1193
odm_set_bb_reg(dm, R_0x858, BIT(13) | BIT(12) | BIT(11), 2); /* Reg858[13:11]=3'b010 */
1194
} else { /* @MPchip */
1195
odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 1);
1196
odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 2);
1197
}
1198
} else {
1199
if (!dm->is_mp_chip) { /* testchip */
1200
odm_set_bb_reg(dm, R_0x858, BIT(10) | BIT(9) | BIT(8), 0); /* Reg858[10:8]=3'b000 */
1201
odm_set_bb_reg(dm, R_0x858, BIT(13) | BIT(12) | BIT(11), 1); /* Reg858[13:11]=3'b001 */
1202
odm_set_bb_reg(dm, R_0x878, BIT(16), 0);
1203
odm_set_bb_reg(dm, R_0x858, BIT(15) | BIT(14), 2); /* @(Reg878[0],Reg858[14:15])=3'b010 */
1204
odm_set_bb_reg(dm, R_0x878, BIT(19) | BIT(18) | BIT(17), 3); /* Reg878[3:1]=3b'011 */
1205
odm_set_bb_reg(dm, R_0x878, BIT(22) | BIT(21) | BIT(20), 4); /* Reg878[6:4]=3b'100 */
1206
odm_set_bb_reg(dm, R_0x878, BIT(25) | BIT(24) | BIT(23), 5); /* Reg878[9:7]=3b'101 */
1207
odm_set_bb_reg(dm, R_0x878, BIT(28) | BIT(27) | BIT(26), 6); /* Reg878[12:10]=3b'110 */
1208
odm_set_bb_reg(dm, R_0x878, BIT(31) | BIT(30) | BIT(29), 7); /* Reg878[15:13]=3b'111 */
1209
} else { /* @MPchip */
1210
odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 4); /* @0: 3b'000 */
1211
odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 2); /* @1: 3b'001 */
1212
odm_set_bb_reg(dm, R_0x914, MASKBYTE2, 0); /* @2: 3b'010 */
1213
odm_set_bb_reg(dm, R_0x914, MASKBYTE3, 1); /* @3: 3b'011 */
1214
odm_set_bb_reg(dm, R_0x918, MASKBYTE0, 3); /* @4: 3b'100 */
1215
odm_set_bb_reg(dm, R_0x918, MASKBYTE1, 5); /* @5: 3b'101 */
1216
odm_set_bb_reg(dm, R_0x918, MASKBYTE2, 6); /* @6: 3b'110 */
1217
odm_set_bb_reg(dm, R_0x918, MASKBYTE3, 255); /* @7: 3b'111 */
1218
}
1219
}
1220
1221
/* @Default ant setting when no fast training */
1222
odm_set_bb_reg(dm, R_0x864, BIT(5) | BIT(4) | BIT(3), 0); /* @Default RX */
1223
odm_set_bb_reg(dm, R_0x864, BIT(8) | BIT(7) | BIT(6), 1); /* Optional RX */
1224
odm_set_bb_reg(dm, R_0x860, BIT(14) | BIT(13) | BIT(12), 0); /* @Default TX */
1225
1226
/* @Enter Traing state */
1227
odm_set_bb_reg(dm, R_0x864, BIT(2) | BIT(1) | BIT(0), (dm->fat_comb_a - 1)); /* reg864[2:0]=3'd6 */ /* ant combination=reg864[2:0]+1 */
1228
1229
#if 0
1230
/* SW Control */
1231
/* phy_set_bb_reg(adapter, 0x864, BIT10, 1); */
1232
/* phy_set_bb_reg(adapter, 0x870, BIT9, 1); */
1233
/* phy_set_bb_reg(adapter, 0x870, BIT8, 1); */
1234
/* phy_set_bb_reg(adapter, 0x864, BIT11, 1); */
1235
/* phy_set_bb_reg(adapter, 0x860, BIT9, 0); */
1236
/* phy_set_bb_reg(adapter, 0x860, BIT8, 0); */
1237
#endif
1238
}
1239
#endif
1240
1241
#endif /* @#if (RTL8188E_SUPPORT == 1) */
1242
1243
#if (RTL8192E_SUPPORT == 1)
1244
void odm_rx_hw_ant_div_init_92e(void *dm_void)
1245
{
1246
struct dm_struct *dm = (struct dm_struct *)dm_void;
1247
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1248
1249
#if 0
1250
if (*dm->mp_mode == true) {
1251
odm_ant_div_on_off(dm, ANTDIV_OFF);
1252
odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);
1253
/* r_rxdiv_enable_anta regc50[8]=1'b0 0: control by c50[9] */
1254
odm_set_bb_reg(dm, R_0xc50, BIT(9), 1);
1255
/* @1:CG, 0:CS */
1256
return;
1257
}
1258
#endif
1259
1260
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
1261
1262
/* Pin Settings */
1263
odm_set_bb_reg(dm, R_0x870, BIT(8), 0);
1264
/* reg870[8]=1'b0, antsel is controled by HWs */
1265
odm_set_bb_reg(dm, R_0xc50, BIT(8), 1);
1266
/* regc50[8]=1'b1 CS/CG switching is controled by HWs*/
1267
1268
/* @Mapping table */
1269
odm_set_bb_reg(dm, R_0x914, 0xFFFF, 0x0100);
1270
/* @antenna mapping table */
1271
1272
/* OFDM Settings */
1273
odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xA0); /* thershold */
1274
odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x0); /* @bias */
1275
1276
/* @CCK Settings */
1277
odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);
1278
/* Select which path to receive for CCK_1 & CCK_2 */
1279
odm_set_bb_reg(dm, R_0xb34, BIT(30), 0);
1280
/* @(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */
1281
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
1282
/* @Fix CCK PHY status report issue */
1283
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);
1284
/* @CCK complete HW AntDiv within 64 samples */
1285
1286
#ifdef ODM_EVM_ENHANCE_ANTDIV
1287
phydm_evm_sw_antdiv_init(dm);
1288
#endif
1289
}
1290
1291
void odm_trx_hw_ant_div_init_92e(void *dm_void)
1292
{
1293
struct dm_struct *dm = (struct dm_struct *)dm_void;
1294
1295
#if 0
1296
if (*dm->mp_mode == true) {
1297
odm_ant_div_on_off(dm, ANTDIV_OFF);
1298
odm_set_bb_reg(dm, R_0xc50, BIT(8), 0); /* r_rxdiv_enable_anta regc50[8]=1'b0 0: control by c50[9] */
1299
odm_set_bb_reg(dm, R_0xc50, BIT(9), 1); /* @1:CG, 0:CS */
1300
return;
1301
}
1302
#endif
1303
1304
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
1305
1306
/* @3 --RFE pin setting--------- */
1307
/* @[MAC] */
1308
odm_set_mac_reg(dm, R_0x38, BIT(11), 1);
1309
/* @DBG PAD Driving control (GPIO 8) */
1310
odm_set_mac_reg(dm, R_0x4c, BIT(23), 0); /* path-A, RFE_CTRL_3 */
1311
odm_set_mac_reg(dm, R_0x4c, BIT(29), 1); /* path-A, RFE_CTRL_8 */
1312
/* @[BB] */
1313
odm_set_bb_reg(dm, R_0x944, BIT(3), 1); /* RFE_buffer */
1314
odm_set_bb_reg(dm, R_0x944, BIT(8), 1);
1315
odm_set_bb_reg(dm, R_0x940, BIT(7) | BIT(6), 0x0);
1316
/* r_rfe_path_sel_ (RFE_CTRL_3) */
1317
odm_set_bb_reg(dm, R_0x940, BIT(17) | BIT(16), 0x0);
1318
/* r_rfe_path_sel_ (RFE_CTRL_8) */
1319
odm_set_bb_reg(dm, R_0x944, BIT(31), 0); /* RFE_buffer */
1320
odm_set_bb_reg(dm, R_0x92c, BIT(3), 0); /* rfe_inv (RFE_CTRL_3) */
1321
odm_set_bb_reg(dm, R_0x92c, BIT(8), 1); /* rfe_inv (RFE_CTRL_8) */
1322
odm_set_bb_reg(dm, R_0x930, 0xF000, 0x8); /* path-A, RFE_CTRL_3 */
1323
odm_set_bb_reg(dm, R_0x934, 0xF, 0x8); /* path-A, RFE_CTRL_8 */
1324
/* @3 ------------------------- */
1325
1326
/* Pin Settings */
1327
odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);
1328
/* path-A */ /* disable CS/CG switch */
1329
1330
#if 0
1331
/* @Let it follows PHY_REG for bit9 setting */
1332
if (dm->priv->pshare->rf_ft_var.use_ext_pa ||
1333
dm->priv->pshare->rf_ft_var.use_ext_lna)
1334
odm_set_bb_reg(dm, R_0xc50, BIT(9), 1);/* path-A output at CS */
1335
else
1336
odm_set_bb_reg(dm, R_0xc50, BIT(9), 0);
1337
/* path-A output at CG ->normal power */
1338
#endif
1339
1340
odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0);
1341
/* path-A*/ /* antsel antselb by HW */
1342
odm_set_bb_reg(dm, R_0xb38, BIT(10), 0);/* path-A*/ /* antsel2 by HW */
1343
1344
/* @Mapping table */
1345
odm_set_bb_reg(dm, R_0x914, 0xFFFF, 0x0100);
1346
/* @antenna mapping table */
1347
1348
/* OFDM Settings */
1349
odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xA0); /* thershold */
1350
odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x0); /* @bias */
1351
1352
/* @CCK Settings */
1353
odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);
1354
/* Select which path to receive for CCK_1 & CCK_2 */
1355
odm_set_bb_reg(dm, R_0xb34, BIT(30), 0);
1356
/* @(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */
1357
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
1358
/* @Fix CCK PHY status report issue */
1359
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);
1360
/* @CCK complete HW AntDiv within 64 samples */
1361
1362
#ifdef ODM_EVM_ENHANCE_ANTDIV
1363
phydm_evm_sw_antdiv_init(dm);
1364
#endif
1365
}
1366
1367
#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
1368
void odm_smart_hw_ant_div_init_92e(
1369
void *dm_void)
1370
{
1371
struct dm_struct *dm = (struct dm_struct *)dm_void;
1372
1373
PHYDM_DBG(dm, DBG_ANT_DIV,
1374
"***8192E AntDiv_Init => ant_div_type=[CG_TRX_SMART_ANTDIV]\n");
1375
}
1376
#endif
1377
1378
#endif /* @#if (RTL8192E_SUPPORT == 1) */
1379
1380
#if (RTL8192F_SUPPORT == 1)
1381
void odm_rx_hw_ant_div_init_92f(void *dm_void)
1382
{
1383
struct dm_struct *dm = (struct dm_struct *)dm_void;
1384
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1385
1386
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
1387
1388
/* Pin Settings */
1389
odm_set_bb_reg(dm, R_0x870, BIT(8), 0);
1390
/* reg870[8]=1'b0, "antsel" is controlled by HWs */
1391
odm_set_bb_reg(dm, R_0xc50, BIT(8), 1);
1392
/* regc50[8]=1'b1, " CS/CG switching" is controlled by HWs */
1393
1394
/* @Mapping table */
1395
odm_set_bb_reg(dm, R_0x914, 0xFFFF, 0x0100);
1396
/* @antenna mapping table */
1397
1398
/* OFDM Settings */
1399
odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xA0); /* thershold */
1400
odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x0); /* @bias */
1401
1402
/* @CCK Settings */
1403
odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);
1404
/* Select which path to receive for CCK_1 & CCK_2 */
1405
odm_set_bb_reg(dm, R_0xb34, BIT(30), 0);
1406
/* @(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */
1407
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
1408
/* @Fix CCK PHY status report issue */
1409
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);
1410
/* @CCK complete HW AntDiv within 64 samples */
1411
1412
#ifdef ODM_EVM_ENHANCE_ANTDIV
1413
phydm_evm_sw_antdiv_init(dm);
1414
#endif
1415
}
1416
1417
void odm_trx_hw_ant_div_init_92f(void *dm_void)
1418
1419
{
1420
struct dm_struct *dm = (struct dm_struct *)dm_void;
1421
1422
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
1423
/* @3 --RFE pin setting--------- */
1424
/* @[MAC] */
1425
odm_set_mac_reg(dm, R_0x1048, BIT(0), 1);
1426
/* @DBG PAD Driving control (gpioA_0) */
1427
odm_set_mac_reg(dm, R_0x1048, BIT(1), 1);
1428
/* @DBG PAD Driving control (gpioA_1) */
1429
odm_set_mac_reg(dm, R_0x4c, BIT(24), 1);
1430
odm_set_mac_reg(dm, R_0x1038, BIT(25) | BIT(24) | BIT(23), 0);
1431
/* @gpioA_0,gpioA_1*/
1432
odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);
1433
/* @[BB] */
1434
odm_set_bb_reg(dm, R_0x944, BIT(8), 1); /* output enable */
1435
odm_set_bb_reg(dm, R_0x944, BIT(9), 1);
1436
odm_set_bb_reg(dm, R_0x940, BIT(16) | BIT(17), 0x0);
1437
/* r_rfe_path_sel_ (RFE_CTRL_8) */
1438
odm_set_bb_reg(dm, R_0x940, BIT(18) | BIT(19), 0x0);
1439
/* r_rfe_path_sel_ (RFE_CTRL_9) */
1440
odm_set_bb_reg(dm, R_0x944, BIT(31), 0); /* RFE_buffer_en */
1441
odm_set_bb_reg(dm, R_0x92c, BIT(8), 0); /* rfe_inv (RFE_CTRL_8) */
1442
odm_set_bb_reg(dm, R_0x92c, BIT(9), 1); /* rfe_inv (RFE_CTRL_9) */
1443
odm_set_bb_reg(dm, R_0x934, 0xF, 0x8); /* path-A, RFE_CTRL_8 */
1444
odm_set_bb_reg(dm, R_0x934, 0xF0, 0x8); /* path-A, RFE_CTRL_9 */
1445
/* @3 ------------------------- */
1446
1447
/* Pin Settings */
1448
odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);
1449
/* path-A,disable CS/CG switch */
1450
odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0);
1451
/* path-A*, antsel antselb by HW */
1452
odm_set_bb_reg(dm, R_0xb38, BIT(10), 0); /* path-A ,antsel2 by HW */
1453
1454
/* @Mapping table */
1455
odm_set_bb_reg(dm, R_0x914, 0xFFFF, 0x0100);
1456
/* @antenna mapping table */
1457
1458
/* OFDM Settings */
1459
odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xA0); /* thershold */
1460
odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x0); /* @bias */
1461
1462
/* @CCK Settings */
1463
odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);
1464
/* Select which path to receive for CCK_1 & CCK_2 */
1465
odm_set_bb_reg(dm, R_0xb34, BIT(30), 0);
1466
/* @(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */
1467
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
1468
/* @Fix CCK PHY status report issue */
1469
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);
1470
/* @CCK complete HW AntDiv within 64 samples */
1471
1472
#ifdef ODM_EVM_ENHANCE_ANTDIV
1473
phydm_evm_sw_antdiv_init(dm);
1474
#endif
1475
}
1476
1477
#endif /* @#if (RTL8192F_SUPPORT == 1) */
1478
1479
#if (RTL8822B_SUPPORT == 1)
1480
void phydm_trx_hw_ant_div_init_22b(void *dm_void)
1481
{
1482
struct dm_struct *dm = (struct dm_struct *)dm_void;
1483
1484
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
1485
1486
/* Pin Settings */
1487
odm_set_bb_reg(dm, R_0xcb8, BIT(21) | BIT(20), 0x1);
1488
odm_set_bb_reg(dm, R_0xcb8, BIT(23) | BIT(22), 0x1);
1489
odm_set_bb_reg(dm, R_0xc1c, BIT(7) | BIT(6), 0x0);
1490
/* @------------------------- */
1491
1492
/* @Mapping table */
1493
/* @antenna mapping table */
1494
odm_set_bb_reg(dm, R_0xca4, 0xFFFF, 0x0100);
1495
1496
/* OFDM Settings */
1497
/* thershold */
1498
odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0);
1499
/* @bias */
1500
odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x0);
1501
odm_set_bb_reg(dm, R_0x668, BIT(3), 0x1);
1502
1503
/* @CCK Settings */
1504
/* Select which path to receive for CCK_1 & CCK_2 */
1505
odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);
1506
/* @Fix CCK PHY status report issue */
1507
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
1508
/* @CCK complete HW AntDiv within 64 samples */
1509
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);
1510
/* @BT Coexistence */
1511
/* @keep antsel_map when GNT_BT = 1 */
1512
odm_set_bb_reg(dm, R_0xcac, BIT(9), 1);
1513
/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */
1514
odm_set_bb_reg(dm, R_0x804, BIT(4), 1);
1515
/* response TX ant by RX ant */
1516
odm_set_mac_reg(dm, R_0x668, BIT(3), 1);
1517
#if (defined(CONFIG_2T4R_ANTENNA))
1518
PHYDM_DBG(dm, DBG_ANT_DIV,
1519
"***8822B AntDiv_Init => 2T4R case\n");
1520
/* Pin Settings */
1521
odm_set_bb_reg(dm, R_0xeb8, BIT(21) | BIT(20), 0x1);
1522
odm_set_bb_reg(dm, R_0xeb8, BIT(23) | BIT(22), 0x1);
1523
odm_set_bb_reg(dm, R_0xe1c, BIT(7) | BIT(6), 0x0);
1524
/* @BT Coexistence */
1525
odm_set_bb_reg(dm, R_0xeac, BIT(9), 1);
1526
/* @keep antsel_map when GNT_BT = 1 */
1527
/* Mapping table */
1528
/* antenna mapping table */
1529
odm_set_bb_reg(dm, R_0xea4, 0xFFFF, 0x0100);
1530
/*odm_set_bb_reg(dm, R_0x900, 0x30000, 0x3);*/
1531
#endif
1532
1533
#ifdef ODM_EVM_ENHANCE_ANTDIV
1534
phydm_evm_sw_antdiv_init(dm);
1535
#endif
1536
}
1537
#endif /* @#if (RTL8822B_SUPPORT == 1) */
1538
1539
#if (RTL8197F_SUPPORT == 1)
1540
void phydm_rx_hw_ant_div_init_97f(void *dm_void)
1541
{
1542
struct dm_struct *dm = (struct dm_struct *)dm_void;
1543
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1544
1545
#if 0
1546
if (*dm->mp_mode == true) {
1547
odm_ant_div_on_off(dm, ANTDIV_OFF);
1548
odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);
1549
/* r_rxdiv_enable_anta regc50[8]=1'b0 0: control by c50[9] */
1550
odm_set_bb_reg(dm, R_0xc50, BIT(9), 1); /* @1:CG, 0:CS */
1551
return;
1552
}
1553
#endif
1554
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
1555
1556
/* Pin Settings */
1557
odm_set_bb_reg(dm, R_0x870, BIT(8), 0);
1558
/* reg870[8]=1'b0, */ /* "antsel" is controlled by HWs */
1559
odm_set_bb_reg(dm, R_0xc50, BIT(8), 1);
1560
/* regc50[8]=1'b1 *//*"CS/CG switching" is controlled by HWs */
1561
1562
/* @Mapping table */
1563
odm_set_bb_reg(dm, R_0x914, 0xFFFF, 0x0100);
1564
/* @antenna mapping table */
1565
1566
/* OFDM Settings */
1567
odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xA0); /* thershold */
1568
odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x0); /* @bias */
1569
1570
/* @CCK Settings */
1571
odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);
1572
/* Select which path to receive for CCK_1 & CCK_2 */
1573
odm_set_bb_reg(dm, R_0xb34, BIT(30), 0);
1574
/* @(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */
1575
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
1576
/* @Fix CCK PHY status report issue */
1577
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);
1578
/* @CCK complete HW AntDiv within 64 samples */
1579
1580
#ifdef ODM_EVM_ENHANCE_ANTDIV
1581
phydm_evm_sw_antdiv_init(dm);
1582
#endif
1583
}
1584
#endif //#if (RTL8197F_SUPPORT == 1)
1585
1586
#if (RTL8723D_SUPPORT == 1)
1587
void odm_trx_hw_ant_div_init_8723d(void *dm_void)
1588
{
1589
struct dm_struct *dm = (struct dm_struct *)dm_void;
1590
1591
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
1592
1593
/*@BT Coexistence*/
1594
/*@keep antsel_map when GNT_BT = 1*/
1595
odm_set_bb_reg(dm, R_0x864, BIT(12), 1);
1596
/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */
1597
odm_set_bb_reg(dm, R_0x874, BIT(23), 0);
1598
/* @Disable hw antsw & fast_train.antsw when BT TX/RX */
1599
odm_set_bb_reg(dm, R_0xe64, 0xFFFF0000, 0x000c);
1600
1601
odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0);
1602
#if 0
1603
/*PTA setting: WL_BB_SEL_BTG_TRXG_anta, (1: HW CTRL 0: SW CTRL)*/
1604
/*odm_set_bb_reg(dm, R_0x948, BIT6, 0);*/
1605
/*odm_set_bb_reg(dm, R_0x948, BIT8, 0);*/
1606
#endif
1607
/*@GNT_WL tx*/
1608
odm_set_bb_reg(dm, R_0x950, BIT(29), 0);
1609
1610
/*@Mapping Table*/
1611
odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 0);
1612
odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 3);
1613
#if 0
1614
/* odm_set_bb_reg(dm, R_0x864, BIT5|BIT4|BIT3, 0); */
1615
/* odm_set_bb_reg(dm, R_0x864, BIT8|BIT7|BIT6, 1); */
1616
#endif
1617
1618
/* Set WLBB_SEL_RF_ON 1 if RXFIR_PWDB > 0xCcc[3:0] */
1619
odm_set_bb_reg(dm, R_0xccc, BIT(12), 0);
1620
/* @Low-to-High threshold for WLBB_SEL_RF_ON when OFDM enable */
1621
odm_set_bb_reg(dm, R_0xccc, 0x0F, 0x01);
1622
/* @High-to-Low threshold for WLBB_SEL_RF_ON when OFDM enable */
1623
odm_set_bb_reg(dm, R_0xccc, 0xF0, 0x0);
1624
/* @b Low-to-High threshold for WLBB_SEL_RF_ON when OFDM disable (CCK)*/
1625
odm_set_bb_reg(dm, R_0xabc, 0xFF, 0x06);
1626
/* @High-to-Low threshold for WLBB_SEL_RF_ON when OFDM disable (CCK) */
1627
odm_set_bb_reg(dm, R_0xabc, 0xFF00, 0x00);
1628
1629
/*OFDM HW AntDiv Parameters*/
1630
odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xa0);
1631
odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x00);
1632
odm_set_bb_reg(dm, R_0xc5c, BIT(20) | BIT(19) | BIT(18), 0x04);
1633
1634
/*@CCK HW AntDiv Parameters*/
1635
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
1636
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);
1637
odm_set_bb_reg(dm, R_0xaa8, BIT(8), 0);
1638
1639
odm_set_bb_reg(dm, R_0xa0c, 0x0F, 0xf);
1640
odm_set_bb_reg(dm, R_0xa14, 0x1F, 0x8);
1641
odm_set_bb_reg(dm, R_0xa10, BIT(13), 0x1);
1642
odm_set_bb_reg(dm, R_0xa74, BIT(8), 0x0);
1643
odm_set_bb_reg(dm, R_0xb34, BIT(30), 0x1);
1644
1645
/*@disable antenna training */
1646
odm_set_bb_reg(dm, R_0xe08, BIT(16), 0);
1647
odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);
1648
}
1649
/*@Mingzhi 2017-05-08*/
1650
1651
void odm_s0s1_sw_ant_div_init_8723d(void *dm_void)
1652
{
1653
struct dm_struct *dm = (struct dm_struct *)dm_void;
1654
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
1655
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1656
1657
PHYDM_DBG(dm, DBG_ANT_DIV,
1658
"***8723D AntDiv_Init => ant_div_type=[ S0S1_SW_AntDiv]\n");
1659
1660
/*@keep antsel_map when GNT_BT = 1*/
1661
odm_set_bb_reg(dm, R_0x864, BIT(12), 1);
1662
1663
/* @Disable antsw when GNT_BT=1 */
1664
odm_set_bb_reg(dm, R_0x874, BIT(23), 0);
1665
1666
/* @Mapping Table */
1667
odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 0);
1668
odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 1);
1669
1670
/* Output Pin Settings */
1671
#if 0
1672
/* odm_set_bb_reg(dm, R_0x948, BIT6, 0x1); */
1673
#endif
1674
odm_set_bb_reg(dm, R_0x870, BIT(8), 1);
1675
odm_set_bb_reg(dm, R_0x870, BIT(9), 1);
1676
1677
/* Status init */
1678
fat_tab->is_become_linked = false;
1679
swat_tab->try_flag = SWAW_STEP_INIT;
1680
swat_tab->double_chk_flag = 0;
1681
swat_tab->cur_antenna = MAIN_ANT;
1682
swat_tab->pre_ant = MAIN_ANT;
1683
dm->antdiv_counter = CONFIG_ANTDIV_PERIOD;
1684
1685
/* @2 [--For HW Bug setting] */
1686
odm_set_bb_reg(dm, R_0x80c, BIT(21), 0); /* TX ant by Reg */
1687
}
1688
1689
void odm_update_rx_idle_ant_8723d(void *dm_void, u8 ant, u32 default_ant,
1690
u32 optional_ant)
1691
{
1692
struct dm_struct *dm = (struct dm_struct *)dm_void;
1693
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1694
void *adapter = dm->adapter;
1695
u8 count = 0;
1696
1697
#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
1698
/*score board to BT ,a002:WL to do ant-div*/
1699
odm_set_mac_reg(dm, R_0xa8, MASKHWORD, 0xa002);
1700
ODM_delay_us(50);
1701
#endif
1702
#if 0
1703
/* odm_set_bb_reg(dm, R_0x948, BIT(6), 0x1); */
1704
#endif
1705
if (dm->ant_div_type == S0S1_SW_ANTDIV) {
1706
odm_set_bb_reg(dm, R_0x860, BIT(8), default_ant);
1707
odm_set_bb_reg(dm, R_0x860, BIT(9), default_ant);
1708
}
1709
odm_set_bb_reg(dm, R_0x864, BIT(5) | BIT(4) | BIT(3), default_ant);
1710
/*@Default RX*/
1711
odm_set_bb_reg(dm, R_0x864, BIT(8) | BIT(7) | BIT(6), optional_ant);
1712
/*Optional RX*/
1713
odm_set_bb_reg(dm, R_0x860, BIT(14) | BIT(13) | BIT(12), default_ant);
1714
/*@Default TX*/
1715
fat_tab->rx_idle_ant = ant;
1716
#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
1717
/*score board to BT ,a000:WL@S1 a001:WL@S0*/
1718
if (default_ant == ANT1_2G)
1719
odm_set_mac_reg(dm, R_0xa8, MASKHWORD, 0xa000);
1720
else
1721
odm_set_mac_reg(dm, R_0xa8, MASKHWORD, 0xa001);
1722
#endif
1723
}
1724
1725
void phydm_set_tx_ant_pwr_8723d(void *dm_void, u8 ant)
1726
{
1727
struct dm_struct *dm = (struct dm_struct *)dm_void;
1728
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1729
void *adapter = dm->adapter;
1730
1731
fat_tab->rx_idle_ant = ant;
1732
1733
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1734
((PADAPTER)adapter)->HalFunc.SetTxPowerLevelHandler(adapter, *dm->channel);
1735
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
1736
rtw_hal_set_tx_power_level(adapter, *dm->channel);
1737
#endif
1738
}
1739
#endif
1740
1741
#if (RTL8723B_SUPPORT == 1)
1742
void odm_trx_hw_ant_div_init_8723b(void *dm_void)
1743
{
1744
struct dm_struct *dm = (struct dm_struct *)dm_void;
1745
1746
PHYDM_DBG(dm, DBG_ANT_DIV,
1747
"***8723B AntDiv_Init => ant_div_type=[CG_TRX_HW_ANTDIV(DPDT)]\n");
1748
1749
/* @Mapping Table */
1750
odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 0);
1751
odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 1);
1752
1753
/* OFDM HW AntDiv Parameters */
1754
odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xa0); /* thershold */
1755
odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x00); /* @bias */
1756
1757
/* @CCK HW AntDiv Parameters */
1758
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
1759
/* patch for clk from 88M to 80M */
1760
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);
1761
/* @do 64 samples */
1762
1763
/* @BT Coexistence */
1764
odm_set_bb_reg(dm, R_0x864, BIT(12), 0);
1765
/* @keep antsel_map when GNT_BT = 1 */
1766
odm_set_bb_reg(dm, R_0x874, BIT(23), 0);
1767
/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */
1768
1769
/* Output Pin Settings */
1770
odm_set_bb_reg(dm, R_0x870, BIT(8), 0);
1771
1772
odm_set_bb_reg(dm, R_0x948, BIT(6), 0);
1773
/* WL_BB_SEL_BTG_TRXG_anta, (1: HW CTRL 0: SW CTRL) */
1774
odm_set_bb_reg(dm, R_0x948, BIT(7), 0);
1775
1776
odm_set_mac_reg(dm, R_0x40, BIT(3), 1);
1777
odm_set_mac_reg(dm, R_0x38, BIT(11), 1);
1778
odm_set_mac_reg(dm, R_0x4c, BIT(24) | BIT(23), 2);
1779
/* select DPDT_P and DPDT_N as output pin */
1780
1781
odm_set_bb_reg(dm, R_0x944, BIT(0) | BIT(1), 3); /* @in/out */
1782
odm_set_bb_reg(dm, R_0x944, BIT(31), 0);
1783
1784
odm_set_bb_reg(dm, R_0x92c, BIT(1), 0); /* @DPDT_P non-inverse */
1785
odm_set_bb_reg(dm, R_0x92c, BIT(0), 1); /* @DPDT_N inverse */
1786
1787
odm_set_bb_reg(dm, R_0x930, 0xF0, 8); /* @DPDT_P = ANTSEL[0] */
1788
odm_set_bb_reg(dm, R_0x930, 0xF, 8); /* @DPDT_N = ANTSEL[0] */
1789
1790
/* @2 [--For HW Bug setting] */
1791
if (dm->ant_type == ODM_AUTO_ANT)
1792
odm_set_bb_reg(dm, R_0xa00, BIT(15), 0);
1793
/* @CCK AntDiv function block enable */
1794
}
1795
1796
void odm_s0s1_sw_ant_div_init_8723b(void *dm_void)
1797
{
1798
struct dm_struct *dm = (struct dm_struct *)dm_void;
1799
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
1800
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1801
1802
PHYDM_DBG(dm, DBG_ANT_DIV,
1803
"***8723B AntDiv_Init => ant_div_type=[ S0S1_SW_AntDiv]\n");
1804
1805
/* @Mapping Table */
1806
odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 0);
1807
odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 1);
1808
1809
#if 0
1810
/* Output Pin Settings */
1811
/* odm_set_bb_reg(dm, R_0x948, BIT6, 0x1); */
1812
#endif
1813
odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0);
1814
1815
fat_tab->is_become_linked = false;
1816
swat_tab->try_flag = SWAW_STEP_INIT;
1817
swat_tab->double_chk_flag = 0;
1818
1819
/* @2 [--For HW Bug setting] */
1820
odm_set_bb_reg(dm, R_0x80c, BIT(21), 0); /* TX ant by Reg */
1821
}
1822
1823
void odm_update_rx_idle_ant_8723b(
1824
void *dm_void,
1825
u8 ant,
1826
u32 default_ant,
1827
u32 optional_ant)
1828
{
1829
struct dm_struct *dm = (struct dm_struct *)dm_void;
1830
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1831
void *adapter = dm->adapter;
1832
u8 count = 0;
1833
/*u8 u1_temp;*/
1834
/*u8 h2c_parameter;*/
1835
1836
if (!dm->is_linked && dm->ant_type == ODM_AUTO_ANT) {
1837
PHYDM_DBG(dm, DBG_ANT_DIV,
1838
"[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to no link\n");
1839
return;
1840
}
1841
1842
#if 0
1843
/* Send H2C command to FW */
1844
/* @Enable wifi calibration */
1845
h2c_parameter = true;
1846
odm_fill_h2c_cmd(dm, ODM_H2C_WIFI_CALIBRATION, 1, &h2c_parameter);
1847
1848
/* @Check if H2C command sucess or not (0x1e6) */
1849
u1_temp = odm_read_1byte(dm, 0x1e6);
1850
while ((u1_temp != 0x1) && (count < 100)) {
1851
ODM_delay_us(10);
1852
u1_temp = odm_read_1byte(dm, 0x1e6);
1853
count++;
1854
}
1855
PHYDM_DBG(dm, DBG_ANT_DIV,
1856
"[ Update Rx-Idle-ant ] 8723B: H2C command status = %d, count = %d\n",
1857
u1_temp, count);
1858
1859
if (u1_temp == 0x1) {
1860
/* @Check if BT is doing IQK (0x1e7) */
1861
count = 0;
1862
u1_temp = odm_read_1byte(dm, 0x1e7);
1863
while ((!(u1_temp & BIT(0))) && (count < 100)) {
1864
ODM_delay_us(50);
1865
u1_temp = odm_read_1byte(dm, 0x1e7);
1866
count++;
1867
}
1868
PHYDM_DBG(dm, DBG_ANT_DIV,
1869
"[ Update Rx-Idle-ant ] 8723B: BT IQK status = %d, count = %d\n",
1870
u1_temp, count);
1871
1872
if (u1_temp & BIT(0)) {
1873
odm_set_bb_reg(dm, R_0x948, BIT(6), 0x1);
1874
odm_set_bb_reg(dm, R_0x948, BIT(9), default_ant);
1875
odm_set_bb_reg(dm, R_0x864, 0x38, default_ant);
1876
/* @Default RX */
1877
odm_set_bb_reg(dm, R_0x864, 0x1c0, optional_ant);
1878
/* @Optional RX */
1879
odm_set_bb_reg(dm, R_0x860, 0x7000, default_ant);
1880
/* @Default TX */
1881
fat_tab->rx_idle_ant = ant;
1882
1883
/* Set TX AGC by S0/S1 */
1884
/* Need to consider Linux driver */
1885
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1886
adapter->hal_func.set_tx_power_level_handler(adapter, *dm->channel);
1887
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
1888
rtw_hal_set_tx_power_level(adapter, *dm->channel);
1889
#endif
1890
1891
/* Set IQC by S0/S1 */
1892
odm_set_iqc_by_rfpath(dm, default_ant);
1893
PHYDM_DBG(dm, DBG_ANT_DIV,
1894
"[ Update Rx-Idle-ant ] 8723B: Success to set RX antenna\n");
1895
} else
1896
PHYDM_DBG(dm, DBG_ANT_DIV,
1897
"[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to BT IQK\n");
1898
} else
1899
PHYDM_DBG(dm, DBG_ANT_DIV,
1900
"[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to H2C command fail\n");
1901
1902
/* Send H2C command to FW */
1903
/* @Disable wifi calibration */
1904
h2c_parameter = false;
1905
odm_fill_h2c_cmd(dm, ODM_H2C_WIFI_CALIBRATION, 1, &h2c_parameter);
1906
#else
1907
1908
odm_set_bb_reg(dm, R_0x948, BIT(6), 0x1);
1909
odm_set_bb_reg(dm, R_0x948, BIT(9), default_ant);
1910
odm_set_bb_reg(dm, R_0x864, BIT(5) | BIT(4) | BIT(3), default_ant);
1911
/*@Default RX*/
1912
odm_set_bb_reg(dm, R_0x864, BIT(8) | BIT(7) | BIT(6), optional_ant);
1913
/*Optional RX*/
1914
odm_set_bb_reg(dm, R_0x860, BIT(14) | BIT(13) | BIT(12), default_ant);
1915
/*@Default TX*/
1916
fat_tab->rx_idle_ant = ant;
1917
1918
/* Set TX AGC by S0/S1 */
1919
/* Need to consider Linux driver */
1920
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1921
((PADAPTER)adapter)->HalFunc.SetTxPowerLevelHandler(adapter, *dm->channel);
1922
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
1923
rtw_hal_set_tx_power_level(adapter, *dm->channel);
1924
#endif
1925
1926
/* Set IQC by S0/S1 */
1927
odm_set_iqc_by_rfpath(dm, default_ant);
1928
PHYDM_DBG(dm, DBG_ANT_DIV,
1929
"[ Update Rx-Idle-ant ] 8723B: Success to set RX antenna\n");
1930
1931
#endif
1932
}
1933
1934
boolean
1935
phydm_is_bt_enable_8723b(void *dm_void)
1936
{
1937
struct dm_struct *dm = (struct dm_struct *)dm_void;
1938
u32 bt_state;
1939
#if 0
1940
/*u32 reg75;*/
1941
1942
/*reg75 = odm_get_bb_reg(dm, R_0x74, BIT8);*/
1943
/*odm_set_bb_reg(dm, R_0x74, BIT8, 0x0);*/
1944
#endif
1945
odm_set_bb_reg(dm, R_0xa0, BIT(24) | BIT(25) | BIT(26), 0x5);
1946
bt_state = odm_get_bb_reg(dm, R_0xa0, 0xf);
1947
#if 0
1948
/*odm_set_bb_reg(dm, R_0x74, BIT8, reg75);*/
1949
#endif
1950
1951
if (bt_state == 4 || bt_state == 7 || bt_state == 9 || bt_state == 13)
1952
return true;
1953
else
1954
return false;
1955
}
1956
#endif /* @#if (RTL8723B_SUPPORT == 1) */
1957
1958
#if (RTL8821A_SUPPORT == 1)
1959
1960
void odm_trx_hw_ant_div_init_8821a(void *dm_void)
1961
{
1962
struct dm_struct *dm = (struct dm_struct *)dm_void;
1963
1964
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
1965
1966
/* Output Pin Settings */
1967
odm_set_mac_reg(dm, R_0x4c, BIT(25), 0);
1968
1969
odm_set_mac_reg(dm, R_0x64, BIT(29), 1); /* PAPE by WLAN control */
1970
odm_set_mac_reg(dm, R_0x64, BIT(28), 1); /* @LNAON by WLAN control */
1971
1972
odm_set_bb_reg(dm, R_0xcb8, BIT(16), 0);
1973
1974
odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);
1975
/* select DPDT_P and DPDT_N as output pin */
1976
odm_set_mac_reg(dm, R_0x4c, BIT(24), 1); /* @by WLAN control */
1977
odm_set_bb_reg(dm, R_0xcb4, 0xF, 8); /* @DPDT_P = ANTSEL[0] */
1978
odm_set_bb_reg(dm, R_0xcb4, 0xF0, 8); /* @DPDT_N = ANTSEL[0] */
1979
odm_set_bb_reg(dm, R_0xcb4, BIT(29), 0); /* @DPDT_P non-inverse */
1980
odm_set_bb_reg(dm, R_0xcb4, BIT(28), 1); /* @DPDT_N inverse */
1981
1982
/* @Mapping Table */
1983
odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);
1984
odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);
1985
1986
/* OFDM HW AntDiv Parameters */
1987
odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */
1988
odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x10); /* @bias */
1989
1990
/* @CCK HW AntDiv Parameters */
1991
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
1992
/* patch for clk from 88M to 80M */
1993
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */
1994
1995
odm_set_bb_reg(dm, R_0x800, BIT(25), 0);
1996
/* @ANTSEL_CCK sent to the smart_antenna circuit */
1997
odm_set_bb_reg(dm, R_0xa00, BIT(15), 0);
1998
/* @CCK AntDiv function block enable */
1999
2000
/* @BT Coexistence */
2001
odm_set_bb_reg(dm, R_0xcac, BIT(9), 1);
2002
/* @keep antsel_map when GNT_BT = 1 */
2003
odm_set_bb_reg(dm, R_0x804, BIT(4), 1);
2004
/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */
2005
2006
odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);
2007
/* settling time of antdiv by RF LNA = 100ns */
2008
2009
/* response TX ant by RX ant */
2010
odm_set_mac_reg(dm, R_0x668, BIT(3), 1);
2011
}
2012
2013
void odm_s0s1_sw_ant_div_init_8821a(void *dm_void)
2014
{
2015
struct dm_struct *dm = (struct dm_struct *)dm_void;
2016
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
2017
2018
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
2019
2020
/* Output Pin Settings */
2021
odm_set_mac_reg(dm, R_0x4c, BIT(25), 0);
2022
2023
odm_set_mac_reg(dm, R_0x64, BIT(29), 1); /* PAPE by WLAN control */
2024
odm_set_mac_reg(dm, R_0x64, BIT(28), 1); /* @LNAON by WLAN control */
2025
2026
odm_set_bb_reg(dm, R_0xcb8, BIT(16), 0);
2027
2028
odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);
2029
/* select DPDT_P and DPDT_N as output pin */
2030
odm_set_mac_reg(dm, R_0x4c, BIT(24), 1); /* @by WLAN control */
2031
odm_set_bb_reg(dm, R_0xcb4, 0xF, 8); /* @DPDT_P = ANTSEL[0] */
2032
odm_set_bb_reg(dm, R_0xcb4, 0xF0, 8); /* @DPDT_N = ANTSEL[0] */
2033
odm_set_bb_reg(dm, R_0xcb4, BIT(29), 0); /* @DPDT_P non-inverse */
2034
odm_set_bb_reg(dm, R_0xcb4, BIT(28), 1); /* @DPDT_N inverse */
2035
2036
/* @Mapping Table */
2037
odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);
2038
odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);
2039
2040
/* OFDM HW AntDiv Parameters */
2041
odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */
2042
odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x10); /* @bias */
2043
2044
/* @CCK HW AntDiv Parameters */
2045
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
2046
/* patch for clk from 88M to 80M */
2047
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */
2048
2049
odm_set_bb_reg(dm, R_0x800, BIT(25), 0);
2050
/* @ANTSEL_CCK sent to the smart_antenna circuit */
2051
odm_set_bb_reg(dm, R_0xa00, BIT(15), 0);
2052
/* @CCK AntDiv function block enable */
2053
2054
/* @BT Coexistence */
2055
odm_set_bb_reg(dm, R_0xcac, BIT(9), 1);
2056
/* @keep antsel_map when GNT_BT = 1 */
2057
odm_set_bb_reg(dm, R_0x804, BIT(4), 1);
2058
/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */
2059
2060
odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);
2061
/* settling time of antdiv by RF LNA = 100ns */
2062
2063
/* response TX ant by RX ant */
2064
odm_set_mac_reg(dm, R_0x668, BIT(3), 1);
2065
2066
odm_set_bb_reg(dm, R_0x900, BIT(18), 0);
2067
2068
swat_tab->try_flag = SWAW_STEP_INIT;
2069
swat_tab->double_chk_flag = 0;
2070
swat_tab->cur_antenna = MAIN_ANT;
2071
swat_tab->pre_ant = MAIN_ANT;
2072
swat_tab->swas_no_link_state = 0;
2073
}
2074
#endif /* @#if (RTL8821A_SUPPORT == 1) */
2075
2076
#if (RTL8821C_SUPPORT == 1)
2077
void odm_trx_hw_ant_div_init_8821c(void *dm_void)
2078
{
2079
struct dm_struct *dm = (struct dm_struct *)dm_void;
2080
2081
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
2082
/* Output Pin Settings */
2083
odm_set_mac_reg(dm, R_0x4c, BIT(25), 0);
2084
2085
odm_set_mac_reg(dm, R_0x64, BIT(29), 1); /* PAPE by WLAN control */
2086
odm_set_mac_reg(dm, R_0x64, BIT(28), 1); /* @LNAON by WLAN control */
2087
2088
odm_set_bb_reg(dm, R_0xcb8, BIT(16), 0);
2089
2090
odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);
2091
/* select DPDT_P and DPDT_N as output pin */
2092
odm_set_mac_reg(dm, R_0x4c, BIT(24), 1); /* @by WLAN control */
2093
odm_set_bb_reg(dm, R_0xcb4, 0xF, 8); /* @DPDT_P = ANTSEL[0] */
2094
odm_set_bb_reg(dm, R_0xcb4, 0xF0, 8); /* @DPDT_N = ANTSEL[0] */
2095
odm_set_bb_reg(dm, R_0xcb4, BIT(29), 0); /* @DPDT_P non-inverse */
2096
odm_set_bb_reg(dm, R_0xcb4, BIT(28), 1); /* @DPDT_N inverse */
2097
2098
/* @Mapping Table */
2099
odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);
2100
odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);
2101
2102
/* OFDM HW AntDiv Parameters */
2103
odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */
2104
odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x10); /* @bias */
2105
2106
/* @CCK HW AntDiv Parameters */
2107
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
2108
/* patch for clk from 88M to 80M */
2109
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */
2110
2111
odm_set_bb_reg(dm, R_0x800, BIT(25), 0);
2112
/* @ANTSEL_CCK sent to the smart_antenna circuit */
2113
odm_set_bb_reg(dm, R_0xa00, BIT(15), 0);
2114
/* @CCK AntDiv function block enable */
2115
2116
/* @BT Coexistence */
2117
odm_set_bb_reg(dm, R_0xcac, BIT(9), 1);
2118
/* @keep antsel_map when GNT_BT = 1 */
2119
odm_set_bb_reg(dm, R_0x804, BIT(4), 1);
2120
/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */
2121
2122
/* Timming issue */
2123
odm_set_bb_reg(dm, R_0x818, BIT(23) | BIT(22) | BIT(21) | BIT(20), 0);
2124
/*@keep antidx after tx for ACK ( unit x 3.2 mu sec)*/
2125
odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);
2126
/* settling time of antdiv by RF LNA = 100ns */
2127
2128
/* response TX ant by RX ant */
2129
odm_set_mac_reg(dm, R_0x668, BIT(3), 1);
2130
}
2131
2132
void phydm_s0s1_sw_ant_div_init_8821c(void *dm_void)
2133
{
2134
struct dm_struct *dm = (struct dm_struct *)dm_void;
2135
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
2136
2137
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
2138
2139
/* Output Pin Settings */
2140
odm_set_mac_reg(dm, R_0x4c, BIT(25), 0);
2141
2142
odm_set_mac_reg(dm, R_0x64, BIT(29), 1); /* PAPE by WLAN control */
2143
odm_set_mac_reg(dm, R_0x64, BIT(28), 1); /* @LNAON by WLAN control */
2144
2145
odm_set_bb_reg(dm, R_0xcb8, BIT(16), 0);
2146
2147
odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);
2148
/* select DPDT_P and DPDT_N as output pin */
2149
odm_set_mac_reg(dm, R_0x4c, BIT(24), 1); /* @by WLAN control */
2150
odm_set_bb_reg(dm, R_0xcb4, 0xF, 8); /* @DPDT_P = ANTSEL[0] */
2151
odm_set_bb_reg(dm, R_0xcb4, 0xF0, 8); /* @DPDT_N = ANTSEL[0] */
2152
odm_set_bb_reg(dm, R_0xcb4, BIT(29), 0); /* @DPDT_P non-inverse */
2153
odm_set_bb_reg(dm, R_0xcb4, BIT(28), 1); /* @DPDT_N inverse */
2154
2155
/* @Mapping Table */
2156
odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);
2157
odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);
2158
2159
/* OFDM HW AntDiv Parameters */
2160
odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */
2161
odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x00); /* @bias */
2162
2163
/* @CCK HW AntDiv Parameters */
2164
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
2165
/* patch for clk from 88M to 80M */
2166
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */
2167
2168
odm_set_bb_reg(dm, R_0x800, BIT(25), 0);
2169
/* @ANTSEL_CCK sent to the smart_antenna circuit */
2170
odm_set_bb_reg(dm, R_0xa00, BIT(15), 0);
2171
/* @CCK AntDiv function block enable */
2172
2173
/* @BT Coexistence */
2174
odm_set_bb_reg(dm, R_0xcac, BIT(9), 1);
2175
/* @keep antsel_map when GNT_BT = 1 */
2176
odm_set_bb_reg(dm, R_0x804, BIT(4), 1);
2177
/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */
2178
2179
odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);
2180
/* settling time of antdiv by RF LNA = 100ns */
2181
2182
/* response TX ant by RX ant */
2183
odm_set_mac_reg(dm, R_0x668, BIT(3), 1);
2184
2185
odm_set_bb_reg(dm, R_0x900, BIT(18), 0);
2186
2187
swat_tab->try_flag = SWAW_STEP_INIT;
2188
swat_tab->double_chk_flag = 0;
2189
swat_tab->cur_antenna = MAIN_ANT;
2190
swat_tab->pre_ant = MAIN_ANT;
2191
swat_tab->swas_no_link_state = 0;
2192
}
2193
#endif /* @#if (RTL8821C_SUPPORT == 1) */
2194
2195
#if (RTL8881A_SUPPORT == 1)
2196
void odm_trx_hw_ant_div_init_8881a(void *dm_void)
2197
{
2198
struct dm_struct *dm = (struct dm_struct *)dm_void;
2199
2200
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
2201
2202
/* Output Pin Settings */
2203
/* @[SPDT related] */
2204
odm_set_mac_reg(dm, R_0x4c, BIT(25), 0);
2205
odm_set_mac_reg(dm, R_0x4c, BIT(26), 0);
2206
odm_set_bb_reg(dm, R_0xcb4, BIT(31), 0); /* @delay buffer */
2207
odm_set_bb_reg(dm, R_0xcb4, BIT(22), 0);
2208
odm_set_bb_reg(dm, R_0xcb4, BIT(24), 1);
2209
odm_set_bb_reg(dm, R_0xcb0, 0xF00, 8); /* @DPDT_P = ANTSEL[0] */
2210
odm_set_bb_reg(dm, R_0xcb0, 0xF0000, 8); /* @DPDT_N = ANTSEL[0] */
2211
2212
/* @Mapping Table */
2213
odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);
2214
odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);
2215
2216
/* OFDM HW AntDiv Parameters */
2217
odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */
2218
odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x0); /* @bias */
2219
odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);
2220
/* settling time of antdiv by RF LNA = 100ns */
2221
2222
/* @CCK HW AntDiv Parameters */
2223
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
2224
/* patch for clk from 88M to 80M */
2225
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */
2226
2227
/* @2 [--For HW Bug setting] */
2228
2229
odm_set_bb_reg(dm, R_0x900, BIT(18), 0);
2230
/* TX ant by Reg *//* A-cut bug */
2231
}
2232
2233
#endif /* @#if (RTL8881A_SUPPORT == 1) */
2234
2235
#if (RTL8812A_SUPPORT == 1)
2236
void odm_trx_hw_ant_div_init_8812a(void *dm_void)
2237
{
2238
struct dm_struct *dm = (struct dm_struct *)dm_void;
2239
2240
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
2241
2242
/* @3 */ /* @3 --RFE pin setting--------- */
2243
/* @[BB] */
2244
odm_set_bb_reg(dm, R_0x900, BIT(10) | BIT(9) | BIT(8), 0x0);
2245
/* @disable SW switch */
2246
odm_set_bb_reg(dm, R_0x900, BIT(17) | BIT(16), 0x0);
2247
odm_set_bb_reg(dm, R_0x974, BIT(7) | BIT(6), 0x3); /* @in/out */
2248
odm_set_bb_reg(dm, R_0xcb4, BIT(31), 0); /* @delay buffer */
2249
odm_set_bb_reg(dm, R_0xcb4, BIT(26), 0);
2250
odm_set_bb_reg(dm, R_0xcb4, BIT(27), 1);
2251
odm_set_bb_reg(dm, R_0xcb0, 0xF000000, 8); /* @DPDT_P = ANTSEL[0] */
2252
odm_set_bb_reg(dm, R_0xcb0, 0xF0000000, 8); /* @DPDT_N = ANTSEL[0] */
2253
/* @3 ------------------------- */
2254
2255
/* @Mapping Table */
2256
odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);
2257
odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);
2258
2259
/* OFDM HW AntDiv Parameters */
2260
odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */
2261
odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x0); /* @bias */
2262
odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);
2263
/* settling time of antdiv by RF LNA = 100ns */
2264
2265
/* @CCK HW AntDiv Parameters */
2266
odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);
2267
/* patch for clk from 88M to 80M */
2268
odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */
2269
2270
/* @2 [--For HW Bug setting] */
2271
2272
odm_set_bb_reg(dm, R_0x900, BIT(18), 0);
2273
/* TX ant by Reg */ /* A-cut bug */
2274
}
2275
2276
#endif /* @#if (RTL8812A_SUPPORT == 1) */
2277
2278
#if (RTL8188F_SUPPORT == 1)
2279
void odm_s0s1_sw_ant_div_init_8188f(void *dm_void)
2280
{
2281
struct dm_struct *dm = (struct dm_struct *)dm_void;
2282
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
2283
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
2284
2285
PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);
2286
2287
#if 0
2288
/*@GPIO setting*/
2289
/*odm_set_mac_reg(dm, R_0x64, BIT(18), 0); */
2290
/*odm_set_mac_reg(dm, R_0x44, BIT(28)|BIT(27), 0);*/
2291
/*odm_set_mac_reg(dm, R_0x44, BIT(20) | BIT(19), 0x3);*/
2292
/*enable_output for P_GPIO[4:3]*/
2293
/*odm_set_mac_reg(dm, R_0x44, BIT(12)|BIT(11), 0);*/ /*output value*/
2294
/*odm_set_mac_reg(dm, R_0x40, BIT(1)|BIT(0), 0);*/ /*GPIO function*/
2295
#endif
2296
2297
if (dm->support_ic_type == ODM_RTL8188F) {
2298
if (dm->support_interface == ODM_ITRF_USB)
2299
odm_set_mac_reg(dm, R_0x44, BIT(20) | BIT(19), 0x3);
2300
/*@enable_output for P_GPIO[4:3]*/
2301
else if (dm->support_interface == ODM_ITRF_SDIO)
2302
odm_set_mac_reg(dm, R_0x44, BIT(18), 0x1);
2303
/*@enable_output for P_GPIO[2]*/
2304
}
2305
2306
fat_tab->is_become_linked = false;
2307
swat_tab->try_flag = SWAW_STEP_INIT;
2308
swat_tab->double_chk_flag = 0;
2309
}
2310
2311
void phydm_update_rx_idle_antenna_8188F(void *dm_void, u32 default_ant)
2312
{
2313
struct dm_struct *dm = (struct dm_struct *)dm_void;
2314
u8 codeword;
2315
2316
if (dm->support_ic_type == ODM_RTL8188F) {
2317
if (dm->support_interface == ODM_ITRF_USB) {
2318
if (default_ant == ANT1_2G)
2319
codeword = 1; /*@2'b01*/
2320
else
2321
codeword = 2; /*@2'b10*/
2322
odm_set_mac_reg(dm, R_0x44, 0x1800, codeword);
2323
/*@GPIO[4:3] output value*/
2324
} else if (dm->support_interface == ODM_ITRF_SDIO) {
2325
if (default_ant == ANT1_2G) {
2326
codeword = 0; /*@1'b0*/
2327
odm_set_bb_reg(dm, R_0x870, 0x300, 0x3);
2328
odm_set_bb_reg(dm, R_0x860, 0x300, 0x1);
2329
} else {
2330
codeword = 1; /*@1'b1*/
2331
odm_set_bb_reg(dm, R_0x870, 0x300, 0x3);
2332
odm_set_bb_reg(dm, R_0x860, 0x300, 0x2);
2333
}
2334
odm_set_mac_reg(dm, R_0x44, BIT(10), codeword);
2335
/*@GPIO[2] output value*/
2336
}
2337
}
2338
}
2339
#endif
2340
2341
#ifdef ODM_EVM_ENHANCE_ANTDIV
2342
void phydm_rx_rate_for_antdiv(void *dm_void, void *pkt_info_void)
2343
{
2344
struct dm_struct *dm = (struct dm_struct *)dm_void;
2345
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
2346
struct phydm_perpkt_info_struct *pktinfo = NULL;
2347
u8 data_rate = 0;
2348
2349
pktinfo = (struct phydm_perpkt_info_struct *)pkt_info_void;
2350
data_rate = pktinfo->data_rate & 0x7f;
2351
2352
if (!fat_tab->get_stats)
2353
return;
2354
2355
if (fat_tab->antsel_rx_keep_0 == ANT1_2G) {
2356
if (data_rate >= ODM_RATEMCS0 &&
2357
data_rate <= ODM_RATEMCS15)
2358
fat_tab->main_ht_cnt[data_rate - ODM_RATEMCS0]++;
2359
else if (data_rate >= ODM_RATEVHTSS1MCS0 &&
2360
data_rate <= ODM_RATEVHTSS2MCS9)
2361
fat_tab->main_vht_cnt[data_rate - ODM_RATEVHTSS1MCS0]++;
2362
} else { /*ANT2_2G*/
2363
if (data_rate >= ODM_RATEMCS0 &&
2364
data_rate <= ODM_RATEMCS15)
2365
fat_tab->aux_ht_cnt[data_rate - ODM_RATEMCS0]++;
2366
else if (data_rate >= ODM_RATEVHTSS1MCS0 &&
2367
data_rate <= ODM_RATEVHTSS2MCS9)
2368
fat_tab->aux_vht_cnt[data_rate - ODM_RATEVHTSS1MCS0]++;
2369
}
2370
}
2371
2372
void phydm_antdiv_reset_rx_rate(void *dm_void)
2373
{
2374
struct dm_struct *dm = (struct dm_struct *)dm_void;
2375
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
2376
2377
odm_memory_set(dm, &fat_tab->main_ht_cnt[0], 0, HT_IDX * 2);
2378
odm_memory_set(dm, &fat_tab->aux_ht_cnt[0], 0, HT_IDX * 2);
2379
odm_memory_set(dm, &fat_tab->main_vht_cnt[0], 0, VHT_IDX * 2);
2380
odm_memory_set(dm, &fat_tab->aux_vht_cnt[0], 0, VHT_IDX * 2);
2381
}
2382
2383
void phydm_statistics_evm_1ss(void *dm_void, void *phy_info_void,
2384
u8 antsel_tr_mux, u32 id, u32 utility)
2385
{
2386
struct dm_struct *dm = (struct dm_struct *)dm_void;
2387
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
2388
struct phydm_phyinfo_struct *phy_info = NULL;
2389
2390
phy_info = (struct phydm_phyinfo_struct *)phy_info_void;
2391
if (antsel_tr_mux == ANT1_2G) {
2392
fat_tab->main_evm_sum[id] += ((phy_info->rx_mimo_evm_dbm[0])
2393
<< 5);
2394
fat_tab->main_evm_cnt[id]++;
2395
} else {
2396
fat_tab->aux_evm_sum[id] += ((phy_info->rx_mimo_evm_dbm[0])
2397
<< 5);
2398
fat_tab->aux_evm_cnt[id]++;
2399
}
2400
}
2401
2402
void phydm_statistics_evm_2ss(void *dm_void, void *phy_info_void,
2403
u8 antsel_tr_mux, u32 id, u32 utility)
2404
{
2405
struct dm_struct *dm = (struct dm_struct *)dm_void;
2406
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
2407
struct phydm_phyinfo_struct *phy_info = NULL;
2408
2409
phy_info = (struct phydm_phyinfo_struct *)phy_info_void;
2410
if (antsel_tr_mux == ANT1_2G) {
2411
fat_tab->main_evm_2ss_sum[id][0] += phy_info->rx_mimo_evm_dbm[0]
2412
<< 5;
2413
fat_tab->main_evm_2ss_sum[id][1] += phy_info->rx_mimo_evm_dbm[1]
2414
<< 5;
2415
fat_tab->main_evm_2ss_cnt[id]++;
2416
2417
} else {
2418
fat_tab->aux_evm_2ss_sum[id][0] += (phy_info->rx_mimo_evm_dbm[0]
2419
<< 5);
2420
fat_tab->aux_evm_2ss_sum[id][1] += (phy_info->rx_mimo_evm_dbm[1]
2421
<< 5);
2422
fat_tab->aux_evm_2ss_cnt[id]++;
2423
}
2424
}
2425
2426
void phydm_evm_sw_antdiv_init(void *dm_void)
2427
{
2428
struct dm_struct *dm = (struct dm_struct *)dm_void;
2429
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
2430
2431
/*@EVM enhance AntDiv method init----------------*/
2432
fat_tab->evm_method_enable = 0;
2433
fat_tab->fat_state = NORMAL_STATE_MIAN;
2434
fat_tab->fat_state_cnt = 0;
2435
fat_tab->pre_antdiv_rssi = 0;
2436
2437
dm->antdiv_intvl = 30;
2438
dm->antdiv_delay = 20;
2439
dm->antdiv_train_num = 4;
2440
odm_set_bb_reg(dm, R_0x910, 0x3f, 0xf);
2441
dm->antdiv_evm_en = 1;
2442
/*@dm->antdiv_period=1;*/
2443
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
2444
dm->evm_antdiv_period = 1;
2445
#else
2446
dm->evm_antdiv_period = 3;
2447
#endif
2448
dm->stop_antdiv_rssi_th = 3;
2449
dm->stop_antdiv_tp_th = 80;
2450
dm->antdiv_tp_period = 3;
2451
dm->stop_antdiv_tp_diff_th = 5;
2452
}
2453
2454
void odm_evm_fast_ant_reset(void *dm_void)
2455
{
2456
struct dm_struct *dm = (struct dm_struct *)dm_void;
2457
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
2458
2459
fat_tab->evm_method_enable = 0;
2460
if (fat_tab->div_path_type == ANT_PATH_A)
2461
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);
2462
else if (fat_tab->div_path_type == ANT_PATH_B)
2463
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_B);
2464
else if (fat_tab->div_path_type == ANT_PATH_AB)
2465
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_AB);
2466
fat_tab->fat_state = NORMAL_STATE_MIAN;
2467
fat_tab->fat_state_cnt = 0;
2468
dm->antdiv_period = 0;
2469
odm_set_mac_reg(dm, R_0x608, BIT(8), 0);
2470
}
2471
2472
void odm_evm_enhance_ant_div(void *dm_void)
2473
{
2474
struct dm_struct *dm = (struct dm_struct *)dm_void;
2475
u32 main_rssi, aux_rssi;
2476
u32 main_crc_utility = 0, aux_crc_utility = 0, utility_ratio = 1;
2477
u32 main_evm, aux_evm, diff_rssi = 0, diff_EVM = 0;
2478
u32 main_2ss_evm[2], aux_2ss_evm[2];
2479
u32 main_1ss_evm, aux_1ss_evm;
2480
u32 main_2ss_evm_sum, aux_2ss_evm_sum;
2481
u8 score_EVM = 0, score_CRC = 0;
2482
u8 rssi_larger_ant = 0;
2483
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
2484
u32 value32, i, mac_id;
2485
boolean main_above1 = false, aux_above1 = false;
2486
boolean force_antenna = false;
2487
struct cmn_sta_info *sta;
2488
u32 main_tp_avg, aux_tp_avg;
2489
u8 curr_rssi, rssi_diff;
2490
u32 tp_diff, tp_diff_avg;
2491
u16 main_max_cnt = 0, aux_max_cnt = 0;
2492
u16 main_max_idx = 0, aux_max_idx = 0;
2493
u16 main_cnt_all = 0, aux_cnt_all = 0;
2494
u8 rate_num = dm->num_rf_path;
2495
u8 rate_ss_shift = 0;
2496
u8 tp_diff_return = 0, tp_return = 0, rssi_return = 0;
2497
u8 target_ant_evm_1ss, target_ant_evm_2ss;
2498
u8 decision_evm_ss;
2499
u8 next_ant;
2500
2501
fat_tab->target_ant_enhance = 0xFF;
2502
2503
if ((dm->support_ic_type & ODM_EVM_ANTDIV_IC)) {
2504
if (dm->is_one_entry_only) {
2505
#if 0
2506
/* PHYDM_DBG(dm,DBG_ANT_DIV, "[One Client only]\n"); */
2507
#endif
2508
mac_id = dm->one_entry_macid;
2509
sta = dm->phydm_sta_info[mac_id];
2510
2511
main_rssi = (fat_tab->main_cnt[mac_id] != 0) ? (fat_tab->main_sum[mac_id] / fat_tab->main_cnt[mac_id]) : 0;
2512
aux_rssi = (fat_tab->aux_cnt[mac_id] != 0) ? (fat_tab->aux_sum[mac_id] / fat_tab->aux_cnt[mac_id]) : 0;
2513
2514
if ((main_rssi == 0 && aux_rssi != 0 && aux_rssi >= FORCE_RSSI_DIFF) || (main_rssi != 0 && aux_rssi == 0 && main_rssi >= FORCE_RSSI_DIFF))
2515
diff_rssi = FORCE_RSSI_DIFF;
2516
else if (main_rssi != 0 && aux_rssi != 0)
2517
diff_rssi = (main_rssi >= aux_rssi) ? (main_rssi - aux_rssi) : (aux_rssi - main_rssi);
2518
2519
if (main_rssi >= aux_rssi)
2520
rssi_larger_ant = MAIN_ANT;
2521
else
2522
rssi_larger_ant = AUX_ANT;
2523
2524
PHYDM_DBG(dm, DBG_ANT_DIV,
2525
"Main_Cnt=(( %d )), main_rssi=(( %d ))\n",
2526
fat_tab->main_cnt[mac_id], main_rssi);
2527
PHYDM_DBG(dm, DBG_ANT_DIV,
2528
"Aux_Cnt=(( %d )), aux_rssi=(( %d ))\n",
2529
fat_tab->aux_cnt[mac_id], aux_rssi);
2530
2531
if (((main_rssi >= evm_rssi_th_high || aux_rssi >= evm_rssi_th_high) || fat_tab->evm_method_enable == 1)
2532
/* @&& (diff_rssi <= FORCE_RSSI_DIFF + 1) */
2533
) {
2534
PHYDM_DBG(dm, DBG_ANT_DIV,
2535
"> TH_H || evm_method_enable==1\n");
2536
2537
if ((main_rssi >= evm_rssi_th_low || aux_rssi >= evm_rssi_th_low)) {
2538
PHYDM_DBG(dm, DBG_ANT_DIV, "> TH_L, fat_state_cnt =((%d))\n", fat_tab->fat_state_cnt);
2539
2540
/*Traning state: 0(alt) 1(ori) 2(alt) 3(ori)============================================================*/
2541
if (fat_tab->fat_state_cnt < (dm->antdiv_train_num << 1)) {
2542
if (fat_tab->fat_state_cnt == 0) {
2543
/*Reset EVM 1SS Method */
2544
fat_tab->main_evm_sum[mac_id] = 0;
2545
fat_tab->aux_evm_sum[mac_id] = 0;
2546
fat_tab->main_evm_cnt[mac_id] = 0;
2547
fat_tab->aux_evm_cnt[mac_id] = 0;
2548
/*Reset EVM 2SS Method */
2549
fat_tab->main_evm_2ss_sum[mac_id][0] = 0;
2550
fat_tab->main_evm_2ss_sum[mac_id][1] = 0;
2551
fat_tab->aux_evm_2ss_sum[mac_id][0] = 0;
2552
fat_tab->aux_evm_2ss_sum[mac_id][1] = 0;
2553
fat_tab->main_evm_2ss_cnt[mac_id] = 0;
2554
fat_tab->aux_evm_2ss_cnt[mac_id] = 0;
2555
2556
/*Reset TP Method */
2557
fat_tab->main_tp = 0;
2558
fat_tab->aux_tp = 0;
2559
fat_tab->main_tp_cnt = 0;
2560
fat_tab->aux_tp_cnt = 0;
2561
phydm_antdiv_reset_rx_rate(dm);
2562
2563
/*Reset CRC Method */
2564
fat_tab->main_crc32_ok_cnt = 0;
2565
fat_tab->main_crc32_fail_cnt = 0;
2566
fat_tab->aux_crc32_ok_cnt = 0;
2567
fat_tab->aux_crc32_fail_cnt = 0;
2568
2569
#ifdef SKIP_EVM_ANTDIV_TRAINING_PATCH
2570
if ((*dm->band_width == CHANNEL_WIDTH_20) && sta->mimo_type == RF_2T2R) {
2571
/*@1. Skip training: RSSI*/
2572
#if 0
2573
/*PHYDM_DBG(pDM_Odm,DBG_ANT_DIV, "TargetAnt_enhance=((%d)), RxIdleAnt=((%d))\n", pDM_FatTable->TargetAnt_enhance, pDM_FatTable->RxIdleAnt);*/
2574
#endif
2575
curr_rssi = (u8)((fat_tab->rx_idle_ant == MAIN_ANT) ? main_rssi : aux_rssi);
2576
rssi_diff = (curr_rssi > fat_tab->pre_antdiv_rssi) ? (curr_rssi - fat_tab->pre_antdiv_rssi) : (fat_tab->pre_antdiv_rssi - curr_rssi);
2577
2578
PHYDM_DBG(dm, DBG_ANT_DIV, "[1] rssi_return, curr_rssi=((%d)), pre_rssi=((%d))\n", curr_rssi, fat_tab->pre_antdiv_rssi);
2579
2580
fat_tab->pre_antdiv_rssi = curr_rssi;
2581
if (rssi_diff < dm->stop_antdiv_rssi_th && curr_rssi != 0)
2582
rssi_return = 1;
2583
2584
/*@2. Skip training: TP Diff*/
2585
tp_diff = (dm->rx_tp > fat_tab->pre_antdiv_tp) ? (dm->rx_tp - fat_tab->pre_antdiv_tp) : (fat_tab->pre_antdiv_tp - dm->rx_tp);
2586
2587
PHYDM_DBG(dm, DBG_ANT_DIV, "[2] tp_diff_return, curr_tp=((%d)), pre_tp=((%d))\n", dm->rx_tp, fat_tab->pre_antdiv_tp);
2588
fat_tab->pre_antdiv_tp = dm->rx_tp;
2589
if ((tp_diff < (u32)(dm->stop_antdiv_tp_diff_th) && dm->rx_tp != 0))
2590
tp_diff_return = 1;
2591
2592
PHYDM_DBG(dm, DBG_ANT_DIV, "[3] tp_return, curr_rx_tp=((%d))\n", dm->rx_tp);
2593
/*@3. Skip training: TP*/
2594
if (dm->rx_tp >= (u32)(dm->stop_antdiv_tp_th))
2595
tp_return = 1;
2596
2597
PHYDM_DBG(dm, DBG_ANT_DIV, "[4] Return {rssi, tp_diff, tp} = {%d, %d, %d}\n", rssi_return, tp_diff_return, tp_return);
2598
/*@4. Joint Return Decision*/
2599
if (tp_return) {
2600
if (tp_diff_return || rssi_diff) {
2601
PHYDM_DBG(dm, DBG_ANT_DIV, "***Return EVM SW AntDiv\n");
2602
return;
2603
}
2604
}
2605
}
2606
#endif
2607
2608
fat_tab->evm_method_enable = 1;
2609
if (fat_tab->div_path_type == ANT_PATH_A)
2610
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);
2611
else if (fat_tab->div_path_type == ANT_PATH_B)
2612
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_B);
2613
else if (fat_tab->div_path_type == ANT_PATH_AB)
2614
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_AB);
2615
dm->antdiv_period = dm->evm_antdiv_period;
2616
odm_set_mac_reg(dm, R_0x608, BIT(8), 1); /*RCR accepts CRC32-Error packets*/
2617
fat_tab->fat_state_cnt++;
2618
fat_tab->get_stats = false;
2619
next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ? MAIN_ANT : AUX_ANT;
2620
odm_update_rx_idle_ant(dm, next_ant);
2621
PHYDM_DBG(dm, DBG_ANT_DIV, "[Antdiv Delay ]\n");
2622
odm_set_timer(dm, &dm->evm_fast_ant_training_timer, dm->antdiv_delay); //ms
2623
} else if ((fat_tab->fat_state_cnt % 2) != 0) {
2624
fat_tab->fat_state_cnt++;
2625
fat_tab->get_stats = true;
2626
odm_set_timer(dm, &dm->evm_fast_ant_training_timer, dm->antdiv_intvl); //ms
2627
} else if ((fat_tab->fat_state_cnt % 2) == 0) {
2628
fat_tab->fat_state_cnt++;
2629
fat_tab->get_stats = false;
2630
next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;
2631
odm_update_rx_idle_ant(dm, next_ant);
2632
PHYDM_DBG(dm, DBG_ANT_DIV, "[Antdiv Delay ]\n");
2633
odm_set_timer(dm, &dm->evm_fast_ant_training_timer, dm->antdiv_delay); //ms
2634
}
2635
}
2636
/*@Decision state: 4==============================================================*/
2637
else {
2638
fat_tab->get_stats = false;
2639
fat_tab->fat_state_cnt = 0;
2640
PHYDM_DBG(dm, DBG_ANT_DIV, "[Decisoin state ]\n");
2641
2642
/* @3 [CRC32 statistic] */
2643
#if 0
2644
if ((fat_tab->main_crc32_ok_cnt > (fat_tab->aux_crc32_ok_cnt << 1)) || (diff_rssi >= 40 && rssi_larger_ant == MAIN_ANT)) {
2645
fat_tab->target_ant_crc32 = MAIN_ANT;
2646
force_antenna = true;
2647
PHYDM_DBG(dm, DBG_ANT_DIV, "CRC32 Force Main\n");
2648
} else if ((fat_tab->aux_crc32_ok_cnt > ((fat_tab->main_crc32_ok_cnt) << 1)) || ((diff_rssi >= 40) && (rssi_larger_ant == AUX_ANT))) {
2649
fat_tab->target_ant_crc32 = AUX_ANT;
2650
force_antenna = true;
2651
PHYDM_DBG(dm, DBG_ANT_DIV, "CRC32 Force Aux\n");
2652
} else
2653
#endif
2654
{
2655
if (fat_tab->main_crc32_fail_cnt <= 5)
2656
fat_tab->main_crc32_fail_cnt = 5;
2657
2658
if (fat_tab->aux_crc32_fail_cnt <= 5)
2659
fat_tab->aux_crc32_fail_cnt = 5;
2660
2661
if (fat_tab->main_crc32_ok_cnt > fat_tab->main_crc32_fail_cnt)
2662
main_above1 = true;
2663
2664
if (fat_tab->aux_crc32_ok_cnt > fat_tab->aux_crc32_fail_cnt)
2665
aux_above1 = true;
2666
2667
if (main_above1 == true && aux_above1 == false) {
2668
force_antenna = true;
2669
fat_tab->target_ant_crc32 = MAIN_ANT;
2670
} else if (main_above1 == false && aux_above1 == true) {
2671
force_antenna = true;
2672
fat_tab->target_ant_crc32 = AUX_ANT;
2673
} else if (main_above1 == true && aux_above1 == true) {
2674
main_crc_utility = ((fat_tab->main_crc32_ok_cnt) << 7) / fat_tab->main_crc32_fail_cnt;
2675
aux_crc_utility = ((fat_tab->aux_crc32_ok_cnt) << 7) / fat_tab->aux_crc32_fail_cnt;
2676
fat_tab->target_ant_crc32 = (main_crc_utility == aux_crc_utility) ? (fat_tab->pre_target_ant_enhance) : ((main_crc_utility >= aux_crc_utility) ? MAIN_ANT : AUX_ANT);
2677
2678
if (main_crc_utility != 0 && aux_crc_utility != 0) {
2679
if (main_crc_utility >= aux_crc_utility)
2680
utility_ratio = (main_crc_utility << 1) / aux_crc_utility;
2681
else
2682
utility_ratio = (aux_crc_utility << 1) / main_crc_utility;
2683
}
2684
} else if (main_above1 == false && aux_above1 == false) {
2685
if (fat_tab->main_crc32_ok_cnt == 0)
2686
fat_tab->main_crc32_ok_cnt = 1;
2687
if (fat_tab->aux_crc32_ok_cnt == 0)
2688
fat_tab->aux_crc32_ok_cnt = 1;
2689
2690
main_crc_utility = ((fat_tab->main_crc32_fail_cnt) << 7) / fat_tab->main_crc32_ok_cnt;
2691
aux_crc_utility = ((fat_tab->aux_crc32_fail_cnt) << 7) / fat_tab->aux_crc32_ok_cnt;
2692
fat_tab->target_ant_crc32 = (main_crc_utility == aux_crc_utility) ? (fat_tab->pre_target_ant_enhance) : ((main_crc_utility <= aux_crc_utility) ? MAIN_ANT : AUX_ANT);
2693
2694
if (main_crc_utility != 0 && aux_crc_utility != 0) {
2695
if (main_crc_utility >= aux_crc_utility)
2696
utility_ratio = (main_crc_utility << 1) / (aux_crc_utility);
2697
else
2698
utility_ratio = (aux_crc_utility << 1) / (main_crc_utility);
2699
}
2700
}
2701
}
2702
odm_set_mac_reg(dm, R_0x608, BIT(8), 0); /* NOT Accept CRC32 Error packets. */
2703
PHYDM_DBG(dm, DBG_ANT_DIV, "MAIN_CRC: Ok=((%d)), Fail = ((%d)), Utility = ((%d))\n", fat_tab->main_crc32_ok_cnt, fat_tab->main_crc32_fail_cnt, main_crc_utility);
2704
PHYDM_DBG(dm, DBG_ANT_DIV, "AUX__CRC: Ok=((%d)), Fail = ((%d)), Utility = ((%d))\n", fat_tab->aux_crc32_ok_cnt, fat_tab->aux_crc32_fail_cnt, aux_crc_utility);
2705
PHYDM_DBG(dm, DBG_ANT_DIV, "***1.TargetAnt_CRC32 = ((%s))\n", (fat_tab->target_ant_crc32 == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
2706
2707
for (i = 0; i < HT_IDX; i++) {
2708
main_cnt_all += fat_tab->main_ht_cnt[i];
2709
aux_cnt_all += fat_tab->aux_ht_cnt[i];
2710
2711
if (fat_tab->main_ht_cnt[i] > main_max_cnt) {
2712
main_max_cnt = fat_tab->main_ht_cnt[i];
2713
main_max_idx = i;
2714
}
2715
2716
if (fat_tab->aux_ht_cnt[i] > aux_max_cnt) {
2717
aux_max_cnt = fat_tab->aux_ht_cnt[i];
2718
aux_max_idx = i;
2719
}
2720
}
2721
2722
for (i = 0; i < rate_num; i++) {
2723
rate_ss_shift = (i << 3);
2724
PHYDM_DBG(dm, DBG_ANT_DIV, "*main_ht_cnt HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}\n",
2725
(rate_ss_shift), (rate_ss_shift + 7),
2726
fat_tab->main_ht_cnt[rate_ss_shift + 0], fat_tab->main_ht_cnt[rate_ss_shift + 1],
2727
fat_tab->main_ht_cnt[rate_ss_shift + 2], fat_tab->main_ht_cnt[rate_ss_shift + 3],
2728
fat_tab->main_ht_cnt[rate_ss_shift + 4], fat_tab->main_ht_cnt[rate_ss_shift + 5],
2729
fat_tab->main_ht_cnt[rate_ss_shift + 6], fat_tab->main_ht_cnt[rate_ss_shift + 7]);
2730
}
2731
2732
for (i = 0; i < rate_num; i++) {
2733
rate_ss_shift = (i << 3);
2734
PHYDM_DBG(dm, DBG_ANT_DIV, "*aux_ht_cnt HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}\n",
2735
(rate_ss_shift), (rate_ss_shift + 7),
2736
fat_tab->aux_ht_cnt[rate_ss_shift + 0], fat_tab->aux_ht_cnt[rate_ss_shift + 1],
2737
fat_tab->aux_ht_cnt[rate_ss_shift + 2], fat_tab->aux_ht_cnt[rate_ss_shift + 3],
2738
fat_tab->aux_ht_cnt[rate_ss_shift + 4], fat_tab->aux_ht_cnt[rate_ss_shift + 5],
2739
fat_tab->aux_ht_cnt[rate_ss_shift + 6], fat_tab->aux_ht_cnt[rate_ss_shift + 7]);
2740
}
2741
2742
/* @3 [EVM statistic] */
2743
/*@1SS EVM*/
2744
main_1ss_evm = (fat_tab->main_evm_cnt[mac_id] != 0) ? (fat_tab->main_evm_sum[mac_id] / fat_tab->main_evm_cnt[mac_id]) : 0;
2745
aux_1ss_evm = (fat_tab->aux_evm_cnt[mac_id] != 0) ? (fat_tab->aux_evm_sum[mac_id] / fat_tab->aux_evm_cnt[mac_id]) : 0;
2746
target_ant_evm_1ss = (main_1ss_evm == aux_1ss_evm) ? (fat_tab->pre_target_ant_enhance) : ((main_1ss_evm >= aux_1ss_evm) ? MAIN_ANT : AUX_ANT);
2747
2748
PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Main1ss_EVM= (( %d ))\n", fat_tab->main_evm_cnt[mac_id], main_1ss_evm);
2749
PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Aux_1ss_EVM = (( %d ))\n", fat_tab->aux_evm_cnt[mac_id], aux_1ss_evm);
2750
2751
/*@2SS EVM*/
2752
main_2ss_evm[0] = (fat_tab->main_evm_2ss_cnt[mac_id] != 0) ? (fat_tab->main_evm_2ss_sum[mac_id][0] / fat_tab->main_evm_2ss_cnt[mac_id]) : 0;
2753
main_2ss_evm[1] = (fat_tab->main_evm_2ss_cnt[mac_id] != 0) ? (fat_tab->main_evm_2ss_sum[mac_id][1] / fat_tab->main_evm_2ss_cnt[mac_id]) : 0;
2754
main_2ss_evm_sum = main_2ss_evm[0] + main_2ss_evm[1];
2755
2756
aux_2ss_evm[0] = (fat_tab->aux_evm_2ss_cnt[mac_id] != 0) ? (fat_tab->aux_evm_2ss_sum[mac_id][0] / fat_tab->aux_evm_2ss_cnt[mac_id]) : 0;
2757
aux_2ss_evm[1] = (fat_tab->aux_evm_2ss_cnt[mac_id] != 0) ? (fat_tab->aux_evm_2ss_sum[mac_id][1] / fat_tab->aux_evm_2ss_cnt[mac_id]) : 0;
2758
aux_2ss_evm_sum = aux_2ss_evm[0] + aux_2ss_evm[1];
2759
2760
target_ant_evm_2ss = (main_2ss_evm_sum == aux_2ss_evm_sum) ? (fat_tab->pre_target_ant_enhance) : ((main_2ss_evm_sum >= aux_2ss_evm_sum) ? MAIN_ANT : AUX_ANT);
2761
2762
PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Main2ss_EVM{A,B,Sum} = {%d, %d, %d}\n",
2763
fat_tab->main_evm_2ss_cnt[mac_id], main_2ss_evm[0], main_2ss_evm[1], main_2ss_evm_sum);
2764
PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Aux_2ss_EVM{A,B,Sum} = {%d, %d, %d}\n",
2765
fat_tab->aux_evm_2ss_cnt[mac_id], aux_2ss_evm[0], aux_2ss_evm[1], aux_2ss_evm_sum);
2766
2767
if ((main_2ss_evm_sum + aux_2ss_evm_sum) != 0) {
2768
decision_evm_ss = 2;
2769
main_evm = main_2ss_evm_sum;
2770
aux_evm = aux_2ss_evm_sum;
2771
fat_tab->target_ant_evm = target_ant_evm_2ss;
2772
} else {
2773
decision_evm_ss = 1;
2774
main_evm = main_1ss_evm;
2775
aux_evm = aux_1ss_evm;
2776
fat_tab->target_ant_evm = target_ant_evm_1ss;
2777
}
2778
2779
if ((main_evm == 0 || aux_evm == 0))
2780
diff_EVM = 100;
2781
else if (main_evm >= aux_evm)
2782
diff_EVM = main_evm - aux_evm;
2783
else
2784
diff_EVM = aux_evm - main_evm;
2785
2786
PHYDM_DBG(dm, DBG_ANT_DIV, "***2.TargetAnt_EVM((%d-ss)) = ((%s))\n", decision_evm_ss, (fat_tab->target_ant_evm == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
2787
2788
//3 [TP statistic]
2789
main_tp_avg = (fat_tab->main_tp_cnt != 0) ? (fat_tab->main_tp / fat_tab->main_tp_cnt) : 0;
2790
aux_tp_avg = (fat_tab->aux_tp_cnt != 0) ? (fat_tab->aux_tp / fat_tab->aux_tp_cnt) : 0;
2791
tp_diff_avg = DIFF_2(main_tp_avg, aux_tp_avg);
2792
fat_tab->target_ant_tp = (tp_diff_avg < 100) ? (fat_tab->pre_target_ant_enhance) : ((main_tp_avg >= aux_tp_avg) ? MAIN_ANT : AUX_ANT);
2793
2794
PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Main_TP = ((%d))\n", fat_tab->main_tp_cnt, main_tp_avg);
2795
PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Aux_TP = ((%d))\n", fat_tab->aux_tp_cnt, aux_tp_avg);
2796
PHYDM_DBG(dm, DBG_ANT_DIV, "***3.TargetAnt_TP = ((%s))\n", (fat_tab->target_ant_tp == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
2797
2798
/*Reset TP Method */
2799
fat_tab->main_tp = 0;
2800
fat_tab->aux_tp = 0;
2801
fat_tab->main_tp_cnt = 0;
2802
fat_tab->aux_tp_cnt = 0;
2803
2804
/* @2 [ Decision state ] */
2805
#if 1
2806
if (main_max_idx == aux_max_idx && ((main_cnt_all + aux_cnt_all) != 0)) {
2807
PHYDM_DBG(dm, DBG_ANT_DIV, "Decision EVM, main_max_idx = ((MCS%d)), aux_max_idx = ((MCS%d))\n", main_max_idx, aux_max_idx);
2808
fat_tab->target_ant_enhance = fat_tab->target_ant_evm;
2809
} else {
2810
PHYDM_DBG(dm, DBG_ANT_DIV, "Decision TP, main_max_idx = ((MCS%d)), aux_max_idx = ((MCS%d))\n", main_max_idx, aux_max_idx);
2811
fat_tab->target_ant_enhance = fat_tab->target_ant_tp;
2812
}
2813
#else
2814
if (fat_tab->target_ant_evm == fat_tab->target_ant_crc32) {
2815
PHYDM_DBG(dm, DBG_ANT_DIV, "Decision type 1, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM);
2816
2817
if ((utility_ratio < 2 && force_antenna == false) && diff_EVM <= 30)
2818
fat_tab->target_ant_enhance = fat_tab->pre_target_ant_enhance;
2819
else
2820
fat_tab->target_ant_enhance = fat_tab->target_ant_evm;
2821
}
2822
#if 0
2823
else if ((diff_EVM <= 50 && (utility_ratio > 4 && force_antenna == false)) || (force_antenna == true)) {
2824
PHYDM_DBG(dm, DBG_ANT_DIV, "Decision type 2, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM);
2825
fat_tab->target_ant_enhance = fat_tab->target_ant_crc32;
2826
}
2827
#endif
2828
else if (diff_EVM >= 20) {
2829
PHYDM_DBG(dm, DBG_ANT_DIV, "Decision type 3, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM);
2830
fat_tab->target_ant_enhance = fat_tab->target_ant_evm;
2831
} else if (utility_ratio >= 6 && force_antenna == false) {
2832
PHYDM_DBG(dm, DBG_ANT_DIV, "Decision type 4, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM);
2833
fat_tab->target_ant_enhance = fat_tab->target_ant_crc32;
2834
} else {
2835
PHYDM_DBG(dm, DBG_ANT_DIV, "Decision type 5, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM);
2836
2837
if (force_antenna == true)
2838
score_CRC = 2;
2839
else if (utility_ratio >= 5) /*@>2.5*/
2840
score_CRC = 2;
2841
else if (utility_ratio >= 4) /*@>2*/
2842
score_CRC = 1;
2843
else
2844
score_CRC = 0;
2845
2846
if (diff_EVM >= 15)
2847
score_EVM = 3;
2848
else if (diff_EVM >= 10)
2849
score_EVM = 2;
2850
else if (diff_EVM >= 5)
2851
score_EVM = 1;
2852
else
2853
score_EVM = 0;
2854
2855
if (score_CRC > score_EVM)
2856
fat_tab->target_ant_enhance = fat_tab->target_ant_crc32;
2857
else if (score_CRC < score_EVM)
2858
fat_tab->target_ant_enhance = fat_tab->target_ant_evm;
2859
else
2860
fat_tab->target_ant_enhance = fat_tab->pre_target_ant_enhance;
2861
}
2862
#endif
2863
fat_tab->pre_target_ant_enhance = fat_tab->target_ant_enhance;
2864
2865
PHYDM_DBG(dm, DBG_ANT_DIV, "*** 4.TargetAnt_enhance = (( %s ))******\n", (fat_tab->target_ant_enhance == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
2866
}
2867
} else { /* RSSI< = evm_rssi_th_low */
2868
PHYDM_DBG(dm, DBG_ANT_DIV, "[ <TH_L: escape from > TH_L ]\n");
2869
odm_evm_fast_ant_reset(dm);
2870
}
2871
} else {
2872
PHYDM_DBG(dm, DBG_ANT_DIV,
2873
"[escape from> TH_H || evm_method_enable==1]\n");
2874
odm_evm_fast_ant_reset(dm);
2875
}
2876
} else {
2877
PHYDM_DBG(dm, DBG_ANT_DIV, "[multi-Client]\n");
2878
odm_evm_fast_ant_reset(dm);
2879
}
2880
}
2881
}
2882
2883
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2884
void phydm_evm_antdiv_callback(
2885
struct phydm_timer_list *timer)
2886
{
2887
void *adapter = (void *)timer->Adapter;
2888
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
2889
struct dm_struct *dm = &hal_data->DM_OutSrc;
2890
2891
#if DEV_BUS_TYPE == RT_PCI_INTERFACE
2892
#if USE_WORKITEM
2893
odm_schedule_work_item(&dm->phydm_evm_antdiv_workitem);
2894
#else
2895
{
2896
odm_hw_ant_div(dm);
2897
}
2898
#endif
2899
#else
2900
odm_schedule_work_item(&dm->phydm_evm_antdiv_workitem);
2901
#endif
2902
}
2903
2904
void phydm_evm_antdiv_workitem_callback(
2905
void *context)
2906
{
2907
void *adapter = (void *)context;
2908
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
2909
struct dm_struct *dm = &hal_data->DM_OutSrc;
2910
2911
odm_hw_ant_div(dm);
2912
}
2913
2914
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
2915
void phydm_evm_antdiv_callback(void *dm_void)
2916
{
2917
struct dm_struct *dm = (struct dm_struct *)dm_void;
2918
void *padapter = dm->adapter;
2919
2920
if (*dm->is_net_closed)
2921
return;
2922
if (dm->support_interface == ODM_ITRF_PCIE) {
2923
odm_hw_ant_div(dm);
2924
} else {
2925
/* @Can't do I/O in timer callback*/
2926
phydm_run_in_thread_cmd(dm,
2927
phydm_evm_antdiv_workitem_callback,
2928
padapter);
2929
}
2930
}
2931
2932
void phydm_evm_antdiv_workitem_callback(void *context)
2933
{
2934
void *adapter = (void *)context;
2935
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
2936
struct dm_struct *dm = &hal_data->odmpriv;
2937
2938
odm_hw_ant_div(dm);
2939
}
2940
2941
#else
2942
void phydm_evm_antdiv_callback(
2943
void *dm_void)
2944
{
2945
struct dm_struct *dm = (struct dm_struct *)dm_void;
2946
2947
PHYDM_DBG(dm, DBG_ANT_DIV, "******AntDiv_Callback******\n");
2948
odm_hw_ant_div(dm);
2949
}
2950
#endif
2951
2952
#endif
2953
2954
void odm_hw_ant_div(void *dm_void)
2955
{
2956
struct dm_struct *dm = (struct dm_struct *)dm_void;
2957
u32 i, min_max_rssi = 0xFF, ant_div_max_rssi = 0, max_rssi = 0;
2958
u32 main_rssi, aux_rssi, mian_cnt, aux_cnt, local_max_rssi;
2959
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
2960
u8 rx_idle_ant = fat_tab->rx_idle_ant, target_ant = 7;
2961
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2962
struct cmn_sta_info *sta;
2963
2964
#ifdef PHYDM_BEAMFORMING_SUPPORT
2965
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
2966
struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;
2967
u32 TH1 = 500000;
2968
u32 TH2 = 10000000;
2969
u32 ma_rx_temp, degrade_TP_temp, improve_TP_temp;
2970
u8 monitor_rssi_threshold = 30;
2971
2972
dm_bdc_table->BF_pass = true;
2973
dm_bdc_table->DIV_pass = true;
2974
dm_bdc_table->is_all_div_sta_idle = true;
2975
dm_bdc_table->is_all_bf_sta_idle = true;
2976
dm_bdc_table->num_bf_tar = 0;
2977
dm_bdc_table->num_div_tar = 0;
2978
dm_bdc_table->num_client = 0;
2979
#endif
2980
#endif
2981
2982
if (!dm->is_linked) { /* @is_linked==False */
2983
PHYDM_DBG(dm, DBG_ANT_DIV, "[No Link!!!]\n");
2984
2985
if (fat_tab->is_become_linked) {
2986
if (fat_tab->div_path_type == ANT_PATH_A)
2987
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);
2988
else if (fat_tab->div_path_type == ANT_PATH_B)
2989
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_B);
2990
else if (fat_tab->div_path_type == ANT_PATH_AB)
2991
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_AB);
2992
odm_update_rx_idle_ant(dm, MAIN_ANT);
2993
odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
2994
dm->antdiv_period = 0;
2995
2996
fat_tab->is_become_linked = dm->is_linked;
2997
}
2998
return;
2999
} else {
3000
if (!fat_tab->is_become_linked) {
3001
PHYDM_DBG(dm, DBG_ANT_DIV, "[Linked !!!]\n");
3002
if (fat_tab->div_path_type == ANT_PATH_A)
3003
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);
3004
else if (fat_tab->div_path_type == ANT_PATH_B)
3005
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_B);
3006
else if (fat_tab->div_path_type == ANT_PATH_AB)
3007
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_AB);
3008
#if 0
3009
/*odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);*/
3010
3011
/* @if(dm->support_ic_type == ODM_RTL8821 ) */
3012
/* odm_set_bb_reg(dm, R_0x800, BIT(25), 0); */
3013
/* CCK AntDiv function disable */
3014
3015
/* @#if(DM_ODM_SUPPORT_TYPE == ODM_AP) */
3016
/* @else if(dm->support_ic_type == ODM_RTL8881A) */
3017
/* odm_set_bb_reg(dm, R_0x800, BIT(25), 0); */
3018
/* CCK AntDiv function disable */
3019
/* @#endif */
3020
3021
/* @else if(dm->support_ic_type == ODM_RTL8723B ||*/
3022
/* @dm->support_ic_type == ODM_RTL8812) */
3023
/* odm_set_bb_reg(dm, R_0xa00, BIT(15), 0); */
3024
/* CCK AntDiv function disable */
3025
#endif
3026
3027
fat_tab->is_become_linked = dm->is_linked;
3028
3029
if (dm->support_ic_type == ODM_RTL8723B &&
3030
dm->ant_div_type == CG_TRX_HW_ANTDIV) {
3031
odm_set_bb_reg(dm, R_0x930, 0xF0, 8);
3032
/* @DPDT_P = ANTSEL[0] for 8723B AntDiv */
3033
odm_set_bb_reg(dm, R_0x930, 0xF, 8);
3034
/* @DPDT_N = ANTSEL[0] */
3035
}
3036
3037
/* @ BDC Init */
3038
#ifdef PHYDM_BEAMFORMING_SUPPORT
3039
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
3040
odm_bdc_init(dm);
3041
#endif
3042
#endif
3043
3044
#ifdef ODM_EVM_ENHANCE_ANTDIV
3045
odm_evm_fast_ant_reset(dm);
3046
#endif
3047
}
3048
}
3049
3050
if (!(*fat_tab->p_force_tx_by_desc)) {
3051
if (dm->is_one_entry_only)
3052
odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
3053
else
3054
odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);
3055
}
3056
3057
#ifdef ODM_EVM_ENHANCE_ANTDIV
3058
if (dm->antdiv_evm_en == 1) {
3059
odm_evm_enhance_ant_div(dm);
3060
if (fat_tab->fat_state_cnt != 0)
3061
return;
3062
} else
3063
odm_evm_fast_ant_reset(dm);
3064
#endif
3065
3066
/* @2 BDC mode Arbitration */
3067
#ifdef PHYDM_BEAMFORMING_SUPPORT
3068
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
3069
if (dm->antdiv_evm_en == 0 || fat_tab->evm_method_enable == 0)
3070
odm_bf_ant_div_mode_arbitration(dm);
3071
#endif
3072
#endif
3073
3074
for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
3075
sta = dm->phydm_sta_info[i];
3076
if (!is_sta_active(sta)) {
3077
phydm_antdiv_reset_statistic(dm, i);
3078
continue;
3079
}
3080
3081
/* @2 Caculate RSSI per Antenna */
3082
if (fat_tab->main_cnt[i] != 0 || fat_tab->aux_cnt[i] != 0) {
3083
mian_cnt = fat_tab->main_cnt[i];
3084
aux_cnt = fat_tab->aux_cnt[i];
3085
main_rssi = (mian_cnt != 0) ?
3086
(fat_tab->main_sum[i] / mian_cnt) : 0;
3087
aux_rssi = (aux_cnt != 0) ?
3088
(fat_tab->aux_sum[i] / aux_cnt) : 0;
3089
target_ant = (mian_cnt == aux_cnt) ?
3090
fat_tab->rx_idle_ant :
3091
((mian_cnt >= aux_cnt) ?
3092
MAIN_ANT : AUX_ANT);
3093
/*Use counter number for OFDM*/
3094
3095
} else { /*@CCK only case*/
3096
mian_cnt = fat_tab->main_cnt_cck[i];
3097
aux_cnt = fat_tab->aux_cnt_cck[i];
3098
main_rssi = (mian_cnt != 0) ?
3099
(fat_tab->main_sum_cck[i] / mian_cnt) : 0;
3100
aux_rssi = (aux_cnt != 0) ?
3101
(fat_tab->aux_sum_cck[i] / aux_cnt) : 0;
3102
target_ant = (main_rssi == aux_rssi) ?
3103
fat_tab->rx_idle_ant :
3104
((main_rssi >= aux_rssi) ?
3105
MAIN_ANT : AUX_ANT);
3106
/*Use RSSI for CCK only case*/
3107
}
3108
3109
PHYDM_DBG(dm, DBG_ANT_DIV,
3110
"*** Client[ %d ] : Main_Cnt = (( %d )) , CCK_Main_Cnt = (( %d )) , main_rssi= (( %d ))\n",
3111
i, fat_tab->main_cnt[i],
3112
fat_tab->main_cnt_cck[i], main_rssi);
3113
PHYDM_DBG(dm, DBG_ANT_DIV,
3114
"*** Client[ %d ] : Aux_Cnt = (( %d )) , CCK_Aux_Cnt = (( %d )) , aux_rssi = (( %d ))\n",
3115
i, fat_tab->aux_cnt[i],
3116
fat_tab->aux_cnt_cck[i], aux_rssi);
3117
3118
local_max_rssi = (main_rssi > aux_rssi) ? main_rssi : aux_rssi;
3119
/* @ Select max_rssi for DIG */
3120
if (local_max_rssi > ant_div_max_rssi && local_max_rssi < 40)
3121
ant_div_max_rssi = local_max_rssi;
3122
if (local_max_rssi > max_rssi)
3123
max_rssi = local_max_rssi;
3124
3125
/* @ Select RX Idle Antenna */
3126
if (local_max_rssi != 0 && local_max_rssi < min_max_rssi) {
3127
rx_idle_ant = target_ant;
3128
min_max_rssi = local_max_rssi;
3129
}
3130
3131
#ifdef ODM_EVM_ENHANCE_ANTDIV
3132
if (dm->antdiv_evm_en == 1) {
3133
if (fat_tab->target_ant_enhance != 0xFF) {
3134
target_ant = fat_tab->target_ant_enhance;
3135
rx_idle_ant = fat_tab->target_ant_enhance;
3136
}
3137
}
3138
#endif
3139
3140
/* @2 Select TX Antenna */
3141
if (dm->ant_div_type != CGCS_RX_HW_ANTDIV) {
3142
#ifdef PHYDM_BEAMFORMING_SUPPORT
3143
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
3144
if (dm_bdc_table->w_bfee_client[i] == 0)
3145
#endif
3146
#endif
3147
{
3148
odm_update_tx_ant(dm, target_ant, i);
3149
}
3150
}
3151
3152
/* @------------------------------------------------------------ */
3153
3154
#ifdef PHYDM_BEAMFORMING_SUPPORT
3155
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
3156
3157
dm_bdc_table->num_client++;
3158
3159
if (dm_bdc_table->bdc_mode == BDC_MODE_2 || dm_bdc_table->bdc_mode == BDC_MODE_3) {
3160
/* @2 Byte counter */
3161
3162
ma_rx_temp = sta->rx_moving_average_tp; /* RX TP ( bit /sec) */
3163
3164
if (dm_bdc_table->BDC_state == bdc_bfer_train_state)
3165
dm_bdc_table->MA_rx_TP_DIV[i] = ma_rx_temp;
3166
else
3167
dm_bdc_table->MA_rx_TP[i] = ma_rx_temp;
3168
3169
if (ma_rx_temp < TH2 && ma_rx_temp > TH1 && local_max_rssi <= monitor_rssi_threshold) {
3170
if (dm_bdc_table->w_bfer_client[i] == 1) { /* @Bfer_Target */
3171
dm_bdc_table->num_bf_tar++;
3172
3173
if (dm_bdc_table->BDC_state == BDC_DECISION_STATE && dm_bdc_table->bdc_try_flag == 0) {
3174
improve_TP_temp = (dm_bdc_table->MA_rx_TP_DIV[i] * 9) >> 3; /* @* 1.125 */
3175
dm_bdc_table->BF_pass = (dm_bdc_table->MA_rx_TP[i] > improve_TP_temp) ? true : false;
3176
PHYDM_DBG(dm, DBG_ANT_DIV, "*** Client[ %d ] : { MA_rx_TP,improve_TP_temp, MA_rx_TP_DIV, BF_pass}={ %d, %d, %d , %d }\n", i, dm_bdc_table->MA_rx_TP[i], improve_TP_temp, dm_bdc_table->MA_rx_TP_DIV[i], dm_bdc_table->BF_pass);
3177
}
3178
} else { /* @DIV_Target */
3179
dm_bdc_table->num_div_tar++;
3180
3181
if (dm_bdc_table->BDC_state == BDC_DECISION_STATE && dm_bdc_table->bdc_try_flag == 0) {
3182
degrade_TP_temp = (dm_bdc_table->MA_rx_TP_DIV[i] * 5) >> 3; /* @* 0.625 */
3183
dm_bdc_table->DIV_pass = (dm_bdc_table->MA_rx_TP[i] > degrade_TP_temp) ? true : false;
3184
PHYDM_DBG(dm, DBG_ANT_DIV, "*** Client[ %d ] : { MA_rx_TP, degrade_TP_temp, MA_rx_TP_DIV, DIV_pass}=\n{ %d, %d, %d , %d }\n", i, dm_bdc_table->MA_rx_TP[i], degrade_TP_temp, dm_bdc_table->MA_rx_TP_DIV[i], dm_bdc_table->DIV_pass);
3185
}
3186
}
3187
}
3188
3189
if (ma_rx_temp > TH1) {
3190
if (dm_bdc_table->w_bfer_client[i] == 1) /* @Bfer_Target */
3191
dm_bdc_table->is_all_bf_sta_idle = false;
3192
else /* @DIV_Target */
3193
dm_bdc_table->is_all_div_sta_idle = false;
3194
}
3195
3196
PHYDM_DBG(dm, DBG_ANT_DIV,
3197
"*** Client[ %d ] : { BFmeeCap, BFmerCap} = { %d , %d }\n",
3198
i, dm_bdc_table->w_bfee_client[i],
3199
dm_bdc_table->w_bfer_client[i]);
3200
3201
if (dm_bdc_table->BDC_state == bdc_bfer_train_state)
3202
PHYDM_DBG(dm, DBG_ANT_DIV, "*** Client[ %d ] : MA_rx_TP_DIV = (( %d ))\n", i, dm_bdc_table->MA_rx_TP_DIV[i]);
3203
3204
else
3205
PHYDM_DBG(dm, DBG_ANT_DIV, "*** Client[ %d ] : MA_rx_TP = (( %d ))\n", i, dm_bdc_table->MA_rx_TP[i]);
3206
}
3207
#endif
3208
#endif
3209
3210
#ifdef PHYDM_BEAMFORMING_SUPPORT
3211
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
3212
if (dm_bdc_table->bdc_try_flag == 0)
3213
#endif
3214
#endif
3215
{
3216
phydm_antdiv_reset_statistic(dm, i);
3217
}
3218
}
3219
3220
/* @2 Set RX Idle Antenna & TX Antenna(Because of HW Bug ) */
3221
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
3222
PHYDM_DBG(dm, DBG_ANT_DIV, "*** rx_idle_ant = (( %s ))\n",
3223
(rx_idle_ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
3224
3225
#ifdef PHYDM_BEAMFORMING_SUPPORT
3226
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
3227
if (dm_bdc_table->bdc_mode == BDC_MODE_1 || dm_bdc_table->bdc_mode == BDC_MODE_3) {
3228
PHYDM_DBG(dm, DBG_ANT_DIV,
3229
"*** bdc_rx_idle_update_counter = (( %d ))\n",
3230
dm_bdc_table->bdc_rx_idle_update_counter);
3231
3232
if (dm_bdc_table->bdc_rx_idle_update_counter == 1) {
3233
PHYDM_DBG(dm, DBG_ANT_DIV,
3234
"***Update RxIdle Antenna!!!\n");
3235
dm_bdc_table->bdc_rx_idle_update_counter = 30;
3236
odm_update_rx_idle_ant(dm, rx_idle_ant);
3237
} else {
3238
dm_bdc_table->bdc_rx_idle_update_counter--;
3239
PHYDM_DBG(dm, DBG_ANT_DIV,
3240
"***NOT update RxIdle Antenna because of BF ( need to fix TX-ant)\n");
3241
}
3242
} else
3243
#endif
3244
#endif
3245
odm_update_rx_idle_ant(dm, rx_idle_ant);
3246
#else
3247
3248
odm_update_rx_idle_ant(dm, rx_idle_ant);
3249
3250
#endif /* @#if(DM_ODM_SUPPORT_TYPE == ODM_AP) */
3251
3252
/* @2 BDC Main Algorithm */
3253
#ifdef PHYDM_BEAMFORMING_SUPPORT
3254
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
3255
if (dm->antdiv_evm_en == 0 || fat_tab->evm_method_enable == 0)
3256
odm_bd_ccoex_bfee_rx_div_arbitration(dm);
3257
3258
dm_bdc_table->num_txbfee_client = 0;
3259
dm_bdc_table->num_txbfer_client = 0;
3260
#endif
3261
#endif
3262
3263
if (ant_div_max_rssi == 0)
3264
dig_t->ant_div_rssi_max = dm->rssi_min;
3265
else
3266
dig_t->ant_div_rssi_max = ant_div_max_rssi;
3267
3268
PHYDM_DBG(dm, DBG_ANT_DIV, "***AntDiv End***\n\n");
3269
}
3270
3271
#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
3272
3273
void odm_s0s1_sw_ant_div_reset(void *dm_void)
3274
{
3275
struct dm_struct *dm = (struct dm_struct *)dm_void;
3276
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
3277
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
3278
3279
fat_tab->is_become_linked = false;
3280
swat_tab->try_flag = SWAW_STEP_INIT;
3281
swat_tab->double_chk_flag = 0;
3282
3283
PHYDM_DBG(dm, DBG_ANT_DIV, "%s: fat_tab->is_become_linked = %d\n",
3284
__func__, fat_tab->is_become_linked);
3285
}
3286
3287
void phydm_sw_antdiv_train_time(void *dm_void)
3288
{
3289
struct dm_struct *dm = (struct dm_struct *)dm_void;
3290
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
3291
u8 high_traffic_train_time_u = 0x32, high_traffic_train_time_l = 0;
3292
u8 low_traffic_train_time_u = 200, low_traffic_train_time_l = 0;
3293
u8 train_time_temp;
3294
3295
if (dm->traffic_load == TRAFFIC_HIGH) {
3296
train_time_temp = swat_tab->train_time;
3297
3298
if (swat_tab->train_time_flag == 3) {
3299
high_traffic_train_time_l = 0xa;
3300
3301
if (train_time_temp <= 16)
3302
train_time_temp = high_traffic_train_time_l;
3303
else
3304
train_time_temp -= 16;
3305
3306
} else if (swat_tab->train_time_flag == 2) {
3307
train_time_temp -= 8;
3308
high_traffic_train_time_l = 0xf;
3309
} else if (swat_tab->train_time_flag == 1) {
3310
train_time_temp -= 4;
3311
high_traffic_train_time_l = 0x1e;
3312
} else if (swat_tab->train_time_flag == 0) {
3313
train_time_temp += 8;
3314
high_traffic_train_time_l = 0x28;
3315
}
3316
3317
if (dm->support_ic_type == ODM_RTL8188F) {
3318
if (dm->support_interface == ODM_ITRF_SDIO)
3319
high_traffic_train_time_l += 0xa;
3320
}
3321
3322
/* @-- */
3323
if (train_time_temp > high_traffic_train_time_u)
3324
train_time_temp = high_traffic_train_time_u;
3325
3326
else if (train_time_temp < high_traffic_train_time_l)
3327
train_time_temp = high_traffic_train_time_l;
3328
3329
swat_tab->train_time = train_time_temp; /*@10ms~200ms*/
3330
3331
PHYDM_DBG(dm, DBG_ANT_DIV,
3332
"train_time_flag=((%d)), train_time=((%d))\n",
3333
swat_tab->train_time_flag,
3334
swat_tab->train_time);
3335
3336
} else if ((dm->traffic_load == TRAFFIC_MID) ||
3337
(dm->traffic_load == TRAFFIC_LOW)) {
3338
train_time_temp = swat_tab->train_time;
3339
3340
if (swat_tab->train_time_flag == 3) {
3341
low_traffic_train_time_l = 10;
3342
if (train_time_temp < 50)
3343
train_time_temp = low_traffic_train_time_l;
3344
else
3345
train_time_temp -= 50;
3346
} else if (swat_tab->train_time_flag == 2) {
3347
train_time_temp -= 30;
3348
low_traffic_train_time_l = 36;
3349
} else if (swat_tab->train_time_flag == 1) {
3350
train_time_temp -= 10;
3351
low_traffic_train_time_l = 40;
3352
} else {
3353
train_time_temp += 10;
3354
low_traffic_train_time_l = 50;
3355
}
3356
3357
if (dm->support_ic_type == ODM_RTL8188F) {
3358
if (dm->support_interface == ODM_ITRF_SDIO)
3359
low_traffic_train_time_l += 10;
3360
}
3361
3362
/* @-- */
3363
if (train_time_temp >= low_traffic_train_time_u)
3364
train_time_temp = low_traffic_train_time_u;
3365
3366
else if (train_time_temp <= low_traffic_train_time_l)
3367
train_time_temp = low_traffic_train_time_l;
3368
3369
swat_tab->train_time = train_time_temp; /*@10ms~200ms*/
3370
3371
PHYDM_DBG(dm, DBG_ANT_DIV,
3372
"train_time_flag=((%d)) , train_time=((%d))\n",
3373
swat_tab->train_time_flag, swat_tab->train_time);
3374
3375
} else {
3376
swat_tab->train_time = 0xc8; /*@200ms*/
3377
}
3378
}
3379
3380
void phydm_sw_antdiv_decision(void *dm_void)
3381
{
3382
struct dm_struct *dm = (struct dm_struct *)dm_void;
3383
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
3384
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
3385
u32 i, min_max_rssi = 0xFF, local_max_rssi, local_min_rssi;
3386
u32 main_rssi, aux_rssi;
3387
u8 rx_idle_ant = swat_tab->pre_ant;
3388
u8 target_ant = swat_tab->pre_ant, next_ant = 0;
3389
struct cmn_sta_info *entry = NULL;
3390
u32 main_cnt = 0, aux_cnt = 0, main_sum = 0, aux_sum = 0;
3391
u32 main_ctrl_cnt = 0, aux_ctrl_cnt = 0;
3392
boolean is_by_ctrl_frame = false;
3393
boolean cond_23d_main, cond_23d_aux;
3394
u64 pkt_cnt_total = 0;
3395
3396
for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
3397
entry = dm->phydm_sta_info[i];
3398
if (!is_sta_active(entry)) {
3399
phydm_antdiv_reset_statistic(dm, i);
3400
continue;
3401
}
3402
3403
/* @2 Caculate RSSI per Antenna */
3404
if (fat_tab->main_cnt[i] != 0 || fat_tab->aux_cnt[i] != 0) {
3405
main_cnt = (u32)fat_tab->main_cnt[i];
3406
aux_cnt = (u32)fat_tab->aux_cnt[i];
3407
main_rssi = (main_cnt != 0) ?
3408
(fat_tab->main_sum[i] / main_cnt) : 0;
3409
aux_rssi = (aux_cnt != 0) ?
3410
(fat_tab->aux_sum[i] / aux_cnt) : 0;
3411
if (dm->support_ic_type == ODM_RTL8723D) {
3412
cond_23d_main = (aux_cnt > main_cnt) &&
3413
((main_rssi - aux_rssi < 5) ||
3414
(aux_rssi > main_rssi));
3415
cond_23d_aux = (main_cnt > aux_cnt) &&
3416
((aux_rssi - main_rssi < 5) ||
3417
(main_rssi > aux_rssi));
3418
if (swat_tab->pre_ant == MAIN_ANT) {
3419
if (main_cnt == 0)
3420
target_ant = (aux_cnt != 0) ?
3421
AUX_ANT :
3422
swat_tab->pre_ant;
3423
else
3424
target_ant = cond_23d_main ?
3425
AUX_ANT :
3426
swat_tab->pre_ant;
3427
} else {
3428
if (aux_cnt == 0)
3429
target_ant = (main_cnt != 0) ?
3430
MAIN_ANT :
3431
swat_tab->pre_ant;
3432
else
3433
target_ant = cond_23d_aux ?
3434
MAIN_ANT :
3435
swat_tab->pre_ant;
3436
}
3437
} else {
3438
if (swat_tab->pre_ant == MAIN_ANT) {
3439
target_ant = (aux_rssi > main_rssi) ?
3440
AUX_ANT :
3441
swat_tab->pre_ant;
3442
} else if (swat_tab->pre_ant == AUX_ANT) {
3443
target_ant = (main_rssi > aux_rssi) ?
3444
MAIN_ANT :
3445
swat_tab->pre_ant;
3446
}
3447
}
3448
} else { /*@CCK only case*/
3449
main_cnt = fat_tab->main_cnt_cck[i];
3450
aux_cnt = fat_tab->aux_cnt_cck[i];
3451
main_rssi = (main_cnt != 0) ?
3452
(fat_tab->main_sum_cck[i] / main_cnt) : 0;
3453
aux_rssi = (aux_cnt != 0) ?
3454
(fat_tab->aux_sum_cck[i] / aux_cnt) : 0;
3455
target_ant = (main_rssi == aux_rssi) ?
3456
swat_tab->pre_ant :
3457
((main_rssi >= aux_rssi) ?
3458
MAIN_ANT : AUX_ANT);
3459
/*Use RSSI for CCK only case*/
3460
}
3461
local_max_rssi = (main_rssi >= aux_rssi) ? main_rssi : aux_rssi;
3462
local_min_rssi = (main_rssi >= aux_rssi) ? aux_rssi : main_rssi;
3463
3464
PHYDM_DBG(dm, DBG_ANT_DIV,
3465
"*** CCK_counter_main = (( %d )) , CCK_counter_aux= (( %d ))\n",
3466
fat_tab->main_cnt_cck[i], fat_tab->aux_cnt_cck[i]);
3467
PHYDM_DBG(dm, DBG_ANT_DIV,
3468
"*** OFDM_counter_main = (( %d )) , OFDM_counter_aux= (( %d ))\n",
3469
fat_tab->main_cnt[i], fat_tab->aux_cnt[i]);
3470
PHYDM_DBG(dm, DBG_ANT_DIV,
3471
"*** main_Cnt = (( %d )) , aux_Cnt = (( %d ))\n",
3472
main_cnt, aux_cnt);
3473
PHYDM_DBG(dm, DBG_ANT_DIV,
3474
"*** main_rssi= (( %d )) , aux_rssi = (( %d ))\n",
3475
main_rssi, aux_rssi);
3476
PHYDM_DBG(dm, DBG_ANT_DIV,
3477
"*** MAC ID:[ %d ] , target_ant = (( %s ))\n", i,
3478
(target_ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
3479
3480
/* @2 Select RX Idle Antenna */
3481
3482
if (local_max_rssi != 0 && local_max_rssi < min_max_rssi) {
3483
rx_idle_ant = target_ant;
3484
min_max_rssi = local_max_rssi;
3485
PHYDM_DBG(dm, DBG_ANT_DIV,
3486
"*** local_max_rssi-local_min_rssi = ((%d))\n",
3487
(local_max_rssi - local_min_rssi));
3488
3489
if ((local_max_rssi - local_min_rssi) > 8) {
3490
if (local_min_rssi != 0) {
3491
swat_tab->train_time_flag = 3;
3492
} else {
3493
if (min_max_rssi > RSSI_CHECK_THRESHOLD)
3494
swat_tab->train_time_flag = 0;
3495
else
3496
swat_tab->train_time_flag = 3;
3497
}
3498
} else if ((local_max_rssi - local_min_rssi) > 5) {
3499
swat_tab->train_time_flag = 2;
3500
} else if ((local_max_rssi - local_min_rssi) > 2) {
3501
swat_tab->train_time_flag = 1;
3502
} else {
3503
swat_tab->train_time_flag = 0;
3504
}
3505
}
3506
3507
/* @2 Select TX Antenna */
3508
if (target_ant == MAIN_ANT)
3509
fat_tab->antsel_a[i] = ANT1_2G;
3510
else
3511
fat_tab->antsel_a[i] = ANT2_2G;
3512
3513
phydm_antdiv_reset_statistic(dm, i);
3514
pkt_cnt_total += (main_cnt + aux_cnt);
3515
}
3516
3517
if (swat_tab->is_sw_ant_div_by_ctrl_frame) {
3518
odm_s0s1_sw_ant_div_by_ctrl_frame(dm, SWAW_STEP_DETERMINE);
3519
is_by_ctrl_frame = true;
3520
}
3521
3522
PHYDM_DBG(dm, DBG_ANT_DIV,
3523
"Control frame packet counter = %d, data frame packet counter = %llu\n",
3524
swat_tab->pkt_cnt_sw_ant_div_by_ctrl_frame, pkt_cnt_total);
3525
3526
if (min_max_rssi == 0xff || ((pkt_cnt_total <
3527
(swat_tab->pkt_cnt_sw_ant_div_by_ctrl_frame >> 1)) &&
3528
dm->phy_dbg_info.num_qry_beacon_pkt < 2)) {
3529
min_max_rssi = 0;
3530
PHYDM_DBG(dm, DBG_ANT_DIV,
3531
"Check RSSI of control frame because min_max_rssi == 0xff\n");
3532
PHYDM_DBG(dm, DBG_ANT_DIV, "is_by_ctrl_frame = %d\n",
3533
is_by_ctrl_frame);
3534
3535
if (is_by_ctrl_frame) {
3536
main_ctrl_cnt = fat_tab->main_ctrl_cnt;
3537
aux_ctrl_cnt = fat_tab->aux_ctrl_cnt;
3538
main_rssi = (main_ctrl_cnt != 0) ?
3539
(fat_tab->main_ctrl_sum / main_ctrl_cnt) :
3540
0;
3541
aux_rssi = (aux_ctrl_cnt != 0) ?
3542
(fat_tab->aux_ctrl_sum / aux_ctrl_cnt) : 0;
3543
3544
if (main_ctrl_cnt <= 1 &&
3545
fat_tab->cck_ctrl_frame_cnt_main >= 1)
3546
main_rssi = 0;
3547
3548
if (aux_ctrl_cnt <= 1 &&
3549
fat_tab->cck_ctrl_frame_cnt_aux >= 1)
3550
aux_rssi = 0;
3551
3552
if (main_rssi != 0 || aux_rssi != 0) {
3553
rx_idle_ant = (main_rssi == aux_rssi) ?
3554
swat_tab->pre_ant :
3555
((main_rssi >= aux_rssi) ?
3556
MAIN_ANT : AUX_ANT);
3557
local_max_rssi = (main_rssi >= aux_rssi) ?
3558
main_rssi : aux_rssi;
3559
local_min_rssi = (main_rssi >= aux_rssi) ?
3560
aux_rssi : main_rssi;
3561
3562
if ((local_max_rssi - local_min_rssi) > 8)
3563
swat_tab->train_time_flag = 3;
3564
else if ((local_max_rssi - local_min_rssi) > 5)
3565
swat_tab->train_time_flag = 2;
3566
else if ((local_max_rssi - local_min_rssi) > 2)
3567
swat_tab->train_time_flag = 1;
3568
else
3569
swat_tab->train_time_flag = 0;
3570
3571
PHYDM_DBG(dm, DBG_ANT_DIV,
3572
"Control frame: main_rssi = %d, aux_rssi = %d\n",
3573
main_rssi, aux_rssi);
3574
PHYDM_DBG(dm, DBG_ANT_DIV,
3575
"rx_idle_ant decided by control frame = %s\n",
3576
(rx_idle_ant == MAIN_ANT ?
3577
"MAIN" : "AUX"));
3578
}
3579
}
3580
}
3581
3582
fat_tab->min_max_rssi = min_max_rssi;
3583
swat_tab->try_flag = SWAW_STEP_PEEK;
3584
3585
if (swat_tab->double_chk_flag == 1) {
3586
swat_tab->double_chk_flag = 0;
3587
3588
if (fat_tab->min_max_rssi > RSSI_CHECK_THRESHOLD) {
3589
PHYDM_DBG(dm, DBG_ANT_DIV,
3590
" [Double check] min_max_rssi ((%d)) > %d again!!\n",
3591
fat_tab->min_max_rssi, RSSI_CHECK_THRESHOLD);
3592
3593
odm_update_rx_idle_ant(dm, rx_idle_ant);
3594
3595
PHYDM_DBG(dm, DBG_ANT_DIV,
3596
"[reset try_flag = 0] Training accomplished !!!]\n\n\n");
3597
} else {
3598
PHYDM_DBG(dm, DBG_ANT_DIV,
3599
" [Double check] min_max_rssi ((%d)) <= %d !!\n",
3600
fat_tab->min_max_rssi, RSSI_CHECK_THRESHOLD);
3601
3602
next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ?
3603
AUX_ANT : MAIN_ANT;
3604
swat_tab->try_flag = SWAW_STEP_PEEK;
3605
swat_tab->reset_idx = RSSI_CHECK_RESET_PERIOD;
3606
PHYDM_DBG(dm, DBG_ANT_DIV,
3607
"[set try_flag=0] Normal state: Need to tryg again!!\n\n\n");
3608
}
3609
} else {
3610
if (fat_tab->min_max_rssi < RSSI_CHECK_THRESHOLD)
3611
swat_tab->reset_idx = RSSI_CHECK_RESET_PERIOD;
3612
3613
swat_tab->pre_ant = rx_idle_ant;
3614
odm_update_rx_idle_ant(dm, rx_idle_ant);
3615
PHYDM_DBG(dm, DBG_ANT_DIV,
3616
"[reset try_flag = 0] Training accomplished !!!]\n\n\n");
3617
}
3618
}
3619
3620
void odm_s0s1_sw_ant_div(void *dm_void, u8 step)
3621
{
3622
struct dm_struct *dm = (struct dm_struct *)dm_void;
3623
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
3624
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
3625
u32 value32;
3626
u8 next_ant = 0;
3627
3628
if (!dm->is_linked) { /* @is_linked==False */
3629
PHYDM_DBG(dm, DBG_ANT_DIV, "[No Link!!!]\n");
3630
if (fat_tab->is_become_linked == true) {
3631
odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
3632
if (dm->support_ic_type == ODM_RTL8723B) {
3633
PHYDM_DBG(dm, DBG_ANT_DIV,
3634
"Set REG 948[9:6]=0x0\n");
3635
odm_set_bb_reg(dm, R_0x948, 0x3c0, 0x0);
3636
}
3637
fat_tab->is_become_linked = dm->is_linked;
3638
}
3639
return;
3640
} else {
3641
if (fat_tab->is_become_linked == false) {
3642
PHYDM_DBG(dm, DBG_ANT_DIV, "[Linked !!!]\n");
3643
3644
if (dm->support_ic_type == ODM_RTL8723B) {
3645
value32 = odm_get_bb_reg(dm, R_0x864, 0x38);
3646
3647
#if (RTL8723B_SUPPORT == 1)
3648
if (value32 == 0x0)
3649
odm_update_rx_idle_ant_8723b(dm,
3650
MAIN_ANT,
3651
ANT1_2G,
3652
ANT2_2G);
3653
else if (value32 == 0x1)
3654
odm_update_rx_idle_ant_8723b(dm,
3655
AUX_ANT,
3656
ANT2_2G,
3657
ANT1_2G);
3658
#endif
3659
3660
PHYDM_DBG(dm, DBG_ANT_DIV,
3661
"8723B: First link! Force antenna to %s\n",
3662
(value32 == 0x0 ? "MAIN" : "AUX"));
3663
}
3664
3665
if (dm->support_ic_type == ODM_RTL8723D) {
3666
value32 = odm_get_bb_reg(dm, R_0x864, 0x38);
3667
#if (RTL8723D_SUPPORT == 1)
3668
if (value32 == 0x0)
3669
odm_update_rx_idle_ant_8723d(dm,
3670
MAIN_ANT,
3671
ANT1_2G,
3672
ANT2_2G);
3673
else if (value32 == 0x1)
3674
odm_update_rx_idle_ant_8723d(dm,
3675
AUX_ANT,
3676
ANT2_2G,
3677
ANT1_2G);
3678
PHYDM_DBG(dm, DBG_ANT_DIV,
3679
"8723D: First link! Force antenna to %s\n",
3680
(value32 == 0x0 ? "MAIN" : "AUX"));
3681
#endif
3682
}
3683
fat_tab->is_become_linked = dm->is_linked;
3684
}
3685
}
3686
3687
if (!(*fat_tab->p_force_tx_by_desc)) {
3688
if (dm->is_one_entry_only == true)
3689
odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
3690
else
3691
odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);
3692
}
3693
3694
PHYDM_DBG(dm, DBG_ANT_DIV,
3695
"[%d] { try_flag=(( %d )), step=(( %d )), double_chk_flag = (( %d )) }\n",
3696
__LINE__, swat_tab->try_flag, step,
3697
swat_tab->double_chk_flag);
3698
3699
/* @ Handling step mismatch condition. */
3700
/* @ Peak step is not finished at last time. */
3701
/* @ Recover the variable and check again. */
3702
if (step != swat_tab->try_flag) {
3703
PHYDM_DBG(dm, DBG_ANT_DIV,
3704
"[step != try_flag] Need to Reset After Link\n");
3705
odm_sw_ant_div_rest_after_link(dm);
3706
}
3707
3708
if (swat_tab->try_flag == SWAW_STEP_INIT) {
3709
swat_tab->try_flag = SWAW_STEP_PEEK;
3710
swat_tab->train_time_flag = 0;
3711
PHYDM_DBG(dm, DBG_ANT_DIV,
3712
"[set try_flag = 0] Prepare for peek!\n\n");
3713
return;
3714
3715
} else {
3716
/* @1 Normal state (Begin Trying) */
3717
if (swat_tab->try_flag == SWAW_STEP_PEEK) {
3718
PHYDM_DBG(dm, DBG_ANT_DIV,
3719
"TxOkCnt=(( %llu )), RxOkCnt=(( %llu )), traffic_load = (%d))\n",
3720
dm->cur_tx_ok_cnt, dm->cur_rx_ok_cnt,
3721
dm->traffic_load);
3722
phydm_sw_antdiv_train_time(dm);
3723
3724
PHYDM_DBG(dm, DBG_ANT_DIV,
3725
"Current min_max_rssi is ((%d))\n",
3726
fat_tab->min_max_rssi);
3727
3728
/* @---reset index--- */
3729
if (swat_tab->reset_idx >= RSSI_CHECK_RESET_PERIOD) {
3730
fat_tab->min_max_rssi = 0;
3731
swat_tab->reset_idx = 0;
3732
}
3733
PHYDM_DBG(dm, DBG_ANT_DIV, "reset_idx = (( %d ))\n",
3734
swat_tab->reset_idx);
3735
3736
swat_tab->reset_idx++;
3737
3738
/* @---double check flag--- */
3739
if (fat_tab->min_max_rssi > RSSI_CHECK_THRESHOLD &&
3740
swat_tab->double_chk_flag == 0) {
3741
PHYDM_DBG(dm, DBG_ANT_DIV,
3742
" min_max_rssi is ((%d)), and > %d\n",
3743
fat_tab->min_max_rssi,
3744
RSSI_CHECK_THRESHOLD);
3745
3746
swat_tab->double_chk_flag = 1;
3747
swat_tab->try_flag = SWAW_STEP_DETERMINE;
3748
swat_tab->rssi_trying = 0;
3749
3750
PHYDM_DBG(dm, DBG_ANT_DIV,
3751
"Test the current ant for (( %d )) ms again\n",
3752
swat_tab->train_time);
3753
odm_update_rx_idle_ant(dm,
3754
fat_tab->rx_idle_ant);
3755
odm_set_timer(dm, &swat_tab->sw_antdiv_timer,
3756
swat_tab->train_time); /*@ms*/
3757
return;
3758
}
3759
3760
next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ?
3761
AUX_ANT : MAIN_ANT;
3762
3763
swat_tab->try_flag = SWAW_STEP_DETERMINE;
3764
3765
if (swat_tab->reset_idx <= 1)
3766
swat_tab->rssi_trying = 2;
3767
else
3768
swat_tab->rssi_trying = 1;
3769
3770
odm_s0s1_sw_ant_div_by_ctrl_frame(dm, SWAW_STEP_PEEK);
3771
PHYDM_DBG(dm, DBG_ANT_DIV,
3772
"[set try_flag=1] Normal state: Begin Trying!!\n");
3773
3774
} else if ((swat_tab->try_flag == SWAW_STEP_DETERMINE) &&
3775
(swat_tab->double_chk_flag == 0)) {
3776
next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ?
3777
AUX_ANT : MAIN_ANT;
3778
swat_tab->rssi_trying--;
3779
}
3780
3781
/* @1 Decision state */
3782
if (swat_tab->try_flag == SWAW_STEP_DETERMINE &&
3783
swat_tab->rssi_trying == 0) {
3784
phydm_sw_antdiv_decision(dm);
3785
return;
3786
}
3787
}
3788
3789
/* @1 4.Change TRX antenna */
3790
3791
PHYDM_DBG(dm, DBG_ANT_DIV,
3792
"rssi_trying = (( %d )), ant: (( %s )) >>> (( %s ))\n",
3793
swat_tab->rssi_trying,
3794
(fat_tab->rx_idle_ant == MAIN_ANT ? "MAIN" : "AUX"),
3795
(next_ant == MAIN_ANT ? "MAIN" : "AUX"));
3796
3797
odm_update_rx_idle_ant(dm, next_ant);
3798
3799
/* @1 5.Reset Statistics */
3800
3801
fat_tab->rx_idle_ant = next_ant;
3802
3803
if (dm->support_ic_type == ODM_RTL8723D) {
3804
if (fat_tab->rx_idle_ant == MAIN_ANT) {
3805
fat_tab->main_sum[0] = 0;
3806
fat_tab->main_cnt[0] = 0;
3807
fat_tab->main_sum_cck[0] = 0;
3808
fat_tab->main_cnt_cck[0] = 0;
3809
} else {
3810
fat_tab->aux_sum[0] = 0;
3811
fat_tab->aux_cnt[0] = 0;
3812
fat_tab->aux_sum_cck[0] = 0;
3813
fat_tab->aux_cnt_cck[0] = 0;
3814
}
3815
}
3816
3817
if (dm->support_ic_type == ODM_RTL8188F) {
3818
if (dm->support_interface == ODM_ITRF_SDIO) {
3819
ODM_delay_us(200);
3820
3821
if (fat_tab->rx_idle_ant == MAIN_ANT) {
3822
fat_tab->main_sum[0] = 0;
3823
fat_tab->main_cnt[0] = 0;
3824
fat_tab->main_sum_cck[0] = 0;
3825
fat_tab->main_cnt_cck[0] = 0;
3826
} else {
3827
fat_tab->aux_sum[0] = 0;
3828
fat_tab->aux_cnt[0] = 0;
3829
fat_tab->aux_sum_cck[0] = 0;
3830
fat_tab->aux_cnt_cck[0] = 0;
3831
}
3832
}
3833
}
3834
/* @1 6.Set next timer (Trying state) */
3835
PHYDM_DBG(dm, DBG_ANT_DIV, " Test ((%s)) ant for (( %d )) ms\n",
3836
(next_ant == MAIN_ANT ? "MAIN" : "AUX"),
3837
swat_tab->train_time);
3838
odm_set_timer(dm, &swat_tab->sw_antdiv_timer, swat_tab->train_time);
3839
/*@ms*/
3840
}
3841
3842
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3843
void odm_sw_antdiv_callback(struct phydm_timer_list *timer)
3844
{
3845
void *adapter = (void *)timer->Adapter;
3846
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
3847
struct sw_antenna_switch *swat_tab = &hal_data->DM_OutSrc.dm_swat_table;
3848
3849
#if DEV_BUS_TYPE == RT_PCI_INTERFACE
3850
#if USE_WORKITEM
3851
odm_schedule_work_item(&swat_tab->phydm_sw_antenna_switch_workitem);
3852
#else
3853
{
3854
#if 0
3855
/* @dbg_print("SW_antdiv_Callback"); */
3856
#endif
3857
odm_s0s1_sw_ant_div(&hal_data->DM_OutSrc, SWAW_STEP_DETERMINE);
3858
}
3859
#endif
3860
#else
3861
odm_schedule_work_item(&swat_tab->phydm_sw_antenna_switch_workitem);
3862
#endif
3863
}
3864
3865
void odm_sw_antdiv_workitem_callback(void *context)
3866
{
3867
void *adapter = (void *)context;
3868
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
3869
3870
#if 0
3871
/* @dbg_print("SW_antdiv_Workitem_Callback"); */
3872
#endif
3873
odm_s0s1_sw_ant_div(&hal_data->DM_OutSrc, SWAW_STEP_DETERMINE);
3874
}
3875
3876
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
3877
3878
void odm_sw_antdiv_workitem_callback(void *context)
3879
{
3880
void *
3881
adapter = (void *)context;
3882
HAL_DATA_TYPE
3883
*hal_data = GET_HAL_DATA(((PADAPTER)adapter));
3884
3885
#if 0
3886
/*@dbg_print("SW_antdiv_Workitem_Callback");*/
3887
#endif
3888
odm_s0s1_sw_ant_div(&hal_data->odmpriv, SWAW_STEP_DETERMINE);
3889
}
3890
3891
void odm_sw_antdiv_callback(void *function_context)
3892
{
3893
struct dm_struct *dm = (struct dm_struct *)function_context;
3894
void *padapter = dm->adapter;
3895
if (*dm->is_net_closed == true)
3896
return;
3897
3898
#if 0 /* @Can't do I/O in timer callback*/
3899
odm_s0s1_sw_ant_div(dm, SWAW_STEP_DETERMINE);
3900
#else
3901
rtw_run_in_thread_cmd(padapter, odm_sw_antdiv_workitem_callback,
3902
padapter);
3903
#endif
3904
}
3905
3906
#endif
3907
3908
void odm_s0s1_sw_ant_div_by_ctrl_frame(void *dm_void, u8 step)
3909
{
3910
struct dm_struct *dm = (struct dm_struct *)dm_void;
3911
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
3912
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
3913
3914
switch (step) {
3915
case SWAW_STEP_PEEK:
3916
swat_tab->pkt_cnt_sw_ant_div_by_ctrl_frame = 0;
3917
swat_tab->is_sw_ant_div_by_ctrl_frame = true;
3918
fat_tab->main_ctrl_cnt = 0;
3919
fat_tab->aux_ctrl_cnt = 0;
3920
fat_tab->main_ctrl_sum = 0;
3921
fat_tab->aux_ctrl_sum = 0;
3922
fat_tab->cck_ctrl_frame_cnt_main = 0;
3923
fat_tab->cck_ctrl_frame_cnt_aux = 0;
3924
fat_tab->ofdm_ctrl_frame_cnt_main = 0;
3925
fat_tab->ofdm_ctrl_frame_cnt_aux = 0;
3926
PHYDM_DBG(dm, DBG_ANT_DIV,
3927
"odm_S0S1_SwAntDivForAPMode(): Start peek and reset counter\n");
3928
break;
3929
case SWAW_STEP_DETERMINE:
3930
swat_tab->is_sw_ant_div_by_ctrl_frame = false;
3931
PHYDM_DBG(dm, DBG_ANT_DIV,
3932
"odm_S0S1_SwAntDivForAPMode(): Stop peek\n");
3933
break;
3934
default:
3935
swat_tab->is_sw_ant_div_by_ctrl_frame = false;
3936
break;
3937
}
3938
}
3939
3940
void odm_antsel_statistics_ctrl(void *dm_void, u8 antsel_tr_mux,
3941
u32 rx_pwdb_all)
3942
{
3943
struct dm_struct *dm = (struct dm_struct *)dm_void;
3944
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
3945
3946
if (antsel_tr_mux == ANT1_2G) {
3947
fat_tab->main_ctrl_sum += rx_pwdb_all;
3948
fat_tab->main_ctrl_cnt++;
3949
} else {
3950
fat_tab->aux_ctrl_sum += rx_pwdb_all;
3951
fat_tab->aux_ctrl_cnt++;
3952
}
3953
}
3954
3955
void odm_s0s1_sw_ant_div_by_ctrl_frame_process_rssi(void *dm_void,
3956
void *phy_info_void,
3957
void *pkt_info_void
3958
/* struct phydm_phyinfo_struct* phy_info, */
3959
/* struct phydm_perpkt_info_struct* pktinfo */
3960
)
3961
{
3962
struct dm_struct *dm = (struct dm_struct *)dm_void;
3963
struct phydm_phyinfo_struct *phy_info = NULL;
3964
struct phydm_perpkt_info_struct *pktinfo = NULL;
3965
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
3966
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
3967
u8 rssi_cck;
3968
3969
phy_info = (struct phydm_phyinfo_struct *)phy_info_void;
3970
pktinfo = (struct phydm_perpkt_info_struct *)pkt_info_void;
3971
3972
if (!(dm->support_ability & ODM_BB_ANT_DIV))
3973
return;
3974
3975
if (dm->ant_div_type != S0S1_SW_ANTDIV)
3976
return;
3977
3978
/* @In try state */
3979
if (!swat_tab->is_sw_ant_div_by_ctrl_frame)
3980
return;
3981
3982
/* No HW error and match receiver address */
3983
if (!pktinfo->is_to_self)
3984
return;
3985
3986
swat_tab->pkt_cnt_sw_ant_div_by_ctrl_frame++;
3987
3988
if (pktinfo->is_cck_rate) {
3989
rssi_cck = phy_info->rx_mimo_signal_strength[RF_PATH_A];
3990
fat_tab->antsel_rx_keep_0 = (fat_tab->rx_idle_ant == MAIN_ANT) ?
3991
ANT1_2G : ANT2_2G;
3992
3993
if (fat_tab->antsel_rx_keep_0 == ANT1_2G)
3994
fat_tab->cck_ctrl_frame_cnt_main++;
3995
else
3996
fat_tab->cck_ctrl_frame_cnt_aux++;
3997
3998
odm_antsel_statistics_ctrl(dm, fat_tab->antsel_rx_keep_0,
3999
rssi_cck);
4000
} else {
4001
fat_tab->antsel_rx_keep_0 = (fat_tab->rx_idle_ant == MAIN_ANT) ?
4002
ANT1_2G : ANT2_2G;
4003
4004
if (fat_tab->antsel_rx_keep_0 == ANT1_2G)
4005
fat_tab->ofdm_ctrl_frame_cnt_main++;
4006
else
4007
fat_tab->ofdm_ctrl_frame_cnt_aux++;
4008
4009
odm_antsel_statistics_ctrl(dm, fat_tab->antsel_rx_keep_0,
4010
phy_info->rx_pwdb_all);
4011
}
4012
}
4013
4014
#endif /* @#if (RTL8723B_SUPPORT == 1) || (RTL8821A_SUPPORT == 1) */
4015
4016
void odm_set_next_mac_addr_target(void *dm_void)
4017
{
4018
struct dm_struct *dm = (struct dm_struct *)dm_void;
4019
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
4020
struct cmn_sta_info *entry;
4021
u32 value32, i;
4022
4023
PHYDM_DBG(dm, DBG_ANT_DIV, "%s ==>\n", __func__);
4024
4025
if (dm->is_linked) {
4026
for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
4027
if ((fat_tab->train_idx + 1) == ODM_ASSOCIATE_ENTRY_NUM)
4028
fat_tab->train_idx = 0;
4029
else
4030
fat_tab->train_idx++;
4031
4032
entry = dm->phydm_sta_info[fat_tab->train_idx];
4033
4034
if (is_sta_active(entry)) {
4035
/*@Match MAC ADDR*/
4036
value32 = (entry->mac_addr[5] << 8) | entry->mac_addr[4];
4037
4038
odm_set_mac_reg(dm, R_0x7b4, 0xFFFF, value32); /*@0x7b4~0x7b5*/
4039
4040
value32 = (entry->mac_addr[3] << 24) | (entry->mac_addr[2] << 16) | (entry->mac_addr[1] << 8) | entry->mac_addr[0];
4041
4042
odm_set_mac_reg(dm, R_0x7b0, MASKDWORD, value32); /*@0x7b0~0x7b3*/
4043
4044
PHYDM_DBG(dm, DBG_ANT_DIV,
4045
"fat_tab->train_idx=%d\n",
4046
fat_tab->train_idx);
4047
4048
PHYDM_DBG(dm, DBG_ANT_DIV,
4049
"Training MAC addr = %x:%x:%x:%x:%x:%x\n",
4050
entry->mac_addr[5],
4051
entry->mac_addr[4],
4052
entry->mac_addr[3],
4053
entry->mac_addr[2],
4054
entry->mac_addr[1],
4055
entry->mac_addr[0]);
4056
4057
break;
4058
}
4059
}
4060
}
4061
}
4062
4063
#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
4064
4065
void odm_fast_ant_training(
4066
void *dm_void)
4067
{
4068
struct dm_struct *dm = (struct dm_struct *)dm_void;
4069
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
4070
4071
u32 max_rssi_path_a = 0, pckcnt_path_a = 0;
4072
u8 i, target_ant_path_a = 0;
4073
boolean is_pkt_filter_macth_path_a = false;
4074
#if (RTL8192E_SUPPORT == 1)
4075
u32 max_rssi_path_b = 0, pckcnt_path_b = 0;
4076
u8 target_ant_path_b = 0;
4077
boolean is_pkt_filter_macth_path_b = false;
4078
#endif
4079
4080
if (!dm->is_linked) { /* @is_linked==False */
4081
PHYDM_DBG(dm, DBG_ANT_DIV, "[No Link!!!]\n");
4082
4083
if (fat_tab->is_become_linked == true) {
4084
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);
4085
phydm_fast_training_enable(dm, FAT_OFF);
4086
odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
4087
fat_tab->is_become_linked = dm->is_linked;
4088
}
4089
return;
4090
} else {
4091
if (fat_tab->is_become_linked == false) {
4092
PHYDM_DBG(dm, DBG_ANT_DIV, "[Linked!!!]\n");
4093
fat_tab->is_become_linked = dm->is_linked;
4094
}
4095
}
4096
4097
if (!(*fat_tab->p_force_tx_by_desc)) {
4098
if (dm->is_one_entry_only == true)
4099
odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
4100
else
4101
odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);
4102
}
4103
4104
if (dm->support_ic_type == ODM_RTL8188E)
4105
odm_set_bb_reg(dm, R_0x864, BIT(2) | BIT(1) | BIT(0), ((dm->fat_comb_a) - 1));
4106
#if (RTL8192E_SUPPORT == 1)
4107
else if (dm->support_ic_type == ODM_RTL8192E) {
4108
odm_set_bb_reg(dm, R_0xb38, BIT(2) | BIT(1) | BIT(0), ((dm->fat_comb_a) - 1)); /* path-A */ /* ant combination=regB38[2:0]+1 */
4109
odm_set_bb_reg(dm, R_0xb38, BIT(18) | BIT(17) | BIT(16), ((dm->fat_comb_b) - 1)); /* path-B */ /* ant combination=regB38[18:16]+1 */
4110
}
4111
#endif
4112
4113
PHYDM_DBG(dm, DBG_ANT_DIV, "==>%s\n", __func__);
4114
4115
/* @1 TRAINING STATE */
4116
if (fat_tab->fat_state == FAT_TRAINING_STATE) {
4117
/* @2 Caculate RSSI per Antenna */
4118
4119
/* @3 [path-A]--------------------------- */
4120
for (i = 0; i < (dm->fat_comb_a); i++) { /* @i : antenna index */
4121
if (fat_tab->ant_rssi_cnt[i] == 0)
4122
fat_tab->ant_ave_rssi[i] = 0;
4123
else {
4124
fat_tab->ant_ave_rssi[i] = fat_tab->ant_sum_rssi[i] / fat_tab->ant_rssi_cnt[i];
4125
is_pkt_filter_macth_path_a = true;
4126
}
4127
4128
if (fat_tab->ant_ave_rssi[i] > max_rssi_path_a) {
4129
max_rssi_path_a = fat_tab->ant_ave_rssi[i];
4130
pckcnt_path_a = fat_tab->ant_rssi_cnt[i];
4131
target_ant_path_a = i;
4132
} else if (fat_tab->ant_ave_rssi[i] == max_rssi_path_a) {
4133
if (fat_tab->ant_rssi_cnt[i] > pckcnt_path_a) {
4134
max_rssi_path_a = fat_tab->ant_ave_rssi[i];
4135
pckcnt_path_a = fat_tab->ant_rssi_cnt[i];
4136
target_ant_path_a = i;
4137
}
4138
}
4139
4140
PHYDM_DBG(
4141
"*** ant-index : [ %d ], counter = (( %d )), Avg RSSI = (( %d ))\n",
4142
i, fat_tab->ant_rssi_cnt[i],
4143
fat_tab->ant_ave_rssi[i]);
4144
}
4145
4146
#if 0
4147
#if (RTL8192E_SUPPORT == 1)
4148
/* @3 [path-B]--------------------------- */
4149
for (i = 0; i < (dm->fat_comb_b); i++) {
4150
if (fat_tab->antRSSIcnt_pathB[i] == 0)
4151
fat_tab->antAveRSSI_pathB[i] = 0;
4152
else { /* @(ant_rssi_cnt[i] != 0) */
4153
fat_tab->antAveRSSI_pathB[i] = fat_tab->antSumRSSI_pathB[i] / fat_tab->antRSSIcnt_pathB[i];
4154
is_pkt_filter_macth_path_b = true;
4155
}
4156
if (fat_tab->antAveRSSI_pathB[i] > max_rssi_path_b) {
4157
max_rssi_path_b = fat_tab->antAveRSSI_pathB[i];
4158
pckcnt_path_b = fat_tab->antRSSIcnt_pathB[i];
4159
target_ant_path_b = (u8)i;
4160
}
4161
if (fat_tab->antAveRSSI_pathB[i] == max_rssi_path_b) {
4162
if (fat_tab->antRSSIcnt_pathB > pckcnt_path_b) {
4163
max_rssi_path_b = fat_tab->antAveRSSI_pathB[i];
4164
target_ant_path_b = (u8)i;
4165
}
4166
}
4167
if (dm->fat_print_rssi == 1) {
4168
PHYDM_DBG(dm, DBG_ANT_DIV,
4169
"***{path-B}: Sum RSSI[%d] = (( %d )), cnt RSSI [%d] = (( %d )), Avg RSSI[%d] = (( %d ))\n",
4170
i, fat_tab->antSumRSSI_pathB[i], i,
4171
fat_tab->antRSSIcnt_pathB[i], i,
4172
fat_tab->antAveRSSI_pathB[i]);
4173
}
4174
}
4175
#endif
4176
#endif
4177
4178
/* @1 DECISION STATE */
4179
4180
/* @2 Select TRX Antenna */
4181
4182
phydm_fast_training_enable(dm, FAT_OFF);
4183
4184
/* @3 [path-A]--------------------------- */
4185
if (is_pkt_filter_macth_path_a == false) {
4186
#if 0
4187
/* PHYDM_DBG(dm,DBG_ANT_DIV, "{path-A}: None Packet is matched\n"); */
4188
#endif
4189
PHYDM_DBG(dm, DBG_ANT_DIV,
4190
"{path-A}: None Packet is matched\n");
4191
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);
4192
} else {
4193
PHYDM_DBG(
4194
"target_ant_path_a = (( %d )) , max_rssi_path_a = (( %d ))\n",
4195
target_ant_path_a, max_rssi_path_a);
4196
4197
/* @3 [ update RX-optional ant ] Default RX is Omni, Optional RX is the best decision by FAT */
4198
if (dm->support_ic_type == ODM_RTL8188E)
4199
odm_set_bb_reg(dm, R_0x864, BIT(8) | BIT(7) | BIT(6), target_ant_path_a);
4200
else if (dm->support_ic_type == ODM_RTL8192E)
4201
odm_set_bb_reg(dm, R_0xb38, BIT(8) | BIT(7) | BIT(6), target_ant_path_a); /* Optional RX [pth-A] */
4202
4203
/* @3 [ update TX ant ] */
4204
odm_update_tx_ant(dm, target_ant_path_a, (fat_tab->train_idx));
4205
4206
if (target_ant_path_a == 0)
4207
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);
4208
}
4209
#if 0
4210
#if (RTL8192E_SUPPORT == 1)
4211
/* @3 [path-B]--------------------------- */
4212
if (is_pkt_filter_macth_path_b == false) {
4213
if (dm->fat_print_rssi == 1)
4214
PHYDM_DBG(dm, DBG_ANT_DIV,
4215
"***[%d]{path-B}: None Packet is matched\n\n\n",
4216
__LINE__);
4217
} else {
4218
if (dm->fat_print_rssi == 1) {
4219
PHYDM_DBG(dm, DBG_ANT_DIV,
4220
" ***target_ant_path_b = (( %d )) *** max_rssi = (( %d ))***\n\n\n",
4221
target_ant_path_b, max_rssi_path_b);
4222
}
4223
odm_set_bb_reg(dm, R_0xb38, BIT(21) | BIT20 | BIT19, target_ant_path_b); /* @Default RX is Omni, Optional RX is the best decision by FAT */
4224
odm_set_bb_reg(dm, R_0x80c, BIT(21), 1); /* Reg80c[21]=1'b1 //from TX Info */
4225
4226
fat_tab->antsel_pathB[fat_tab->train_idx] = target_ant_path_b;
4227
}
4228
#endif
4229
#endif
4230
4231
/* @2 Reset counter */
4232
for (i = 0; i < (dm->fat_comb_a); i++) {
4233
fat_tab->ant_sum_rssi[i] = 0;
4234
fat_tab->ant_rssi_cnt[i] = 0;
4235
}
4236
/*@
4237
#if (RTL8192E_SUPPORT == 1)
4238
for(i=0; i<=(dm->fat_comb_b); i++)
4239
{
4240
fat_tab->antSumRSSI_pathB[i] = 0;
4241
fat_tab->antRSSIcnt_pathB[i] = 0;
4242
}
4243
#endif
4244
*/
4245
4246
fat_tab->fat_state = FAT_PREPARE_STATE;
4247
return;
4248
}
4249
4250
/* @1 NORMAL STATE */
4251
if (fat_tab->fat_state == FAT_PREPARE_STATE) {
4252
PHYDM_DBG(dm, DBG_ANT_DIV, "[ Start Prepare state ]\n");
4253
4254
odm_set_next_mac_addr_target(dm);
4255
4256
/* @2 Prepare Training */
4257
fat_tab->fat_state = FAT_TRAINING_STATE;
4258
phydm_fast_training_enable(dm, FAT_ON);
4259
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);
4260
/* @enable HW AntDiv */
4261
PHYDM_DBG(dm, DBG_ANT_DIV, "[Start Training state]\n");
4262
4263
odm_set_timer(dm, &dm->fast_ant_training_timer, dm->antdiv_intvl); /* @ms */
4264
}
4265
}
4266
4267
void odm_fast_ant_training_callback(
4268
void *dm_void)
4269
{
4270
struct dm_struct *dm = (struct dm_struct *)dm_void;
4271
4272
#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
4273
if (*(dm->is_net_closed) == true)
4274
return;
4275
#endif
4276
4277
#if USE_WORKITEM
4278
odm_schedule_work_item(&dm->fast_ant_training_workitem);
4279
#else
4280
PHYDM_DBG(dm, DBG_ANT_DIV, "******%s******\n", __func__);
4281
odm_fast_ant_training(dm);
4282
#endif
4283
}
4284
4285
void odm_fast_ant_training_work_item_callback(
4286
void *dm_void)
4287
{
4288
struct dm_struct *dm = (struct dm_struct *)dm_void;
4289
4290
PHYDM_DBG(dm, DBG_ANT_DIV, "******%s******\n", __func__);
4291
odm_fast_ant_training(dm);
4292
}
4293
4294
#endif
4295
4296
void odm_ant_div_init(void *dm_void)
4297
{
4298
struct dm_struct *dm = (struct dm_struct *)dm_void;
4299
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
4300
struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;
4301
4302
if (!(dm->support_ability & ODM_BB_ANT_DIV)) {
4303
PHYDM_DBG(dm, DBG_ANT_DIV,
4304
"[Return!!!] Not Support Antenna Diversity Function\n");
4305
return;
4306
}
4307
/* @--- */
4308
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
4309
if (fat_tab->ant_div_2g_5g == ODM_ANTDIV_2G) {
4310
PHYDM_DBG(dm, DBG_ANT_DIV,
4311
"[2G AntDiv Init]: Only Support 2G Antenna Diversity Function\n");
4312
if (!(dm->support_ic_type & ODM_ANTDIV_2G_SUPPORT_IC))
4313
return;
4314
} else if (fat_tab->ant_div_2g_5g == ODM_ANTDIV_5G) {
4315
PHYDM_DBG(dm, DBG_ANT_DIV,
4316
"[5G AntDiv Init]: Only Support 5G Antenna Diversity Function\n");
4317
if (!(dm->support_ic_type & ODM_ANTDIV_5G_SUPPORT_IC))
4318
return;
4319
} else if (fat_tab->ant_div_2g_5g == (ODM_ANTDIV_2G | ODM_ANTDIV_5G))
4320
PHYDM_DBG(dm, DBG_ANT_DIV,
4321
"[2G & 5G AntDiv Init]:Support Both 2G & 5G Antenna Diversity Function\n");
4322
4323
#endif
4324
/* @--- */
4325
4326
/* @2 [--General---] */
4327
dm->antdiv_period = 0;
4328
4329
fat_tab->is_become_linked = false;
4330
fat_tab->ant_div_on_off = 0xff;
4331
4332
/* @3 - AP - */
4333
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
4334
4335
#ifdef PHYDM_BEAMFORMING_SUPPORT
4336
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
4337
odm_bdc_init(dm);
4338
#endif
4339
#endif
4340
4341
/* @3 - WIN - */
4342
#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)
4343
swat_tab->ant_5g = MAIN_ANT;
4344
swat_tab->ant_2g = MAIN_ANT;
4345
#endif
4346
4347
/* @2 [---Set MAIN_ANT as default antenna if Auto-ant enable---] */
4348
if (fat_tab->div_path_type == ANT_PATH_A)
4349
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);
4350
else if (fat_tab->div_path_type == ANT_PATH_B)
4351
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_B);
4352
else if (fat_tab->div_path_type == ANT_PATH_AB)
4353
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_AB);
4354
4355
dm->ant_type = ODM_AUTO_ANT;
4356
4357
fat_tab->rx_idle_ant = 0xff;
4358
/*to make RX-idle-antenna will be updated absolutly*/
4359
odm_update_rx_idle_ant(dm, MAIN_ANT);
4360
phydm_keep_rx_ack_ant_by_tx_ant_time(dm, 0);
4361
/* Timming issue: keep Rx ant after tx for ACK(5 x 3.2 mu = 16mu sec)*/
4362
4363
/* @2 [---Set TX Antenna---] */
4364
if (!fat_tab->p_force_tx_by_desc) {
4365
fat_tab->force_tx_by_desc = 0;
4366
fat_tab->p_force_tx_by_desc = &fat_tab->force_tx_by_desc;
4367
}
4368
PHYDM_DBG(dm, DBG_ANT_DIV, "p_force_tx_by_desc = %d\n",
4369
*fat_tab->p_force_tx_by_desc);
4370
4371
if (*fat_tab->p_force_tx_by_desc)
4372
odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);
4373
else
4374
odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
4375
4376
/* @2 [--88E---] */
4377
if (dm->support_ic_type == ODM_RTL8188E) {
4378
#if (RTL8188E_SUPPORT == 1)
4379
/* @dm->ant_div_type = CGCS_RX_HW_ANTDIV; */
4380
/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */
4381
/* @dm->ant_div_type = CG_TRX_SMART_ANTDIV; */
4382
4383
if (dm->ant_div_type != CGCS_RX_HW_ANTDIV &&
4384
dm->ant_div_type != CG_TRX_HW_ANTDIV &&
4385
dm->ant_div_type != CG_TRX_SMART_ANTDIV) {
4386
PHYDM_DBG(dm, DBG_ANT_DIV,
4387
"[Return!!!] 88E Not Supprrt This AntDiv type\n");
4388
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4389
return;
4390
}
4391
4392
if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)
4393
odm_rx_hw_ant_div_init_88e(dm);
4394
else if (dm->ant_div_type == CG_TRX_HW_ANTDIV)
4395
odm_trx_hw_ant_div_init_88e(dm);
4396
#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
4397
else if (dm->ant_div_type == CG_TRX_SMART_ANTDIV)
4398
odm_smart_hw_ant_div_init_88e(dm);
4399
#endif
4400
#endif
4401
}
4402
4403
/* @2 [--92E---] */
4404
#if (RTL8192E_SUPPORT == 1)
4405
else if (dm->support_ic_type == ODM_RTL8192E) {
4406
/* @dm->ant_div_type = CGCS_RX_HW_ANTDIV; */
4407
/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */
4408
/* @dm->ant_div_type = CG_TRX_SMART_ANTDIV; */
4409
4410
if (dm->ant_div_type != CGCS_RX_HW_ANTDIV &&
4411
dm->ant_div_type != CG_TRX_HW_ANTDIV &&
4412
dm->ant_div_type != CG_TRX_SMART_ANTDIV) {
4413
PHYDM_DBG(dm, DBG_ANT_DIV,
4414
"[Return!!!] 8192E Not Supprrt This AntDiv type\n");
4415
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4416
return;
4417
}
4418
4419
if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)
4420
odm_rx_hw_ant_div_init_92e(dm);
4421
else if (dm->ant_div_type == CG_TRX_HW_ANTDIV)
4422
odm_trx_hw_ant_div_init_92e(dm);
4423
#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
4424
else if (dm->ant_div_type == CG_TRX_SMART_ANTDIV)
4425
odm_smart_hw_ant_div_init_92e(dm);
4426
#endif
4427
}
4428
#endif
4429
4430
/* @2 [--92F---] */
4431
#if (RTL8192F_SUPPORT == 1)
4432
else if (dm->support_ic_type == ODM_RTL8192F) {
4433
/* @dm->ant_div_type = CGCS_RX_HW_ANTDIV; */
4434
/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */
4435
/* @dm->ant_div_type = CG_TRX_SMART_ANTDIV; */
4436
4437
if (dm->ant_div_type != CGCS_RX_HW_ANTDIV) {
4438
if (dm->ant_div_type != CG_TRX_HW_ANTDIV) {
4439
PHYDM_DBG(dm, DBG_ANT_DIV,
4440
"[Return!!!] 8192F Not Supprrt This AntDiv type\n");
4441
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4442
return;
4443
}
4444
}
4445
if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)
4446
odm_rx_hw_ant_div_init_92f(dm);
4447
else if (dm->ant_div_type == CG_TRX_HW_ANTDIV)
4448
odm_trx_hw_ant_div_init_92f(dm);
4449
}
4450
#endif
4451
4452
#if (RTL8197F_SUPPORT == 1)
4453
else if (dm->support_ic_type == ODM_RTL8197F) {
4454
dm->ant_div_type = CGCS_RX_HW_ANTDIV;
4455
4456
if (dm->ant_div_type != CGCS_RX_HW_ANTDIV) {
4457
PHYDM_DBG(dm, DBG_ANT_DIV,
4458
"[Return!!!] 8197F Not Supprrt This AntDiv type\n");
4459
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4460
return;
4461
}
4462
phydm_rx_hw_ant_div_init_97f(dm);
4463
}
4464
#endif
4465
/* @2 [--8723B---] */
4466
#if (RTL8723B_SUPPORT == 1)
4467
else if (dm->support_ic_type == ODM_RTL8723B) {
4468
dm->ant_div_type = S0S1_SW_ANTDIV;
4469
/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */
4470
4471
if (dm->ant_div_type != S0S1_SW_ANTDIV &&
4472
dm->ant_div_type != CG_TRX_HW_ANTDIV) {
4473
PHYDM_DBG(dm, DBG_ANT_DIV,
4474
"[Return!!!] 8723B Not Supprrt This AntDiv type\n");
4475
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4476
return;
4477
}
4478
4479
if (dm->ant_div_type == S0S1_SW_ANTDIV)
4480
odm_s0s1_sw_ant_div_init_8723b(dm);
4481
else if (dm->ant_div_type == CG_TRX_HW_ANTDIV)
4482
odm_trx_hw_ant_div_init_8723b(dm);
4483
}
4484
#endif
4485
/*@2 [--8723D---]*/
4486
#if (RTL8723D_SUPPORT == 1)
4487
else if (dm->support_ic_type == ODM_RTL8723D) {
4488
if (fat_tab->p_default_s0_s1 == NULL) {
4489
fat_tab->default_s0_s1 = 1;
4490
fat_tab->p_default_s0_s1 = &fat_tab->default_s0_s1;
4491
}
4492
PHYDM_DBG(dm, DBG_ANT_DIV, "default_s0_s1 = %d\n",
4493
*fat_tab->p_default_s0_s1);
4494
4495
if (*fat_tab->p_default_s0_s1 == true)
4496
odm_update_rx_idle_ant(dm, MAIN_ANT);
4497
else
4498
odm_update_rx_idle_ant(dm, AUX_ANT);
4499
4500
if (dm->ant_div_type == S0S1_TRX_HW_ANTDIV)
4501
odm_trx_hw_ant_div_init_8723d(dm);
4502
else if (dm->ant_div_type == S0S1_SW_ANTDIV)
4503
odm_s0s1_sw_ant_div_init_8723d(dm);
4504
else {
4505
PHYDM_DBG(dm, DBG_ANT_DIV,
4506
"[Return!!!] 8723D Not Supprrt This AntDiv type\n");
4507
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4508
return;
4509
}
4510
}
4511
#endif
4512
#if (RTL8721D_SUPPORT == 1)
4513
else if (dm->support_ic_type == ODM_RTL8721D) {
4514
/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */
4515
4516
if (dm->ant_div_type != CG_TRX_HW_ANTDIV) {
4517
PHYDM_DBG(dm, DBG_ANT_DIV,
4518
"[Return!!!] 8721D Not Supprrt This AntDiv type\n");
4519
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4520
return;
4521
}
4522
if (dm->ant_div_type == CG_TRX_HW_ANTDIV)
4523
odm_trx_hw_ant_div_init_8721d(dm);
4524
}
4525
#endif
4526
/* @2 [--8811A 8821A---] */
4527
#if (RTL8821A_SUPPORT == 1)
4528
else if (dm->support_ic_type == ODM_RTL8821) {
4529
#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1
4530
dm->ant_div_type = HL_SW_SMART_ANT_TYPE1;
4531
4532
if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE1) {
4533
odm_trx_hw_ant_div_init_8821a(dm);
4534
phydm_hl_smart_ant_type1_init_8821a(dm);
4535
} else
4536
#endif
4537
{
4538
#ifdef ODM_CONFIG_BT_COEXIST
4539
dm->ant_div_type = S0S1_SW_ANTDIV;
4540
#else
4541
dm->ant_div_type = CG_TRX_HW_ANTDIV;
4542
#endif
4543
4544
if (dm->ant_div_type != CG_TRX_HW_ANTDIV &&
4545
dm->ant_div_type != S0S1_SW_ANTDIV) {
4546
PHYDM_DBG(dm, DBG_ANT_DIV,
4547
"[Return!!!] 8821A & 8811A Not Supprrt This AntDiv type\n");
4548
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4549
return;
4550
}
4551
if (dm->ant_div_type == CG_TRX_HW_ANTDIV)
4552
odm_trx_hw_ant_div_init_8821a(dm);
4553
else if (dm->ant_div_type == S0S1_SW_ANTDIV)
4554
odm_s0s1_sw_ant_div_init_8821a(dm);
4555
}
4556
}
4557
#endif
4558
4559
/* @2 [--8821C---] */
4560
#if (RTL8821C_SUPPORT == 1)
4561
else if (dm->support_ic_type == ODM_RTL8821C) {
4562
dm->ant_div_type = S0S1_SW_ANTDIV;
4563
if (dm->ant_div_type != S0S1_SW_ANTDIV) {
4564
PHYDM_DBG(dm, DBG_ANT_DIV,
4565
"[Return!!!] 8821C Not Supprrt This AntDiv type\n");
4566
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4567
return;
4568
}
4569
phydm_s0s1_sw_ant_div_init_8821c(dm);
4570
odm_trx_hw_ant_div_init_8821c(dm);
4571
}
4572
#endif
4573
4574
/* @2 [--8881A---] */
4575
#if (RTL8881A_SUPPORT == 1)
4576
else if (dm->support_ic_type == ODM_RTL8881A) {
4577
/* @dm->ant_div_type = CGCS_RX_HW_ANTDIV; */
4578
/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */
4579
4580
if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {
4581
odm_trx_hw_ant_div_init_8881a(dm);
4582
} else {
4583
PHYDM_DBG(dm, DBG_ANT_DIV,
4584
"[Return!!!] 8881A Not Supprrt This AntDiv type\n");
4585
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4586
return;
4587
}
4588
4589
odm_trx_hw_ant_div_init_8881a(dm);
4590
}
4591
#endif
4592
4593
/* @2 [--8812---] */
4594
#if (RTL8812A_SUPPORT == 1)
4595
else if (dm->support_ic_type == ODM_RTL8812) {
4596
/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */
4597
4598
if (dm->ant_div_type != CG_TRX_HW_ANTDIV) {
4599
PHYDM_DBG(dm, DBG_ANT_DIV,
4600
"[Return!!!] 8812A Not Supprrt This AntDiv type\n");
4601
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4602
return;
4603
}
4604
odm_trx_hw_ant_div_init_8812a(dm);
4605
}
4606
#endif
4607
4608
/*@[--8188F---]*/
4609
#if (RTL8188F_SUPPORT == 1)
4610
else if (dm->support_ic_type == ODM_RTL8188F) {
4611
dm->ant_div_type = S0S1_SW_ANTDIV;
4612
odm_s0s1_sw_ant_div_init_8188f(dm);
4613
}
4614
#endif
4615
4616
/*@[--8822B---]*/
4617
#if (RTL8822B_SUPPORT == 1)
4618
else if (dm->support_ic_type == ODM_RTL8822B) {
4619
dm->ant_div_type = CG_TRX_HW_ANTDIV;
4620
4621
if (dm->ant_div_type != CG_TRX_HW_ANTDIV) {
4622
PHYDM_DBG(dm, DBG_ANT_DIV,
4623
"[Return!!!] 8822B Not Supprrt This AntDiv type\n");
4624
dm->support_ability &= ~(ODM_BB_ANT_DIV);
4625
return;
4626
}
4627
phydm_trx_hw_ant_div_init_22b(dm);
4628
#ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
4629
dm->ant_div_type = HL_SW_SMART_ANT_TYPE2;
4630
4631
if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE2)
4632
phydm_hl_smart_ant_type2_init_8822b(dm);
4633
#endif
4634
}
4635
#endif
4636
4637
/*@PHYDM_DBG(dm, DBG_ANT_DIV, "*** support_ic_type=[%lu]\n",*/
4638
/*dm->support_ic_type);*/
4639
/*PHYDM_DBG(dm, DBG_ANT_DIV, "*** AntDiv support_ability=[%lu]\n",*/
4640
/* (dm->support_ability & ODM_BB_ANT_DIV)>>6);*/
4641
/*PHYDM_DBG(dm, DBG_ANT_DIV, "*** AntDiv type=[%d]\n",dm->ant_div_type);*/
4642
}
4643
4644
void odm_ant_div(void *dm_void)
4645
{
4646
struct dm_struct *dm = (struct dm_struct *)dm_void;
4647
void *adapter = dm->adapter;
4648
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
4649
#if (defined(CONFIG_HL_SMART_ANTENNA))
4650
struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
4651
#endif
4652
4653
#ifdef ODM_EVM_ENHANCE_ANTDIV
4654
if (dm->is_linked) {
4655
PHYDM_DBG(dm, DBG_ANT_DIV,
4656
"tp_active_occur=((%d)), evm_method_enable=((%d))\n",
4657
dm->tp_active_occur, fat_tab->evm_method_enable);
4658
4659
if (dm->tp_active_occur == 1 &&
4660
fat_tab->evm_method_enable == 1) {
4661
fat_tab->idx_ant_div_counter_5g = dm->antdiv_period;
4662
fat_tab->idx_ant_div_counter_2g = dm->antdiv_period;
4663
}
4664
}
4665
#endif
4666
4667
if (*dm->band_type == ODM_BAND_5G) {
4668
if (fat_tab->idx_ant_div_counter_5g < dm->antdiv_period) {
4669
fat_tab->idx_ant_div_counter_5g++;
4670
return;
4671
} else
4672
fat_tab->idx_ant_div_counter_5g = 0;
4673
} else if (*dm->band_type == ODM_BAND_2_4G) {
4674
if (fat_tab->idx_ant_div_counter_2g < dm->antdiv_period) {
4675
fat_tab->idx_ant_div_counter_2g++;
4676
return;
4677
} else
4678
fat_tab->idx_ant_div_counter_2g = 0;
4679
}
4680
4681
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN || DM_ODM_SUPPORT_TYPE == ODM_CE)
4682
4683
if (fat_tab->enable_ctrl_frame_antdiv) {
4684
if (dm->data_frame_num <= 10 && dm->is_linked)
4685
fat_tab->use_ctrl_frame_antdiv = 1;
4686
else
4687
fat_tab->use_ctrl_frame_antdiv = 0;
4688
4689
PHYDM_DBG(dm, DBG_ANT_DIV,
4690
"use_ctrl_frame_antdiv = (( %d )), data_frame_num = (( %d ))\n",
4691
fat_tab->use_ctrl_frame_antdiv, dm->data_frame_num);
4692
dm->data_frame_num = 0;
4693
}
4694
4695
{
4696
#ifdef PHYDM_BEAMFORMING_SUPPORT
4697
4698
enum beamforming_cap beamform_cap = phydm_get_beamform_cap(dm);
4699
PHYDM_DBG(dm, DBG_ANT_DIV, "is_bt_continuous_turn = ((%d))\n",
4700
dm->is_bt_continuous_turn);
4701
PHYDM_DBG(dm, DBG_ANT_DIV,
4702
"[ AntDiv Beam Cap ] cap= ((%d))\n", beamform_cap);
4703
if (!dm->is_bt_continuous_turn) {
4704
if ((beamform_cap & BEAMFORMEE_CAP) &&
4705
(!(*fat_tab->is_no_csi_feedback))) {
4706
/* @BFmee On && Div On->Div Off */
4707
PHYDM_DBG(dm, DBG_ANT_DIV,
4708
"[ AntDiv : OFF ] BFmee ==1; cap= ((%d))\n",
4709
beamform_cap);
4710
PHYDM_DBG(dm, DBG_ANT_DIV,
4711
"[ AntDiv BF] is_no_csi_feedback= ((%d))\n",
4712
*(fat_tab->is_no_csi_feedback));
4713
if (fat_tab->fix_ant_bfee == 0) {
4714
odm_ant_div_on_off(dm, ANTDIV_OFF,
4715
ANT_PATH_A);
4716
fat_tab->fix_ant_bfee = 1;
4717
}
4718
return;
4719
} else { /* @BFmee Off && Div Off->Div On */
4720
if (fat_tab->fix_ant_bfee == 1 &&
4721
dm->is_linked) {
4722
PHYDM_DBG(dm, DBG_ANT_DIV,
4723
"[ AntDiv : ON ] BFmee ==0; cap=((%d))\n",
4724
beamform_cap);
4725
PHYDM_DBG(dm, DBG_ANT_DIV,
4726
"[ AntDiv BF] is_no_csi_feedback= ((%d))\n",
4727
*fat_tab->is_no_csi_feedback);
4728
if (dm->ant_div_type != S0S1_SW_ANTDIV)
4729
odm_ant_div_on_off(dm, ANTDIV_ON
4730
, ANT_PATH_A)
4731
;
4732
fat_tab->fix_ant_bfee = 0;
4733
}
4734
}
4735
} else {
4736
if (fat_tab->div_path_type == ANT_PATH_A)
4737
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);
4738
else if (fat_tab->div_path_type == ANT_PATH_B)
4739
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_B);
4740
else if (fat_tab->div_path_type == ANT_PATH_AB)
4741
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_AB);
4742
}
4743
#endif
4744
}
4745
#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
4746
/* @----------just for fool proof */
4747
4748
if (dm->antdiv_rssi)
4749
dm->debug_components |= DBG_ANT_DIV;
4750
else
4751
dm->debug_components &= ~DBG_ANT_DIV;
4752
4753
if (fat_tab->ant_div_2g_5g == ODM_ANTDIV_2G) {
4754
if (!(dm->support_ic_type & ODM_ANTDIV_2G_SUPPORT_IC))
4755
return;
4756
} else if (fat_tab->ant_div_2g_5g == ODM_ANTDIV_5G) {
4757
if (!(dm->support_ic_type & ODM_ANTDIV_5G_SUPPORT_IC))
4758
return;
4759
}
4760
#endif
4761
4762
/* @---------- */
4763
4764
if (dm->antdiv_select == 1)
4765
dm->ant_type = ODM_FIX_MAIN_ANT;
4766
else if (dm->antdiv_select == 2)
4767
dm->ant_type = ODM_FIX_AUX_ANT;
4768
else { /* @if (dm->antdiv_select==0) */
4769
dm->ant_type = ODM_AUTO_ANT;
4770
4771
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
4772
/*Stop Antenna diversity for CMW500 testing case*/
4773
if (dm->consecutive_idlel_time >= 10) {
4774
dm->ant_type = ODM_FIX_MAIN_ANT;
4775
PHYDM_DBG(dm, DBG_ANT_DIV,
4776
"[AntDiv: OFF] No TP case, consecutive_idlel_time=((%d))\n",
4777
dm->consecutive_idlel_time);
4778
}
4779
#endif
4780
}
4781
4782
/*PHYDM_DBG(dm, DBG_ANT_DIV,"ant_type= (%d), pre_ant_type= (%d)\n",*/
4783
/*dm->ant_type,dm->pre_ant_type); */
4784
4785
if (dm->ant_type != ODM_AUTO_ANT) {
4786
PHYDM_DBG(dm, DBG_ANT_DIV, "Fix Antenna at (( %s ))\n",
4787
(dm->ant_type == ODM_FIX_MAIN_ANT) ? "MAIN" : "AUX");
4788
4789
if (dm->ant_type != dm->pre_ant_type) {
4790
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);
4791
odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
4792
4793
if (dm->ant_type == ODM_FIX_MAIN_ANT)
4794
odm_update_rx_idle_ant(dm, MAIN_ANT);
4795
else if (dm->ant_type == ODM_FIX_AUX_ANT)
4796
odm_update_rx_idle_ant(dm, AUX_ANT);
4797
}
4798
dm->pre_ant_type = dm->ant_type;
4799
return;
4800
} else {
4801
if (dm->ant_type != dm->pre_ant_type) {
4802
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);
4803
odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);
4804
}
4805
dm->pre_ant_type = dm->ant_type;
4806
}
4807
#if (defined(CONFIG_2T4R_ANTENNA))
4808
if (dm->ant_type2 != ODM_AUTO_ANT) {
4809
PHYDM_DBG(dm, DBG_ANT_DIV, "PathB Fix Ant at (( %s ))\n",
4810
(dm->ant_type2 == ODM_FIX_MAIN_ANT) ? "MAIN" : "AUX");
4811
4812
if (dm->ant_type2 != dm->pre_ant_type2) {
4813
odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_B);
4814
odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);
4815
4816
if (dm->ant_type2 == ODM_FIX_MAIN_ANT)
4817
phydm_update_rx_idle_ant_pathb(dm, MAIN_ANT);
4818
else if (dm->ant_type2 == ODM_FIX_AUX_ANT)
4819
phydm_update_rx_idle_ant_pathb(dm, AUX_ANT);
4820
}
4821
dm->pre_ant_type2 = dm->ant_type2;
4822
return;
4823
}
4824
if (dm->ant_type2 != dm->pre_ant_type2) {
4825
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_B);
4826
odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);
4827
}
4828
dm->pre_ant_type2 = dm->ant_type2;
4829
4830
#endif
4831
4832
/*@ ----------------------------------------------- */
4833
/*@ [--8188E--] */
4834
if (dm->support_ic_type == ODM_RTL8188E) {
4835
#if (RTL8188E_SUPPORT == 1)
4836
if (dm->ant_div_type == CG_TRX_HW_ANTDIV ||
4837
dm->ant_div_type == CGCS_RX_HW_ANTDIV)
4838
odm_hw_ant_div(dm);
4839
4840
#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) ||\
4841
(defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
4842
else if (dm->ant_div_type == CG_TRX_SMART_ANTDIV)
4843
odm_fast_ant_training(dm);
4844
#endif
4845
4846
#endif
4847
}
4848
/*@ [--8192E--] */
4849
#if (RTL8192E_SUPPORT == 1)
4850
else if (dm->support_ic_type == ODM_RTL8192E) {
4851
if (dm->ant_div_type == CGCS_RX_HW_ANTDIV ||
4852
dm->ant_div_type == CG_TRX_HW_ANTDIV)
4853
odm_hw_ant_div(dm);
4854
4855
#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) ||\
4856
(defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
4857
else if (dm->ant_div_type == CG_TRX_SMART_ANTDIV)
4858
odm_fast_ant_training(dm);
4859
#endif
4860
}
4861
#endif
4862
/*@ [--8197F--] */
4863
#if (RTL8197F_SUPPORT == 1)
4864
else if (dm->support_ic_type == ODM_RTL8197F) {
4865
if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)
4866
odm_hw_ant_div(dm);
4867
}
4868
#endif
4869
4870
#if (RTL8723B_SUPPORT == 1)
4871
/*@ [--8723B---] */
4872
else if (dm->support_ic_type == ODM_RTL8723B) {
4873
if (phydm_is_bt_enable_8723b(dm)) {
4874
PHYDM_DBG(dm, DBG_ANT_DIV, "[BT is enable!!!]\n");
4875
if (fat_tab->is_become_linked == true) {
4876
PHYDM_DBG(dm, DBG_ANT_DIV,
4877
"Set REG 948[9:6]=0x0\n");
4878
if (dm->support_ic_type == ODM_RTL8723B)
4879
odm_set_bb_reg(dm, R_0x948, 0x3c0, 0x0)
4880
;
4881
4882
fat_tab->is_become_linked = false;
4883
}
4884
} else {
4885
if (dm->ant_div_type == S0S1_SW_ANTDIV) {
4886
#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
4887
odm_s0s1_sw_ant_div(dm, SWAW_STEP_PEEK);
4888
#endif
4889
} else if (dm->ant_div_type == CG_TRX_HW_ANTDIV)
4890
odm_hw_ant_div(dm);
4891
}
4892
}
4893
#endif
4894
/*@ [--8723D--]*/
4895
#if (RTL8723D_SUPPORT == 1)
4896
else if (dm->support_ic_type == ODM_RTL8723D) {
4897
if (dm->ant_div_type == S0S1_SW_ANTDIV) {
4898
#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
4899
if (dm->antdiv_counter == CONFIG_ANTDIV_PERIOD) {
4900
odm_s0s1_sw_ant_div(dm, SWAW_STEP_PEEK);
4901
dm->antdiv_counter--;
4902
} else {
4903
dm->antdiv_counter--;
4904
}
4905
if (dm->antdiv_counter == 0)
4906
dm->antdiv_counter = CONFIG_ANTDIV_PERIOD;
4907
#endif
4908
} else if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {
4909
odm_hw_ant_div(dm);
4910
}
4911
}
4912
#endif
4913
#if (RTL8721D_SUPPORT == 1)
4914
else if (dm->support_ic_type == ODM_RTL8721D) {
4915
if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {
4916
odm_hw_ant_div(dm);
4917
}
4918
}
4919
#endif
4920
/*@ [--8821A--] */
4921
#if (RTL8821A_SUPPORT == 1)
4922
else if (dm->support_ic_type == ODM_RTL8821) {
4923
#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1
4924
if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE1) {
4925
if (sat_tab->fix_beam_pattern_en != 0) {
4926
PHYDM_DBG(dm, DBG_ANT_DIV,
4927
" [ SmartAnt ] Fix SmartAnt Pattern = 0x%x\n",
4928
sat_tab->fix_beam_pattern_codeword);
4929
/*return;*/
4930
} else {
4931
odm_fast_ant_training_hl_smart_antenna_type1(dm);
4932
}
4933
4934
} else
4935
#endif
4936
{
4937
#ifdef ODM_CONFIG_BT_COEXIST
4938
if (!dm->bt_info_table.is_bt_enabled) { /*@BT disabled*/
4939
if (dm->ant_div_type == S0S1_SW_ANTDIV) {
4940
dm->ant_div_type = CG_TRX_HW_ANTDIV;
4941
PHYDM_DBG(dm, DBG_ANT_DIV,
4942
" [S0S1_SW_ANTDIV] -> [CG_TRX_HW_ANTDIV]\n");
4943
/*odm_set_bb_reg(dm, 0x8d4, BIT24, 1);*/
4944
if (fat_tab->is_become_linked == true)
4945
odm_ant_div_on_off(dm,
4946
ANTDIV_ON,
4947
ANT_PATH_A);
4948
}
4949
4950
} else { /*@BT enabled*/
4951
4952
if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {
4953
dm->ant_div_type = S0S1_SW_ANTDIV;
4954
PHYDM_DBG(dm, DBG_ANT_DIV,
4955
" [CG_TRX_HW_ANTDIV] -> [S0S1_SW_ANTDIV]\n");
4956
/*odm_set_bb_reg(dm, 0x8d4, BIT24, 0);*/
4957
odm_ant_div_on_off(dm, ANTDIV_OFF,
4958
ANT_PATH_A);
4959
}
4960
}
4961
#endif
4962
4963
if (dm->ant_div_type == S0S1_SW_ANTDIV) {
4964
#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
4965
odm_s0s1_sw_ant_div(dm, SWAW_STEP_PEEK);
4966
#endif
4967
} else if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {
4968
odm_hw_ant_div(dm);
4969
}
4970
}
4971
}
4972
#endif
4973
4974
/*@ [--8821C--] */
4975
#if (RTL8821C_SUPPORT == 1)
4976
else if (dm->support_ic_type == ODM_RTL8821C) {
4977
if (!dm->is_bt_continuous_turn) {
4978
dm->ant_div_type = S0S1_SW_ANTDIV;
4979
PHYDM_DBG(dm, DBG_ANT_DIV,
4980
"is_bt_continuous_turn = ((%d)) ==> SW AntDiv\n",
4981
dm->is_bt_continuous_turn);
4982
4983
} else {
4984
dm->ant_div_type = CG_TRX_HW_ANTDIV;
4985
PHYDM_DBG(dm, DBG_ANT_DIV,
4986
"is_bt_continuous_turn = ((%d)) ==> HW AntDiv\n",
4987
dm->is_bt_continuous_turn);
4988
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);
4989
}
4990
4991
if (fat_tab->force_antdiv_type)
4992
dm->ant_div_type = fat_tab->antdiv_type_dbg;
4993
4994
if (dm->ant_div_type == S0S1_SW_ANTDIV) {
4995
#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
4996
odm_s0s1_sw_ant_div(dm, SWAW_STEP_PEEK);
4997
#endif
4998
} else if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {
4999
odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);
5000
odm_hw_ant_div(dm);
5001
}
5002
}
5003
#endif
5004
5005
/* @ [--8881A--] */
5006
#if (RTL8881A_SUPPORT == 1)
5007
else if (dm->support_ic_type == ODM_RTL8881A)
5008
odm_hw_ant_div(dm);
5009
#endif
5010
5011
/*@ [--8812A--] */
5012
#if (RTL8812A_SUPPORT == 1)
5013
else if (dm->support_ic_type == ODM_RTL8812)
5014
odm_hw_ant_div(dm);
5015
#endif
5016
5017
#if (RTL8188F_SUPPORT == 1)
5018
/*@ [--8188F--]*/
5019
else if (dm->support_ic_type == ODM_RTL8188F) {
5020
#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
5021
odm_s0s1_sw_ant_div(dm, SWAW_STEP_PEEK);
5022
#endif
5023
}
5024
#endif
5025
5026
/*@ [--8822B--]*/
5027
#if (RTL8822B_SUPPORT == 1)
5028
else if (dm->support_ic_type == ODM_RTL8822B) {
5029
if (dm->ant_div_type == CG_TRX_HW_ANTDIV)
5030
odm_hw_ant_div(dm);
5031
#ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
5032
if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE2) {
5033
if (sat_tab->fix_beam_pattern_en != 0)
5034
PHYDM_DBG(dm, DBG_ANT_DIV,
5035
" [ SmartAnt ] Fix SmartAnt Pattern = 0x%x\n",
5036
sat_tab->fix_beam_pattern_codeword);
5037
else
5038
phydm_fast_ant_training_hl_smart_antenna_type2(dm);
5039
}
5040
#endif
5041
}
5042
#endif
5043
}
5044
5045
void odm_antsel_statistics(void *dm_void, void *phy_info_void,
5046
u8 antsel_tr_mux, u32 mac_id, u32 utility, u8 method,
5047
u8 is_cck_rate)
5048
{
5049
struct dm_struct *dm = (struct dm_struct *)dm_void;
5050
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
5051
struct phydm_phyinfo_struct *phy_info = NULL;
5052
5053
phy_info = (struct phydm_phyinfo_struct *)phy_info_void;
5054
5055
if (method == RSSI_METHOD) {
5056
if (is_cck_rate) {
5057
if (antsel_tr_mux == ANT1_2G) {
5058
/*to prevent u16 overflow, max(RSSI)=100, 65435+100 = 65535 (u16)*/
5059
if (fat_tab->main_sum_cck[mac_id] > 65435)
5060
return;
5061
5062
fat_tab->main_sum_cck[mac_id] += (u16)utility;
5063
fat_tab->main_cnt_cck[mac_id]++;
5064
} else {
5065
if (fat_tab->aux_sum_cck[mac_id] > 65435)
5066
return;
5067
5068
fat_tab->aux_sum_cck[mac_id] += (u16)utility;
5069
fat_tab->aux_cnt_cck[mac_id]++;
5070
}
5071
5072
} else { /*ofdm rate*/
5073
5074
if (antsel_tr_mux == ANT1_2G) {
5075
if (fat_tab->main_sum[mac_id] > 65435)
5076
return;
5077
5078
fat_tab->main_sum[mac_id] += (u16)utility;
5079
fat_tab->main_cnt[mac_id]++;
5080
} else {
5081
if (fat_tab->aux_sum[mac_id] > 65435)
5082
return;
5083
5084
fat_tab->aux_sum[mac_id] += (u16)utility;
5085
fat_tab->aux_cnt[mac_id]++;
5086
}
5087
}
5088
}
5089
#ifdef ODM_EVM_ENHANCE_ANTDIV
5090
else if (method == EVM_METHOD) {
5091
if (!fat_tab->get_stats)
5092
return;
5093
5094
if (dm->rate_ss == 1) {
5095
phydm_statistics_evm_1ss(dm, phy_info, antsel_tr_mux,
5096
mac_id, utility);
5097
} else { /*@>= 2SS*/
5098
phydm_statistics_evm_2ss(dm, phy_info, antsel_tr_mux,
5099
mac_id, utility);
5100
}
5101
5102
} else if (method == CRC32_METHOD) {
5103
if (antsel_tr_mux == ANT1_2G) {
5104
fat_tab->main_crc32_ok_cnt += utility;
5105
fat_tab->main_crc32_fail_cnt++;
5106
} else {
5107
fat_tab->aux_crc32_ok_cnt += utility;
5108
fat_tab->aux_crc32_fail_cnt++;
5109
}
5110
5111
} else if (method == TP_METHOD) {
5112
if (!fat_tab->get_stats)
5113
return;
5114
if (utility <= ODM_RATEMCS15 && utility >= ODM_RATEMCS0) {
5115
if (antsel_tr_mux == ANT1_2G) {
5116
fat_tab->main_tp += (phy_rate_table[utility])
5117
<< 5;
5118
fat_tab->main_tp_cnt++;
5119
} else {
5120
fat_tab->aux_tp += (phy_rate_table[utility])
5121
<< 5;
5122
fat_tab->aux_tp_cnt++;
5123
}
5124
}
5125
}
5126
#endif
5127
}
5128
5129
void odm_process_rssi_smart(void *dm_void, void *phy_info_void,
5130
void *pkt_info_void, u8 rx_power_ant0)
5131
{
5132
struct dm_struct *dm = (struct dm_struct *)dm_void;
5133
struct phydm_phyinfo_struct *phy_info = NULL;
5134
struct phydm_perpkt_info_struct *pktinfo = NULL;
5135
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
5136
5137
phy_info = (struct phydm_phyinfo_struct *)phy_info_void;
5138
pktinfo = (struct phydm_perpkt_info_struct *)pkt_info_void;
5139
5140
if ((dm->support_ic_type & ODM_SMART_ANT_SUPPORT) &&
5141
pktinfo->is_packet_to_self &&
5142
fat_tab->fat_state == FAT_TRAINING_STATE) {
5143
/* @(pktinfo->is_packet_match_bssid && (!pktinfo->is_packet_beacon)) */
5144
u8 antsel_tr_mux;
5145
5146
antsel_tr_mux = (fat_tab->antsel_rx_keep_2 << 2) |
5147
(fat_tab->antsel_rx_keep_1 << 1) |
5148
fat_tab->antsel_rx_keep_0;
5149
fat_tab->ant_sum_rssi[antsel_tr_mux] += rx_power_ant0;
5150
fat_tab->ant_rssi_cnt[antsel_tr_mux]++;
5151
}
5152
}
5153
5154
void odm_process_rssi_normal(void *dm_void, void *phy_info_void,
5155
void *pkt_info_void, u8 rx_pwr0)
5156
{
5157
struct dm_struct *dm = (struct dm_struct *)dm_void;
5158
struct phydm_phyinfo_struct *phy_info = NULL;
5159
struct phydm_perpkt_info_struct *pktinfo = NULL;
5160
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
5161
u8 rx_evm0, rx_evm1;
5162
boolean b_main;
5163
5164
phy_info = (struct phydm_phyinfo_struct *)phy_info_void;
5165
pktinfo = (struct phydm_perpkt_info_struct *)pkt_info_void;
5166
rx_evm0 = phy_info->rx_mimo_signal_quality[0];
5167
rx_evm1 = phy_info->rx_mimo_signal_quality[1];
5168
5169
if (!(pktinfo->is_packet_to_self || fat_tab->use_ctrl_frame_antdiv))
5170
return;
5171
5172
if (dm->ant_div_type == S0S1_SW_ANTDIV) {
5173
if (pktinfo->is_cck_rate ||
5174
dm->support_ic_type == ODM_RTL8188F) {
5175
5176
b_main = (fat_tab->rx_idle_ant == MAIN_ANT);
5177
fat_tab->antsel_rx_keep_0 = b_main ? ANT1_2G : ANT2_2G;
5178
}
5179
5180
odm_antsel_statistics(dm, phy_info, fat_tab->antsel_rx_keep_0,
5181
pktinfo->station_id, rx_pwr0, RSSI_METHOD,
5182
pktinfo->is_cck_rate);
5183
} else {
5184
odm_antsel_statistics(dm, phy_info, fat_tab->antsel_rx_keep_0,
5185
pktinfo->station_id, rx_pwr0, RSSI_METHOD,
5186
pktinfo->is_cck_rate);
5187
5188
#ifdef ODM_EVM_ENHANCE_ANTDIV
5189
if (!(dm->support_ic_type & ODM_EVM_ANTDIV_IC))
5190
return;
5191
if (pktinfo->is_cck_rate)
5192
return;
5193
5194
odm_antsel_statistics(dm, phy_info, fat_tab->antsel_rx_keep_0,
5195
pktinfo->station_id, rx_evm0, EVM_METHOD,
5196
pktinfo->is_cck_rate);
5197
odm_antsel_statistics(dm, phy_info, fat_tab->antsel_rx_keep_0,
5198
pktinfo->station_id, rx_evm0, TP_METHOD,
5199
pktinfo->is_cck_rate);
5200
#endif
5201
}
5202
}
5203
5204
void odm_process_rssi_for_ant_div(void *dm_void, void *phy_info_void,
5205
void *pkt_info_void)
5206
{
5207
struct dm_struct *dm = (struct dm_struct *)dm_void;
5208
struct phydm_phyinfo_struct *phy_info = NULL;
5209
struct phydm_perpkt_info_struct *pktinfo = NULL;
5210
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
5211
#if (defined(CONFIG_HL_SMART_ANTENNA))
5212
struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;
5213
u32 beam_tmp;
5214
u8 next_ant;
5215
u8 train_pkt_number;
5216
#endif
5217
boolean b_main;
5218
u8 rx_power_ant0, rx_power_ant1;
5219
u8 rx_evm_ant0, rx_evm_ant1;
5220
u8 rssi_avg;
5221
u64 rssi_linear = 0;
5222
5223
phy_info = (struct phydm_phyinfo_struct *)phy_info_void;
5224
pktinfo = (struct phydm_perpkt_info_struct *)pkt_info_void;
5225
rx_power_ant0 = phy_info->rx_mimo_signal_strength[0];
5226
rx_power_ant1 = phy_info->rx_mimo_signal_strength[1];
5227
rx_evm_ant0 = phy_info->rx_mimo_signal_quality[0];
5228
rx_evm_ant1 = phy_info->rx_mimo_signal_quality[1];
5229
5230
if ((dm->support_ic_type & ODM_IC_2SS) && !pktinfo->is_cck_rate) {
5231
if (rx_power_ant1 < 100) {
5232
rssi_linear = phydm_db_2_linear(rx_power_ant0) +
5233
phydm_db_2_linear(rx_power_ant1);
5234
/* @Rounding and removing fractional bits */
5235
rssi_linear = (rssi_linear +
5236
(1 << (FRAC_BITS - 1))) >> FRAC_BITS;
5237
/* @Calculate average RSSI */
5238
rssi_linear = DIVIDED_2(rssi_linear);
5239
/* @averaged PWDB */
5240
rssi_avg = (u8)odm_convert_to_db(rssi_linear);
5241
}
5242
5243
} else {
5244
rx_power_ant0 = (u8)phy_info->rx_pwdb_all;
5245
rssi_avg = rx_power_ant0;
5246
}
5247
5248
#ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
5249
if ((dm->ant_div_type == HL_SW_SMART_ANT_TYPE2) && (fat_tab->fat_state == FAT_TRAINING_STATE))
5250
phydm_process_rssi_for_hb_smtant_type2(dm, phy_info, pktinfo, rssi_avg); /*@for 8822B*/
5251
else
5252
#endif
5253
5254
#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1
5255
#ifdef CONFIG_FAT_PATCH
5256
if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE1 && fat_tab->fat_state == FAT_TRAINING_STATE) {
5257
/*@[Beacon]*/
5258
if (pktinfo->is_packet_beacon) {
5259
sat_tab->beacon_counter++;
5260
PHYDM_DBG(dm, DBG_ANT_DIV,
5261
"MatchBSSID_beacon_counter = ((%d))\n",
5262
sat_tab->beacon_counter);
5263
5264
if (sat_tab->beacon_counter >= sat_tab->pre_beacon_counter + 2) {
5265
if (sat_tab->ant_num > 1) {
5266
next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;
5267
odm_update_rx_idle_ant(dm, next_ant);
5268
}
5269
5270
sat_tab->update_beam_idx++;
5271
5272
PHYDM_DBG(dm, DBG_ANT_DIV,
5273
"pre_beacon_counter = ((%d)), pkt_counter = ((%d)), update_beam_idx = ((%d))\n",
5274
sat_tab->pre_beacon_counter,
5275
sat_tab->pkt_counter,
5276
sat_tab->update_beam_idx);
5277
5278
sat_tab->pre_beacon_counter = sat_tab->beacon_counter;
5279
sat_tab->pkt_counter = 0;
5280
}
5281
}
5282
/*@[data]*/
5283
else if (pktinfo->is_packet_to_self) {
5284
if (sat_tab->pkt_skip_statistic_en == 0) {
5285
/*@
5286
PHYDM_DBG(dm, DBG_ANT_DIV, "StaID[%d]: antsel_pathA = ((%d)), hw_antsw_occur = ((%d)), Beam_num = ((%d)), RSSI = ((%d))\n",
5287
pktinfo->station_id, fat_tab->antsel_rx_keep_0, fat_tab->hw_antsw_occur, sat_tab->fast_training_beam_num, rx_power_ant0);
5288
*/
5289
PHYDM_DBG(dm, DBG_ANT_DIV,
5290
"ID[%d][pkt_cnt = %d]: {ANT, Beam} = {%d, %d}, RSSI = ((%d))\n",
5291
pktinfo->station_id,
5292
sat_tab->pkt_counter,
5293
fat_tab->antsel_rx_keep_0,
5294
sat_tab->fast_training_beam_num,
5295
rx_power_ant0);
5296
5297
sat_tab->pkt_rssi_sum[fat_tab->antsel_rx_keep_0][sat_tab->fast_training_beam_num] += rx_power_ant0;
5298
sat_tab->pkt_rssi_cnt[fat_tab->antsel_rx_keep_0][sat_tab->fast_training_beam_num]++;
5299
sat_tab->pkt_counter++;
5300
5301
#if 1
5302
train_pkt_number = sat_tab->beam_train_cnt[fat_tab->rx_idle_ant - 1][sat_tab->fast_training_beam_num];
5303
#else
5304
train_pkt_number = sat_tab->per_beam_training_pkt_num;
5305
#endif
5306
5307
/*Swich Antenna erery N pkts*/
5308
if (sat_tab->pkt_counter == train_pkt_number) {
5309
if (sat_tab->ant_num > 1) {
5310
PHYDM_DBG(dm, DBG_ANT_DIV, "packet enugh ((%d ))pkts ---> Switch antenna\n", train_pkt_number);
5311
next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;
5312
odm_update_rx_idle_ant(dm, next_ant);
5313
}
5314
5315
sat_tab->update_beam_idx++;
5316
PHYDM_DBG(dm, DBG_ANT_DIV, "pre_beacon_counter = ((%d)), update_beam_idx_counter = ((%d))\n",
5317
sat_tab->pre_beacon_counter, sat_tab->update_beam_idx);
5318
5319
sat_tab->pre_beacon_counter = sat_tab->beacon_counter;
5320
sat_tab->pkt_counter = 0;
5321
}
5322
}
5323
}
5324
5325
/*Swich Beam after switch "sat_tab->ant_num" antennas*/
5326
if (sat_tab->update_beam_idx == sat_tab->ant_num) {
5327
sat_tab->update_beam_idx = 0;
5328
sat_tab->pkt_counter = 0;
5329
beam_tmp = sat_tab->fast_training_beam_num;
5330
5331
if (sat_tab->fast_training_beam_num >= (sat_tab->beam_patten_num_each_ant - 1)) {
5332
fat_tab->fat_state = FAT_DECISION_STATE;
5333
5334
#if DEV_BUS_TYPE == RT_PCI_INTERFACE
5335
if (dm->support_interface == ODM_ITRF_PCIE)
5336
odm_fast_ant_training_hl_smart_antenna_type1(dm);
5337
#endif
5338
#if DEV_BUS_TYPE == RT_USB_INTERFACE || DEV_BUS_TYPE == RT_SDIO_INTERFACE
5339
if (dm->support_interface == ODM_ITRF_USB || dm->support_interface == ODM_ITRF_SDIO)
5340
odm_schedule_work_item(&sat_tab->hl_smart_antenna_decision_workitem);
5341
#endif
5342
5343
} else {
5344
sat_tab->fast_training_beam_num++;
5345
PHYDM_DBG(dm, DBG_ANT_DIV,
5346
"Update Beam_num (( %d )) -> (( %d ))\n",
5347
beam_tmp,
5348
sat_tab->fast_training_beam_num);
5349
phydm_set_all_ant_same_beam_num(dm);
5350
5351
fat_tab->fat_state = FAT_TRAINING_STATE;
5352
}
5353
}
5354
}
5355
#else
5356
5357
if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE1) {
5358
if ((dm->support_ic_type & ODM_HL_SMART_ANT_TYPE1_SUPPORT) &&
5359
pktinfo->is_packet_to_self &&
5360
fat_tab->fat_state == FAT_TRAINING_STATE) {
5361
if (sat_tab->pkt_skip_statistic_en == 0) {
5362
/*@
5363
PHYDM_DBG(dm, DBG_ANT_DIV, "StaID[%d]: antsel_pathA = ((%d)), hw_antsw_occur = ((%d)), Beam_num = ((%d)), RSSI = ((%d))\n",
5364
pktinfo->station_id, fat_tab->antsel_rx_keep_0, fat_tab->hw_antsw_occur, sat_tab->fast_training_beam_num, rx_power_ant0);
5365
*/
5366
PHYDM_DBG(dm, DBG_ANT_DIV,
5367
"StaID[%d]: antsel_pathA = ((%d)), is_packet_to_self = ((%d)), Beam_num = ((%d)), RSSI = ((%d))\n",
5368
pktinfo->station_id,
5369
fat_tab->antsel_rx_keep_0,
5370
pktinfo->is_packet_to_self,
5371
sat_tab->fast_training_beam_num,
5372
rx_power_ant0);
5373
5374
sat_tab->pkt_rssi_sum[fat_tab->antsel_rx_keep_0][sat_tab->fast_training_beam_num] += rx_power_ant0;
5375
sat_tab->pkt_rssi_cnt[fat_tab->antsel_rx_keep_0][sat_tab->fast_training_beam_num]++;
5376
sat_tab->pkt_counter++;
5377
5378
/*swich beam every N pkt*/
5379
if (sat_tab->pkt_counter >= sat_tab->per_beam_training_pkt_num) {
5380
sat_tab->pkt_counter = 0;
5381
beam_tmp = sat_tab->fast_training_beam_num;
5382
5383
if (sat_tab->fast_training_beam_num >= (sat_tab->beam_patten_num_each_ant - 1)) {
5384
fat_tab->fat_state = FAT_DECISION_STATE;
5385
5386
#if DEV_BUS_TYPE == RT_PCI_INTERFACE
5387
if (dm->support_interface == ODM_ITRF_PCIE)
5388
odm_fast_ant_training_hl_smart_antenna_type1(dm);
5389
#endif
5390
#if DEV_BUS_TYPE == RT_USB_INTERFACE || DEV_BUS_TYPE == RT_SDIO_INTERFACE
5391
if (dm->support_interface == ODM_ITRF_USB || dm->support_interface == ODM_ITRF_SDIO)
5392
odm_schedule_work_item(&sat_tab->hl_smart_antenna_decision_workitem);
5393
#endif
5394
5395
} else {
5396
sat_tab->fast_training_beam_num++;
5397
phydm_set_all_ant_same_beam_num(dm);
5398
5399
fat_tab->fat_state = FAT_TRAINING_STATE;
5400
PHYDM_DBG(dm, DBG_ANT_DIV, "Update Beam_num (( %d )) -> (( %d ))\n", beam_tmp, sat_tab->fast_training_beam_num);
5401
}
5402
}
5403
}
5404
}
5405
}
5406
#endif
5407
else
5408
#endif
5409
if (dm->ant_div_type == CG_TRX_SMART_ANTDIV) {
5410
odm_process_rssi_smart(dm, phy_info, pktinfo,
5411
rx_power_ant0);
5412
} else { /* @ant_div_type != CG_TRX_SMART_ANTDIV */
5413
odm_process_rssi_normal(dm, phy_info, pktinfo,
5414
rx_power_ant0);
5415
}
5416
#if 0
5417
/* PHYDM_DBG(dm,DBG_ANT_DIV,"is_cck_rate=%d, pwdb_all=%d\n",
5418
* pktinfo->is_cck_rate, phy_info->rx_pwdb_all);
5419
* PHYDM_DBG(dm,DBG_ANT_DIV,"antsel_tr_mux=3'b%d%d%d\n",
5420
* fat_tab->antsel_rx_keep_2, fat_tab->antsel_rx_keep_1,
5421
* fat_tab->antsel_rx_keep_0);
5422
*/
5423
#endif
5424
}
5425
5426
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE | ODM_IOT))
5427
void odm_set_tx_ant_by_tx_info(void *dm_void, u8 *desc, u8 mac_id)
5428
{
5429
struct dm_struct *dm = (struct dm_struct *)dm_void;
5430
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
5431
5432
if (!(dm->support_ability & ODM_BB_ANT_DIV))
5433
return;
5434
5435
if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)
5436
return;
5437
5438
if (dm->support_ic_type == (ODM_RTL8723B | ODM_RTL8721D)) {
5439
#if (RTL8723B_SUPPORT == 1 || RTL8721D_SUPPORT == 1)
5440
SET_TX_DESC_ANTSEL_A_8723B(desc, fat_tab->antsel_a[mac_id]);
5441
/*PHYDM_DBG(dm,DBG_ANT_DIV,
5442
* "[8723B] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",
5443
* mac_id, fat_tab->antsel_c[mac_id], fat_tab->antsel_b[mac_id],
5444
* fat_tab->antsel_a[mac_id]);
5445
*/
5446
#endif
5447
} else if (dm->support_ic_type == ODM_RTL8821) {
5448
#if (RTL8821A_SUPPORT == 1)
5449
SET_TX_DESC_ANTSEL_A_8812(desc, fat_tab->antsel_a[mac_id]);
5450
/*PHYDM_DBG(dm,DBG_ANT_DIV,
5451
* "[8821A] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",
5452
* mac_id, fat_tab->antsel_c[mac_id], fat_tab->antsel_b[mac_id],
5453
* fat_tab->antsel_a[mac_id]);
5454
*/
5455
#endif
5456
} else if (dm->support_ic_type == ODM_RTL8188E) {
5457
#if (RTL8188E_SUPPORT == 1)
5458
SET_TX_DESC_ANTSEL_A_88E(desc, fat_tab->antsel_a[mac_id]);
5459
SET_TX_DESC_ANTSEL_B_88E(desc, fat_tab->antsel_b[mac_id]);
5460
SET_TX_DESC_ANTSEL_C_88E(desc, fat_tab->antsel_c[mac_id]);
5461
/*PHYDM_DBG(dm,DBG_ANT_DIV,
5462
* "[8188E] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",
5463
* mac_id, fat_tab->antsel_c[mac_id], fat_tab->antsel_b[mac_id],
5464
* fat_tab->antsel_a[mac_id]);
5465
*/
5466
#endif
5467
} else if (dm->support_ic_type == ODM_RTL8821C) {
5468
#if (RTL8821C_SUPPORT == 1)
5469
SET_TX_DESC_ANTSEL_A_8821C(desc, fat_tab->antsel_a[mac_id]);
5470
/*PHYDM_DBG(dm,DBG_ANT_DIV,
5471
* "[8821C] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",
5472
* mac_id, fat_tab->antsel_c[mac_id], fat_tab->antsel_b[mac_id],
5473
* fat_tab->antsel_a[mac_id]);
5474
*/
5475
#endif
5476
} else if (dm->support_ic_type == ODM_RTL8822B) {
5477
#if (RTL8822B_SUPPORT == 1)
5478
SET_TX_DESC_ANTSEL_A_8822B(desc, fat_tab->antsel_a[mac_id]);
5479
#endif
5480
5481
}
5482
}
5483
#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
5484
5485
void odm_set_tx_ant_by_tx_info(
5486
struct rtl8192cd_priv *priv,
5487
struct tx_desc *pdesc,
5488
unsigned short aid)
5489
{
5490
struct dm_struct *dm = GET_PDM_ODM(priv); /*@&(priv->pshare->_dmODM);*/
5491
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
5492
5493
if (!(dm->support_ability & ODM_BB_ANT_DIV))
5494
return;
5495
5496
if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)
5497
return;
5498
5499
if (dm->support_ic_type == ODM_RTL8881A) {
5500
#if 0
5501
/*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E******\n",__FUNCTION__,__LINE__); */
5502
#endif
5503
pdesc->Dword6 &= set_desc(~(BIT(18) | BIT(17) | BIT(16)));
5504
pdesc->Dword6 |= set_desc(fat_tab->antsel_a[aid] << 16);
5505
} else if (dm->support_ic_type == ODM_RTL8192E) {
5506
#if 0
5507
/*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8192E******\n",__FUNCTION__,__LINE__); */
5508
#endif
5509
pdesc->Dword6 &= set_desc(~(BIT(18) | BIT(17) | BIT(16)));
5510
pdesc->Dword6 |= set_desc(fat_tab->antsel_a[aid] << 16);
5511
} else if (dm->support_ic_type == ODM_RTL8197F) {
5512
#if 0
5513
/*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8192E******\n",__FUNCTION__,__LINE__); */
5514
#endif
5515
pdesc->Dword6 &= set_desc(~(BIT(17) | BIT(16)));
5516
pdesc->Dword6 |= set_desc(fat_tab->antsel_a[aid] << 16);
5517
} else if (dm->support_ic_type == ODM_RTL8822B) {
5518
pdesc->Dword6 &= set_desc(~(BIT(17) | BIT(16)));
5519
pdesc->Dword6 |= set_desc(fat_tab->antsel_a[aid] << 16);
5520
} else if (dm->support_ic_type == ODM_RTL8188E) {
5521
#if 0
5522
/*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8188E******\n",__FUNCTION__,__LINE__);*/
5523
#endif
5524
pdesc->Dword2 &= set_desc(~BIT(24));
5525
pdesc->Dword2 &= set_desc(~BIT(25));
5526
pdesc->Dword7 &= set_desc(~BIT(29));
5527
5528
pdesc->Dword2 |= set_desc(fat_tab->antsel_a[aid] << 24);
5529
pdesc->Dword2 |= set_desc(fat_tab->antsel_b[aid] << 25);
5530
pdesc->Dword7 |= set_desc(fat_tab->antsel_c[aid] << 29);
5531
5532
} else if (dm->support_ic_type == ODM_RTL8812) {
5533
/*@[path-A]*/
5534
#if 0
5535
/*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E******\n",__FUNCTION__,__LINE__);*/
5536
#endif
5537
5538
pdesc->Dword6 &= set_desc(~BIT(16));
5539
pdesc->Dword6 &= set_desc(~BIT(17));
5540
pdesc->Dword6 &= set_desc(~BIT(18));
5541
5542
pdesc->Dword6 |= set_desc(fat_tab->antsel_a[aid] << 16);
5543
pdesc->Dword6 |= set_desc(fat_tab->antsel_b[aid] << 17);
5544
pdesc->Dword6 |= set_desc(fat_tab->antsel_c[aid] << 18);
5545
}
5546
}
5547
5548
#if 1 /*@def CONFIG_WLAN_HAL*/
5549
void odm_set_tx_ant_by_tx_info_hal(
5550
struct rtl8192cd_priv *priv,
5551
void *pdesc_data,
5552
u16 aid)
5553
{
5554
struct dm_struct *dm = GET_PDM_ODM(priv); /*@&(priv->pshare->_dmODM);*/
5555
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
5556
PTX_DESC_DATA_88XX pdescdata = (PTX_DESC_DATA_88XX)pdesc_data;
5557
5558
if (!(dm->support_ability & ODM_BB_ANT_DIV))
5559
return;
5560
5561
if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)
5562
return;
5563
5564
if (dm->support_ic_type & (ODM_RTL8881A | ODM_RTL8192E | ODM_RTL8814A |
5565
ODM_RTL8197F | ODM_RTL8822B)) {
5566
#if 0
5567
/*panic_printk("[%s] [%d] **odm_set_tx_ant_by_tx_info_hal**\n",
5568
* __FUNCTION__,__LINE__);
5569
*/
5570
#endif
5571
pdescdata->ant_sel = 1;
5572
pdescdata->ant_sel_a = fat_tab->antsel_a[aid];
5573
}
5574
}
5575
#endif /*@#ifdef CONFIG_WLAN_HAL*/
5576
5577
#endif
5578
5579
void odm_ant_div_config(void *dm_void)
5580
{
5581
struct dm_struct *dm = (struct dm_struct *)dm_void;
5582
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
5583
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
5584
PHYDM_DBG(dm, DBG_ANT_DIV, "WIN Config Antenna Diversity\n");
5585
/*@
5586
if(dm->support_ic_type==ODM_RTL8723B)
5587
{
5588
if((!dm->swat_tab.ANTA_ON || !dm->swat_tab.ANTB_ON))
5589
dm->support_ability &= ~(ODM_BB_ANT_DIV);
5590
}
5591
*/
5592
#if (defined(CONFIG_2T3R_ANTENNA))
5593
#if (RTL8822B_SUPPORT == 1)
5594
dm->rfe_type = ANT_2T3R_RFE_TYPE;
5595
#endif
5596
#endif
5597
5598
#if (defined(CONFIG_2T4R_ANTENNA))
5599
#if (RTL8822B_SUPPORT == 1)
5600
dm->rfe_type = ANT_2T4R_RFE_TYPE;
5601
#endif
5602
#endif
5603
5604
if (dm->support_ic_type == ODM_RTL8723D)
5605
dm->ant_div_type = S0S1_SW_ANTDIV;
5606
#elif (DM_ODM_SUPPORT_TYPE & (ODM_CE))
5607
5608
PHYDM_DBG(dm, DBG_ANT_DIV, "CE Config Antenna Diversity\n");
5609
5610
if (dm->support_ic_type == ODM_RTL8723B)
5611
dm->ant_div_type = S0S1_SW_ANTDIV;
5612
5613
if (dm->support_ic_type == ODM_RTL8723D)
5614
dm->ant_div_type = S0S1_SW_ANTDIV;
5615
#elif (DM_ODM_SUPPORT_TYPE & (ODM_IOT))
5616
5617
PHYDM_DBG(dm, DBG_ANT_DIV, "IOT Config Antenna Diversity\n");
5618
5619
if (dm->support_ic_type == ODM_RTL8721D)
5620
dm->ant_div_type = CG_TRX_HW_ANTDIV;
5621
5622
#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))
5623
5624
PHYDM_DBG(dm, DBG_ANT_DIV, "AP Config Antenna Diversity\n");
5625
5626
/* @2 [ NOT_SUPPORT_ANTDIV ] */
5627
#if (defined(CONFIG_NOT_SUPPORT_ANTDIV))
5628
dm->support_ability &= ~(ODM_BB_ANT_DIV);
5629
PHYDM_DBG(dm, DBG_ANT_DIV,
5630
"[ Disable AntDiv function] : Not Support 2.4G & 5G Antenna Diversity\n");
5631
5632
/* @2 [ 2G&5G_SUPPORT_ANTDIV ] */
5633
#elif (defined(CONFIG_2G5G_SUPPORT_ANTDIV))
5634
PHYDM_DBG(dm, DBG_ANT_DIV,
5635
"[ Enable AntDiv function] : 2.4G & 5G Support Antenna Diversity Simultaneously\n");
5636
fat_tab->ant_div_2g_5g = (ODM_ANTDIV_2G | ODM_ANTDIV_5G);
5637
5638
if (dm->support_ic_type & ODM_ANTDIV_SUPPORT)
5639
dm->support_ability |= ODM_BB_ANT_DIV;
5640
if (*dm->band_type == ODM_BAND_5G) {
5641
#if (defined(CONFIG_5G_CGCS_RX_DIVERSITY))
5642
dm->ant_div_type = CGCS_RX_HW_ANTDIV;
5643
PHYDM_DBG(dm, DBG_ANT_DIV,
5644
"[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");
5645
panic_printk("[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");
5646
#elif (defined(CONFIG_5G_CG_TRX_DIVERSITY) ||\
5647
defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A))
5648
dm->ant_div_type = CG_TRX_HW_ANTDIV;
5649
PHYDM_DBG(dm, DBG_ANT_DIV,
5650
"[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n");
5651
panic_printk("[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n");
5652
#elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY))
5653
dm->ant_div_type = CG_TRX_SMART_ANTDIV;
5654
PHYDM_DBG(dm, DBG_ANT_DIV,
5655
"[ 5G] : AntDiv type = CG_SMART_ANTDIV\n");
5656
#elif (defined(CONFIG_5G_S0S1_SW_ANT_DIVERSITY))
5657
dm->ant_div_type = S0S1_SW_ANTDIV;
5658
PHYDM_DBG(dm, DBG_ANT_DIV,
5659
"[ 5G] : AntDiv type = S0S1_SW_ANTDIV\n");
5660
#endif
5661
} else if (*dm->band_type == ODM_BAND_2_4G) {
5662
#if (defined(CONFIG_2G_CGCS_RX_DIVERSITY))
5663
dm->ant_div_type = CGCS_RX_HW_ANTDIV;
5664
PHYDM_DBG(dm, DBG_ANT_DIV,
5665
"[ 2.4G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");
5666
#elif (defined(CONFIG_2G_CG_TRX_DIVERSITY) ||\
5667
defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A))
5668
dm->ant_div_type = CG_TRX_HW_ANTDIV;
5669
PHYDM_DBG(dm, DBG_ANT_DIV,
5670
"[ 2.4G] : AntDiv type = CG_TRX_HW_ANTDIV\n");
5671
#elif (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
5672
dm->ant_div_type = CG_TRX_SMART_ANTDIV;
5673
PHYDM_DBG(dm, DBG_ANT_DIV,
5674
"[ 2.4G] : AntDiv type = CG_SMART_ANTDIV\n");
5675
#elif (defined(CONFIG_2G_S0S1_SW_ANT_DIVERSITY))
5676
dm->ant_div_type = S0S1_SW_ANTDIV;
5677
PHYDM_DBG(dm, DBG_ANT_DIV,
5678
"[ 2.4G] : AntDiv type = S0S1_SW_ANTDIV\n");
5679
#endif
5680
}
5681
5682
/* @2 [ 5G_SUPPORT_ANTDIV ] */
5683
#elif (defined(CONFIG_5G_SUPPORT_ANTDIV))
5684
PHYDM_DBG(dm, DBG_ANT_DIV,
5685
"[ Enable AntDiv function] : Only 5G Support Antenna Diversity\n");
5686
panic_printk("[ Enable AntDiv function] : Only 5G Support Antenna Diversity\n");
5687
fat_tab->ant_div_2g_5g = (ODM_ANTDIV_5G);
5688
if (*dm->band_type == ODM_BAND_5G) {
5689
if (dm->support_ic_type & ODM_ANTDIV_5G_SUPPORT_IC)
5690
dm->support_ability |= ODM_BB_ANT_DIV;
5691
#if (defined(CONFIG_5G_CGCS_RX_DIVERSITY))
5692
dm->ant_div_type = CGCS_RX_HW_ANTDIV;
5693
PHYDM_DBG(dm, DBG_ANT_DIV,
5694
"[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");
5695
panic_printk("[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");
5696
#elif (defined(CONFIG_5G_CG_TRX_DIVERSITY))
5697
dm->ant_div_type = CG_TRX_HW_ANTDIV;
5698
panic_printk("[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n");
5699
PHYDM_DBG(dm, DBG_ANT_DIV,
5700
"[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n");
5701
#elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY))
5702
dm->ant_div_type = CG_TRX_SMART_ANTDIV;
5703
PHYDM_DBG(dm, DBG_ANT_DIV,
5704
"[ 5G] : AntDiv type = CG_SMART_ANTDIV\n");
5705
#elif (defined(CONFIG_5G_S0S1_SW_ANT_DIVERSITY))
5706
dm->ant_div_type = S0S1_SW_ANTDIV;
5707
PHYDM_DBG(dm, DBG_ANT_DIV,
5708
"[ 5G] : AntDiv type = S0S1_SW_ANTDIV\n");
5709
#endif
5710
} else if (*dm->band_type == ODM_BAND_2_4G) {
5711
PHYDM_DBG(dm, DBG_ANT_DIV, "Not Support 2G ant_div_type\n");
5712
dm->support_ability &= ~(ODM_BB_ANT_DIV);
5713
}
5714
5715
/* @2 [ 2G_SUPPORT_ANTDIV ] */
5716
#elif (defined(CONFIG_2G_SUPPORT_ANTDIV))
5717
PHYDM_DBG(dm, DBG_ANT_DIV,
5718
"[ Enable AntDiv function] : Only 2.4G Support Antenna Diversity\n");
5719
fat_tab->ant_div_2g_5g = (ODM_ANTDIV_2G);
5720
if (*dm->band_type == ODM_BAND_2_4G) {
5721
if (dm->support_ic_type & ODM_ANTDIV_2G_SUPPORT_IC)
5722
dm->support_ability |= ODM_BB_ANT_DIV;
5723
#if (defined(CONFIG_2G_CGCS_RX_DIVERSITY))
5724
dm->ant_div_type = CGCS_RX_HW_ANTDIV;
5725
PHYDM_DBG(dm, DBG_ANT_DIV,
5726
"[ 2.4G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");
5727
#elif (defined(CONFIG_2G_CG_TRX_DIVERSITY))
5728
dm->ant_div_type = CG_TRX_HW_ANTDIV;
5729
PHYDM_DBG(dm, DBG_ANT_DIV,
5730
"[ 2.4G] : AntDiv type = CG_TRX_HW_ANTDIV\n");
5731
#elif (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
5732
dm->ant_div_type = CG_TRX_SMART_ANTDIV;
5733
PHYDM_DBG(dm, DBG_ANT_DIV,
5734
"[ 2.4G] : AntDiv type = CG_SMART_ANTDIV\n");
5735
#elif (defined(CONFIG_2G_S0S1_SW_ANT_DIVERSITY))
5736
dm->ant_div_type = S0S1_SW_ANTDIV;
5737
PHYDM_DBG(dm, DBG_ANT_DIV,
5738
"[ 2.4G] : AntDiv type = S0S1_SW_ANTDIV\n");
5739
#endif
5740
} else if (*dm->band_type == ODM_BAND_5G) {
5741
PHYDM_DBG(dm, DBG_ANT_DIV, "Not Support 5G ant_div_type\n");
5742
dm->support_ability &= ~(ODM_BB_ANT_DIV);
5743
}
5744
#endif
5745
#endif
5746
5747
PHYDM_DBG(dm, DBG_ANT_DIV,
5748
"[AntDiv Config Info] AntDiv_SupportAbility = (( %x ))\n",
5749
((dm->support_ability & ODM_BB_ANT_DIV) ? 1 : 0));
5750
PHYDM_DBG(dm, DBG_ANT_DIV,
5751
"[AntDiv Config Info] be_fix_tx_ant = ((%d))\n",
5752
dm->dm_fat_table.b_fix_tx_ant);
5753
}
5754
5755
void odm_ant_div_timers(void *dm_void, u8 state)
5756
{
5757
struct dm_struct *dm = (struct dm_struct *)dm_void;
5758
if (state == INIT_ANTDIV_TIMMER) {
5759
#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
5760
odm_initialize_timer(dm,
5761
&dm->dm_swat_table.sw_antdiv_timer,
5762
(void *)odm_sw_antdiv_callback, NULL,
5763
"sw_antdiv_timer");
5764
#elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) ||\
5765
(defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
5766
odm_initialize_timer(dm, &dm->fast_ant_training_timer,
5767
(void *)odm_fast_ant_training_callback,
5768
NULL, "fast_ant_training_timer");
5769
#endif
5770
5771
#ifdef ODM_EVM_ENHANCE_ANTDIV
5772
odm_initialize_timer(dm, &dm->evm_fast_ant_training_timer,
5773
(void *)phydm_evm_antdiv_callback, NULL,
5774
"evm_fast_ant_training_timer");
5775
#endif
5776
} else if (state == CANCEL_ANTDIV_TIMMER) {
5777
#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
5778
odm_cancel_timer(dm,
5779
&dm->dm_swat_table.sw_antdiv_timer);
5780
#elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) ||\
5781
(defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
5782
odm_cancel_timer(dm, &dm->fast_ant_training_timer);
5783
#endif
5784
5785
#ifdef ODM_EVM_ENHANCE_ANTDIV
5786
odm_cancel_timer(dm, &dm->evm_fast_ant_training_timer);
5787
#endif
5788
} else if (state == RELEASE_ANTDIV_TIMMER) {
5789
#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
5790
odm_release_timer(dm,
5791
&dm->dm_swat_table.sw_antdiv_timer);
5792
#elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) ||\
5793
(defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
5794
odm_release_timer(dm, &dm->fast_ant_training_timer);
5795
#endif
5796
5797
#ifdef ODM_EVM_ENHANCE_ANTDIV
5798
odm_release_timer(dm, &dm->evm_fast_ant_training_timer);
5799
#endif
5800
}
5801
}
5802
5803
void phydm_antdiv_debug(void *dm_void, char input[][16], u32 *_used,
5804
char *output, u32 *_out_len)
5805
{
5806
struct dm_struct *dm = (struct dm_struct *)dm_void;
5807
struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
5808
u32 used = *_used;
5809
u32 out_len = *_out_len;
5810
u32 dm_value[10] = {0};
5811
char help[] = "-h";
5812
u8 i, input_idx = 0;
5813
5814
for (i = 0; i < 5; i++) {
5815
if (input[i + 1]) {
5816
PHYDM_SSCANF(input[i + 1], DCMD_HEX, &dm_value[i]);
5817
input_idx++;
5818
}
5819
}
5820
5821
if (input_idx == 0)
5822
return;
5823
5824
if ((strcmp(input[1], help) == 0)) {
5825
PDM_SNPF(out_len, used, output + used, out_len - used,
5826
"{1} {0:auto, 1:fix main, 2:fix auto}\n");
5827
PDM_SNPF(out_len, used, output + used, out_len - used,
5828
"{2} {antdiv_period}\n");
5829
#if (RTL8821C_SUPPORT == 1)
5830
PDM_SNPF(out_len, used, output + used, out_len - used,
5831
"{3} {en} {0:Default, 1:HW_Div, 2:SW_Div}\n");
5832
#endif
5833
5834
} else if (dm_value[0] == 1) {
5835
/*@fixed or auto antenna*/
5836
if (dm_value[1] == 0) {
5837
dm->ant_type = ODM_AUTO_ANT;
5838
PDM_SNPF(out_len, used, output + used, out_len - used,
5839
"AntDiv: Auto\n");
5840
} else if (dm_value[1] == 1) {
5841
dm->ant_type = ODM_FIX_MAIN_ANT;
5842
PDM_SNPF(out_len, used, output + used, out_len - used,
5843
"AntDiv: Fix Main\n");
5844
} else if (dm_value[1] == 2) {
5845
dm->ant_type = ODM_FIX_AUX_ANT;
5846
PDM_SNPF(out_len, used, output + used, out_len - used,
5847
"AntDiv: Fix Aux\n");
5848
}
5849
5850
if (dm->ant_type != ODM_AUTO_ANT) {
5851
odm_stop_antenna_switch_dm(dm);
5852
if (dm->ant_type == ODM_FIX_MAIN_ANT)
5853
odm_update_rx_idle_ant(dm, MAIN_ANT);
5854
else if (dm->ant_type == ODM_FIX_AUX_ANT)
5855
odm_update_rx_idle_ant(dm, AUX_ANT);
5856
} else {
5857
phydm_enable_antenna_diversity(dm);
5858
}
5859
dm->pre_ant_type = dm->ant_type;
5860
} else if (dm_value[0] == 2) {
5861
/*@dynamic period for AntDiv*/
5862
dm->antdiv_period = (u8)dm_value[1];
5863
PDM_SNPF(out_len, used, output + used, out_len - used,
5864
"AntDiv_period=((%d))\n", dm->antdiv_period);
5865
}
5866
#if (RTL8821C_SUPPORT == 1)
5867
else if (dm_value[0] == 3 &&
5868
dm->support_ic_type == ODM_RTL8821C) {
5869
/*Only for 8821C*/
5870
if (dm_value[1] == 0) {
5871
fat_tab->force_antdiv_type = false;
5872
PDM_SNPF(out_len, used, output + used, out_len - used,
5873
"[8821C] AntDiv: Default\n");
5874
} else if (dm_value[1] == 1) {
5875
fat_tab->force_antdiv_type = true;
5876
fat_tab->antdiv_type_dbg = CG_TRX_HW_ANTDIV;
5877
PDM_SNPF(out_len, used, output + used, out_len - used,
5878
"[8821C] AntDiv: HW diversity\n");
5879
} else if (dm_value[1] == 2) {
5880
fat_tab->force_antdiv_type = true;
5881
fat_tab->antdiv_type_dbg = S0S1_SW_ANTDIV;
5882
PDM_SNPF(out_len, used, output + used, out_len - used,
5883
"[8821C] AntDiv: SW diversity\n");
5884
}
5885
}
5886
#endif
5887
#ifdef ODM_EVM_ENHANCE_ANTDIV
5888
else if (dm_value[0] == 4) {
5889
if (dm_value[1] == 0) {
5890
/*@init parameters for EVM AntDiv*/
5891
phydm_evm_sw_antdiv_init(dm);
5892
PDM_SNPF(out_len, used, output + used, out_len - used,
5893
"init evm antdiv parameters\n");
5894
} else if (dm_value[1] == 1) {
5895
/*training number for EVM AntDiv*/
5896
dm->antdiv_train_num = (u8)dm_value[2];
5897
PDM_SNPF(out_len, used, output + used, out_len - used,
5898
"antdiv_train_num = ((%d))\n",
5899
dm->antdiv_train_num);
5900
} else if (dm_value[1] == 2) {
5901
/*training interval for EVM AntDiv*/
5902
dm->antdiv_intvl = (u8)dm_value[2];
5903
PDM_SNPF(out_len, used, output + used, out_len - used,
5904
"antdiv_intvl = ((%d))\n",
5905
dm->antdiv_intvl);
5906
} else if (dm_value[1] == 3) {
5907
/*@function period for EVM AntDiv*/
5908
dm->evm_antdiv_period = (u8)dm_value[2];
5909
PDM_SNPF(out_len, used, output + used, out_len - used,
5910
"evm_antdiv_period = ((%d))\n",
5911
dm->evm_antdiv_period);
5912
} else if (dm_value[1] == 100) {/*show parameters*/
5913
PDM_SNPF(out_len, used, output + used, out_len - used,
5914
"ant_type = ((%d))\n", dm->ant_type);
5915
PDM_SNPF(out_len, used, output + used, out_len - used,
5916
"antdiv_train_num = ((%d))\n",
5917
dm->antdiv_train_num);
5918
PDM_SNPF(out_len, used, output + used, out_len - used,
5919
"antdiv_intvl = ((%d))\n",
5920
dm->antdiv_intvl);
5921
PDM_SNPF(out_len, used, output + used, out_len - used,
5922
"evm_antdiv_period = ((%d))\n",
5923
dm->evm_antdiv_period);
5924
}
5925
}
5926
#ifdef CONFIG_2T4R_ANTENNA
5927
else if (dm_value[0] == 5) { /*Only for 8822B 2T4R case*/
5928
5929
if (dm_value[1] == 0) {
5930
dm->ant_type2 = ODM_AUTO_ANT;
5931
PDM_SNPF(out_len, used, output + used, out_len - used,
5932
"AntDiv: PathB Auto\n");
5933
} else if (dm_value[1] == 1) {
5934
dm->ant_type2 = ODM_FIX_MAIN_ANT;
5935
PDM_SNPF(out_len, used, output + used, out_len - used,
5936
"AntDiv: PathB Fix Main\n");
5937
} else if (dm_value[1] == 2) {
5938
dm->ant_type2 = ODM_FIX_AUX_ANT;
5939
PDM_SNPF(out_len, used, output + used, out_len - used,
5940
"AntDiv: PathB Fix Aux\n");
5941
}
5942
5943
if (dm->ant_type2 != ODM_AUTO_ANT) {
5944
odm_stop_antenna_switch_dm(dm);
5945
if (dm->ant_type2 == ODM_FIX_MAIN_ANT)
5946
phydm_update_rx_idle_ant_pathb(dm, MAIN_ANT);
5947
else if (dm->ant_type2 == ODM_FIX_AUX_ANT)
5948
phydm_update_rx_idle_ant_pathb(dm, AUX_ANT);
5949
} else {
5950
phydm_enable_antenna_diversity(dm);
5951
}
5952
dm->pre_ant_type2 = dm->ant_type2;
5953
}
5954
#endif
5955
#endif
5956
*_used = used;
5957
*_out_len = out_len;
5958
}
5959
5960
void odm_ant_div_reset(void *dm_void)
5961
{
5962
struct dm_struct *dm = (struct dm_struct *)dm_void;
5963
5964
#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
5965
if (dm->ant_div_type == S0S1_SW_ANTDIV)
5966
odm_s0s1_sw_ant_div_reset(dm);
5967
#endif
5968
}
5969
5970
void odm_antenna_diversity_init(void *dm_void)
5971
{
5972
struct dm_struct *dm = (struct dm_struct *)dm_void;
5973
5974
odm_ant_div_config(dm);
5975
odm_ant_div_init(dm);
5976
}
5977
5978
void odm_antenna_diversity(void *dm_void)
5979
{
5980
struct dm_struct *dm = (struct dm_struct *)dm_void;
5981
5982
if (*dm->mp_mode)
5983
return;
5984
5985
if (!(dm->support_ability & ODM_BB_ANT_DIV)) {
5986
PHYDM_DBG(dm, DBG_ANT_DIV,
5987
"[Return!!!] Not Support Antenna Diversity Function\n");
5988
return;
5989
}
5990
5991
if (dm->pause_ability & ODM_BB_ANT_DIV) {
5992
PHYDM_DBG(dm, DBG_ANT_DIV, "Return: Pause AntDIv in LV=%d\n",
5993
dm->pause_lv_table.lv_antdiv);
5994
return;
5995
}
5996
5997
odm_ant_div(dm);
5998
}
5999
#endif /*@#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY*/
6000
6001
6002