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