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