Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_antdiv.c
1307 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13* The full GNU General Public License is included in this distribution in the14* file called LICENSE.15*16* Contact Information:17* wlanfae <[email protected]>18* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,19* Hsinchu 300, Taiwan.20*21* Larry Finger <[email protected]>22*23*****************************************************************************/2425/*************************************************************26* include files27************************************************************/2829#include "mp_precomp.h"30#include "phydm_precomp.h"3132/*******************************************************33* when antenna test utility is on or some testing need to disable antenna34* diversity call this function to disable all ODM related mechanisms which35* will switch antenna.36*****************************************************37*/38#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY3940#if (RTL8721D_SUPPORT == 1)4142void odm_update_rx_idle_ant_8721d(void *dm_void, u8 ant, u32 default_ant,43u32 optional_ant)44{45struct dm_struct *dm = (struct dm_struct *)dm_void;46struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;4748odm_set_bb_reg(dm, R_0x864, BIT(5) | BIT(4) | BIT(3), default_ant);49/*@Default RX*/50odm_set_bb_reg(dm, R_0x864, BIT(8) | BIT(7) | BIT(6), optional_ant);51/*@Optional RX*/52odm_set_bb_reg(dm, R_0x860, BIT(14) | BIT(13) | BIT(12), default_ant);53/*@Default TX*/54fat_tab->rx_idle_ant = ant;55}5657void odm_trx_hw_ant_div_init_8721d(void *dm_void)58{59struct dm_struct *dm = (struct dm_struct *)dm_void;6061PHYDM_DBG(dm, DBG_ANT_DIV,62"[8721D] AntDiv_Init => ant_div_type=[CG_TRX_HW_ANTDIV]\n");6364/*@BT Coexistence*/65/*@keep antsel_map when GNT_BT = 1*/66odm_set_bb_reg(dm, R_0x864, BIT(12), 1);67/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */68odm_set_bb_reg(dm, R_0x874, BIT(23), 0);69/* @Disable hw antsw & fast_train.antsw when BT TX/RX */70odm_set_bb_reg(dm, R_0xe64, 0xFFFF0000, 0x000c);7172u32 sysreg408 = HAL_READ32(SYSTEM_CTRL_BASE_LP, 0x0408);7374sysreg408 &= ~0x0000001F;75sysreg408 |= 0x12;76HAL_WRITE32(SYSTEM_CTRL_BASE_LP, 0x0408, sysreg408);7778u32 sysreg410 = HAL_READ32(SYSTEM_CTRL_BASE_LP, 0x0410);7980sysreg410 &= ~0x0000001F;81sysreg410 |= 0x12;82HAL_WRITE32(SYSTEM_CTRL_BASE_LP, 0x0410, sysreg410);8384u32 sysreg208 = HAL_READ32(SYSTEM_CTRL_BASE_LP, REG_LP_FUNC_EN0);8586sysreg208 |= BIT(28);87HAL_WRITE32(SYSTEM_CTRL_BASE_LP, REG_LP_FUNC_EN0, sysreg208);8889u32 sysreg344 =90HAL_READ32(SYSTEM_CTRL_BASE_LP, REG_AUDIO_SHARE_PAD_CTRL);9192sysreg344 |= BIT(9);93HAL_WRITE32(SYSTEM_CTRL_BASE_LP, REG_AUDIO_SHARE_PAD_CTRL, sysreg344);9495u32 sysreg280 = HAL_READ32(SYSTEM_CTRL_BASE_LP, REG_LP_SYSPLL_CTRL0);9697sysreg280 |= 0x7;98HAL_WRITE32(SYSTEM_CTRL_BASE_LP, REG_LP_SYSPLL_CTRL0, sysreg280);99100sysreg344 |= BIT(8);101HAL_WRITE32(SYSTEM_CTRL_BASE_LP, REG_AUDIO_SHARE_PAD_CTRL, sysreg344);102103sysreg344 |= BIT(0);104HAL_WRITE32(SYSTEM_CTRL_BASE_LP, REG_AUDIO_SHARE_PAD_CTRL, sysreg344);105106odm_set_bb_reg(dm, R_0x930, 0xF00, 8); /* RFE CTRL_2 ANTSEL0 */107odm_set_bb_reg(dm, R_0x930, 0xF000, 8); /* RFE CTRL_3 ANTSEL0 */108odm_set_bb_reg(dm, R_0x92c, BIT(3) | BIT(2), 2);109110odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0);111odm_set_bb_reg(dm, R_0x804, 0xF00, 1); /* r_keep_rfpin */112odm_set_bb_reg(dm, R_0x944, 0x0000000C, 0x3); /* PAD in/output CTRL */113114/*PTA setting: WL_BB_SEL_BTG_TRXG_anta, (1: HW CTRL 0: SW CTRL)*/115/*odm_set_bb_reg(dm, R_0x948, BIT6, 0);*/116/*odm_set_bb_reg(dm, R_0x948, BIT8, 0);*/117/*@GNT_WL tx*/118odm_set_bb_reg(dm, R_0x950, BIT(29), 0);119120/*@Mapping Table*/121odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 0);122odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 1);123/* odm_set_bb_reg(dm, R_0x864, BIT5|BIT4|BIT3, 0); */124/* odm_set_bb_reg(dm, R_0x864, BIT8|BIT7|BIT6, 1); */125126/* Set WLBB_SEL_RF_ON 1 if RXFIR_PWDB > 0xCcc[3:0] */127odm_set_bb_reg(dm, R_0xccc, BIT(12), 0);128/* @Low-to-High threshold for WLBB_SEL_RF_ON */129/*when OFDM enable */130odm_set_bb_reg(dm, R_0xccc, 0x0F, 0x01);131/* @High-to-Low threshold for WLBB_SEL_RF_ON */132/* when OFDM enable */133odm_set_bb_reg(dm, R_0xccc, 0xF0, 0x0);134/* @b Low-to-High threshold for WLBB_SEL_RF_ON*/135/*when OFDM disable ( only CCK ) */136odm_set_bb_reg(dm, R_0xabc, 0xFF, 0x06);137/* @High-to-Low threshold for WLBB_SEL_RF_ON*/138/* when OFDM disable ( only CCK ) */139odm_set_bb_reg(dm, R_0xabc, 0xFF00, 0x00);140141/*OFDM HW AntDiv Parameters*/142odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xa0);143odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x00);144odm_set_bb_reg(dm, R_0xc5c, BIT(20) | BIT(19) | BIT(18), 0x04);145146/*@CCK HW AntDiv Parameters*/147odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);148odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);149odm_set_bb_reg(dm, R_0xaa8, BIT(8), 0);150151odm_set_bb_reg(dm, R_0xa0c, 0x0F, 0xf);152odm_set_bb_reg(dm, R_0xa14, 0x1F, 0x8);153odm_set_bb_reg(dm, R_0xa10, BIT(13), 0x1);154odm_set_bb_reg(dm, R_0xa74, BIT(8), 0x0);155odm_set_bb_reg(dm, R_0xb34, BIT(30), 0x1);156157/*@disable antenna training */158odm_set_bb_reg(dm, R_0xe08, BIT(16), 0);159odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);160}161#endif162163void odm_stop_antenna_switch_dm(void *dm_void)164{165struct dm_struct *dm = (struct dm_struct *)dm_void;166struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;167/* @disable ODM antenna diversity */168dm->support_ability &= ~ODM_BB_ANT_DIV;169if (fat_tab->div_path_type == ANT_PATH_A)170odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);171else if (fat_tab->div_path_type == ANT_PATH_B)172odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_B);173else if (fat_tab->div_path_type == ANT_PATH_AB)174odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_AB);175odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);176PHYDM_DBG(dm, DBG_ANT_DIV, "STOP Antenna Diversity\n");177}178179void phydm_enable_antenna_diversity(void *dm_void)180{181struct dm_struct *dm = (struct dm_struct *)dm_void;182183dm->support_ability |= ODM_BB_ANT_DIV;184dm->antdiv_select = 0;185PHYDM_DBG(dm, DBG_ANT_DIV, "AntDiv is enabled & Re-Init AntDiv\n");186odm_antenna_diversity_init(dm);187}188189void odm_set_ant_config(void *dm_void, u8 ant_setting /* @0=A, 1=B, 2=C,...*/)190{191struct dm_struct *dm = (struct dm_struct *)dm_void;192193if (dm->support_ic_type == ODM_RTL8723B) {194if (ant_setting == 0) /* @ant A*/195odm_set_bb_reg(dm, R_0x948, MASKDWORD, 0x00000000);196else if (ant_setting == 1)197odm_set_bb_reg(dm, R_0x948, MASKDWORD, 0x00000280);198} else if (dm->support_ic_type == ODM_RTL8723D) {199if (ant_setting == 0) /* @ant A*/200odm_set_bb_reg(dm, R_0x948, MASKLWORD, 0x0000);201else if (ant_setting == 1)202odm_set_bb_reg(dm, R_0x948, MASKLWORD, 0x0280);203}204}205206/* ****************************************************** */207208void odm_sw_ant_div_rest_after_link(void *dm_void)209{210#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))211struct dm_struct *dm = (struct dm_struct *)dm_void;212struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;213struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;214u32 i;215216if (dm->ant_div_type == S0S1_SW_ANTDIV) {217swat_tab->try_flag = SWAW_STEP_INIT;218swat_tab->rssi_trying = 0;219swat_tab->double_chk_flag = 0;220fat_tab->rx_idle_ant = MAIN_ANT;221222for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)223phydm_antdiv_reset_statistic(dm, i);224}225226#endif227}228229void phydm_n_on_off(void *dm_void, u8 swch, u8 path)230{231struct dm_struct *dm = (struct dm_struct *)dm_void;232struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;233234if (path == ANT_PATH_A) {235odm_set_bb_reg(dm, R_0xc50, BIT(7), swch);236} else if (path == ANT_PATH_B) {237odm_set_bb_reg(dm, R_0xc58, BIT(7), swch);238} else if (path == ANT_PATH_AB) {239odm_set_bb_reg(dm, R_0xc50, BIT(7), swch);240odm_set_bb_reg(dm, R_0xc58, BIT(7), swch);241}242odm_set_bb_reg(dm, R_0xa00, BIT(15), swch);243#if (RTL8723D_SUPPORT == 1)244/*@Mingzhi 2017-05-08*/245if (dm->support_ic_type == ODM_RTL8723D) {246if (swch == ANTDIV_ON) {247odm_set_bb_reg(dm, R_0xce0, BIT(1), 1);248odm_set_bb_reg(dm, R_0x948, BIT(6), 1);249/*@1:HW ctrl 0:SW ctrl*/250} else {251odm_set_bb_reg(dm, R_0xce0, BIT(1), 0);252odm_set_bb_reg(dm, R_0x948, BIT(6), 0);253/*@1:HW ctrl 0:SW ctrl*/254}255}256#endif257}258259void phydm_ac_on_off(void *dm_void, u8 swch, u8 path)260{261struct dm_struct *dm = (struct dm_struct *)dm_void;262struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;263264if (dm->support_ic_type & ODM_RTL8812) {265odm_set_bb_reg(dm, R_0xc50, BIT(7), swch);266/* OFDM AntDiv function block enable */267odm_set_bb_reg(dm, R_0xa00, BIT(15), swch);268/* @CCK AntDiv function block enable */269} else if (dm->support_ic_type & ODM_RTL8822B) {270odm_set_bb_reg(dm, R_0x800, BIT(25), swch);271odm_set_bb_reg(dm, R_0xa00, BIT(15), swch);272if (path == ANT_PATH_A) {273odm_set_bb_reg(dm, R_0xc50, BIT(7), swch);274} else if (path == ANT_PATH_B) {275odm_set_bb_reg(dm, R_0xe50, BIT(7), swch);276} else if (path == ANT_PATH_AB) {277odm_set_bb_reg(dm, R_0xc50, BIT(7), swch);278odm_set_bb_reg(dm, R_0xe50, BIT(7), swch);279}280} else {281odm_set_bb_reg(dm, R_0x8d4, BIT(24), swch);282/* OFDM AntDiv function block enable */283284if (dm->cut_version >= ODM_CUT_C &&285dm->support_ic_type == ODM_RTL8821 &&286dm->ant_div_type != S0S1_SW_ANTDIV) {287PHYDM_DBG(dm, DBG_ANT_DIV, "(Turn %s) CCK HW-AntDiv\n",288(swch == ANTDIV_ON) ? "ON" : "OFF");289odm_set_bb_reg(dm, R_0x800, BIT(25), swch);290odm_set_bb_reg(dm, R_0xa00, BIT(15), swch);291/* @CCK AntDiv function block enable */292} else if (dm->support_ic_type == ODM_RTL8821C) {293PHYDM_DBG(dm, DBG_ANT_DIV, "(Turn %s) CCK HW-AntDiv\n",294(swch == ANTDIV_ON) ? "ON" : "OFF");295odm_set_bb_reg(dm, R_0x800, BIT(25), swch);296odm_set_bb_reg(dm, R_0xa00, BIT(15), swch);297/* @CCK AntDiv function block enable */298}299}300}301302void odm_ant_div_on_off(void *dm_void, u8 swch, u8 path)303{304struct dm_struct *dm = (struct dm_struct *)dm_void;305struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;306307if (fat_tab->ant_div_on_off != swch) {308if (dm->ant_div_type == S0S1_SW_ANTDIV)309return;310311if (dm->support_ic_type & ODM_N_ANTDIV_SUPPORT) {312PHYDM_DBG(dm, DBG_ANT_DIV,313"(( Turn %s )) N-Series HW-AntDiv block\n",314(swch == ANTDIV_ON) ? "ON" : "OFF");315phydm_n_on_off(dm, swch, path);316317} else if (dm->support_ic_type & ODM_AC_ANTDIV_SUPPORT) {318PHYDM_DBG(dm, DBG_ANT_DIV,319"(( Turn %s )) AC-Series HW-AntDiv block\n",320(swch == ANTDIV_ON) ? "ON" : "OFF");321phydm_ac_on_off(dm, swch, path);322}323}324fat_tab->ant_div_on_off = swch;325}326327void odm_tx_by_tx_desc_or_reg(void *dm_void, u8 swch)328{329struct dm_struct *dm = (struct dm_struct *)dm_void;330struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;331u8 enable;332333if (fat_tab->b_fix_tx_ant == NO_FIX_TX_ANT)334enable = (swch == TX_BY_DESC) ? 1 : 0;335else336enable = 0; /*@Force TX by Reg*/337338if (dm->ant_div_type != CGCS_RX_HW_ANTDIV) {339if (dm->support_ic_type & ODM_N_ANTDIV_SUPPORT)340odm_set_bb_reg(dm, R_0x80c, BIT(21), enable);341else if (dm->support_ic_type & ODM_AC_ANTDIV_SUPPORT)342odm_set_bb_reg(dm, R_0x900, BIT(18), enable);343344PHYDM_DBG(dm, DBG_ANT_DIV, "[AntDiv] TX_Ant_BY (( %s ))\n",345(enable == TX_BY_DESC) ? "DESC" : "REG");346}347}348349void phydm_antdiv_reset_statistic(void *dm_void, u32 macid)350{351struct dm_struct *dm = (struct dm_struct *)dm_void;352struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;353354fat_tab->main_sum[macid] = 0;355fat_tab->aux_sum[macid] = 0;356fat_tab->main_cnt[macid] = 0;357fat_tab->aux_cnt[macid] = 0;358fat_tab->main_sum_cck[macid] = 0;359fat_tab->aux_sum_cck[macid] = 0;360fat_tab->main_cnt_cck[macid] = 0;361fat_tab->aux_cnt_cck[macid] = 0;362}363364void phydm_fast_training_enable(void *dm_void, u8 swch)365{366struct dm_struct *dm = (struct dm_struct *)dm_void;367u8 enable;368369if (swch == FAT_ON)370enable = 1;371else372enable = 0;373374PHYDM_DBG(dm, DBG_ANT_DIV, "Fast ant Training_en = ((%d))\n", enable);375376if (dm->support_ic_type == ODM_RTL8188E) {377odm_set_bb_reg(dm, R_0xe08, BIT(16), enable);378/*@enable fast training*/379} else if (dm->support_ic_type == ODM_RTL8192E) {380odm_set_bb_reg(dm, R_0xb34, BIT(28), enable);381/*@enable fast training (path-A)*/382#if 0383odm_set_bb_reg(dm, R_0xb34, BIT(29), enable);384/*enable fast training (path-B)*/385#endif386} else if (dm->support_ic_type & (ODM_RTL8821 | ODM_RTL8822B)) {387odm_set_bb_reg(dm, R_0x900, BIT(19), enable);388/*@enable fast training */389}390}391392void phydm_keep_rx_ack_ant_by_tx_ant_time(void *dm_void, u32 time)393{394struct dm_struct *dm = (struct dm_struct *)dm_void;395396/* Timming issue: keep Rx ant after tx for ACK ( time x 3.2 mu sec)*/397if (dm->support_ic_type & ODM_N_ANTDIV_SUPPORT)398odm_set_bb_reg(dm, R_0xe20, 0xf00000, time);399else if (dm->support_ic_type & ODM_AC_ANTDIV_SUPPORT)400odm_set_bb_reg(dm, R_0x818, 0xf00000, time);401}402403void phydm_update_rx_idle_ac(void *dm_void, u8 ant, u32 default_ant,404u32 optional_ant, u32 default_tx_ant)405{406struct dm_struct *dm = (struct dm_struct *)dm_void;407408u16 value16 = odm_read_2byte(dm, ODM_REG_TRMUX_11AC + 2);409/* @2014/01/14 MH/Luke.Lee Add direct write for register 0xc0a to */410/* @prevnt incorrect 0xc08 bit0-15.We still not know why it is changed*/411value16 &= ~(BIT(11) | BIT(10) | BIT(9) | BIT(8) | BIT(7) | BIT(6) |412BIT(5) | BIT(4) | BIT(3));413value16 |= ((u16)default_ant << 3);414value16 |= ((u16)optional_ant << 6);415value16 |= ((u16)default_tx_ant << 9);416odm_write_2byte(dm, ODM_REG_TRMUX_11AC + 2, value16);417#if 0418odm_set_bb_reg(dm, ODM_REG_TRMUX_11AC, 0x380000, default_ant);419/* @Default RX */420odm_set_bb_reg(dm, ODM_REG_TRMUX_11AC, 0x1c00000, optional_ant);421/* Optional RX */422odm_set_bb_reg(dm, ODM_REG_TRMUX_11AC, 0xe000000, default_ant);423/* @Default TX */424#endif425}426427void phydm_update_rx_idle_n(void *dm_void, u8 ant, u32 default_ant,428u32 optional_ant, u32 default_tx_ant)429{430struct dm_struct *dm = (struct dm_struct *)dm_void;431u32 value32;432433if (dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8197F)) {434odm_set_bb_reg(dm, R_0xb38, 0x38, default_ant);435/* @Default RX */436odm_set_bb_reg(dm, R_0xb38, 0x1c0, optional_ant);437/* Optional RX */438odm_set_bb_reg(dm, R_0x860, 0x7000, default_ant);439/* @Default TX */440#if (RTL8723B_SUPPORT == 1)441} else if (dm->support_ic_type == ODM_RTL8723B) {442value32 = odm_get_bb_reg(dm, R_0x948, 0xFFF);443444if (value32 != 0x280)445odm_update_rx_idle_ant_8723b(dm, ant, default_ant,446optional_ant);447else448PHYDM_DBG(dm, DBG_ANT_DIV,449"[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to 0x948 = 0x280\n");450#endif451452#if (RTL8723D_SUPPORT == 1) /*@Mingzhi 2017-05-08*/453} else if (dm->support_ic_type == ODM_RTL8723D) {454phydm_set_tx_ant_pwr_8723d(dm, ant);455odm_update_rx_idle_ant_8723d(dm, ant, default_ant,456optional_ant);457#endif458459#if (RTL8721D_SUPPORT == 1)460} else if (dm->support_ic_type == ODM_RTL8721D) {461odm_update_rx_idle_ant_8721d(dm, ant, default_ant,462optional_ant);463#endif464} else {465/*@8188E & 8188F*/466/*@ if (dm->support_ic_type == ODM_RTL8723D) {*/467/*#if (RTL8723D_SUPPORT == 1)*/468/* phydm_set_tx_ant_pwr_8723d(dm, ant);*/469/*#endif*/470/* }*/471#if (RTL8188F_SUPPORT == 1)472if (dm->support_ic_type == ODM_RTL8188F)473phydm_update_rx_idle_antenna_8188F(dm, default_ant);474#endif475476odm_set_bb_reg(dm, R_0x864, 0x38, default_ant);/*@Default RX*/477odm_set_bb_reg(dm, R_0x864, 0x1c0, optional_ant);478/*Optional RX*/479odm_set_bb_reg(dm, R_0x860, 0x7000, default_tx_ant);480/*@Default TX*/481}482}483484void odm_update_rx_idle_ant(void *dm_void, u8 ant)485{486struct dm_struct *dm = (struct dm_struct *)dm_void;487struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;488u32 default_ant, optional_ant, value32, default_tx_ant;489490if (fat_tab->rx_idle_ant != ant) {491PHYDM_DBG(dm, DBG_ANT_DIV,492"[ Update Rx-Idle-ant ] rx_idle_ant =%s\n",493(ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");494495if (!(dm->support_ic_type & ODM_RTL8723B))496fat_tab->rx_idle_ant = ant;497498if (ant == MAIN_ANT) {499default_ant = ANT1_2G;500optional_ant = ANT2_2G;501} else {502default_ant = ANT2_2G;503optional_ant = ANT1_2G;504}505506if (fat_tab->b_fix_tx_ant != NO_FIX_TX_ANT)507default_tx_ant = (fat_tab->b_fix_tx_ant ==508FIX_TX_AT_MAIN) ? 0 : 1;509else510default_tx_ant = default_ant;511512if (dm->support_ic_type & ODM_N_ANTDIV_SUPPORT) {513phydm_update_rx_idle_n(dm, ant, default_ant,514optional_ant, default_tx_ant);515} else if (dm->support_ic_type & ODM_AC_ANTDIV_SUPPORT) {516phydm_update_rx_idle_ac(dm, ant, default_ant,517optional_ant, default_tx_ant);518}519/*PathA Resp Tx*/520if (dm->support_ic_type & (ODM_RTL8821C | ODM_RTL8822B |521ODM_RTL8814A))522odm_set_mac_reg(dm, R_0x6d8, 0x7, default_tx_ant);523else if (dm->support_ic_type == ODM_RTL8188E)524odm_set_mac_reg(dm, R_0x6d8, 0xc0, default_tx_ant);525else526odm_set_mac_reg(dm, R_0x6d8, 0x700, default_tx_ant);527528} else { /* @fat_tab->rx_idle_ant == ant */529PHYDM_DBG(dm, DBG_ANT_DIV,530"[ Stay in Ori-ant ] rx_idle_ant =%s\n",531(ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");532fat_tab->rx_idle_ant = ant;533}534}535536void phydm_update_rx_idle_ant_pathb(void *dm_void, u8 ant)537{538struct dm_struct *dm = (struct dm_struct *)dm_void;539struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;540u32 default_ant, optional_ant, value32, default_tx_ant;541542if (fat_tab->rx_idle_ant2 != ant) {543PHYDM_DBG(dm, DBG_ANT_DIV,544"[ Update Rx-Idle-ant2 ] rx_idle_ant2 =%s\n",545(ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");546if (ant == MAIN_ANT) {547default_ant = ANT1_2G;548optional_ant = ANT2_2G;549} else {550default_ant = ANT2_2G;551optional_ant = ANT1_2G;552}553554if (fat_tab->b_fix_tx_ant != NO_FIX_TX_ANT)555default_tx_ant = (fat_tab->b_fix_tx_ant ==556FIX_TX_AT_MAIN) ? 0 : 1;557else558default_tx_ant = default_ant;559if (dm->support_ic_type & ODM_RTL8822B) {560u16 v16 = odm_read_2byte(dm, ODM_REG_ANT_11AC_B + 2);561562v16 &= ~(0xff8);/*0xE08[11:3]*/563v16 |= ((u16)default_ant << 3);564v16 |= ((u16)optional_ant << 6);565v16 |= ((u16)default_tx_ant << 9);566odm_write_2byte(dm, ODM_REG_ANT_11AC_B + 2, v16);567odm_set_mac_reg(dm, R_0x6d8, 0x38, default_tx_ant);568/*PathB Resp Tx*/569}570} else {571/* fat_tab->rx_idle_ant2 == ant */572PHYDM_DBG(dm, DBG_ANT_DIV, "[Stay Ori Ant] rx_idle_ant2 = %s\n",573(ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");574fat_tab->rx_idle_ant2 = ant;575}576}577578void phydm_set_antdiv_val(void *dm_void, u32 *val_buf, u8 val_len)579{580struct dm_struct *dm = (struct dm_struct *)dm_void;581582if (val_len != 1) {583PHYDM_DBG(dm, ODM_COMP_API, "[Error][antdiv]Need val_len=1\n");584return;585}586587odm_update_rx_idle_ant(dm, (u8)(*val_buf));588}589590void odm_update_tx_ant(void *dm_void, u8 ant, u32 mac_id)591{592struct dm_struct *dm = (struct dm_struct *)dm_void;593struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;594u8 tx_ant;595596if (fat_tab->b_fix_tx_ant != NO_FIX_TX_ANT)597ant = (fat_tab->b_fix_tx_ant == FIX_TX_AT_MAIN) ?598MAIN_ANT : AUX_ANT;599600if (dm->ant_div_type == CG_TRX_SMART_ANTDIV)601tx_ant = ant;602else {603if (ant == MAIN_ANT)604tx_ant = ANT1_2G;605else606tx_ant = ANT2_2G;607}608609fat_tab->antsel_a[mac_id] = tx_ant & BIT(0);610fat_tab->antsel_b[mac_id] = (tx_ant & BIT(1)) >> 1;611fat_tab->antsel_c[mac_id] = (tx_ant & BIT(2)) >> 2;612613PHYDM_DBG(dm, DBG_ANT_DIV,614"[Set TX-DESC value]: mac_id:(( %d )), tx_ant = (( %s ))\n",615mac_id, (ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");616#if 0617PHYDM_DBG(dm, DBG_ANT_DIV,618"antsel_tr_mux=(( 3'b%d%d%d ))\n",619fat_tab->antsel_c[mac_id], fat_tab->antsel_b[mac_id],620fat_tab->antsel_a[mac_id]);621#endif622}623624#ifdef PHYDM_BEAMFORMING_SUPPORT625#if (DM_ODM_SUPPORT_TYPE == ODM_AP)626627void odm_bdc_init(628void *dm_void)629{630struct dm_struct *dm = (struct dm_struct *)dm_void;631struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;632633PHYDM_DBG(dm, DBG_ANT_DIV, "\n[ BDC Initialization......]\n");634dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;635dm_bdc_table->bdc_mode = BDC_MODE_NULL;636dm_bdc_table->bdc_try_flag = 0;637dm_bdc_table->bd_ccoex_type_wbfer = 0;638dm->bdc_holdstate = 0xff;639640if (dm->support_ic_type == ODM_RTL8192E) {641odm_set_bb_reg(dm, R_0xd7c, 0x0FFFFFFF, 0x1081008);642odm_set_bb_reg(dm, R_0xd80, 0x0FFFFFFF, 0);643} else if (dm->support_ic_type == ODM_RTL8812) {644odm_set_bb_reg(dm, R_0x9b0, 0x0FFFFFFF, 0x1081008);645/* @0x9b0[30:0] = 01081008 */646odm_set_bb_reg(dm, R_0x9b4, 0x0FFFFFFF, 0);647/* @0x9b4[31:0] = 00000000 */648}649}650651void odm_CSI_on_off(652void *dm_void,653u8 CSI_en)654{655struct dm_struct *dm = (struct dm_struct *)dm_void;656if (CSI_en == CSI_ON) {657if (dm->support_ic_type == ODM_RTL8192E)658odm_set_mac_reg(dm, R_0xd84, BIT(11), 1);659/* @0xd84[11]=1 */660else if (dm->support_ic_type == ODM_RTL8812)661odm_set_mac_reg(dm, R_0x9b0, BIT(31), 1);662/* @0x9b0[31]=1 */663664} else if (CSI_en == CSI_OFF) {665if (dm->support_ic_type == ODM_RTL8192E)666odm_set_mac_reg(dm, R_0xd84, BIT(11), 0);667/* @0xd84[11]=0 */668else if (dm->support_ic_type == ODM_RTL8812)669odm_set_mac_reg(dm, R_0x9b0, BIT(31), 0);670/* @0x9b0[31]=0 */671}672}673674void odm_bd_ccoex_type_with_bfer_client(675void *dm_void,676u8 swch)677{678struct dm_struct *dm = (struct dm_struct *)dm_void;679struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;680u8 bd_ccoex_type_wbfer;681682if (swch == DIVON_CSIOFF) {683PHYDM_DBG(dm, DBG_ANT_DIV,684"[BDCcoexType: 1] {DIV,CSI} ={1,0}\n");685bd_ccoex_type_wbfer = 1;686687if (bd_ccoex_type_wbfer != dm_bdc_table->bd_ccoex_type_wbfer) {688odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);689odm_CSI_on_off(dm, CSI_OFF);690dm_bdc_table->bd_ccoex_type_wbfer = 1;691}692} else if (swch == DIVOFF_CSION) {693PHYDM_DBG(dm, DBG_ANT_DIV,694"[BDCcoexType: 2] {DIV,CSI} ={0,1}\n");695bd_ccoex_type_wbfer = 2;696697if (bd_ccoex_type_wbfer != dm_bdc_table->bd_ccoex_type_wbfer) {698odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);699odm_CSI_on_off(dm, CSI_ON);700dm_bdc_table->bd_ccoex_type_wbfer = 2;701}702}703}704705void odm_bf_ant_div_mode_arbitration(706void *dm_void)707{708struct dm_struct *dm = (struct dm_struct *)dm_void;709struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;710u8 current_bdc_mode;711712#if (DM_ODM_SUPPORT_TYPE == ODM_AP)713PHYDM_DBG(dm, DBG_ANT_DIV, "\n");714715/* @2 mode 1 */716if (dm_bdc_table->num_txbfee_client != 0 &&717dm_bdc_table->num_txbfer_client == 0) {718current_bdc_mode = BDC_MODE_1;719720if (current_bdc_mode != dm_bdc_table->bdc_mode) {721dm_bdc_table->bdc_mode = BDC_MODE_1;722odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);723dm_bdc_table->bdc_rx_idle_update_counter = 1;724PHYDM_DBG(dm, DBG_ANT_DIV, "Change to (( Mode1 ))\n");725}726727PHYDM_DBG(dm, DBG_ANT_DIV,728"[Antdiv + BF coextance mode] : (( Mode1 ))\n");729}730/* @2 mode 2 */731else if ((dm_bdc_table->num_txbfee_client == 0) &&732(dm_bdc_table->num_txbfer_client != 0)) {733current_bdc_mode = BDC_MODE_2;734735if (current_bdc_mode != dm_bdc_table->bdc_mode) {736dm_bdc_table->bdc_mode = BDC_MODE_2;737dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;738dm_bdc_table->bdc_try_flag = 0;739PHYDM_DBG(dm, DBG_ANT_DIV, "Change to (( Mode2 ))\n");740}741PHYDM_DBG(dm, DBG_ANT_DIV,742"[Antdiv + BF coextance mode] : (( Mode2 ))\n");743}744/* @2 mode 3 */745else if ((dm_bdc_table->num_txbfee_client != 0) &&746(dm_bdc_table->num_txbfer_client != 0)) {747current_bdc_mode = BDC_MODE_3;748749if (current_bdc_mode != dm_bdc_table->bdc_mode) {750dm_bdc_table->bdc_mode = BDC_MODE_3;751dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;752dm_bdc_table->bdc_try_flag = 0;753dm_bdc_table->bdc_rx_idle_update_counter = 1;754PHYDM_DBG(dm, DBG_ANT_DIV, "Change to (( Mode3 ))\n");755}756757PHYDM_DBG(dm, DBG_ANT_DIV,758"[Antdiv + BF coextance mode] : (( Mode3 ))\n");759}760/* @2 mode 4 */761else if ((dm_bdc_table->num_txbfee_client == 0) &&762(dm_bdc_table->num_txbfer_client == 0)) {763current_bdc_mode = BDC_MODE_4;764765if (current_bdc_mode != dm_bdc_table->bdc_mode) {766dm_bdc_table->bdc_mode = BDC_MODE_4;767odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);768PHYDM_DBG(dm, DBG_ANT_DIV, "Change to (( Mode4 ))\n");769}770771PHYDM_DBG(dm, DBG_ANT_DIV,772"[Antdiv + BF coextance mode] : (( Mode4 ))\n");773}774#endif775}776777void odm_div_train_state_setting(778void *dm_void)779{780struct dm_struct *dm = (struct dm_struct *)dm_void;781struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;782783PHYDM_DBG(dm, DBG_ANT_DIV,784"\n*****[S T A R T ]***** [2-0. DIV_TRAIN_STATE]\n");785dm_bdc_table->bdc_try_counter = 2;786dm_bdc_table->bdc_try_flag = 1;787dm_bdc_table->BDC_state = bdc_bfer_train_state;788odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);789}790791void odm_bd_ccoex_bfee_rx_div_arbitration(792void *dm_void)793{794struct dm_struct *dm = (struct dm_struct *)dm_void;795struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;796boolean stop_bf_flag;797u8 bdc_active_mode;798799#if (DM_ODM_SUPPORT_TYPE == ODM_AP)800801PHYDM_DBG(dm, DBG_ANT_DIV,802"***{ num_BFee, num_BFer, num_client} = (( %d , %d , %d))\n",803dm_bdc_table->num_txbfee_client,804dm_bdc_table->num_txbfer_client, dm_bdc_table->num_client);805PHYDM_DBG(dm, DBG_ANT_DIV,806"***{ num_BF_tars, num_DIV_tars } = (( %d , %d ))\n",807dm_bdc_table->num_bf_tar, dm_bdc_table->num_div_tar);808809/* @2 [ MIB control ] */810if (dm->bdc_holdstate == 2) {811odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);812dm_bdc_table->BDC_state = BDC_BF_HOLD_STATE;813PHYDM_DBG(dm, DBG_ANT_DIV, "Force in [ BF STATE]\n");814return;815} else if (dm->bdc_holdstate == 1) {816dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;817odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);818PHYDM_DBG(dm, DBG_ANT_DIV, "Force in [ DIV STATE]\n");819return;820}821822/* @------------------------------------------------------------ */823824/* @2 mode 2 & 3 */825if (dm_bdc_table->bdc_mode == BDC_MODE_2 ||826dm_bdc_table->bdc_mode == BDC_MODE_3) {827PHYDM_DBG(dm, DBG_ANT_DIV,828"\n{ Try_flag, Try_counter } = { %d , %d }\n",829dm_bdc_table->bdc_try_flag,830dm_bdc_table->bdc_try_counter);831PHYDM_DBG(dm, DBG_ANT_DIV, "BDCcoexType = (( %d ))\n\n",832dm_bdc_table->bd_ccoex_type_wbfer);833834/* @All Client have Bfer-Cap------------------------------- */835if (dm_bdc_table->num_txbfer_client == dm_bdc_table->num_client) {836/* @BFer STA Only?: yes */837PHYDM_DBG(dm, DBG_ANT_DIV,838"BFer STA only? (( Yes ))\n");839dm_bdc_table->bdc_try_flag = 0;840dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;841odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);842return;843} else844PHYDM_DBG(dm, DBG_ANT_DIV,845"BFer STA only? (( No ))\n");846if (dm_bdc_table->is_all_bf_sta_idle == false && dm_bdc_table->is_all_div_sta_idle == true) {847PHYDM_DBG(dm, DBG_ANT_DIV,848"All DIV-STA are idle, but BF-STA not\n");849dm_bdc_table->bdc_try_flag = 0;850dm_bdc_table->BDC_state = bdc_bfer_train_state;851odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);852return;853} else if (dm_bdc_table->is_all_bf_sta_idle == true && dm_bdc_table->is_all_div_sta_idle == false) {854PHYDM_DBG(dm, DBG_ANT_DIV,855"All BF-STA are idle, but DIV-STA not\n");856dm_bdc_table->bdc_try_flag = 0;857dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;858odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);859return;860}861862/* Select active mode-------------------------------------- */863if (dm_bdc_table->num_bf_tar == 0) { /* Selsect_1, Selsect_2 */864if (dm_bdc_table->num_div_tar == 0) { /* Selsect_3 */865PHYDM_DBG(dm, DBG_ANT_DIV,866"Select active mode (( 1 ))\n");867dm_bdc_table->bdc_active_mode = 1;868} else {869PHYDM_DBG(dm, DBG_ANT_DIV,870"Select active mode (( 2 ))\n");871dm_bdc_table->bdc_active_mode = 2;872}873dm_bdc_table->bdc_try_flag = 0;874dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;875odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);876return;877} else { /* num_bf_tar > 0 */878if (dm_bdc_table->num_div_tar == 0) { /* Selsect_3 */879PHYDM_DBG(dm, DBG_ANT_DIV,880"Select active mode (( 3 ))\n");881dm_bdc_table->bdc_active_mode = 3;882dm_bdc_table->bdc_try_flag = 0;883dm_bdc_table->BDC_state = bdc_bfer_train_state;884odm_bd_ccoex_type_with_bfer_client(dm,885DIVOFF_CSION)886;887return;888} else { /* Selsect_4 */889bdc_active_mode = 4;890PHYDM_DBG(dm, DBG_ANT_DIV,891"Select active mode (( 4 ))\n");892893if (bdc_active_mode != dm_bdc_table->bdc_active_mode) {894dm_bdc_table->bdc_active_mode = 4;895PHYDM_DBG(dm, DBG_ANT_DIV, "Change to active mode (( 4 )) & return!!!\n");896return;897}898}899}900901#if 1902if (dm->bdc_holdstate == 0xff) {903dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;904odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);905PHYDM_DBG(dm, DBG_ANT_DIV, "Force in [ DIV STATE]\n");906return;907}908#endif909910/* @Does Client number changed ? ------------------------------- */911if (dm_bdc_table->num_client != dm_bdc_table->pre_num_client) {912dm_bdc_table->bdc_try_flag = 0;913dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;914PHYDM_DBG(dm, DBG_ANT_DIV,915"[ The number of client has been changed !!!] return to (( BDC_DIV_TRAIN_STATE ))\n");916}917dm_bdc_table->pre_num_client = dm_bdc_table->num_client;918919if (dm_bdc_table->bdc_try_flag == 0) {920/* @2 DIV_TRAIN_STATE (mode 2-0) */921if (dm_bdc_table->BDC_state == BDC_DIV_TRAIN_STATE)922odm_div_train_state_setting(dm);923/* @2 BFer_TRAIN_STATE (mode 2-1) */924else if (dm_bdc_table->BDC_state == bdc_bfer_train_state) {925PHYDM_DBG(dm, DBG_ANT_DIV,926"*****[2-1. BFer_TRAIN_STATE ]*****\n");927928#if 0929/* @if(dm_bdc_table->num_bf_tar==0) */930/* @{ */931/* PHYDM_DBG(dm,DBG_ANT_DIV, "BF_tars exist? : (( No )), [ bdc_bfer_train_state ] >> [BDC_DIV_TRAIN_STATE]\n"); */932/* odm_div_train_state_setting( dm); */933/* @} */934/* else */ /* num_bf_tar != 0 */935/* @{ */936#endif937dm_bdc_table->bdc_try_counter = 2;938dm_bdc_table->bdc_try_flag = 1;939dm_bdc_table->BDC_state = BDC_DECISION_STATE;940odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);941PHYDM_DBG(dm, DBG_ANT_DIV,942"BF_tars exist? : (( Yes )), [ bdc_bfer_train_state ] >> [BDC_DECISION_STATE]\n");943/* @} */944}945/* @2 DECISION_STATE (mode 2-2) */946else if (dm_bdc_table->BDC_state == BDC_DECISION_STATE) {947PHYDM_DBG(dm, DBG_ANT_DIV,948"*****[2-2. DECISION_STATE]*****\n");949#if 0950/* @if(dm_bdc_table->num_bf_tar==0) */951/* @{ */952/* ODM_AntDiv_Printk(("BF_tars exist? : (( No )), [ DECISION_STATE ] >> [BDC_DIV_TRAIN_STATE]\n")); */953/* odm_div_train_state_setting( dm); */954/* @} */955/* else */ /* num_bf_tar != 0 */956/* @{ */957#endif958if (dm_bdc_table->BF_pass == false || dm_bdc_table->DIV_pass == false)959stop_bf_flag = true;960else961stop_bf_flag = false;962963PHYDM_DBG(dm, DBG_ANT_DIV,964"BF_tars exist? : (( Yes )), {BF_pass, DIV_pass, stop_bf_flag } = { %d, %d, %d }\n",965dm_bdc_table->BF_pass,966dm_bdc_table->DIV_pass, stop_bf_flag);967968if (stop_bf_flag == true) { /* @DIV_en */969dm_bdc_table->bdc_hold_counter = 10; /* @20 */970odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);971dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;972PHYDM_DBG(dm, DBG_ANT_DIV, "[ stop_bf_flag= ((true)), BDC_DECISION_STATE ] >> [BDC_DIV_HOLD_STATE]\n");973} else { /* @BF_en */974dm_bdc_table->bdc_hold_counter = 10; /* @20 */975odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);976dm_bdc_table->BDC_state = BDC_BF_HOLD_STATE;977PHYDM_DBG(dm, DBG_ANT_DIV, "[stop_bf_flag= ((false)), BDC_DECISION_STATE ] >> [BDC_BF_HOLD_STATE]\n");978}979/* @} */980}981/* @2 BF-HOLD_STATE (mode 2-3) */982else if (dm_bdc_table->BDC_state == BDC_BF_HOLD_STATE) {983PHYDM_DBG(dm, DBG_ANT_DIV,984"*****[2-3. BF_HOLD_STATE ]*****\n");985986PHYDM_DBG(dm, DBG_ANT_DIV,987"bdc_hold_counter = (( %d ))\n",988dm_bdc_table->bdc_hold_counter);989990if (dm_bdc_table->bdc_hold_counter == 1) {991PHYDM_DBG(dm, DBG_ANT_DIV, "[ BDC_BF_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE]\n");992odm_div_train_state_setting(dm);993} else {994dm_bdc_table->bdc_hold_counter--;995996#if 0997/* @if(dm_bdc_table->num_bf_tar==0) */998/* @{ */999/* PHYDM_DBG(dm,DBG_ANT_DIV, "BF_tars exist? : (( No )), [ BDC_BF_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE]\n"); */1000/* odm_div_train_state_setting( dm); */1001/* @} */1002/* else */ /* num_bf_tar != 0 */1003/* @{ */1004/* PHYDM_DBG(dm,DBG_ANT_DIV, "BF_tars exist? : (( Yes ))\n"); */1005#endif1006dm_bdc_table->BDC_state = BDC_BF_HOLD_STATE;1007odm_bd_ccoex_type_with_bfer_client(dm, DIVOFF_CSION);1008PHYDM_DBG(dm, DBG_ANT_DIV, "[ BDC_BF_HOLD_STATE ] >> [BDC_BF_HOLD_STATE]\n");1009/* @} */1010}1011}1012/* @2 DIV-HOLD_STATE (mode 2-4) */1013else if (dm_bdc_table->BDC_state == BDC_DIV_HOLD_STATE) {1014PHYDM_DBG(dm, DBG_ANT_DIV,1015"*****[2-4. DIV_HOLD_STATE ]*****\n");10161017PHYDM_DBG(dm, DBG_ANT_DIV,1018"bdc_hold_counter = (( %d ))\n",1019dm_bdc_table->bdc_hold_counter);10201021if (dm_bdc_table->bdc_hold_counter == 1) {1022PHYDM_DBG(dm, DBG_ANT_DIV, "[ BDC_DIV_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE]\n");1023odm_div_train_state_setting(dm);1024} else {1025dm_bdc_table->bdc_hold_counter--;1026dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;1027odm_bd_ccoex_type_with_bfer_client(dm, DIVON_CSIOFF);1028PHYDM_DBG(dm, DBG_ANT_DIV, "[ BDC_DIV_HOLD_STATE ] >> [BDC_DIV_HOLD_STATE]\n");1029}1030}10311032} else if (dm_bdc_table->bdc_try_flag == 1) {1033/* @2 Set Training counter */1034if (dm_bdc_table->bdc_try_counter > 1) {1035dm_bdc_table->bdc_try_counter--;1036if (dm_bdc_table->bdc_try_counter == 1)1037dm_bdc_table->bdc_try_flag = 0;10381039PHYDM_DBG(dm, DBG_ANT_DIV, "Training !!\n");1040/* return ; */1041}1042}1043}10441045PHYDM_DBG(dm, DBG_ANT_DIV, "\n[end]\n");10461047#endif /* @#if(DM_ODM_SUPPORT_TYPE == ODM_AP) */1048}10491050#endif1051#endif /* @#ifdef PHYDM_BEAMFORMING_SUPPORT*/10521053#if (RTL8188E_SUPPORT == 1)10541055void odm_rx_hw_ant_div_init_88e(void *dm_void)1056{1057struct dm_struct *dm = (struct dm_struct *)dm_void;1058u32 value32;1059struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;10601061PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);10621063/* @MAC setting */1064value32 = odm_get_mac_reg(dm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD);1065odm_set_mac_reg(dm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD,1066value32 | (BIT(23) | BIT(25)));1067/* Reg4C[25]=1, Reg4C[23]=1 for pin output */1068/* Pin Settings */1069odm_set_bb_reg(dm, ODM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);1070/* reg870[8]=1'b0, reg870[9]=1'b0 */1071/* antsel antselb by HW */1072odm_set_bb_reg(dm, ODM_REG_RX_ANT_CTRL_11N, BIT(10), 0);1073/* reg864[10]=1'b0 */ /* antsel2 by HW */1074odm_set_bb_reg(dm, ODM_REG_LNA_SWITCH_11N, BIT(22), 1);1075/* regb2c[22]=1'b0 */ /* disable CS/CG switch */1076odm_set_bb_reg(dm, ODM_REG_LNA_SWITCH_11N, BIT(31), 1);1077/* regb2c[31]=1'b1 */ /* output at CG only */1078/* OFDM Settings */1079odm_set_bb_reg(dm, ODM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);1080/* @CCK Settings */1081odm_set_bb_reg(dm, ODM_REG_BB_PWR_SAV4_11N, BIT(7), 1);1082/* @Fix CCK PHY status report issue */1083odm_set_bb_reg(dm, ODM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1);1084/* @CCK complete HW AntDiv within 64 samples */10851086odm_set_bb_reg(dm, ODM_REG_ANT_MAPPING1_11N, 0xFFFF, 0x0001);1087/* @antenna mapping table */10881089fat_tab->enable_ctrl_frame_antdiv = 1;1090}10911092void odm_trx_hw_ant_div_init_88e(void *dm_void)1093{1094struct dm_struct *dm = (struct dm_struct *)dm_void;1095u32 value32;1096struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;109710981099PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);11001101/* @MAC setting */1102value32 = odm_get_mac_reg(dm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD);1103odm_set_mac_reg(dm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD,1104value32 | (BIT(23) | BIT(25)));1105/* Reg4C[25]=1, Reg4C[23]=1 for pin output */1106/* Pin Settings */1107odm_set_bb_reg(dm, ODM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);1108/* reg870[8]=1'b0, reg870[9]=1'b0 */1109/* antsel antselb by HW */1110odm_set_bb_reg(dm, ODM_REG_RX_ANT_CTRL_11N, BIT(10), 0);1111/* reg864[10]=1'b0 */ /* antsel2 by HW */1112odm_set_bb_reg(dm, ODM_REG_LNA_SWITCH_11N, BIT(22), 0);1113/* regb2c[22]=1'b0 */ /* disable CS/CG switch */1114odm_set_bb_reg(dm, ODM_REG_LNA_SWITCH_11N, BIT(31), 1);1115/* regb2c[31]=1'b1 */ /* output at CG only */1116/* OFDM Settings */1117odm_set_bb_reg(dm, ODM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);1118/* @CCK Settings */1119odm_set_bb_reg(dm, ODM_REG_BB_PWR_SAV4_11N, BIT(7), 1);1120/* @Fix CCK PHY status report issue */1121odm_set_bb_reg(dm, ODM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1);1122/* @CCK complete HW AntDiv within 64 samples */11231124/* @antenna mapping table */1125if (!dm->is_mp_chip) { /* testchip */1126odm_set_bb_reg(dm, ODM_REG_RX_DEFAULT_A_11N, 0x700, 1);1127/* Reg858[10:8]=3'b001 */1128odm_set_bb_reg(dm, ODM_REG_RX_DEFAULT_A_11N, 0x3800, 2);1129/* Reg858[13:11]=3'b010 */1130} else /* @MPchip */1131odm_set_bb_reg(dm, ODM_REG_ANT_MAPPING1_11N, MASKDWORD, 0x0201);1132/*Reg914=3'b010, Reg915=3'b001*/11331134fat_tab->enable_ctrl_frame_antdiv = 1;1135}11361137#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))1138void odm_smart_hw_ant_div_init_88e(1139void *dm_void)1140{1141struct dm_struct *dm = (struct dm_struct *)dm_void;1142u32 value32, i;1143struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;11441145PHYDM_DBG(dm, DBG_ANT_DIV,1146"***8188E AntDiv_Init => ant_div_type=[CG_TRX_SMART_ANTDIV]\n");11471148#if 01149if (*dm->mp_mode == true) {1150PHYDM_DBG(dm, ODM_COMP_INIT, "dm->ant_div_type: %d\n",1151dm->ant_div_type);1152return;1153}1154#endif11551156fat_tab->train_idx = 0;1157fat_tab->fat_state = FAT_PREPARE_STATE;11581159dm->fat_comb_a = 5;1160dm->antdiv_intvl = 0x64; /* @100ms */11611162for (i = 0; i < 6; i++)1163fat_tab->bssid[i] = 0;1164for (i = 0; i < (dm->fat_comb_a); i++) {1165fat_tab->ant_sum_rssi[i] = 0;1166fat_tab->ant_rssi_cnt[i] = 0;1167fat_tab->ant_ave_rssi[i] = 0;1168}11691170/* @MAC setting */1171value32 = odm_get_mac_reg(dm, R_0x4c, MASKDWORD);1172odm_set_mac_reg(dm, R_0x4c, MASKDWORD, value32 | (BIT(23) | BIT(25))); /* Reg4C[25]=1, Reg4C[23]=1 for pin output */1173value32 = odm_get_mac_reg(dm, R_0x7b4, MASKDWORD);1174odm_set_mac_reg(dm, R_0x7b4, MASKDWORD, value32 | (BIT(16) | BIT(17))); /* Reg7B4[16]=1 enable antenna training, Reg7B4[17]=1 enable A2 match */1175/* value32 = platform_efio_read_4byte(adapter, 0x7B4); */1176/* platform_efio_write_4byte(adapter, 0x7b4, value32|BIT(18)); */ /* append MACID in reponse packet */11771178/* @Match MAC ADDR */1179odm_set_mac_reg(dm, R_0x7b4, 0xFFFF, 0);1180odm_set_mac_reg(dm, R_0x7b0, MASKDWORD, 0);11811182odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0); /* reg870[8]=1'b0, reg870[9]=1'b0 */ /* antsel antselb by HW */1183odm_set_bb_reg(dm, R_0x864, BIT(10), 0); /* reg864[10]=1'b0 */ /* antsel2 by HW */1184odm_set_bb_reg(dm, R_0xb2c, BIT(22), 0); /* regb2c[22]=1'b0 */ /* disable CS/CG switch */1185odm_set_bb_reg(dm, R_0xb2c, BIT(31), 0); /* regb2c[31]=1'b1 */ /* output at CS only */1186odm_set_bb_reg(dm, R_0xca4, MASKDWORD, 0x000000a0);11871188/* @antenna mapping table */1189if (dm->fat_comb_a == 2) {1190if (!dm->is_mp_chip) { /* testchip */1191odm_set_bb_reg(dm, R_0x858, BIT(10) | BIT(9) | BIT(8), 1); /* Reg858[10:8]=3'b001 */1192odm_set_bb_reg(dm, R_0x858, BIT(13) | BIT(12) | BIT(11), 2); /* Reg858[13:11]=3'b010 */1193} else { /* @MPchip */1194odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 1);1195odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 2);1196}1197} else {1198if (!dm->is_mp_chip) { /* testchip */1199odm_set_bb_reg(dm, R_0x858, BIT(10) | BIT(9) | BIT(8), 0); /* Reg858[10:8]=3'b000 */1200odm_set_bb_reg(dm, R_0x858, BIT(13) | BIT(12) | BIT(11), 1); /* Reg858[13:11]=3'b001 */1201odm_set_bb_reg(dm, R_0x878, BIT(16), 0);1202odm_set_bb_reg(dm, R_0x858, BIT(15) | BIT(14), 2); /* @(Reg878[0],Reg858[14:15])=3'b010 */1203odm_set_bb_reg(dm, R_0x878, BIT(19) | BIT(18) | BIT(17), 3); /* Reg878[3:1]=3b'011 */1204odm_set_bb_reg(dm, R_0x878, BIT(22) | BIT(21) | BIT(20), 4); /* Reg878[6:4]=3b'100 */1205odm_set_bb_reg(dm, R_0x878, BIT(25) | BIT(24) | BIT(23), 5); /* Reg878[9:7]=3b'101 */1206odm_set_bb_reg(dm, R_0x878, BIT(28) | BIT(27) | BIT(26), 6); /* Reg878[12:10]=3b'110 */1207odm_set_bb_reg(dm, R_0x878, BIT(31) | BIT(30) | BIT(29), 7); /* Reg878[15:13]=3b'111 */1208} else { /* @MPchip */1209odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 4); /* @0: 3b'000 */1210odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 2); /* @1: 3b'001 */1211odm_set_bb_reg(dm, R_0x914, MASKBYTE2, 0); /* @2: 3b'010 */1212odm_set_bb_reg(dm, R_0x914, MASKBYTE3, 1); /* @3: 3b'011 */1213odm_set_bb_reg(dm, R_0x918, MASKBYTE0, 3); /* @4: 3b'100 */1214odm_set_bb_reg(dm, R_0x918, MASKBYTE1, 5); /* @5: 3b'101 */1215odm_set_bb_reg(dm, R_0x918, MASKBYTE2, 6); /* @6: 3b'110 */1216odm_set_bb_reg(dm, R_0x918, MASKBYTE3, 255); /* @7: 3b'111 */1217}1218}12191220/* @Default ant setting when no fast training */1221odm_set_bb_reg(dm, R_0x864, BIT(5) | BIT(4) | BIT(3), 0); /* @Default RX */1222odm_set_bb_reg(dm, R_0x864, BIT(8) | BIT(7) | BIT(6), 1); /* Optional RX */1223odm_set_bb_reg(dm, R_0x860, BIT(14) | BIT(13) | BIT(12), 0); /* @Default TX */12241225/* @Enter Traing state */1226odm_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 */12271228#if 01229/* SW Control */1230/* phy_set_bb_reg(adapter, 0x864, BIT10, 1); */1231/* phy_set_bb_reg(adapter, 0x870, BIT9, 1); */1232/* phy_set_bb_reg(adapter, 0x870, BIT8, 1); */1233/* phy_set_bb_reg(adapter, 0x864, BIT11, 1); */1234/* phy_set_bb_reg(adapter, 0x860, BIT9, 0); */1235/* phy_set_bb_reg(adapter, 0x860, BIT8, 0); */1236#endif1237}1238#endif12391240#endif /* @#if (RTL8188E_SUPPORT == 1) */12411242#if (RTL8192E_SUPPORT == 1)1243void odm_rx_hw_ant_div_init_92e(void *dm_void)1244{1245struct dm_struct *dm = (struct dm_struct *)dm_void;1246struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;12471248#if 01249if (*dm->mp_mode == true) {1250odm_ant_div_on_off(dm, ANTDIV_OFF);1251odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);1252/* r_rxdiv_enable_anta regc50[8]=1'b0 0: control by c50[9] */1253odm_set_bb_reg(dm, R_0xc50, BIT(9), 1);1254/* @1:CG, 0:CS */1255return;1256}1257#endif12581259PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);12601261/* Pin Settings */1262odm_set_bb_reg(dm, R_0x870, BIT(8), 0);1263/* reg870[8]=1'b0, antsel is controled by HWs */1264odm_set_bb_reg(dm, R_0xc50, BIT(8), 1);1265/* regc50[8]=1'b1 CS/CG switching is controled by HWs*/12661267/* @Mapping table */1268odm_set_bb_reg(dm, R_0x914, 0xFFFF, 0x0100);1269/* @antenna mapping table */12701271/* OFDM Settings */1272odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xA0); /* thershold */1273odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x0); /* @bias */12741275/* @CCK Settings */1276odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);1277/* Select which path to receive for CCK_1 & CCK_2 */1278odm_set_bb_reg(dm, R_0xb34, BIT(30), 0);1279/* @(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */1280odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);1281/* @Fix CCK PHY status report issue */1282odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);1283/* @CCK complete HW AntDiv within 64 samples */12841285#ifdef ODM_EVM_ENHANCE_ANTDIV1286phydm_evm_sw_antdiv_init(dm);1287#endif1288}12891290void odm_trx_hw_ant_div_init_92e(void *dm_void)1291{1292struct dm_struct *dm = (struct dm_struct *)dm_void;12931294#if 01295if (*dm->mp_mode == true) {1296odm_ant_div_on_off(dm, ANTDIV_OFF);1297odm_set_bb_reg(dm, R_0xc50, BIT(8), 0); /* r_rxdiv_enable_anta regc50[8]=1'b0 0: control by c50[9] */1298odm_set_bb_reg(dm, R_0xc50, BIT(9), 1); /* @1:CG, 0:CS */1299return;1300}1301#endif13021303PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);13041305/* @3 --RFE pin setting--------- */1306/* @[MAC] */1307odm_set_mac_reg(dm, R_0x38, BIT(11), 1);1308/* @DBG PAD Driving control (GPIO 8) */1309odm_set_mac_reg(dm, R_0x4c, BIT(23), 0); /* path-A, RFE_CTRL_3 */1310odm_set_mac_reg(dm, R_0x4c, BIT(29), 1); /* path-A, RFE_CTRL_8 */1311/* @[BB] */1312odm_set_bb_reg(dm, R_0x944, BIT(3), 1); /* RFE_buffer */1313odm_set_bb_reg(dm, R_0x944, BIT(8), 1);1314odm_set_bb_reg(dm, R_0x940, BIT(7) | BIT(6), 0x0);1315/* r_rfe_path_sel_ (RFE_CTRL_3) */1316odm_set_bb_reg(dm, R_0x940, BIT(17) | BIT(16), 0x0);1317/* r_rfe_path_sel_ (RFE_CTRL_8) */1318odm_set_bb_reg(dm, R_0x944, BIT(31), 0); /* RFE_buffer */1319odm_set_bb_reg(dm, R_0x92c, BIT(3), 0); /* rfe_inv (RFE_CTRL_3) */1320odm_set_bb_reg(dm, R_0x92c, BIT(8), 1); /* rfe_inv (RFE_CTRL_8) */1321odm_set_bb_reg(dm, R_0x930, 0xF000, 0x8); /* path-A, RFE_CTRL_3 */1322odm_set_bb_reg(dm, R_0x934, 0xF, 0x8); /* path-A, RFE_CTRL_8 */1323/* @3 ------------------------- */13241325/* Pin Settings */1326odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);1327/* path-A */ /* disable CS/CG switch */13281329#if 01330/* @Let it follows PHY_REG for bit9 setting */1331if (dm->priv->pshare->rf_ft_var.use_ext_pa ||1332dm->priv->pshare->rf_ft_var.use_ext_lna)1333odm_set_bb_reg(dm, R_0xc50, BIT(9), 1);/* path-A output at CS */1334else1335odm_set_bb_reg(dm, R_0xc50, BIT(9), 0);1336/* path-A output at CG ->normal power */1337#endif13381339odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0);1340/* path-A*/ /* antsel antselb by HW */1341odm_set_bb_reg(dm, R_0xb38, BIT(10), 0);/* path-A*/ /* antsel2 by HW */13421343/* @Mapping table */1344odm_set_bb_reg(dm, R_0x914, 0xFFFF, 0x0100);1345/* @antenna mapping table */13461347/* OFDM Settings */1348odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xA0); /* thershold */1349odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x0); /* @bias */13501351/* @CCK Settings */1352odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);1353/* Select which path to receive for CCK_1 & CCK_2 */1354odm_set_bb_reg(dm, R_0xb34, BIT(30), 0);1355/* @(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */1356odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);1357/* @Fix CCK PHY status report issue */1358odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);1359/* @CCK complete HW AntDiv within 64 samples */13601361#ifdef ODM_EVM_ENHANCE_ANTDIV1362phydm_evm_sw_antdiv_init(dm);1363#endif1364}13651366#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))1367void odm_smart_hw_ant_div_init_92e(1368void *dm_void)1369{1370struct dm_struct *dm = (struct dm_struct *)dm_void;13711372PHYDM_DBG(dm, DBG_ANT_DIV,1373"***8192E AntDiv_Init => ant_div_type=[CG_TRX_SMART_ANTDIV]\n");1374}1375#endif13761377#endif /* @#if (RTL8192E_SUPPORT == 1) */13781379#if (RTL8192F_SUPPORT == 1)1380void odm_rx_hw_ant_div_init_92f(void *dm_void)1381{1382struct dm_struct *dm = (struct dm_struct *)dm_void;1383struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;13841385PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);13861387/* Pin Settings */1388odm_set_bb_reg(dm, R_0x870, BIT(8), 0);1389/* reg870[8]=1'b0, "antsel" is controlled by HWs */1390odm_set_bb_reg(dm, R_0xc50, BIT(8), 1);1391/* regc50[8]=1'b1, " CS/CG switching" is controlled by HWs */13921393/* @Mapping table */1394odm_set_bb_reg(dm, R_0x914, 0xFFFF, 0x0100);1395/* @antenna mapping table */13961397/* OFDM Settings */1398odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xA0); /* thershold */1399odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x0); /* @bias */14001401/* @CCK Settings */1402odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);1403/* Select which path to receive for CCK_1 & CCK_2 */1404odm_set_bb_reg(dm, R_0xb34, BIT(30), 0);1405/* @(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */1406odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);1407/* @Fix CCK PHY status report issue */1408odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);1409/* @CCK complete HW AntDiv within 64 samples */14101411#ifdef ODM_EVM_ENHANCE_ANTDIV1412phydm_evm_sw_antdiv_init(dm);1413#endif1414}14151416void odm_trx_hw_ant_div_init_92f(void *dm_void)14171418{1419struct dm_struct *dm = (struct dm_struct *)dm_void;14201421PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);1422/* @3 --RFE pin setting--------- */1423/* @[MAC] */1424odm_set_mac_reg(dm, R_0x1048, BIT(0), 1);1425/* @DBG PAD Driving control (gpioA_0) */1426odm_set_mac_reg(dm, R_0x1048, BIT(1), 1);1427/* @DBG PAD Driving control (gpioA_1) */1428odm_set_mac_reg(dm, R_0x4c, BIT(24), 1);1429odm_set_mac_reg(dm, R_0x1038, BIT(25) | BIT(24) | BIT(23), 0);1430/* @gpioA_0,gpioA_1*/1431odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);1432/* @[BB] */1433odm_set_bb_reg(dm, R_0x944, BIT(8), 1); /* output enable */1434odm_set_bb_reg(dm, R_0x944, BIT(9), 1);1435odm_set_bb_reg(dm, R_0x940, BIT(16) | BIT(17), 0x0);1436/* r_rfe_path_sel_ (RFE_CTRL_8) */1437odm_set_bb_reg(dm, R_0x940, BIT(18) | BIT(19), 0x0);1438/* r_rfe_path_sel_ (RFE_CTRL_9) */1439odm_set_bb_reg(dm, R_0x944, BIT(31), 0); /* RFE_buffer_en */1440odm_set_bb_reg(dm, R_0x92c, BIT(8), 0); /* rfe_inv (RFE_CTRL_8) */1441odm_set_bb_reg(dm, R_0x92c, BIT(9), 1); /* rfe_inv (RFE_CTRL_9) */1442odm_set_bb_reg(dm, R_0x934, 0xF, 0x8); /* path-A, RFE_CTRL_8 */1443odm_set_bb_reg(dm, R_0x934, 0xF0, 0x8); /* path-A, RFE_CTRL_9 */1444/* @3 ------------------------- */14451446/* Pin Settings */1447odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);1448/* path-A,disable CS/CG switch */1449odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0);1450/* path-A*, antsel antselb by HW */1451odm_set_bb_reg(dm, R_0xb38, BIT(10), 0); /* path-A ,antsel2 by HW */14521453/* @Mapping table */1454odm_set_bb_reg(dm, R_0x914, 0xFFFF, 0x0100);1455/* @antenna mapping table */14561457/* OFDM Settings */1458odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xA0); /* thershold */1459odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x0); /* @bias */14601461/* @CCK Settings */1462odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);1463/* Select which path to receive for CCK_1 & CCK_2 */1464odm_set_bb_reg(dm, R_0xb34, BIT(30), 0);1465/* @(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */1466odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);1467/* @Fix CCK PHY status report issue */1468odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);1469/* @CCK complete HW AntDiv within 64 samples */14701471#ifdef ODM_EVM_ENHANCE_ANTDIV1472phydm_evm_sw_antdiv_init(dm);1473#endif1474}14751476#endif /* @#if (RTL8192F_SUPPORT == 1) */14771478#if (RTL8822B_SUPPORT == 1)1479void phydm_trx_hw_ant_div_init_22b(void *dm_void)1480{1481struct dm_struct *dm = (struct dm_struct *)dm_void;14821483PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);14841485/* Pin Settings */1486odm_set_bb_reg(dm, R_0xcb8, BIT(21) | BIT(20), 0x1);1487odm_set_bb_reg(dm, R_0xcb8, BIT(23) | BIT(22), 0x1);1488odm_set_bb_reg(dm, R_0xc1c, BIT(7) | BIT(6), 0x0);1489/* @------------------------- */14901491/* @Mapping table */1492/* @antenna mapping table */1493odm_set_bb_reg(dm, R_0xca4, 0xFFFF, 0x0100);14941495/* OFDM Settings */1496/* thershold */1497odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0);1498/* @bias */1499odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x0);1500odm_set_bb_reg(dm, R_0x668, BIT(3), 0x1);15011502/* @CCK Settings */1503/* Select which path to receive for CCK_1 & CCK_2 */1504odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);1505/* @Fix CCK PHY status report issue */1506odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);1507/* @CCK complete HW AntDiv within 64 samples */1508odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);1509/* @BT Coexistence */1510/* @keep antsel_map when GNT_BT = 1 */1511odm_set_bb_reg(dm, R_0xcac, BIT(9), 1);1512/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */1513odm_set_bb_reg(dm, R_0x804, BIT(4), 1);1514/* response TX ant by RX ant */1515odm_set_mac_reg(dm, R_0x668, BIT(3), 1);1516#if (defined(CONFIG_2T4R_ANTENNA))1517PHYDM_DBG(dm, DBG_ANT_DIV,1518"***8822B AntDiv_Init => 2T4R case\n");1519/* Pin Settings */1520odm_set_bb_reg(dm, R_0xeb8, BIT(21) | BIT(20), 0x1);1521odm_set_bb_reg(dm, R_0xeb8, BIT(23) | BIT(22), 0x1);1522odm_set_bb_reg(dm, R_0xe1c, BIT(7) | BIT(6), 0x0);1523/* @BT Coexistence */1524odm_set_bb_reg(dm, R_0xeac, BIT(9), 1);1525/* @keep antsel_map when GNT_BT = 1 */1526/* Mapping table */1527/* antenna mapping table */1528odm_set_bb_reg(dm, R_0xea4, 0xFFFF, 0x0100);1529/*odm_set_bb_reg(dm, R_0x900, 0x30000, 0x3);*/1530#endif15311532#ifdef ODM_EVM_ENHANCE_ANTDIV1533phydm_evm_sw_antdiv_init(dm);1534#endif1535}1536#endif /* @#if (RTL8822B_SUPPORT == 1) */15371538#if (RTL8197F_SUPPORT == 1)1539void phydm_rx_hw_ant_div_init_97f(void *dm_void)1540{1541struct dm_struct *dm = (struct dm_struct *)dm_void;1542struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;15431544#if 01545if (*dm->mp_mode == true) {1546odm_ant_div_on_off(dm, ANTDIV_OFF);1547odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);1548/* r_rxdiv_enable_anta regc50[8]=1'b0 0: control by c50[9] */1549odm_set_bb_reg(dm, R_0xc50, BIT(9), 1); /* @1:CG, 0:CS */1550return;1551}1552#endif1553PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);15541555/* Pin Settings */1556odm_set_bb_reg(dm, R_0x870, BIT(8), 0);1557/* reg870[8]=1'b0, */ /* "antsel" is controlled by HWs */1558odm_set_bb_reg(dm, R_0xc50, BIT(8), 1);1559/* regc50[8]=1'b1 *//*"CS/CG switching" is controlled by HWs */15601561/* @Mapping table */1562odm_set_bb_reg(dm, R_0x914, 0xFFFF, 0x0100);1563/* @antenna mapping table */15641565/* OFDM Settings */1566odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xA0); /* thershold */1567odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x0); /* @bias */15681569/* @CCK Settings */1570odm_set_bb_reg(dm, R_0xa04, 0xF000000, 0);1571/* Select which path to receive for CCK_1 & CCK_2 */1572odm_set_bb_reg(dm, R_0xb34, BIT(30), 0);1573/* @(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */1574odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);1575/* @Fix CCK PHY status report issue */1576odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);1577/* @CCK complete HW AntDiv within 64 samples */15781579#ifdef ODM_EVM_ENHANCE_ANTDIV1580phydm_evm_sw_antdiv_init(dm);1581#endif1582}1583#endif //#if (RTL8197F_SUPPORT == 1)15841585#if (RTL8723D_SUPPORT == 1)1586void odm_trx_hw_ant_div_init_8723d(void *dm_void)1587{1588struct dm_struct *dm = (struct dm_struct *)dm_void;15891590PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);15911592/*@BT Coexistence*/1593/*@keep antsel_map when GNT_BT = 1*/1594odm_set_bb_reg(dm, R_0x864, BIT(12), 1);1595/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */1596odm_set_bb_reg(dm, R_0x874, BIT(23), 0);1597/* @Disable hw antsw & fast_train.antsw when BT TX/RX */1598odm_set_bb_reg(dm, R_0xe64, 0xFFFF0000, 0x000c);15991600odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0);1601#if 01602/*PTA setting: WL_BB_SEL_BTG_TRXG_anta, (1: HW CTRL 0: SW CTRL)*/1603/*odm_set_bb_reg(dm, R_0x948, BIT6, 0);*/1604/*odm_set_bb_reg(dm, R_0x948, BIT8, 0);*/1605#endif1606/*@GNT_WL tx*/1607odm_set_bb_reg(dm, R_0x950, BIT(29), 0);16081609/*@Mapping Table*/1610odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 0);1611odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 3);1612#if 01613/* odm_set_bb_reg(dm, R_0x864, BIT5|BIT4|BIT3, 0); */1614/* odm_set_bb_reg(dm, R_0x864, BIT8|BIT7|BIT6, 1); */1615#endif16161617/* Set WLBB_SEL_RF_ON 1 if RXFIR_PWDB > 0xCcc[3:0] */1618odm_set_bb_reg(dm, R_0xccc, BIT(12), 0);1619/* @Low-to-High threshold for WLBB_SEL_RF_ON when OFDM enable */1620odm_set_bb_reg(dm, R_0xccc, 0x0F, 0x01);1621/* @High-to-Low threshold for WLBB_SEL_RF_ON when OFDM enable */1622odm_set_bb_reg(dm, R_0xccc, 0xF0, 0x0);1623/* @b Low-to-High threshold for WLBB_SEL_RF_ON when OFDM disable (CCK)*/1624odm_set_bb_reg(dm, R_0xabc, 0xFF, 0x06);1625/* @High-to-Low threshold for WLBB_SEL_RF_ON when OFDM disable (CCK) */1626odm_set_bb_reg(dm, R_0xabc, 0xFF00, 0x00);16271628/*OFDM HW AntDiv Parameters*/1629odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xa0);1630odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x00);1631odm_set_bb_reg(dm, R_0xc5c, BIT(20) | BIT(19) | BIT(18), 0x04);16321633/*@CCK HW AntDiv Parameters*/1634odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);1635odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);1636odm_set_bb_reg(dm, R_0xaa8, BIT(8), 0);16371638odm_set_bb_reg(dm, R_0xa0c, 0x0F, 0xf);1639odm_set_bb_reg(dm, R_0xa14, 0x1F, 0x8);1640odm_set_bb_reg(dm, R_0xa10, BIT(13), 0x1);1641odm_set_bb_reg(dm, R_0xa74, BIT(8), 0x0);1642odm_set_bb_reg(dm, R_0xb34, BIT(30), 0x1);16431644/*@disable antenna training */1645odm_set_bb_reg(dm, R_0xe08, BIT(16), 0);1646odm_set_bb_reg(dm, R_0xc50, BIT(8), 0);1647}1648/*@Mingzhi 2017-05-08*/16491650void odm_s0s1_sw_ant_div_init_8723d(void *dm_void)1651{1652struct dm_struct *dm = (struct dm_struct *)dm_void;1653struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;1654struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;16551656PHYDM_DBG(dm, DBG_ANT_DIV,1657"***8723D AntDiv_Init => ant_div_type=[ S0S1_SW_AntDiv]\n");16581659/*@keep antsel_map when GNT_BT = 1*/1660odm_set_bb_reg(dm, R_0x864, BIT(12), 1);16611662/* @Disable antsw when GNT_BT=1 */1663odm_set_bb_reg(dm, R_0x874, BIT(23), 0);16641665/* @Mapping Table */1666odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 0);1667odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 1);16681669/* Output Pin Settings */1670#if 01671/* odm_set_bb_reg(dm, R_0x948, BIT6, 0x1); */1672#endif1673odm_set_bb_reg(dm, R_0x870, BIT(8), 1);1674odm_set_bb_reg(dm, R_0x870, BIT(9), 1);16751676/* Status init */1677fat_tab->is_become_linked = false;1678swat_tab->try_flag = SWAW_STEP_INIT;1679swat_tab->double_chk_flag = 0;1680swat_tab->cur_antenna = MAIN_ANT;1681swat_tab->pre_ant = MAIN_ANT;1682dm->antdiv_counter = CONFIG_ANTDIV_PERIOD;16831684/* @2 [--For HW Bug setting] */1685odm_set_bb_reg(dm, R_0x80c, BIT(21), 0); /* TX ant by Reg */1686}16871688void odm_update_rx_idle_ant_8723d(void *dm_void, u8 ant, u32 default_ant,1689u32 optional_ant)1690{1691struct dm_struct *dm = (struct dm_struct *)dm_void;1692struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;1693void *adapter = dm->adapter;1694u8 count = 0;16951696#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))1697/*score board to BT ,a002:WL to do ant-div*/1698odm_set_mac_reg(dm, R_0xa8, MASKHWORD, 0xa002);1699ODM_delay_us(50);1700#endif1701#if 01702/* odm_set_bb_reg(dm, R_0x948, BIT(6), 0x1); */1703#endif1704if (dm->ant_div_type == S0S1_SW_ANTDIV) {1705odm_set_bb_reg(dm, R_0x860, BIT(8), default_ant);1706odm_set_bb_reg(dm, R_0x860, BIT(9), default_ant);1707}1708odm_set_bb_reg(dm, R_0x864, BIT(5) | BIT(4) | BIT(3), default_ant);1709/*@Default RX*/1710odm_set_bb_reg(dm, R_0x864, BIT(8) | BIT(7) | BIT(6), optional_ant);1711/*Optional RX*/1712odm_set_bb_reg(dm, R_0x860, BIT(14) | BIT(13) | BIT(12), default_ant);1713/*@Default TX*/1714fat_tab->rx_idle_ant = ant;1715#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))1716/*score board to BT ,a000:WL@S1 a001:WL@S0*/1717if (default_ant == ANT1_2G)1718odm_set_mac_reg(dm, R_0xa8, MASKHWORD, 0xa000);1719else1720odm_set_mac_reg(dm, R_0xa8, MASKHWORD, 0xa001);1721#endif1722}17231724void phydm_set_tx_ant_pwr_8723d(void *dm_void, u8 ant)1725{1726struct dm_struct *dm = (struct dm_struct *)dm_void;1727struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;1728void *adapter = dm->adapter;17291730fat_tab->rx_idle_ant = ant;17311732#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)1733((PADAPTER)adapter)->HalFunc.SetTxPowerLevelHandler(adapter, *dm->channel);1734#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)1735rtw_hal_set_tx_power_level(adapter, *dm->channel);1736#endif1737}1738#endif17391740#if (RTL8723B_SUPPORT == 1)1741void odm_trx_hw_ant_div_init_8723b(void *dm_void)1742{1743struct dm_struct *dm = (struct dm_struct *)dm_void;17441745PHYDM_DBG(dm, DBG_ANT_DIV,1746"***8723B AntDiv_Init => ant_div_type=[CG_TRX_HW_ANTDIV(DPDT)]\n");17471748/* @Mapping Table */1749odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 0);1750odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 1);17511752/* OFDM HW AntDiv Parameters */1753odm_set_bb_reg(dm, R_0xca4, 0x7FF, 0xa0); /* thershold */1754odm_set_bb_reg(dm, R_0xca4, 0x7FF000, 0x00); /* @bias */17551756/* @CCK HW AntDiv Parameters */1757odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);1758/* patch for clk from 88M to 80M */1759odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1);1760/* @do 64 samples */17611762/* @BT Coexistence */1763odm_set_bb_reg(dm, R_0x864, BIT(12), 0);1764/* @keep antsel_map when GNT_BT = 1 */1765odm_set_bb_reg(dm, R_0x874, BIT(23), 0);1766/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */17671768/* Output Pin Settings */1769odm_set_bb_reg(dm, R_0x870, BIT(8), 0);17701771odm_set_bb_reg(dm, R_0x948, BIT(6), 0);1772/* WL_BB_SEL_BTG_TRXG_anta, (1: HW CTRL 0: SW CTRL) */1773odm_set_bb_reg(dm, R_0x948, BIT(7), 0);17741775odm_set_mac_reg(dm, R_0x40, BIT(3), 1);1776odm_set_mac_reg(dm, R_0x38, BIT(11), 1);1777odm_set_mac_reg(dm, R_0x4c, BIT(24) | BIT(23), 2);1778/* select DPDT_P and DPDT_N as output pin */17791780odm_set_bb_reg(dm, R_0x944, BIT(0) | BIT(1), 3); /* @in/out */1781odm_set_bb_reg(dm, R_0x944, BIT(31), 0);17821783odm_set_bb_reg(dm, R_0x92c, BIT(1), 0); /* @DPDT_P non-inverse */1784odm_set_bb_reg(dm, R_0x92c, BIT(0), 1); /* @DPDT_N inverse */17851786odm_set_bb_reg(dm, R_0x930, 0xF0, 8); /* @DPDT_P = ANTSEL[0] */1787odm_set_bb_reg(dm, R_0x930, 0xF, 8); /* @DPDT_N = ANTSEL[0] */17881789/* @2 [--For HW Bug setting] */1790if (dm->ant_type == ODM_AUTO_ANT)1791odm_set_bb_reg(dm, R_0xa00, BIT(15), 0);1792/* @CCK AntDiv function block enable */1793}17941795void odm_s0s1_sw_ant_div_init_8723b(void *dm_void)1796{1797struct dm_struct *dm = (struct dm_struct *)dm_void;1798struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;1799struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;18001801PHYDM_DBG(dm, DBG_ANT_DIV,1802"***8723B AntDiv_Init => ant_div_type=[ S0S1_SW_AntDiv]\n");18031804/* @Mapping Table */1805odm_set_bb_reg(dm, R_0x914, MASKBYTE0, 0);1806odm_set_bb_reg(dm, R_0x914, MASKBYTE1, 1);18071808#if 01809/* Output Pin Settings */1810/* odm_set_bb_reg(dm, R_0x948, BIT6, 0x1); */1811#endif1812odm_set_bb_reg(dm, R_0x870, BIT(9) | BIT(8), 0);18131814fat_tab->is_become_linked = false;1815swat_tab->try_flag = SWAW_STEP_INIT;1816swat_tab->double_chk_flag = 0;18171818/* @2 [--For HW Bug setting] */1819odm_set_bb_reg(dm, R_0x80c, BIT(21), 0); /* TX ant by Reg */1820}18211822void odm_update_rx_idle_ant_8723b(1823void *dm_void,1824u8 ant,1825u32 default_ant,1826u32 optional_ant)1827{1828struct dm_struct *dm = (struct dm_struct *)dm_void;1829struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;1830void *adapter = dm->adapter;1831u8 count = 0;1832/*u8 u1_temp;*/1833/*u8 h2c_parameter;*/18341835if (!dm->is_linked && dm->ant_type == ODM_AUTO_ANT) {1836PHYDM_DBG(dm, DBG_ANT_DIV,1837"[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to no link\n");1838return;1839}18401841#if 01842/* Send H2C command to FW */1843/* @Enable wifi calibration */1844h2c_parameter = true;1845odm_fill_h2c_cmd(dm, ODM_H2C_WIFI_CALIBRATION, 1, &h2c_parameter);18461847/* @Check if H2C command sucess or not (0x1e6) */1848u1_temp = odm_read_1byte(dm, 0x1e6);1849while ((u1_temp != 0x1) && (count < 100)) {1850ODM_delay_us(10);1851u1_temp = odm_read_1byte(dm, 0x1e6);1852count++;1853}1854PHYDM_DBG(dm, DBG_ANT_DIV,1855"[ Update Rx-Idle-ant ] 8723B: H2C command status = %d, count = %d\n",1856u1_temp, count);18571858if (u1_temp == 0x1) {1859/* @Check if BT is doing IQK (0x1e7) */1860count = 0;1861u1_temp = odm_read_1byte(dm, 0x1e7);1862while ((!(u1_temp & BIT(0))) && (count < 100)) {1863ODM_delay_us(50);1864u1_temp = odm_read_1byte(dm, 0x1e7);1865count++;1866}1867PHYDM_DBG(dm, DBG_ANT_DIV,1868"[ Update Rx-Idle-ant ] 8723B: BT IQK status = %d, count = %d\n",1869u1_temp, count);18701871if (u1_temp & BIT(0)) {1872odm_set_bb_reg(dm, R_0x948, BIT(6), 0x1);1873odm_set_bb_reg(dm, R_0x948, BIT(9), default_ant);1874odm_set_bb_reg(dm, R_0x864, 0x38, default_ant);1875/* @Default RX */1876odm_set_bb_reg(dm, R_0x864, 0x1c0, optional_ant);1877/* @Optional RX */1878odm_set_bb_reg(dm, R_0x860, 0x7000, default_ant);1879/* @Default TX */1880fat_tab->rx_idle_ant = ant;18811882/* Set TX AGC by S0/S1 */1883/* Need to consider Linux driver */1884#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)1885adapter->hal_func.set_tx_power_level_handler(adapter, *dm->channel);1886#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)1887rtw_hal_set_tx_power_level(adapter, *dm->channel);1888#endif18891890/* Set IQC by S0/S1 */1891odm_set_iqc_by_rfpath(dm, default_ant);1892PHYDM_DBG(dm, DBG_ANT_DIV,1893"[ Update Rx-Idle-ant ] 8723B: Success to set RX antenna\n");1894} else1895PHYDM_DBG(dm, DBG_ANT_DIV,1896"[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to BT IQK\n");1897} else1898PHYDM_DBG(dm, DBG_ANT_DIV,1899"[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to H2C command fail\n");19001901/* Send H2C command to FW */1902/* @Disable wifi calibration */1903h2c_parameter = false;1904odm_fill_h2c_cmd(dm, ODM_H2C_WIFI_CALIBRATION, 1, &h2c_parameter);1905#else19061907odm_set_bb_reg(dm, R_0x948, BIT(6), 0x1);1908odm_set_bb_reg(dm, R_0x948, BIT(9), default_ant);1909odm_set_bb_reg(dm, R_0x864, BIT(5) | BIT(4) | BIT(3), default_ant);1910/*@Default RX*/1911odm_set_bb_reg(dm, R_0x864, BIT(8) | BIT(7) | BIT(6), optional_ant);1912/*Optional RX*/1913odm_set_bb_reg(dm, R_0x860, BIT(14) | BIT(13) | BIT(12), default_ant);1914/*@Default TX*/1915fat_tab->rx_idle_ant = ant;19161917/* Set TX AGC by S0/S1 */1918/* Need to consider Linux driver */1919#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)1920((PADAPTER)adapter)->HalFunc.SetTxPowerLevelHandler(adapter, *dm->channel);1921#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)1922rtw_hal_set_tx_power_level(adapter, *dm->channel);1923#endif19241925/* Set IQC by S0/S1 */1926odm_set_iqc_by_rfpath(dm, default_ant);1927PHYDM_DBG(dm, DBG_ANT_DIV,1928"[ Update Rx-Idle-ant ] 8723B: Success to set RX antenna\n");19291930#endif1931}19321933boolean1934phydm_is_bt_enable_8723b(void *dm_void)1935{1936struct dm_struct *dm = (struct dm_struct *)dm_void;1937u32 bt_state;1938#if 01939/*u32 reg75;*/19401941/*reg75 = odm_get_bb_reg(dm, R_0x74, BIT8);*/1942/*odm_set_bb_reg(dm, R_0x74, BIT8, 0x0);*/1943#endif1944odm_set_bb_reg(dm, R_0xa0, BIT(24) | BIT(25) | BIT(26), 0x5);1945bt_state = odm_get_bb_reg(dm, R_0xa0, 0xf);1946#if 01947/*odm_set_bb_reg(dm, R_0x74, BIT8, reg75);*/1948#endif19491950if (bt_state == 4 || bt_state == 7 || bt_state == 9 || bt_state == 13)1951return true;1952else1953return false;1954}1955#endif /* @#if (RTL8723B_SUPPORT == 1) */19561957#if (RTL8821A_SUPPORT == 1)19581959void odm_trx_hw_ant_div_init_8821a(void *dm_void)1960{1961struct dm_struct *dm = (struct dm_struct *)dm_void;19621963PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);19641965/* Output Pin Settings */1966odm_set_mac_reg(dm, R_0x4c, BIT(25), 0);19671968odm_set_mac_reg(dm, R_0x64, BIT(29), 1); /* PAPE by WLAN control */1969odm_set_mac_reg(dm, R_0x64, BIT(28), 1); /* @LNAON by WLAN control */19701971odm_set_bb_reg(dm, R_0xcb8, BIT(16), 0);19721973odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);1974/* select DPDT_P and DPDT_N as output pin */1975odm_set_mac_reg(dm, R_0x4c, BIT(24), 1); /* @by WLAN control */1976odm_set_bb_reg(dm, R_0xcb4, 0xF, 8); /* @DPDT_P = ANTSEL[0] */1977odm_set_bb_reg(dm, R_0xcb4, 0xF0, 8); /* @DPDT_N = ANTSEL[0] */1978odm_set_bb_reg(dm, R_0xcb4, BIT(29), 0); /* @DPDT_P non-inverse */1979odm_set_bb_reg(dm, R_0xcb4, BIT(28), 1); /* @DPDT_N inverse */19801981/* @Mapping Table */1982odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);1983odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);19841985/* OFDM HW AntDiv Parameters */1986odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */1987odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x10); /* @bias */19881989/* @CCK HW AntDiv Parameters */1990odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);1991/* patch for clk from 88M to 80M */1992odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */19931994odm_set_bb_reg(dm, R_0x800, BIT(25), 0);1995/* @ANTSEL_CCK sent to the smart_antenna circuit */1996odm_set_bb_reg(dm, R_0xa00, BIT(15), 0);1997/* @CCK AntDiv function block enable */19981999/* @BT Coexistence */2000odm_set_bb_reg(dm, R_0xcac, BIT(9), 1);2001/* @keep antsel_map when GNT_BT = 1 */2002odm_set_bb_reg(dm, R_0x804, BIT(4), 1);2003/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */20042005odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);2006/* settling time of antdiv by RF LNA = 100ns */20072008/* response TX ant by RX ant */2009odm_set_mac_reg(dm, R_0x668, BIT(3), 1);2010}20112012void odm_s0s1_sw_ant_div_init_8821a(void *dm_void)2013{2014struct dm_struct *dm = (struct dm_struct *)dm_void;2015struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;20162017PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);20182019/* Output Pin Settings */2020odm_set_mac_reg(dm, R_0x4c, BIT(25), 0);20212022odm_set_mac_reg(dm, R_0x64, BIT(29), 1); /* PAPE by WLAN control */2023odm_set_mac_reg(dm, R_0x64, BIT(28), 1); /* @LNAON by WLAN control */20242025odm_set_bb_reg(dm, R_0xcb8, BIT(16), 0);20262027odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);2028/* select DPDT_P and DPDT_N as output pin */2029odm_set_mac_reg(dm, R_0x4c, BIT(24), 1); /* @by WLAN control */2030odm_set_bb_reg(dm, R_0xcb4, 0xF, 8); /* @DPDT_P = ANTSEL[0] */2031odm_set_bb_reg(dm, R_0xcb4, 0xF0, 8); /* @DPDT_N = ANTSEL[0] */2032odm_set_bb_reg(dm, R_0xcb4, BIT(29), 0); /* @DPDT_P non-inverse */2033odm_set_bb_reg(dm, R_0xcb4, BIT(28), 1); /* @DPDT_N inverse */20342035/* @Mapping Table */2036odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);2037odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);20382039/* OFDM HW AntDiv Parameters */2040odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */2041odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x10); /* @bias */20422043/* @CCK HW AntDiv Parameters */2044odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);2045/* patch for clk from 88M to 80M */2046odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */20472048odm_set_bb_reg(dm, R_0x800, BIT(25), 0);2049/* @ANTSEL_CCK sent to the smart_antenna circuit */2050odm_set_bb_reg(dm, R_0xa00, BIT(15), 0);2051/* @CCK AntDiv function block enable */20522053/* @BT Coexistence */2054odm_set_bb_reg(dm, R_0xcac, BIT(9), 1);2055/* @keep antsel_map when GNT_BT = 1 */2056odm_set_bb_reg(dm, R_0x804, BIT(4), 1);2057/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */20582059odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);2060/* settling time of antdiv by RF LNA = 100ns */20612062/* response TX ant by RX ant */2063odm_set_mac_reg(dm, R_0x668, BIT(3), 1);20642065odm_set_bb_reg(dm, R_0x900, BIT(18), 0);20662067swat_tab->try_flag = SWAW_STEP_INIT;2068swat_tab->double_chk_flag = 0;2069swat_tab->cur_antenna = MAIN_ANT;2070swat_tab->pre_ant = MAIN_ANT;2071swat_tab->swas_no_link_state = 0;2072}2073#endif /* @#if (RTL8821A_SUPPORT == 1) */20742075#if (RTL8821C_SUPPORT == 1)2076void odm_trx_hw_ant_div_init_8821c(void *dm_void)2077{2078struct dm_struct *dm = (struct dm_struct *)dm_void;20792080PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);2081/* Output Pin Settings */2082odm_set_mac_reg(dm, R_0x4c, BIT(25), 0);20832084odm_set_mac_reg(dm, R_0x64, BIT(29), 1); /* PAPE by WLAN control */2085odm_set_mac_reg(dm, R_0x64, BIT(28), 1); /* @LNAON by WLAN control */20862087odm_set_bb_reg(dm, R_0xcb8, BIT(16), 0);20882089odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);2090/* select DPDT_P and DPDT_N as output pin */2091odm_set_mac_reg(dm, R_0x4c, BIT(24), 1); /* @by WLAN control */2092odm_set_bb_reg(dm, R_0xcb4, 0xF, 8); /* @DPDT_P = ANTSEL[0] */2093odm_set_bb_reg(dm, R_0xcb4, 0xF0, 8); /* @DPDT_N = ANTSEL[0] */2094odm_set_bb_reg(dm, R_0xcb4, BIT(29), 0); /* @DPDT_P non-inverse */2095odm_set_bb_reg(dm, R_0xcb4, BIT(28), 1); /* @DPDT_N inverse */20962097/* @Mapping Table */2098odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);2099odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);21002101/* OFDM HW AntDiv Parameters */2102odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */2103odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x10); /* @bias */21042105/* @CCK HW AntDiv Parameters */2106odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);2107/* patch for clk from 88M to 80M */2108odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */21092110odm_set_bb_reg(dm, R_0x800, BIT(25), 0);2111/* @ANTSEL_CCK sent to the smart_antenna circuit */2112odm_set_bb_reg(dm, R_0xa00, BIT(15), 0);2113/* @CCK AntDiv function block enable */21142115/* @BT Coexistence */2116odm_set_bb_reg(dm, R_0xcac, BIT(9), 1);2117/* @keep antsel_map when GNT_BT = 1 */2118odm_set_bb_reg(dm, R_0x804, BIT(4), 1);2119/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */21202121/* Timming issue */2122odm_set_bb_reg(dm, R_0x818, BIT(23) | BIT(22) | BIT(21) | BIT(20), 0);2123/*@keep antidx after tx for ACK ( unit x 3.2 mu sec)*/2124odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);2125/* settling time of antdiv by RF LNA = 100ns */21262127/* response TX ant by RX ant */2128odm_set_mac_reg(dm, R_0x668, BIT(3), 1);2129}21302131void phydm_s0s1_sw_ant_div_init_8821c(void *dm_void)2132{2133struct dm_struct *dm = (struct dm_struct *)dm_void;2134struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;21352136PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);21372138/* Output Pin Settings */2139odm_set_mac_reg(dm, R_0x4c, BIT(25), 0);21402141odm_set_mac_reg(dm, R_0x64, BIT(29), 1); /* PAPE by WLAN control */2142odm_set_mac_reg(dm, R_0x64, BIT(28), 1); /* @LNAON by WLAN control */21432144odm_set_bb_reg(dm, R_0xcb8, BIT(16), 0);21452146odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);2147/* select DPDT_P and DPDT_N as output pin */2148odm_set_mac_reg(dm, R_0x4c, BIT(24), 1); /* @by WLAN control */2149odm_set_bb_reg(dm, R_0xcb4, 0xF, 8); /* @DPDT_P = ANTSEL[0] */2150odm_set_bb_reg(dm, R_0xcb4, 0xF0, 8); /* @DPDT_N = ANTSEL[0] */2151odm_set_bb_reg(dm, R_0xcb4, BIT(29), 0); /* @DPDT_P non-inverse */2152odm_set_bb_reg(dm, R_0xcb4, BIT(28), 1); /* @DPDT_N inverse */21532154/* @Mapping Table */2155odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);2156odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);21572158/* OFDM HW AntDiv Parameters */2159odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */2160odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x00); /* @bias */21612162/* @CCK HW AntDiv Parameters */2163odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);2164/* patch for clk from 88M to 80M */2165odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */21662167odm_set_bb_reg(dm, R_0x800, BIT(25), 0);2168/* @ANTSEL_CCK sent to the smart_antenna circuit */2169odm_set_bb_reg(dm, R_0xa00, BIT(15), 0);2170/* @CCK AntDiv function block enable */21712172/* @BT Coexistence */2173odm_set_bb_reg(dm, R_0xcac, BIT(9), 1);2174/* @keep antsel_map when GNT_BT = 1 */2175odm_set_bb_reg(dm, R_0x804, BIT(4), 1);2176/* @Disable hw antsw & fast_train.antsw when GNT_BT=1 */21772178odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);2179/* settling time of antdiv by RF LNA = 100ns */21802181/* response TX ant by RX ant */2182odm_set_mac_reg(dm, R_0x668, BIT(3), 1);21832184odm_set_bb_reg(dm, R_0x900, BIT(18), 0);21852186swat_tab->try_flag = SWAW_STEP_INIT;2187swat_tab->double_chk_flag = 0;2188swat_tab->cur_antenna = MAIN_ANT;2189swat_tab->pre_ant = MAIN_ANT;2190swat_tab->swas_no_link_state = 0;2191}2192#endif /* @#if (RTL8821C_SUPPORT == 1) */21932194#if (RTL8881A_SUPPORT == 1)2195void odm_trx_hw_ant_div_init_8881a(void *dm_void)2196{2197struct dm_struct *dm = (struct dm_struct *)dm_void;21982199PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);22002201/* Output Pin Settings */2202/* @[SPDT related] */2203odm_set_mac_reg(dm, R_0x4c, BIT(25), 0);2204odm_set_mac_reg(dm, R_0x4c, BIT(26), 0);2205odm_set_bb_reg(dm, R_0xcb4, BIT(31), 0); /* @delay buffer */2206odm_set_bb_reg(dm, R_0xcb4, BIT(22), 0);2207odm_set_bb_reg(dm, R_0xcb4, BIT(24), 1);2208odm_set_bb_reg(dm, R_0xcb0, 0xF00, 8); /* @DPDT_P = ANTSEL[0] */2209odm_set_bb_reg(dm, R_0xcb0, 0xF0000, 8); /* @DPDT_N = ANTSEL[0] */22102211/* @Mapping Table */2212odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);2213odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);22142215/* OFDM HW AntDiv Parameters */2216odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */2217odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x0); /* @bias */2218odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);2219/* settling time of antdiv by RF LNA = 100ns */22202221/* @CCK HW AntDiv Parameters */2222odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);2223/* patch for clk from 88M to 80M */2224odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */22252226/* @2 [--For HW Bug setting] */22272228odm_set_bb_reg(dm, R_0x900, BIT(18), 0);2229/* TX ant by Reg *//* A-cut bug */2230}22312232#endif /* @#if (RTL8881A_SUPPORT == 1) */22332234#if (RTL8812A_SUPPORT == 1)2235void odm_trx_hw_ant_div_init_8812a(void *dm_void)2236{2237struct dm_struct *dm = (struct dm_struct *)dm_void;22382239PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);22402241/* @3 */ /* @3 --RFE pin setting--------- */2242/* @[BB] */2243odm_set_bb_reg(dm, R_0x900, BIT(10) | BIT(9) | BIT(8), 0x0);2244/* @disable SW switch */2245odm_set_bb_reg(dm, R_0x900, BIT(17) | BIT(16), 0x0);2246odm_set_bb_reg(dm, R_0x974, BIT(7) | BIT(6), 0x3); /* @in/out */2247odm_set_bb_reg(dm, R_0xcb4, BIT(31), 0); /* @delay buffer */2248odm_set_bb_reg(dm, R_0xcb4, BIT(26), 0);2249odm_set_bb_reg(dm, R_0xcb4, BIT(27), 1);2250odm_set_bb_reg(dm, R_0xcb0, 0xF000000, 8); /* @DPDT_P = ANTSEL[0] */2251odm_set_bb_reg(dm, R_0xcb0, 0xF0000000, 8); /* @DPDT_N = ANTSEL[0] */2252/* @3 ------------------------- */22532254/* @Mapping Table */2255odm_set_bb_reg(dm, R_0xca4, MASKBYTE0, 0);2256odm_set_bb_reg(dm, R_0xca4, MASKBYTE1, 1);22572258/* OFDM HW AntDiv Parameters */2259odm_set_bb_reg(dm, R_0x8d4, 0x7FF, 0xA0); /* thershold */2260odm_set_bb_reg(dm, R_0x8d4, 0x7FF000, 0x0); /* @bias */2261odm_set_bb_reg(dm, R_0x8cc, BIT(20) | BIT(19) | BIT(18), 3);2262/* settling time of antdiv by RF LNA = 100ns */22632264/* @CCK HW AntDiv Parameters */2265odm_set_bb_reg(dm, R_0xa74, BIT(7), 1);2266/* patch for clk from 88M to 80M */2267odm_set_bb_reg(dm, R_0xa0c, BIT(4), 1); /* @do 64 samples */22682269/* @2 [--For HW Bug setting] */22702271odm_set_bb_reg(dm, R_0x900, BIT(18), 0);2272/* TX ant by Reg */ /* A-cut bug */2273}22742275#endif /* @#if (RTL8812A_SUPPORT == 1) */22762277#if (RTL8188F_SUPPORT == 1)2278void odm_s0s1_sw_ant_div_init_8188f(void *dm_void)2279{2280struct dm_struct *dm = (struct dm_struct *)dm_void;2281struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;2282struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;22832284PHYDM_DBG(dm, DBG_ANT_DIV, "[%s]=====>\n", __func__);22852286#if 02287/*@GPIO setting*/2288/*odm_set_mac_reg(dm, R_0x64, BIT(18), 0); */2289/*odm_set_mac_reg(dm, R_0x44, BIT(28)|BIT(27), 0);*/2290/*odm_set_mac_reg(dm, R_0x44, BIT(20) | BIT(19), 0x3);*/2291/*enable_output for P_GPIO[4:3]*/2292/*odm_set_mac_reg(dm, R_0x44, BIT(12)|BIT(11), 0);*/ /*output value*/2293/*odm_set_mac_reg(dm, R_0x40, BIT(1)|BIT(0), 0);*/ /*GPIO function*/2294#endif22952296if (dm->support_ic_type == ODM_RTL8188F) {2297if (dm->support_interface == ODM_ITRF_USB)2298odm_set_mac_reg(dm, R_0x44, BIT(20) | BIT(19), 0x3);2299/*@enable_output for P_GPIO[4:3]*/2300else if (dm->support_interface == ODM_ITRF_SDIO)2301odm_set_mac_reg(dm, R_0x44, BIT(18), 0x1);2302/*@enable_output for P_GPIO[2]*/2303}23042305fat_tab->is_become_linked = false;2306swat_tab->try_flag = SWAW_STEP_INIT;2307swat_tab->double_chk_flag = 0;2308}23092310void phydm_update_rx_idle_antenna_8188F(void *dm_void, u32 default_ant)2311{2312struct dm_struct *dm = (struct dm_struct *)dm_void;2313u8 codeword;23142315if (dm->support_ic_type == ODM_RTL8188F) {2316if (dm->support_interface == ODM_ITRF_USB) {2317if (default_ant == ANT1_2G)2318codeword = 1; /*@2'b01*/2319else2320codeword = 2; /*@2'b10*/2321odm_set_mac_reg(dm, R_0x44, 0x1800, codeword);2322/*@GPIO[4:3] output value*/2323} else if (dm->support_interface == ODM_ITRF_SDIO) {2324if (default_ant == ANT1_2G) {2325codeword = 0; /*@1'b0*/2326odm_set_bb_reg(dm, R_0x870, 0x300, 0x3);2327odm_set_bb_reg(dm, R_0x860, 0x300, 0x1);2328} else {2329codeword = 1; /*@1'b1*/2330odm_set_bb_reg(dm, R_0x870, 0x300, 0x3);2331odm_set_bb_reg(dm, R_0x860, 0x300, 0x2);2332}2333odm_set_mac_reg(dm, R_0x44, BIT(10), codeword);2334/*@GPIO[2] output value*/2335}2336}2337}2338#endif23392340#ifdef ODM_EVM_ENHANCE_ANTDIV2341void phydm_rx_rate_for_antdiv(void *dm_void, void *pkt_info_void)2342{2343struct dm_struct *dm = (struct dm_struct *)dm_void;2344struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;2345struct phydm_perpkt_info_struct *pktinfo = NULL;2346u8 data_rate = 0;23472348pktinfo = (struct phydm_perpkt_info_struct *)pkt_info_void;2349data_rate = pktinfo->data_rate & 0x7f;23502351if (!fat_tab->get_stats)2352return;23532354if (fat_tab->antsel_rx_keep_0 == ANT1_2G) {2355if (data_rate >= ODM_RATEMCS0 &&2356data_rate <= ODM_RATEMCS15)2357fat_tab->main_ht_cnt[data_rate - ODM_RATEMCS0]++;2358else if (data_rate >= ODM_RATEVHTSS1MCS0 &&2359data_rate <= ODM_RATEVHTSS2MCS9)2360fat_tab->main_vht_cnt[data_rate - ODM_RATEVHTSS1MCS0]++;2361} else { /*ANT2_2G*/2362if (data_rate >= ODM_RATEMCS0 &&2363data_rate <= ODM_RATEMCS15)2364fat_tab->aux_ht_cnt[data_rate - ODM_RATEMCS0]++;2365else if (data_rate >= ODM_RATEVHTSS1MCS0 &&2366data_rate <= ODM_RATEVHTSS2MCS9)2367fat_tab->aux_vht_cnt[data_rate - ODM_RATEVHTSS1MCS0]++;2368}2369}23702371void phydm_antdiv_reset_rx_rate(void *dm_void)2372{2373struct dm_struct *dm = (struct dm_struct *)dm_void;2374struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;23752376odm_memory_set(dm, &fat_tab->main_ht_cnt[0], 0, HT_IDX * 2);2377odm_memory_set(dm, &fat_tab->aux_ht_cnt[0], 0, HT_IDX * 2);2378odm_memory_set(dm, &fat_tab->main_vht_cnt[0], 0, VHT_IDX * 2);2379odm_memory_set(dm, &fat_tab->aux_vht_cnt[0], 0, VHT_IDX * 2);2380}23812382void phydm_statistics_evm_1ss(void *dm_void, void *phy_info_void,2383u8 antsel_tr_mux, u32 id, u32 utility)2384{2385struct dm_struct *dm = (struct dm_struct *)dm_void;2386struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;2387struct phydm_phyinfo_struct *phy_info = NULL;23882389phy_info = (struct phydm_phyinfo_struct *)phy_info_void;2390if (antsel_tr_mux == ANT1_2G) {2391fat_tab->main_evm_sum[id] += ((phy_info->rx_mimo_evm_dbm[0])2392<< 5);2393fat_tab->main_evm_cnt[id]++;2394} else {2395fat_tab->aux_evm_sum[id] += ((phy_info->rx_mimo_evm_dbm[0])2396<< 5);2397fat_tab->aux_evm_cnt[id]++;2398}2399}24002401void phydm_statistics_evm_2ss(void *dm_void, void *phy_info_void,2402u8 antsel_tr_mux, u32 id, u32 utility)2403{2404struct dm_struct *dm = (struct dm_struct *)dm_void;2405struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;2406struct phydm_phyinfo_struct *phy_info = NULL;24072408phy_info = (struct phydm_phyinfo_struct *)phy_info_void;2409if (antsel_tr_mux == ANT1_2G) {2410fat_tab->main_evm_2ss_sum[id][0] += phy_info->rx_mimo_evm_dbm[0]2411<< 5;2412fat_tab->main_evm_2ss_sum[id][1] += phy_info->rx_mimo_evm_dbm[1]2413<< 5;2414fat_tab->main_evm_2ss_cnt[id]++;24152416} else {2417fat_tab->aux_evm_2ss_sum[id][0] += (phy_info->rx_mimo_evm_dbm[0]2418<< 5);2419fat_tab->aux_evm_2ss_sum[id][1] += (phy_info->rx_mimo_evm_dbm[1]2420<< 5);2421fat_tab->aux_evm_2ss_cnt[id]++;2422}2423}24242425void phydm_evm_sw_antdiv_init(void *dm_void)2426{2427struct dm_struct *dm = (struct dm_struct *)dm_void;2428struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;24292430/*@EVM enhance AntDiv method init----------------*/2431fat_tab->evm_method_enable = 0;2432fat_tab->fat_state = NORMAL_STATE_MIAN;2433fat_tab->fat_state_cnt = 0;2434fat_tab->pre_antdiv_rssi = 0;24352436dm->antdiv_intvl = 30;2437dm->antdiv_delay = 20;2438dm->antdiv_train_num = 4;2439odm_set_bb_reg(dm, R_0x910, 0x3f, 0xf);2440dm->antdiv_evm_en = 1;2441/*@dm->antdiv_period=1;*/2442#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))2443dm->evm_antdiv_period = 1;2444#else2445dm->evm_antdiv_period = 3;2446#endif2447dm->stop_antdiv_rssi_th = 3;2448dm->stop_antdiv_tp_th = 80;2449dm->antdiv_tp_period = 3;2450dm->stop_antdiv_tp_diff_th = 5;2451}24522453void odm_evm_fast_ant_reset(void *dm_void)2454{2455struct dm_struct *dm = (struct dm_struct *)dm_void;2456struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;24572458fat_tab->evm_method_enable = 0;2459if (fat_tab->div_path_type == ANT_PATH_A)2460odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);2461else if (fat_tab->div_path_type == ANT_PATH_B)2462odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_B);2463else if (fat_tab->div_path_type == ANT_PATH_AB)2464odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_AB);2465fat_tab->fat_state = NORMAL_STATE_MIAN;2466fat_tab->fat_state_cnt = 0;2467dm->antdiv_period = 0;2468odm_set_mac_reg(dm, R_0x608, BIT(8), 0);2469}24702471void odm_evm_enhance_ant_div(void *dm_void)2472{2473struct dm_struct *dm = (struct dm_struct *)dm_void;2474u32 main_rssi, aux_rssi;2475u32 main_crc_utility = 0, aux_crc_utility = 0, utility_ratio = 1;2476u32 main_evm, aux_evm, diff_rssi = 0, diff_EVM = 0;2477u32 main_2ss_evm[2], aux_2ss_evm[2];2478u32 main_1ss_evm, aux_1ss_evm;2479u32 main_2ss_evm_sum, aux_2ss_evm_sum;2480u8 score_EVM = 0, score_CRC = 0;2481u8 rssi_larger_ant = 0;2482struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;2483u32 value32, i, mac_id;2484boolean main_above1 = false, aux_above1 = false;2485boolean force_antenna = false;2486struct cmn_sta_info *sta;2487u32 main_tp_avg, aux_tp_avg;2488u8 curr_rssi, rssi_diff;2489u32 tp_diff, tp_diff_avg;2490u16 main_max_cnt = 0, aux_max_cnt = 0;2491u16 main_max_idx = 0, aux_max_idx = 0;2492u16 main_cnt_all = 0, aux_cnt_all = 0;2493u8 rate_num = dm->num_rf_path;2494u8 rate_ss_shift = 0;2495u8 tp_diff_return = 0, tp_return = 0, rssi_return = 0;2496u8 target_ant_evm_1ss, target_ant_evm_2ss;2497u8 decision_evm_ss;2498u8 next_ant;24992500fat_tab->target_ant_enhance = 0xFF;25012502if ((dm->support_ic_type & ODM_EVM_ANTDIV_IC)) {2503if (dm->is_one_entry_only) {2504#if 02505/* PHYDM_DBG(dm,DBG_ANT_DIV, "[One Client only]\n"); */2506#endif2507mac_id = dm->one_entry_macid;2508sta = dm->phydm_sta_info[mac_id];25092510main_rssi = (fat_tab->main_cnt[mac_id] != 0) ? (fat_tab->main_sum[mac_id] / fat_tab->main_cnt[mac_id]) : 0;2511aux_rssi = (fat_tab->aux_cnt[mac_id] != 0) ? (fat_tab->aux_sum[mac_id] / fat_tab->aux_cnt[mac_id]) : 0;25122513if ((main_rssi == 0 && aux_rssi != 0 && aux_rssi >= FORCE_RSSI_DIFF) || (main_rssi != 0 && aux_rssi == 0 && main_rssi >= FORCE_RSSI_DIFF))2514diff_rssi = FORCE_RSSI_DIFF;2515else if (main_rssi != 0 && aux_rssi != 0)2516diff_rssi = (main_rssi >= aux_rssi) ? (main_rssi - aux_rssi) : (aux_rssi - main_rssi);25172518if (main_rssi >= aux_rssi)2519rssi_larger_ant = MAIN_ANT;2520else2521rssi_larger_ant = AUX_ANT;25222523PHYDM_DBG(dm, DBG_ANT_DIV,2524"Main_Cnt=(( %d )), main_rssi=(( %d ))\n",2525fat_tab->main_cnt[mac_id], main_rssi);2526PHYDM_DBG(dm, DBG_ANT_DIV,2527"Aux_Cnt=(( %d )), aux_rssi=(( %d ))\n",2528fat_tab->aux_cnt[mac_id], aux_rssi);25292530if (((main_rssi >= evm_rssi_th_high || aux_rssi >= evm_rssi_th_high) || fat_tab->evm_method_enable == 1)2531/* @&& (diff_rssi <= FORCE_RSSI_DIFF + 1) */2532) {2533PHYDM_DBG(dm, DBG_ANT_DIV,2534"> TH_H || evm_method_enable==1\n");25352536if ((main_rssi >= evm_rssi_th_low || aux_rssi >= evm_rssi_th_low)) {2537PHYDM_DBG(dm, DBG_ANT_DIV, "> TH_L, fat_state_cnt =((%d))\n", fat_tab->fat_state_cnt);25382539/*Traning state: 0(alt) 1(ori) 2(alt) 3(ori)============================================================*/2540if (fat_tab->fat_state_cnt < (dm->antdiv_train_num << 1)) {2541if (fat_tab->fat_state_cnt == 0) {2542/*Reset EVM 1SS Method */2543fat_tab->main_evm_sum[mac_id] = 0;2544fat_tab->aux_evm_sum[mac_id] = 0;2545fat_tab->main_evm_cnt[mac_id] = 0;2546fat_tab->aux_evm_cnt[mac_id] = 0;2547/*Reset EVM 2SS Method */2548fat_tab->main_evm_2ss_sum[mac_id][0] = 0;2549fat_tab->main_evm_2ss_sum[mac_id][1] = 0;2550fat_tab->aux_evm_2ss_sum[mac_id][0] = 0;2551fat_tab->aux_evm_2ss_sum[mac_id][1] = 0;2552fat_tab->main_evm_2ss_cnt[mac_id] = 0;2553fat_tab->aux_evm_2ss_cnt[mac_id] = 0;25542555/*Reset TP Method */2556fat_tab->main_tp = 0;2557fat_tab->aux_tp = 0;2558fat_tab->main_tp_cnt = 0;2559fat_tab->aux_tp_cnt = 0;2560phydm_antdiv_reset_rx_rate(dm);25612562/*Reset CRC Method */2563fat_tab->main_crc32_ok_cnt = 0;2564fat_tab->main_crc32_fail_cnt = 0;2565fat_tab->aux_crc32_ok_cnt = 0;2566fat_tab->aux_crc32_fail_cnt = 0;25672568#ifdef SKIP_EVM_ANTDIV_TRAINING_PATCH2569if ((*dm->band_width == CHANNEL_WIDTH_20) && sta->mimo_type == RF_2T2R) {2570/*@1. Skip training: RSSI*/2571#if 02572/*PHYDM_DBG(pDM_Odm,DBG_ANT_DIV, "TargetAnt_enhance=((%d)), RxIdleAnt=((%d))\n", pDM_FatTable->TargetAnt_enhance, pDM_FatTable->RxIdleAnt);*/2573#endif2574curr_rssi = (u8)((fat_tab->rx_idle_ant == MAIN_ANT) ? main_rssi : aux_rssi);2575rssi_diff = (curr_rssi > fat_tab->pre_antdiv_rssi) ? (curr_rssi - fat_tab->pre_antdiv_rssi) : (fat_tab->pre_antdiv_rssi - curr_rssi);25762577PHYDM_DBG(dm, DBG_ANT_DIV, "[1] rssi_return, curr_rssi=((%d)), pre_rssi=((%d))\n", curr_rssi, fat_tab->pre_antdiv_rssi);25782579fat_tab->pre_antdiv_rssi = curr_rssi;2580if (rssi_diff < dm->stop_antdiv_rssi_th && curr_rssi != 0)2581rssi_return = 1;25822583/*@2. Skip training: TP Diff*/2584tp_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);25852586PHYDM_DBG(dm, DBG_ANT_DIV, "[2] tp_diff_return, curr_tp=((%d)), pre_tp=((%d))\n", dm->rx_tp, fat_tab->pre_antdiv_tp);2587fat_tab->pre_antdiv_tp = dm->rx_tp;2588if ((tp_diff < (u32)(dm->stop_antdiv_tp_diff_th) && dm->rx_tp != 0))2589tp_diff_return = 1;25902591PHYDM_DBG(dm, DBG_ANT_DIV, "[3] tp_return, curr_rx_tp=((%d))\n", dm->rx_tp);2592/*@3. Skip training: TP*/2593if (dm->rx_tp >= (u32)(dm->stop_antdiv_tp_th))2594tp_return = 1;25952596PHYDM_DBG(dm, DBG_ANT_DIV, "[4] Return {rssi, tp_diff, tp} = {%d, %d, %d}\n", rssi_return, tp_diff_return, tp_return);2597/*@4. Joint Return Decision*/2598if (tp_return) {2599if (tp_diff_return || rssi_diff) {2600PHYDM_DBG(dm, DBG_ANT_DIV, "***Return EVM SW AntDiv\n");2601return;2602}2603}2604}2605#endif26062607fat_tab->evm_method_enable = 1;2608if (fat_tab->div_path_type == ANT_PATH_A)2609odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);2610else if (fat_tab->div_path_type == ANT_PATH_B)2611odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_B);2612else if (fat_tab->div_path_type == ANT_PATH_AB)2613odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_AB);2614dm->antdiv_period = dm->evm_antdiv_period;2615odm_set_mac_reg(dm, R_0x608, BIT(8), 1); /*RCR accepts CRC32-Error packets*/2616fat_tab->fat_state_cnt++;2617fat_tab->get_stats = false;2618next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ? MAIN_ANT : AUX_ANT;2619odm_update_rx_idle_ant(dm, next_ant);2620PHYDM_DBG(dm, DBG_ANT_DIV, "[Antdiv Delay ]\n");2621odm_set_timer(dm, &dm->evm_fast_ant_training_timer, dm->antdiv_delay); //ms2622} else if ((fat_tab->fat_state_cnt % 2) != 0) {2623fat_tab->fat_state_cnt++;2624fat_tab->get_stats = true;2625odm_set_timer(dm, &dm->evm_fast_ant_training_timer, dm->antdiv_intvl); //ms2626} else if ((fat_tab->fat_state_cnt % 2) == 0) {2627fat_tab->fat_state_cnt++;2628fat_tab->get_stats = false;2629next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;2630odm_update_rx_idle_ant(dm, next_ant);2631PHYDM_DBG(dm, DBG_ANT_DIV, "[Antdiv Delay ]\n");2632odm_set_timer(dm, &dm->evm_fast_ant_training_timer, dm->antdiv_delay); //ms2633}2634}2635/*@Decision state: 4==============================================================*/2636else {2637fat_tab->get_stats = false;2638fat_tab->fat_state_cnt = 0;2639PHYDM_DBG(dm, DBG_ANT_DIV, "[Decisoin state ]\n");26402641/* @3 [CRC32 statistic] */2642#if 02643if ((fat_tab->main_crc32_ok_cnt > (fat_tab->aux_crc32_ok_cnt << 1)) || (diff_rssi >= 40 && rssi_larger_ant == MAIN_ANT)) {2644fat_tab->target_ant_crc32 = MAIN_ANT;2645force_antenna = true;2646PHYDM_DBG(dm, DBG_ANT_DIV, "CRC32 Force Main\n");2647} else if ((fat_tab->aux_crc32_ok_cnt > ((fat_tab->main_crc32_ok_cnt) << 1)) || ((diff_rssi >= 40) && (rssi_larger_ant == AUX_ANT))) {2648fat_tab->target_ant_crc32 = AUX_ANT;2649force_antenna = true;2650PHYDM_DBG(dm, DBG_ANT_DIV, "CRC32 Force Aux\n");2651} else2652#endif2653{2654if (fat_tab->main_crc32_fail_cnt <= 5)2655fat_tab->main_crc32_fail_cnt = 5;26562657if (fat_tab->aux_crc32_fail_cnt <= 5)2658fat_tab->aux_crc32_fail_cnt = 5;26592660if (fat_tab->main_crc32_ok_cnt > fat_tab->main_crc32_fail_cnt)2661main_above1 = true;26622663if (fat_tab->aux_crc32_ok_cnt > fat_tab->aux_crc32_fail_cnt)2664aux_above1 = true;26652666if (main_above1 == true && aux_above1 == false) {2667force_antenna = true;2668fat_tab->target_ant_crc32 = MAIN_ANT;2669} else if (main_above1 == false && aux_above1 == true) {2670force_antenna = true;2671fat_tab->target_ant_crc32 = AUX_ANT;2672} else if (main_above1 == true && aux_above1 == true) {2673main_crc_utility = ((fat_tab->main_crc32_ok_cnt) << 7) / fat_tab->main_crc32_fail_cnt;2674aux_crc_utility = ((fat_tab->aux_crc32_ok_cnt) << 7) / fat_tab->aux_crc32_fail_cnt;2675fat_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);26762677if (main_crc_utility != 0 && aux_crc_utility != 0) {2678if (main_crc_utility >= aux_crc_utility)2679utility_ratio = (main_crc_utility << 1) / aux_crc_utility;2680else2681utility_ratio = (aux_crc_utility << 1) / main_crc_utility;2682}2683} else if (main_above1 == false && aux_above1 == false) {2684if (fat_tab->main_crc32_ok_cnt == 0)2685fat_tab->main_crc32_ok_cnt = 1;2686if (fat_tab->aux_crc32_ok_cnt == 0)2687fat_tab->aux_crc32_ok_cnt = 1;26882689main_crc_utility = ((fat_tab->main_crc32_fail_cnt) << 7) / fat_tab->main_crc32_ok_cnt;2690aux_crc_utility = ((fat_tab->aux_crc32_fail_cnt) << 7) / fat_tab->aux_crc32_ok_cnt;2691fat_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);26922693if (main_crc_utility != 0 && aux_crc_utility != 0) {2694if (main_crc_utility >= aux_crc_utility)2695utility_ratio = (main_crc_utility << 1) / (aux_crc_utility);2696else2697utility_ratio = (aux_crc_utility << 1) / (main_crc_utility);2698}2699}2700}2701odm_set_mac_reg(dm, R_0x608, BIT(8), 0); /* NOT Accept CRC32 Error packets. */2702PHYDM_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);2703PHYDM_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);2704PHYDM_DBG(dm, DBG_ANT_DIV, "***1.TargetAnt_CRC32 = ((%s))\n", (fat_tab->target_ant_crc32 == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");27052706for (i = 0; i < HT_IDX; i++) {2707main_cnt_all += fat_tab->main_ht_cnt[i];2708aux_cnt_all += fat_tab->aux_ht_cnt[i];27092710if (fat_tab->main_ht_cnt[i] > main_max_cnt) {2711main_max_cnt = fat_tab->main_ht_cnt[i];2712main_max_idx = i;2713}27142715if (fat_tab->aux_ht_cnt[i] > aux_max_cnt) {2716aux_max_cnt = fat_tab->aux_ht_cnt[i];2717aux_max_idx = i;2718}2719}27202721for (i = 0; i < rate_num; i++) {2722rate_ss_shift = (i << 3);2723PHYDM_DBG(dm, DBG_ANT_DIV, "*main_ht_cnt HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}\n",2724(rate_ss_shift), (rate_ss_shift + 7),2725fat_tab->main_ht_cnt[rate_ss_shift + 0], fat_tab->main_ht_cnt[rate_ss_shift + 1],2726fat_tab->main_ht_cnt[rate_ss_shift + 2], fat_tab->main_ht_cnt[rate_ss_shift + 3],2727fat_tab->main_ht_cnt[rate_ss_shift + 4], fat_tab->main_ht_cnt[rate_ss_shift + 5],2728fat_tab->main_ht_cnt[rate_ss_shift + 6], fat_tab->main_ht_cnt[rate_ss_shift + 7]);2729}27302731for (i = 0; i < rate_num; i++) {2732rate_ss_shift = (i << 3);2733PHYDM_DBG(dm, DBG_ANT_DIV, "*aux_ht_cnt HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}\n",2734(rate_ss_shift), (rate_ss_shift + 7),2735fat_tab->aux_ht_cnt[rate_ss_shift + 0], fat_tab->aux_ht_cnt[rate_ss_shift + 1],2736fat_tab->aux_ht_cnt[rate_ss_shift + 2], fat_tab->aux_ht_cnt[rate_ss_shift + 3],2737fat_tab->aux_ht_cnt[rate_ss_shift + 4], fat_tab->aux_ht_cnt[rate_ss_shift + 5],2738fat_tab->aux_ht_cnt[rate_ss_shift + 6], fat_tab->aux_ht_cnt[rate_ss_shift + 7]);2739}27402741/* @3 [EVM statistic] */2742/*@1SS EVM*/2743main_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;2744aux_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;2745target_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);27462747PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Main1ss_EVM= (( %d ))\n", fat_tab->main_evm_cnt[mac_id], main_1ss_evm);2748PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Aux_1ss_EVM = (( %d ))\n", fat_tab->aux_evm_cnt[mac_id], aux_1ss_evm);27492750/*@2SS EVM*/2751main_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;2752main_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;2753main_2ss_evm_sum = main_2ss_evm[0] + main_2ss_evm[1];27542755aux_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;2756aux_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;2757aux_2ss_evm_sum = aux_2ss_evm[0] + aux_2ss_evm[1];27582759target_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);27602761PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Main2ss_EVM{A,B,Sum} = {%d, %d, %d}\n",2762fat_tab->main_evm_2ss_cnt[mac_id], main_2ss_evm[0], main_2ss_evm[1], main_2ss_evm_sum);2763PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Aux_2ss_EVM{A,B,Sum} = {%d, %d, %d}\n",2764fat_tab->aux_evm_2ss_cnt[mac_id], aux_2ss_evm[0], aux_2ss_evm[1], aux_2ss_evm_sum);27652766if ((main_2ss_evm_sum + aux_2ss_evm_sum) != 0) {2767decision_evm_ss = 2;2768main_evm = main_2ss_evm_sum;2769aux_evm = aux_2ss_evm_sum;2770fat_tab->target_ant_evm = target_ant_evm_2ss;2771} else {2772decision_evm_ss = 1;2773main_evm = main_1ss_evm;2774aux_evm = aux_1ss_evm;2775fat_tab->target_ant_evm = target_ant_evm_1ss;2776}27772778if ((main_evm == 0 || aux_evm == 0))2779diff_EVM = 100;2780else if (main_evm >= aux_evm)2781diff_EVM = main_evm - aux_evm;2782else2783diff_EVM = aux_evm - main_evm;27842785PHYDM_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");27862787//3 [TP statistic]2788main_tp_avg = (fat_tab->main_tp_cnt != 0) ? (fat_tab->main_tp / fat_tab->main_tp_cnt) : 0;2789aux_tp_avg = (fat_tab->aux_tp_cnt != 0) ? (fat_tab->aux_tp / fat_tab->aux_tp_cnt) : 0;2790tp_diff_avg = DIFF_2(main_tp_avg, aux_tp_avg);2791fat_tab->target_ant_tp = (tp_diff_avg < 100) ? (fat_tab->pre_target_ant_enhance) : ((main_tp_avg >= aux_tp_avg) ? MAIN_ANT : AUX_ANT);27922793PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Main_TP = ((%d))\n", fat_tab->main_tp_cnt, main_tp_avg);2794PHYDM_DBG(dm, DBG_ANT_DIV, "Cnt = ((%d)), Aux_TP = ((%d))\n", fat_tab->aux_tp_cnt, aux_tp_avg);2795PHYDM_DBG(dm, DBG_ANT_DIV, "***3.TargetAnt_TP = ((%s))\n", (fat_tab->target_ant_tp == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");27962797/*Reset TP Method */2798fat_tab->main_tp = 0;2799fat_tab->aux_tp = 0;2800fat_tab->main_tp_cnt = 0;2801fat_tab->aux_tp_cnt = 0;28022803/* @2 [ Decision state ] */2804#if 12805if (main_max_idx == aux_max_idx && ((main_cnt_all + aux_cnt_all) != 0)) {2806PHYDM_DBG(dm, DBG_ANT_DIV, "Decision EVM, main_max_idx = ((MCS%d)), aux_max_idx = ((MCS%d))\n", main_max_idx, aux_max_idx);2807fat_tab->target_ant_enhance = fat_tab->target_ant_evm;2808} else {2809PHYDM_DBG(dm, DBG_ANT_DIV, "Decision TP, main_max_idx = ((MCS%d)), aux_max_idx = ((MCS%d))\n", main_max_idx, aux_max_idx);2810fat_tab->target_ant_enhance = fat_tab->target_ant_tp;2811}2812#else2813if (fat_tab->target_ant_evm == fat_tab->target_ant_crc32) {2814PHYDM_DBG(dm, DBG_ANT_DIV, "Decision type 1, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM);28152816if ((utility_ratio < 2 && force_antenna == false) && diff_EVM <= 30)2817fat_tab->target_ant_enhance = fat_tab->pre_target_ant_enhance;2818else2819fat_tab->target_ant_enhance = fat_tab->target_ant_evm;2820}2821#if 02822else if ((diff_EVM <= 50 && (utility_ratio > 4 && force_antenna == false)) || (force_antenna == true)) {2823PHYDM_DBG(dm, DBG_ANT_DIV, "Decision type 2, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM);2824fat_tab->target_ant_enhance = fat_tab->target_ant_crc32;2825}2826#endif2827else if (diff_EVM >= 20) {2828PHYDM_DBG(dm, DBG_ANT_DIV, "Decision type 3, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM);2829fat_tab->target_ant_enhance = fat_tab->target_ant_evm;2830} else if (utility_ratio >= 6 && force_antenna == false) {2831PHYDM_DBG(dm, DBG_ANT_DIV, "Decision type 4, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM);2832fat_tab->target_ant_enhance = fat_tab->target_ant_crc32;2833} else {2834PHYDM_DBG(dm, DBG_ANT_DIV, "Decision type 5, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM);28352836if (force_antenna == true)2837score_CRC = 2;2838else if (utility_ratio >= 5) /*@>2.5*/2839score_CRC = 2;2840else if (utility_ratio >= 4) /*@>2*/2841score_CRC = 1;2842else2843score_CRC = 0;28442845if (diff_EVM >= 15)2846score_EVM = 3;2847else if (diff_EVM >= 10)2848score_EVM = 2;2849else if (diff_EVM >= 5)2850score_EVM = 1;2851else2852score_EVM = 0;28532854if (score_CRC > score_EVM)2855fat_tab->target_ant_enhance = fat_tab->target_ant_crc32;2856else if (score_CRC < score_EVM)2857fat_tab->target_ant_enhance = fat_tab->target_ant_evm;2858else2859fat_tab->target_ant_enhance = fat_tab->pre_target_ant_enhance;2860}2861#endif2862fat_tab->pre_target_ant_enhance = fat_tab->target_ant_enhance;28632864PHYDM_DBG(dm, DBG_ANT_DIV, "*** 4.TargetAnt_enhance = (( %s ))******\n", (fat_tab->target_ant_enhance == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");2865}2866} else { /* RSSI< = evm_rssi_th_low */2867PHYDM_DBG(dm, DBG_ANT_DIV, "[ <TH_L: escape from > TH_L ]\n");2868odm_evm_fast_ant_reset(dm);2869}2870} else {2871PHYDM_DBG(dm, DBG_ANT_DIV,2872"[escape from> TH_H || evm_method_enable==1]\n");2873odm_evm_fast_ant_reset(dm);2874}2875} else {2876PHYDM_DBG(dm, DBG_ANT_DIV, "[multi-Client]\n");2877odm_evm_fast_ant_reset(dm);2878}2879}2880}28812882#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)2883void phydm_evm_antdiv_callback(2884struct phydm_timer_list *timer)2885{2886void *adapter = (void *)timer->Adapter;2887HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));2888struct dm_struct *dm = &hal_data->DM_OutSrc;28892890#if DEV_BUS_TYPE == RT_PCI_INTERFACE2891#if USE_WORKITEM2892odm_schedule_work_item(&dm->phydm_evm_antdiv_workitem);2893#else2894{2895odm_hw_ant_div(dm);2896}2897#endif2898#else2899odm_schedule_work_item(&dm->phydm_evm_antdiv_workitem);2900#endif2901}29022903void phydm_evm_antdiv_workitem_callback(2904void *context)2905{2906void *adapter = (void *)context;2907HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));2908struct dm_struct *dm = &hal_data->DM_OutSrc;29092910odm_hw_ant_div(dm);2911}29122913#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)2914void phydm_evm_antdiv_callback(void *dm_void)2915{2916struct dm_struct *dm = (struct dm_struct *)dm_void;2917void *padapter = dm->adapter;29182919if (*dm->is_net_closed)2920return;2921if (dm->support_interface == ODM_ITRF_PCIE) {2922odm_hw_ant_div(dm);2923} else {2924/* @Can't do I/O in timer callback*/2925phydm_run_in_thread_cmd(dm,2926phydm_evm_antdiv_workitem_callback,2927padapter);2928}2929}29302931void phydm_evm_antdiv_workitem_callback(void *context)2932{2933void *adapter = (void *)context;2934HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));2935struct dm_struct *dm = &hal_data->odmpriv;29362937odm_hw_ant_div(dm);2938}29392940#else2941void phydm_evm_antdiv_callback(2942void *dm_void)2943{2944struct dm_struct *dm = (struct dm_struct *)dm_void;29452946PHYDM_DBG(dm, DBG_ANT_DIV, "******AntDiv_Callback******\n");2947odm_hw_ant_div(dm);2948}2949#endif29502951#endif29522953void odm_hw_ant_div(void *dm_void)2954{2955struct dm_struct *dm = (struct dm_struct *)dm_void;2956u32 i, min_max_rssi = 0xFF, ant_div_max_rssi = 0, max_rssi = 0;2957u32 main_rssi, aux_rssi, mian_cnt, aux_cnt, local_max_rssi;2958struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;2959u8 rx_idle_ant = fat_tab->rx_idle_ant, target_ant = 7;2960struct phydm_dig_struct *dig_t = &dm->dm_dig_table;2961struct cmn_sta_info *sta;29622963#ifdef PHYDM_BEAMFORMING_SUPPORT2964#if (DM_ODM_SUPPORT_TYPE == ODM_AP)2965struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;2966u32 TH1 = 500000;2967u32 TH2 = 10000000;2968u32 ma_rx_temp, degrade_TP_temp, improve_TP_temp;2969u8 monitor_rssi_threshold = 30;29702971dm_bdc_table->BF_pass = true;2972dm_bdc_table->DIV_pass = true;2973dm_bdc_table->is_all_div_sta_idle = true;2974dm_bdc_table->is_all_bf_sta_idle = true;2975dm_bdc_table->num_bf_tar = 0;2976dm_bdc_table->num_div_tar = 0;2977dm_bdc_table->num_client = 0;2978#endif2979#endif29802981if (!dm->is_linked) { /* @is_linked==False */2982PHYDM_DBG(dm, DBG_ANT_DIV, "[No Link!!!]\n");29832984if (fat_tab->is_become_linked) {2985if (fat_tab->div_path_type == ANT_PATH_A)2986odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);2987else if (fat_tab->div_path_type == ANT_PATH_B)2988odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_B);2989else if (fat_tab->div_path_type == ANT_PATH_AB)2990odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_AB);2991odm_update_rx_idle_ant(dm, MAIN_ANT);2992odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);2993dm->antdiv_period = 0;29942995fat_tab->is_become_linked = dm->is_linked;2996}2997return;2998} else {2999if (!fat_tab->is_become_linked) {3000PHYDM_DBG(dm, DBG_ANT_DIV, "[Linked !!!]\n");3001if (fat_tab->div_path_type == ANT_PATH_A)3002odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);3003else if (fat_tab->div_path_type == ANT_PATH_B)3004odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_B);3005else if (fat_tab->div_path_type == ANT_PATH_AB)3006odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_AB);3007#if 03008/*odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);*/30093010/* @if(dm->support_ic_type == ODM_RTL8821 ) */3011/* odm_set_bb_reg(dm, R_0x800, BIT(25), 0); */3012/* CCK AntDiv function disable */30133014/* @#if(DM_ODM_SUPPORT_TYPE == ODM_AP) */3015/* @else if(dm->support_ic_type == ODM_RTL8881A) */3016/* odm_set_bb_reg(dm, R_0x800, BIT(25), 0); */3017/* CCK AntDiv function disable */3018/* @#endif */30193020/* @else if(dm->support_ic_type == ODM_RTL8723B ||*/3021/* @dm->support_ic_type == ODM_RTL8812) */3022/* odm_set_bb_reg(dm, R_0xa00, BIT(15), 0); */3023/* CCK AntDiv function disable */3024#endif30253026fat_tab->is_become_linked = dm->is_linked;30273028if (dm->support_ic_type == ODM_RTL8723B &&3029dm->ant_div_type == CG_TRX_HW_ANTDIV) {3030odm_set_bb_reg(dm, R_0x930, 0xF0, 8);3031/* @DPDT_P = ANTSEL[0] for 8723B AntDiv */3032odm_set_bb_reg(dm, R_0x930, 0xF, 8);3033/* @DPDT_N = ANTSEL[0] */3034}30353036/* @ BDC Init */3037#ifdef PHYDM_BEAMFORMING_SUPPORT3038#if (DM_ODM_SUPPORT_TYPE == ODM_AP)3039odm_bdc_init(dm);3040#endif3041#endif30423043#ifdef ODM_EVM_ENHANCE_ANTDIV3044odm_evm_fast_ant_reset(dm);3045#endif3046}3047}30483049if (!(*fat_tab->p_force_tx_by_desc)) {3050if (dm->is_one_entry_only)3051odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);3052else3053odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);3054}30553056#ifdef ODM_EVM_ENHANCE_ANTDIV3057if (dm->antdiv_evm_en == 1) {3058odm_evm_enhance_ant_div(dm);3059if (fat_tab->fat_state_cnt != 0)3060return;3061} else3062odm_evm_fast_ant_reset(dm);3063#endif30643065/* @2 BDC mode Arbitration */3066#ifdef PHYDM_BEAMFORMING_SUPPORT3067#if (DM_ODM_SUPPORT_TYPE == ODM_AP)3068if (dm->antdiv_evm_en == 0 || fat_tab->evm_method_enable == 0)3069odm_bf_ant_div_mode_arbitration(dm);3070#endif3071#endif30723073for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {3074sta = dm->phydm_sta_info[i];3075if (!is_sta_active(sta)) {3076phydm_antdiv_reset_statistic(dm, i);3077continue;3078}30793080/* @2 Caculate RSSI per Antenna */3081if (fat_tab->main_cnt[i] != 0 || fat_tab->aux_cnt[i] != 0) {3082mian_cnt = fat_tab->main_cnt[i];3083aux_cnt = fat_tab->aux_cnt[i];3084main_rssi = (mian_cnt != 0) ?3085(fat_tab->main_sum[i] / mian_cnt) : 0;3086aux_rssi = (aux_cnt != 0) ?3087(fat_tab->aux_sum[i] / aux_cnt) : 0;3088target_ant = (mian_cnt == aux_cnt) ?3089fat_tab->rx_idle_ant :3090((mian_cnt >= aux_cnt) ?3091MAIN_ANT : AUX_ANT);3092/*Use counter number for OFDM*/30933094} else { /*@CCK only case*/3095mian_cnt = fat_tab->main_cnt_cck[i];3096aux_cnt = fat_tab->aux_cnt_cck[i];3097main_rssi = (mian_cnt != 0) ?3098(fat_tab->main_sum_cck[i] / mian_cnt) : 0;3099aux_rssi = (aux_cnt != 0) ?3100(fat_tab->aux_sum_cck[i] / aux_cnt) : 0;3101target_ant = (main_rssi == aux_rssi) ?3102fat_tab->rx_idle_ant :3103((main_rssi >= aux_rssi) ?3104MAIN_ANT : AUX_ANT);3105/*Use RSSI for CCK only case*/3106}31073108PHYDM_DBG(dm, DBG_ANT_DIV,3109"*** Client[ %d ] : Main_Cnt = (( %d )) , CCK_Main_Cnt = (( %d )) , main_rssi= (( %d ))\n",3110i, fat_tab->main_cnt[i],3111fat_tab->main_cnt_cck[i], main_rssi);3112PHYDM_DBG(dm, DBG_ANT_DIV,3113"*** Client[ %d ] : Aux_Cnt = (( %d )) , CCK_Aux_Cnt = (( %d )) , aux_rssi = (( %d ))\n",3114i, fat_tab->aux_cnt[i],3115fat_tab->aux_cnt_cck[i], aux_rssi);31163117local_max_rssi = (main_rssi > aux_rssi) ? main_rssi : aux_rssi;3118/* @ Select max_rssi for DIG */3119if (local_max_rssi > ant_div_max_rssi && local_max_rssi < 40)3120ant_div_max_rssi = local_max_rssi;3121if (local_max_rssi > max_rssi)3122max_rssi = local_max_rssi;31233124/* @ Select RX Idle Antenna */3125if (local_max_rssi != 0 && local_max_rssi < min_max_rssi) {3126rx_idle_ant = target_ant;3127min_max_rssi = local_max_rssi;3128}31293130#ifdef ODM_EVM_ENHANCE_ANTDIV3131if (dm->antdiv_evm_en == 1) {3132if (fat_tab->target_ant_enhance != 0xFF) {3133target_ant = fat_tab->target_ant_enhance;3134rx_idle_ant = fat_tab->target_ant_enhance;3135}3136}3137#endif31383139/* @2 Select TX Antenna */3140if (dm->ant_div_type != CGCS_RX_HW_ANTDIV) {3141#ifdef PHYDM_BEAMFORMING_SUPPORT3142#if (DM_ODM_SUPPORT_TYPE == ODM_AP)3143if (dm_bdc_table->w_bfee_client[i] == 0)3144#endif3145#endif3146{3147odm_update_tx_ant(dm, target_ant, i);3148}3149}31503151/* @------------------------------------------------------------ */31523153#ifdef PHYDM_BEAMFORMING_SUPPORT3154#if (DM_ODM_SUPPORT_TYPE == ODM_AP)31553156dm_bdc_table->num_client++;31573158if (dm_bdc_table->bdc_mode == BDC_MODE_2 || dm_bdc_table->bdc_mode == BDC_MODE_3) {3159/* @2 Byte counter */31603161ma_rx_temp = sta->rx_moving_average_tp; /* RX TP ( bit /sec) */31623163if (dm_bdc_table->BDC_state == bdc_bfer_train_state)3164dm_bdc_table->MA_rx_TP_DIV[i] = ma_rx_temp;3165else3166dm_bdc_table->MA_rx_TP[i] = ma_rx_temp;31673168if (ma_rx_temp < TH2 && ma_rx_temp > TH1 && local_max_rssi <= monitor_rssi_threshold) {3169if (dm_bdc_table->w_bfer_client[i] == 1) { /* @Bfer_Target */3170dm_bdc_table->num_bf_tar++;31713172if (dm_bdc_table->BDC_state == BDC_DECISION_STATE && dm_bdc_table->bdc_try_flag == 0) {3173improve_TP_temp = (dm_bdc_table->MA_rx_TP_DIV[i] * 9) >> 3; /* @* 1.125 */3174dm_bdc_table->BF_pass = (dm_bdc_table->MA_rx_TP[i] > improve_TP_temp) ? true : false;3175PHYDM_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);3176}3177} else { /* @DIV_Target */3178dm_bdc_table->num_div_tar++;31793180if (dm_bdc_table->BDC_state == BDC_DECISION_STATE && dm_bdc_table->bdc_try_flag == 0) {3181degrade_TP_temp = (dm_bdc_table->MA_rx_TP_DIV[i] * 5) >> 3; /* @* 0.625 */3182dm_bdc_table->DIV_pass = (dm_bdc_table->MA_rx_TP[i] > degrade_TP_temp) ? true : false;3183PHYDM_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);3184}3185}3186}31873188if (ma_rx_temp > TH1) {3189if (dm_bdc_table->w_bfer_client[i] == 1) /* @Bfer_Target */3190dm_bdc_table->is_all_bf_sta_idle = false;3191else /* @DIV_Target */3192dm_bdc_table->is_all_div_sta_idle = false;3193}31943195PHYDM_DBG(dm, DBG_ANT_DIV,3196"*** Client[ %d ] : { BFmeeCap, BFmerCap} = { %d , %d }\n",3197i, dm_bdc_table->w_bfee_client[i],3198dm_bdc_table->w_bfer_client[i]);31993200if (dm_bdc_table->BDC_state == bdc_bfer_train_state)3201PHYDM_DBG(dm, DBG_ANT_DIV, "*** Client[ %d ] : MA_rx_TP_DIV = (( %d ))\n", i, dm_bdc_table->MA_rx_TP_DIV[i]);32023203else3204PHYDM_DBG(dm, DBG_ANT_DIV, "*** Client[ %d ] : MA_rx_TP = (( %d ))\n", i, dm_bdc_table->MA_rx_TP[i]);3205}3206#endif3207#endif32083209#ifdef PHYDM_BEAMFORMING_SUPPORT3210#if (DM_ODM_SUPPORT_TYPE == ODM_AP)3211if (dm_bdc_table->bdc_try_flag == 0)3212#endif3213#endif3214{3215phydm_antdiv_reset_statistic(dm, i);3216}3217}32183219/* @2 Set RX Idle Antenna & TX Antenna(Because of HW Bug ) */3220#if (DM_ODM_SUPPORT_TYPE == ODM_AP)3221PHYDM_DBG(dm, DBG_ANT_DIV, "*** rx_idle_ant = (( %s ))\n",3222(rx_idle_ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");32233224#ifdef PHYDM_BEAMFORMING_SUPPORT3225#if (DM_ODM_SUPPORT_TYPE == ODM_AP)3226if (dm_bdc_table->bdc_mode == BDC_MODE_1 || dm_bdc_table->bdc_mode == BDC_MODE_3) {3227PHYDM_DBG(dm, DBG_ANT_DIV,3228"*** bdc_rx_idle_update_counter = (( %d ))\n",3229dm_bdc_table->bdc_rx_idle_update_counter);32303231if (dm_bdc_table->bdc_rx_idle_update_counter == 1) {3232PHYDM_DBG(dm, DBG_ANT_DIV,3233"***Update RxIdle Antenna!!!\n");3234dm_bdc_table->bdc_rx_idle_update_counter = 30;3235odm_update_rx_idle_ant(dm, rx_idle_ant);3236} else {3237dm_bdc_table->bdc_rx_idle_update_counter--;3238PHYDM_DBG(dm, DBG_ANT_DIV,3239"***NOT update RxIdle Antenna because of BF ( need to fix TX-ant)\n");3240}3241} else3242#endif3243#endif3244odm_update_rx_idle_ant(dm, rx_idle_ant);3245#else32463247odm_update_rx_idle_ant(dm, rx_idle_ant);32483249#endif /* @#if(DM_ODM_SUPPORT_TYPE == ODM_AP) */32503251/* @2 BDC Main Algorithm */3252#ifdef PHYDM_BEAMFORMING_SUPPORT3253#if (DM_ODM_SUPPORT_TYPE == ODM_AP)3254if (dm->antdiv_evm_en == 0 || fat_tab->evm_method_enable == 0)3255odm_bd_ccoex_bfee_rx_div_arbitration(dm);32563257dm_bdc_table->num_txbfee_client = 0;3258dm_bdc_table->num_txbfer_client = 0;3259#endif3260#endif32613262if (ant_div_max_rssi == 0)3263dig_t->ant_div_rssi_max = dm->rssi_min;3264else3265dig_t->ant_div_rssi_max = ant_div_max_rssi;32663267PHYDM_DBG(dm, DBG_ANT_DIV, "***AntDiv End***\n\n");3268}32693270#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY32713272void odm_s0s1_sw_ant_div_reset(void *dm_void)3273{3274struct dm_struct *dm = (struct dm_struct *)dm_void;3275struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;3276struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;32773278fat_tab->is_become_linked = false;3279swat_tab->try_flag = SWAW_STEP_INIT;3280swat_tab->double_chk_flag = 0;32813282PHYDM_DBG(dm, DBG_ANT_DIV, "%s: fat_tab->is_become_linked = %d\n",3283__func__, fat_tab->is_become_linked);3284}32853286void phydm_sw_antdiv_train_time(void *dm_void)3287{3288struct dm_struct *dm = (struct dm_struct *)dm_void;3289struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;3290u8 high_traffic_train_time_u = 0x32, high_traffic_train_time_l = 0;3291u8 low_traffic_train_time_u = 200, low_traffic_train_time_l = 0;3292u8 train_time_temp;32933294if (dm->traffic_load == TRAFFIC_HIGH) {3295train_time_temp = swat_tab->train_time;32963297if (swat_tab->train_time_flag == 3) {3298high_traffic_train_time_l = 0xa;32993300if (train_time_temp <= 16)3301train_time_temp = high_traffic_train_time_l;3302else3303train_time_temp -= 16;33043305} else if (swat_tab->train_time_flag == 2) {3306train_time_temp -= 8;3307high_traffic_train_time_l = 0xf;3308} else if (swat_tab->train_time_flag == 1) {3309train_time_temp -= 4;3310high_traffic_train_time_l = 0x1e;3311} else if (swat_tab->train_time_flag == 0) {3312train_time_temp += 8;3313high_traffic_train_time_l = 0x28;3314}33153316if (dm->support_ic_type == ODM_RTL8188F) {3317if (dm->support_interface == ODM_ITRF_SDIO)3318high_traffic_train_time_l += 0xa;3319}33203321/* @-- */3322if (train_time_temp > high_traffic_train_time_u)3323train_time_temp = high_traffic_train_time_u;33243325else if (train_time_temp < high_traffic_train_time_l)3326train_time_temp = high_traffic_train_time_l;33273328swat_tab->train_time = train_time_temp; /*@10ms~200ms*/33293330PHYDM_DBG(dm, DBG_ANT_DIV,3331"train_time_flag=((%d)), train_time=((%d))\n",3332swat_tab->train_time_flag,3333swat_tab->train_time);33343335} else if ((dm->traffic_load == TRAFFIC_MID) ||3336(dm->traffic_load == TRAFFIC_LOW)) {3337train_time_temp = swat_tab->train_time;33383339if (swat_tab->train_time_flag == 3) {3340low_traffic_train_time_l = 10;3341if (train_time_temp < 50)3342train_time_temp = low_traffic_train_time_l;3343else3344train_time_temp -= 50;3345} else if (swat_tab->train_time_flag == 2) {3346train_time_temp -= 30;3347low_traffic_train_time_l = 36;3348} else if (swat_tab->train_time_flag == 1) {3349train_time_temp -= 10;3350low_traffic_train_time_l = 40;3351} else {3352train_time_temp += 10;3353low_traffic_train_time_l = 50;3354}33553356if (dm->support_ic_type == ODM_RTL8188F) {3357if (dm->support_interface == ODM_ITRF_SDIO)3358low_traffic_train_time_l += 10;3359}33603361/* @-- */3362if (train_time_temp >= low_traffic_train_time_u)3363train_time_temp = low_traffic_train_time_u;33643365else if (train_time_temp <= low_traffic_train_time_l)3366train_time_temp = low_traffic_train_time_l;33673368swat_tab->train_time = train_time_temp; /*@10ms~200ms*/33693370PHYDM_DBG(dm, DBG_ANT_DIV,3371"train_time_flag=((%d)) , train_time=((%d))\n",3372swat_tab->train_time_flag, swat_tab->train_time);33733374} else {3375swat_tab->train_time = 0xc8; /*@200ms*/3376}3377}33783379void phydm_sw_antdiv_decision(void *dm_void)3380{3381struct dm_struct *dm = (struct dm_struct *)dm_void;3382struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;3383struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;3384u32 i, min_max_rssi = 0xFF, local_max_rssi, local_min_rssi;3385u32 main_rssi, aux_rssi;3386u8 rx_idle_ant = swat_tab->pre_ant;3387u8 target_ant = swat_tab->pre_ant, next_ant = 0;3388struct cmn_sta_info *entry = NULL;3389u32 main_cnt = 0, aux_cnt = 0, main_sum = 0, aux_sum = 0;3390u32 main_ctrl_cnt = 0, aux_ctrl_cnt = 0;3391boolean is_by_ctrl_frame = false;3392boolean cond_23d_main, cond_23d_aux;3393u64 pkt_cnt_total = 0;33943395for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {3396entry = dm->phydm_sta_info[i];3397if (!is_sta_active(entry)) {3398phydm_antdiv_reset_statistic(dm, i);3399continue;3400}34013402/* @2 Caculate RSSI per Antenna */3403if (fat_tab->main_cnt[i] != 0 || fat_tab->aux_cnt[i] != 0) {3404main_cnt = (u32)fat_tab->main_cnt[i];3405aux_cnt = (u32)fat_tab->aux_cnt[i];3406main_rssi = (main_cnt != 0) ?3407(fat_tab->main_sum[i] / main_cnt) : 0;3408aux_rssi = (aux_cnt != 0) ?3409(fat_tab->aux_sum[i] / aux_cnt) : 0;3410if (dm->support_ic_type == ODM_RTL8723D) {3411cond_23d_main = (aux_cnt > main_cnt) &&3412((main_rssi - aux_rssi < 5) ||3413(aux_rssi > main_rssi));3414cond_23d_aux = (main_cnt > aux_cnt) &&3415((aux_rssi - main_rssi < 5) ||3416(main_rssi > aux_rssi));3417if (swat_tab->pre_ant == MAIN_ANT) {3418if (main_cnt == 0)3419target_ant = (aux_cnt != 0) ?3420AUX_ANT :3421swat_tab->pre_ant;3422else3423target_ant = cond_23d_main ?3424AUX_ANT :3425swat_tab->pre_ant;3426} else {3427if (aux_cnt == 0)3428target_ant = (main_cnt != 0) ?3429MAIN_ANT :3430swat_tab->pre_ant;3431else3432target_ant = cond_23d_aux ?3433MAIN_ANT :3434swat_tab->pre_ant;3435}3436} else {3437if (swat_tab->pre_ant == MAIN_ANT) {3438target_ant = (aux_rssi > main_rssi) ?3439AUX_ANT :3440swat_tab->pre_ant;3441} else if (swat_tab->pre_ant == AUX_ANT) {3442target_ant = (main_rssi > aux_rssi) ?3443MAIN_ANT :3444swat_tab->pre_ant;3445}3446}3447} else { /*@CCK only case*/3448main_cnt = fat_tab->main_cnt_cck[i];3449aux_cnt = fat_tab->aux_cnt_cck[i];3450main_rssi = (main_cnt != 0) ?3451(fat_tab->main_sum_cck[i] / main_cnt) : 0;3452aux_rssi = (aux_cnt != 0) ?3453(fat_tab->aux_sum_cck[i] / aux_cnt) : 0;3454target_ant = (main_rssi == aux_rssi) ?3455swat_tab->pre_ant :3456((main_rssi >= aux_rssi) ?3457MAIN_ANT : AUX_ANT);3458/*Use RSSI for CCK only case*/3459}3460local_max_rssi = (main_rssi >= aux_rssi) ? main_rssi : aux_rssi;3461local_min_rssi = (main_rssi >= aux_rssi) ? aux_rssi : main_rssi;34623463PHYDM_DBG(dm, DBG_ANT_DIV,3464"*** CCK_counter_main = (( %d )) , CCK_counter_aux= (( %d ))\n",3465fat_tab->main_cnt_cck[i], fat_tab->aux_cnt_cck[i]);3466PHYDM_DBG(dm, DBG_ANT_DIV,3467"*** OFDM_counter_main = (( %d )) , OFDM_counter_aux= (( %d ))\n",3468fat_tab->main_cnt[i], fat_tab->aux_cnt[i]);3469PHYDM_DBG(dm, DBG_ANT_DIV,3470"*** main_Cnt = (( %d )) , aux_Cnt = (( %d ))\n",3471main_cnt, aux_cnt);3472PHYDM_DBG(dm, DBG_ANT_DIV,3473"*** main_rssi= (( %d )) , aux_rssi = (( %d ))\n",3474main_rssi, aux_rssi);3475PHYDM_DBG(dm, DBG_ANT_DIV,3476"*** MAC ID:[ %d ] , target_ant = (( %s ))\n", i,3477(target_ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");34783479/* @2 Select RX Idle Antenna */34803481if (local_max_rssi != 0 && local_max_rssi < min_max_rssi) {3482rx_idle_ant = target_ant;3483min_max_rssi = local_max_rssi;3484PHYDM_DBG(dm, DBG_ANT_DIV,3485"*** local_max_rssi-local_min_rssi = ((%d))\n",3486(local_max_rssi - local_min_rssi));34873488if ((local_max_rssi - local_min_rssi) > 8) {3489if (local_min_rssi != 0) {3490swat_tab->train_time_flag = 3;3491} else {3492if (min_max_rssi > RSSI_CHECK_THRESHOLD)3493swat_tab->train_time_flag = 0;3494else3495swat_tab->train_time_flag = 3;3496}3497} else if ((local_max_rssi - local_min_rssi) > 5) {3498swat_tab->train_time_flag = 2;3499} else if ((local_max_rssi - local_min_rssi) > 2) {3500swat_tab->train_time_flag = 1;3501} else {3502swat_tab->train_time_flag = 0;3503}3504}35053506/* @2 Select TX Antenna */3507if (target_ant == MAIN_ANT)3508fat_tab->antsel_a[i] = ANT1_2G;3509else3510fat_tab->antsel_a[i] = ANT2_2G;35113512phydm_antdiv_reset_statistic(dm, i);3513pkt_cnt_total += (main_cnt + aux_cnt);3514}35153516if (swat_tab->is_sw_ant_div_by_ctrl_frame) {3517odm_s0s1_sw_ant_div_by_ctrl_frame(dm, SWAW_STEP_DETERMINE);3518is_by_ctrl_frame = true;3519}35203521PHYDM_DBG(dm, DBG_ANT_DIV,3522"Control frame packet counter = %d, data frame packet counter = %llu\n",3523swat_tab->pkt_cnt_sw_ant_div_by_ctrl_frame, pkt_cnt_total);35243525if (min_max_rssi == 0xff || ((pkt_cnt_total <3526(swat_tab->pkt_cnt_sw_ant_div_by_ctrl_frame >> 1)) &&3527dm->phy_dbg_info.num_qry_beacon_pkt < 2)) {3528min_max_rssi = 0;3529PHYDM_DBG(dm, DBG_ANT_DIV,3530"Check RSSI of control frame because min_max_rssi == 0xff\n");3531PHYDM_DBG(dm, DBG_ANT_DIV, "is_by_ctrl_frame = %d\n",3532is_by_ctrl_frame);35333534if (is_by_ctrl_frame) {3535main_ctrl_cnt = fat_tab->main_ctrl_cnt;3536aux_ctrl_cnt = fat_tab->aux_ctrl_cnt;3537main_rssi = (main_ctrl_cnt != 0) ?3538(fat_tab->main_ctrl_sum / main_ctrl_cnt) :35390;3540aux_rssi = (aux_ctrl_cnt != 0) ?3541(fat_tab->aux_ctrl_sum / aux_ctrl_cnt) : 0;35423543if (main_ctrl_cnt <= 1 &&3544fat_tab->cck_ctrl_frame_cnt_main >= 1)3545main_rssi = 0;35463547if (aux_ctrl_cnt <= 1 &&3548fat_tab->cck_ctrl_frame_cnt_aux >= 1)3549aux_rssi = 0;35503551if (main_rssi != 0 || aux_rssi != 0) {3552rx_idle_ant = (main_rssi == aux_rssi) ?3553swat_tab->pre_ant :3554((main_rssi >= aux_rssi) ?3555MAIN_ANT : AUX_ANT);3556local_max_rssi = (main_rssi >= aux_rssi) ?3557main_rssi : aux_rssi;3558local_min_rssi = (main_rssi >= aux_rssi) ?3559aux_rssi : main_rssi;35603561if ((local_max_rssi - local_min_rssi) > 8)3562swat_tab->train_time_flag = 3;3563else if ((local_max_rssi - local_min_rssi) > 5)3564swat_tab->train_time_flag = 2;3565else if ((local_max_rssi - local_min_rssi) > 2)3566swat_tab->train_time_flag = 1;3567else3568swat_tab->train_time_flag = 0;35693570PHYDM_DBG(dm, DBG_ANT_DIV,3571"Control frame: main_rssi = %d, aux_rssi = %d\n",3572main_rssi, aux_rssi);3573PHYDM_DBG(dm, DBG_ANT_DIV,3574"rx_idle_ant decided by control frame = %s\n",3575(rx_idle_ant == MAIN_ANT ?3576"MAIN" : "AUX"));3577}3578}3579}35803581fat_tab->min_max_rssi = min_max_rssi;3582swat_tab->try_flag = SWAW_STEP_PEEK;35833584if (swat_tab->double_chk_flag == 1) {3585swat_tab->double_chk_flag = 0;35863587if (fat_tab->min_max_rssi > RSSI_CHECK_THRESHOLD) {3588PHYDM_DBG(dm, DBG_ANT_DIV,3589" [Double check] min_max_rssi ((%d)) > %d again!!\n",3590fat_tab->min_max_rssi, RSSI_CHECK_THRESHOLD);35913592odm_update_rx_idle_ant(dm, rx_idle_ant);35933594PHYDM_DBG(dm, DBG_ANT_DIV,3595"[reset try_flag = 0] Training accomplished !!!]\n\n\n");3596} else {3597PHYDM_DBG(dm, DBG_ANT_DIV,3598" [Double check] min_max_rssi ((%d)) <= %d !!\n",3599fat_tab->min_max_rssi, RSSI_CHECK_THRESHOLD);36003601next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ?3602AUX_ANT : MAIN_ANT;3603swat_tab->try_flag = SWAW_STEP_PEEK;3604swat_tab->reset_idx = RSSI_CHECK_RESET_PERIOD;3605PHYDM_DBG(dm, DBG_ANT_DIV,3606"[set try_flag=0] Normal state: Need to tryg again!!\n\n\n");3607}3608} else {3609if (fat_tab->min_max_rssi < RSSI_CHECK_THRESHOLD)3610swat_tab->reset_idx = RSSI_CHECK_RESET_PERIOD;36113612swat_tab->pre_ant = rx_idle_ant;3613odm_update_rx_idle_ant(dm, rx_idle_ant);3614PHYDM_DBG(dm, DBG_ANT_DIV,3615"[reset try_flag = 0] Training accomplished !!!]\n\n\n");3616}3617}36183619void odm_s0s1_sw_ant_div(void *dm_void, u8 step)3620{3621struct dm_struct *dm = (struct dm_struct *)dm_void;3622struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;3623struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;3624u32 value32;3625u8 next_ant = 0;36263627if (!dm->is_linked) { /* @is_linked==False */3628PHYDM_DBG(dm, DBG_ANT_DIV, "[No Link!!!]\n");3629if (fat_tab->is_become_linked == true) {3630odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);3631if (dm->support_ic_type == ODM_RTL8723B) {3632PHYDM_DBG(dm, DBG_ANT_DIV,3633"Set REG 948[9:6]=0x0\n");3634odm_set_bb_reg(dm, R_0x948, 0x3c0, 0x0);3635}3636fat_tab->is_become_linked = dm->is_linked;3637}3638return;3639} else {3640if (fat_tab->is_become_linked == false) {3641PHYDM_DBG(dm, DBG_ANT_DIV, "[Linked !!!]\n");36423643if (dm->support_ic_type == ODM_RTL8723B) {3644value32 = odm_get_bb_reg(dm, R_0x864, 0x38);36453646#if (RTL8723B_SUPPORT == 1)3647if (value32 == 0x0)3648odm_update_rx_idle_ant_8723b(dm,3649MAIN_ANT,3650ANT1_2G,3651ANT2_2G);3652else if (value32 == 0x1)3653odm_update_rx_idle_ant_8723b(dm,3654AUX_ANT,3655ANT2_2G,3656ANT1_2G);3657#endif36583659PHYDM_DBG(dm, DBG_ANT_DIV,3660"8723B: First link! Force antenna to %s\n",3661(value32 == 0x0 ? "MAIN" : "AUX"));3662}36633664if (dm->support_ic_type == ODM_RTL8723D) {3665value32 = odm_get_bb_reg(dm, R_0x864, 0x38);3666#if (RTL8723D_SUPPORT == 1)3667if (value32 == 0x0)3668odm_update_rx_idle_ant_8723d(dm,3669MAIN_ANT,3670ANT1_2G,3671ANT2_2G);3672else if (value32 == 0x1)3673odm_update_rx_idle_ant_8723d(dm,3674AUX_ANT,3675ANT2_2G,3676ANT1_2G);3677PHYDM_DBG(dm, DBG_ANT_DIV,3678"8723D: First link! Force antenna to %s\n",3679(value32 == 0x0 ? "MAIN" : "AUX"));3680#endif3681}3682fat_tab->is_become_linked = dm->is_linked;3683}3684}36853686if (!(*fat_tab->p_force_tx_by_desc)) {3687if (dm->is_one_entry_only == true)3688odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);3689else3690odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);3691}36923693PHYDM_DBG(dm, DBG_ANT_DIV,3694"[%d] { try_flag=(( %d )), step=(( %d )), double_chk_flag = (( %d )) }\n",3695__LINE__, swat_tab->try_flag, step,3696swat_tab->double_chk_flag);36973698/* @ Handling step mismatch condition. */3699/* @ Peak step is not finished at last time. */3700/* @ Recover the variable and check again. */3701if (step != swat_tab->try_flag) {3702PHYDM_DBG(dm, DBG_ANT_DIV,3703"[step != try_flag] Need to Reset After Link\n");3704odm_sw_ant_div_rest_after_link(dm);3705}37063707if (swat_tab->try_flag == SWAW_STEP_INIT) {3708swat_tab->try_flag = SWAW_STEP_PEEK;3709swat_tab->train_time_flag = 0;3710PHYDM_DBG(dm, DBG_ANT_DIV,3711"[set try_flag = 0] Prepare for peek!\n\n");3712return;37133714} else {3715/* @1 Normal state (Begin Trying) */3716if (swat_tab->try_flag == SWAW_STEP_PEEK) {3717PHYDM_DBG(dm, DBG_ANT_DIV,3718"TxOkCnt=(( %llu )), RxOkCnt=(( %llu )), traffic_load = (%d))\n",3719dm->cur_tx_ok_cnt, dm->cur_rx_ok_cnt,3720dm->traffic_load);3721phydm_sw_antdiv_train_time(dm);37223723PHYDM_DBG(dm, DBG_ANT_DIV,3724"Current min_max_rssi is ((%d))\n",3725fat_tab->min_max_rssi);37263727/* @---reset index--- */3728if (swat_tab->reset_idx >= RSSI_CHECK_RESET_PERIOD) {3729fat_tab->min_max_rssi = 0;3730swat_tab->reset_idx = 0;3731}3732PHYDM_DBG(dm, DBG_ANT_DIV, "reset_idx = (( %d ))\n",3733swat_tab->reset_idx);37343735swat_tab->reset_idx++;37363737/* @---double check flag--- */3738if (fat_tab->min_max_rssi > RSSI_CHECK_THRESHOLD &&3739swat_tab->double_chk_flag == 0) {3740PHYDM_DBG(dm, DBG_ANT_DIV,3741" min_max_rssi is ((%d)), and > %d\n",3742fat_tab->min_max_rssi,3743RSSI_CHECK_THRESHOLD);37443745swat_tab->double_chk_flag = 1;3746swat_tab->try_flag = SWAW_STEP_DETERMINE;3747swat_tab->rssi_trying = 0;37483749PHYDM_DBG(dm, DBG_ANT_DIV,3750"Test the current ant for (( %d )) ms again\n",3751swat_tab->train_time);3752odm_update_rx_idle_ant(dm,3753fat_tab->rx_idle_ant);3754odm_set_timer(dm, &swat_tab->sw_antdiv_timer,3755swat_tab->train_time); /*@ms*/3756return;3757}37583759next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ?3760AUX_ANT : MAIN_ANT;37613762swat_tab->try_flag = SWAW_STEP_DETERMINE;37633764if (swat_tab->reset_idx <= 1)3765swat_tab->rssi_trying = 2;3766else3767swat_tab->rssi_trying = 1;37683769odm_s0s1_sw_ant_div_by_ctrl_frame(dm, SWAW_STEP_PEEK);3770PHYDM_DBG(dm, DBG_ANT_DIV,3771"[set try_flag=1] Normal state: Begin Trying!!\n");37723773} else if ((swat_tab->try_flag == SWAW_STEP_DETERMINE) &&3774(swat_tab->double_chk_flag == 0)) {3775next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ?3776AUX_ANT : MAIN_ANT;3777swat_tab->rssi_trying--;3778}37793780/* @1 Decision state */3781if (swat_tab->try_flag == SWAW_STEP_DETERMINE &&3782swat_tab->rssi_trying == 0) {3783phydm_sw_antdiv_decision(dm);3784return;3785}3786}37873788/* @1 4.Change TRX antenna */37893790PHYDM_DBG(dm, DBG_ANT_DIV,3791"rssi_trying = (( %d )), ant: (( %s )) >>> (( %s ))\n",3792swat_tab->rssi_trying,3793(fat_tab->rx_idle_ant == MAIN_ANT ? "MAIN" : "AUX"),3794(next_ant == MAIN_ANT ? "MAIN" : "AUX"));37953796odm_update_rx_idle_ant(dm, next_ant);37973798/* @1 5.Reset Statistics */37993800fat_tab->rx_idle_ant = next_ant;38013802if (dm->support_ic_type == ODM_RTL8723D) {3803if (fat_tab->rx_idle_ant == MAIN_ANT) {3804fat_tab->main_sum[0] = 0;3805fat_tab->main_cnt[0] = 0;3806fat_tab->main_sum_cck[0] = 0;3807fat_tab->main_cnt_cck[0] = 0;3808} else {3809fat_tab->aux_sum[0] = 0;3810fat_tab->aux_cnt[0] = 0;3811fat_tab->aux_sum_cck[0] = 0;3812fat_tab->aux_cnt_cck[0] = 0;3813}3814}38153816if (dm->support_ic_type == ODM_RTL8188F) {3817if (dm->support_interface == ODM_ITRF_SDIO) {3818ODM_delay_us(200);38193820if (fat_tab->rx_idle_ant == MAIN_ANT) {3821fat_tab->main_sum[0] = 0;3822fat_tab->main_cnt[0] = 0;3823fat_tab->main_sum_cck[0] = 0;3824fat_tab->main_cnt_cck[0] = 0;3825} else {3826fat_tab->aux_sum[0] = 0;3827fat_tab->aux_cnt[0] = 0;3828fat_tab->aux_sum_cck[0] = 0;3829fat_tab->aux_cnt_cck[0] = 0;3830}3831}3832}3833/* @1 6.Set next timer (Trying state) */3834PHYDM_DBG(dm, DBG_ANT_DIV, " Test ((%s)) ant for (( %d )) ms\n",3835(next_ant == MAIN_ANT ? "MAIN" : "AUX"),3836swat_tab->train_time);3837odm_set_timer(dm, &swat_tab->sw_antdiv_timer, swat_tab->train_time);3838/*@ms*/3839}38403841#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)3842void odm_sw_antdiv_callback(struct phydm_timer_list *timer)3843{3844void *adapter = (void *)timer->Adapter;3845HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));3846struct sw_antenna_switch *swat_tab = &hal_data->DM_OutSrc.dm_swat_table;38473848#if DEV_BUS_TYPE == RT_PCI_INTERFACE3849#if USE_WORKITEM3850odm_schedule_work_item(&swat_tab->phydm_sw_antenna_switch_workitem);3851#else3852{3853#if 03854/* @dbg_print("SW_antdiv_Callback"); */3855#endif3856odm_s0s1_sw_ant_div(&hal_data->DM_OutSrc, SWAW_STEP_DETERMINE);3857}3858#endif3859#else3860odm_schedule_work_item(&swat_tab->phydm_sw_antenna_switch_workitem);3861#endif3862}38633864void odm_sw_antdiv_workitem_callback(void *context)3865{3866void *adapter = (void *)context;3867HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));38683869#if 03870/* @dbg_print("SW_antdiv_Workitem_Callback"); */3871#endif3872odm_s0s1_sw_ant_div(&hal_data->DM_OutSrc, SWAW_STEP_DETERMINE);3873}38743875#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)38763877void odm_sw_antdiv_workitem_callback(void *context)3878{3879void *3880adapter = (void *)context;3881HAL_DATA_TYPE3882*hal_data = GET_HAL_DATA(((PADAPTER)adapter));38833884#if 03885/*@dbg_print("SW_antdiv_Workitem_Callback");*/3886#endif3887odm_s0s1_sw_ant_div(&hal_data->odmpriv, SWAW_STEP_DETERMINE);3888}38893890void odm_sw_antdiv_callback(void *function_context)3891{3892struct dm_struct *dm = (struct dm_struct *)function_context;3893void *padapter = dm->adapter;3894if (*dm->is_net_closed == true)3895return;38963897#if 0 /* @Can't do I/O in timer callback*/3898odm_s0s1_sw_ant_div(dm, SWAW_STEP_DETERMINE);3899#else3900rtw_run_in_thread_cmd(padapter, odm_sw_antdiv_workitem_callback,3901padapter);3902#endif3903}39043905#endif39063907void odm_s0s1_sw_ant_div_by_ctrl_frame(void *dm_void, u8 step)3908{3909struct dm_struct *dm = (struct dm_struct *)dm_void;3910struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;3911struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;39123913switch (step) {3914case SWAW_STEP_PEEK:3915swat_tab->pkt_cnt_sw_ant_div_by_ctrl_frame = 0;3916swat_tab->is_sw_ant_div_by_ctrl_frame = true;3917fat_tab->main_ctrl_cnt = 0;3918fat_tab->aux_ctrl_cnt = 0;3919fat_tab->main_ctrl_sum = 0;3920fat_tab->aux_ctrl_sum = 0;3921fat_tab->cck_ctrl_frame_cnt_main = 0;3922fat_tab->cck_ctrl_frame_cnt_aux = 0;3923fat_tab->ofdm_ctrl_frame_cnt_main = 0;3924fat_tab->ofdm_ctrl_frame_cnt_aux = 0;3925PHYDM_DBG(dm, DBG_ANT_DIV,3926"odm_S0S1_SwAntDivForAPMode(): Start peek and reset counter\n");3927break;3928case SWAW_STEP_DETERMINE:3929swat_tab->is_sw_ant_div_by_ctrl_frame = false;3930PHYDM_DBG(dm, DBG_ANT_DIV,3931"odm_S0S1_SwAntDivForAPMode(): Stop peek\n");3932break;3933default:3934swat_tab->is_sw_ant_div_by_ctrl_frame = false;3935break;3936}3937}39383939void odm_antsel_statistics_ctrl(void *dm_void, u8 antsel_tr_mux,3940u32 rx_pwdb_all)3941{3942struct dm_struct *dm = (struct dm_struct *)dm_void;3943struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;39443945if (antsel_tr_mux == ANT1_2G) {3946fat_tab->main_ctrl_sum += rx_pwdb_all;3947fat_tab->main_ctrl_cnt++;3948} else {3949fat_tab->aux_ctrl_sum += rx_pwdb_all;3950fat_tab->aux_ctrl_cnt++;3951}3952}39533954void odm_s0s1_sw_ant_div_by_ctrl_frame_process_rssi(void *dm_void,3955void *phy_info_void,3956void *pkt_info_void3957/* struct phydm_phyinfo_struct* phy_info, */3958/* struct phydm_perpkt_info_struct* pktinfo */3959)3960{3961struct dm_struct *dm = (struct dm_struct *)dm_void;3962struct phydm_phyinfo_struct *phy_info = NULL;3963struct phydm_perpkt_info_struct *pktinfo = NULL;3964struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;3965struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;3966u8 rssi_cck;39673968phy_info = (struct phydm_phyinfo_struct *)phy_info_void;3969pktinfo = (struct phydm_perpkt_info_struct *)pkt_info_void;39703971if (!(dm->support_ability & ODM_BB_ANT_DIV))3972return;39733974if (dm->ant_div_type != S0S1_SW_ANTDIV)3975return;39763977/* @In try state */3978if (!swat_tab->is_sw_ant_div_by_ctrl_frame)3979return;39803981/* No HW error and match receiver address */3982if (!pktinfo->is_to_self)3983return;39843985swat_tab->pkt_cnt_sw_ant_div_by_ctrl_frame++;39863987if (pktinfo->is_cck_rate) {3988rssi_cck = phy_info->rx_mimo_signal_strength[RF_PATH_A];3989fat_tab->antsel_rx_keep_0 = (fat_tab->rx_idle_ant == MAIN_ANT) ?3990ANT1_2G : ANT2_2G;39913992if (fat_tab->antsel_rx_keep_0 == ANT1_2G)3993fat_tab->cck_ctrl_frame_cnt_main++;3994else3995fat_tab->cck_ctrl_frame_cnt_aux++;39963997odm_antsel_statistics_ctrl(dm, fat_tab->antsel_rx_keep_0,3998rssi_cck);3999} else {4000fat_tab->antsel_rx_keep_0 = (fat_tab->rx_idle_ant == MAIN_ANT) ?4001ANT1_2G : ANT2_2G;40024003if (fat_tab->antsel_rx_keep_0 == ANT1_2G)4004fat_tab->ofdm_ctrl_frame_cnt_main++;4005else4006fat_tab->ofdm_ctrl_frame_cnt_aux++;40074008odm_antsel_statistics_ctrl(dm, fat_tab->antsel_rx_keep_0,4009phy_info->rx_pwdb_all);4010}4011}40124013#endif /* @#if (RTL8723B_SUPPORT == 1) || (RTL8821A_SUPPORT == 1) */40144015void odm_set_next_mac_addr_target(void *dm_void)4016{4017struct dm_struct *dm = (struct dm_struct *)dm_void;4018struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;4019struct cmn_sta_info *entry;4020u32 value32, i;40214022PHYDM_DBG(dm, DBG_ANT_DIV, "%s ==>\n", __func__);40234024if (dm->is_linked) {4025for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {4026if ((fat_tab->train_idx + 1) == ODM_ASSOCIATE_ENTRY_NUM)4027fat_tab->train_idx = 0;4028else4029fat_tab->train_idx++;40304031entry = dm->phydm_sta_info[fat_tab->train_idx];40324033if (is_sta_active(entry)) {4034/*@Match MAC ADDR*/4035value32 = (entry->mac_addr[5] << 8) | entry->mac_addr[4];40364037odm_set_mac_reg(dm, R_0x7b4, 0xFFFF, value32); /*@0x7b4~0x7b5*/40384039value32 = (entry->mac_addr[3] << 24) | (entry->mac_addr[2] << 16) | (entry->mac_addr[1] << 8) | entry->mac_addr[0];40404041odm_set_mac_reg(dm, R_0x7b0, MASKDWORD, value32); /*@0x7b0~0x7b3*/40424043PHYDM_DBG(dm, DBG_ANT_DIV,4044"fat_tab->train_idx=%d\n",4045fat_tab->train_idx);40464047PHYDM_DBG(dm, DBG_ANT_DIV,4048"Training MAC addr = %x:%x:%x:%x:%x:%x\n",4049entry->mac_addr[5],4050entry->mac_addr[4],4051entry->mac_addr[3],4052entry->mac_addr[2],4053entry->mac_addr[1],4054entry->mac_addr[0]);40554056break;4057}4058}4059}4060}40614062#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))40634064void odm_fast_ant_training(4065void *dm_void)4066{4067struct dm_struct *dm = (struct dm_struct *)dm_void;4068struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;40694070u32 max_rssi_path_a = 0, pckcnt_path_a = 0;4071u8 i, target_ant_path_a = 0;4072boolean is_pkt_filter_macth_path_a = false;4073#if (RTL8192E_SUPPORT == 1)4074u32 max_rssi_path_b = 0, pckcnt_path_b = 0;4075u8 target_ant_path_b = 0;4076boolean is_pkt_filter_macth_path_b = false;4077#endif40784079if (!dm->is_linked) { /* @is_linked==False */4080PHYDM_DBG(dm, DBG_ANT_DIV, "[No Link!!!]\n");40814082if (fat_tab->is_become_linked == true) {4083odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);4084phydm_fast_training_enable(dm, FAT_OFF);4085odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);4086fat_tab->is_become_linked = dm->is_linked;4087}4088return;4089} else {4090if (fat_tab->is_become_linked == false) {4091PHYDM_DBG(dm, DBG_ANT_DIV, "[Linked!!!]\n");4092fat_tab->is_become_linked = dm->is_linked;4093}4094}40954096if (!(*fat_tab->p_force_tx_by_desc)) {4097if (dm->is_one_entry_only == true)4098odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);4099else4100odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);4101}41024103if (dm->support_ic_type == ODM_RTL8188E)4104odm_set_bb_reg(dm, R_0x864, BIT(2) | BIT(1) | BIT(0), ((dm->fat_comb_a) - 1));4105#if (RTL8192E_SUPPORT == 1)4106else if (dm->support_ic_type == ODM_RTL8192E) {4107odm_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 */4108odm_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 */4109}4110#endif41114112PHYDM_DBG(dm, DBG_ANT_DIV, "==>%s\n", __func__);41134114/* @1 TRAINING STATE */4115if (fat_tab->fat_state == FAT_TRAINING_STATE) {4116/* @2 Caculate RSSI per Antenna */41174118/* @3 [path-A]--------------------------- */4119for (i = 0; i < (dm->fat_comb_a); i++) { /* @i : antenna index */4120if (fat_tab->ant_rssi_cnt[i] == 0)4121fat_tab->ant_ave_rssi[i] = 0;4122else {4123fat_tab->ant_ave_rssi[i] = fat_tab->ant_sum_rssi[i] / fat_tab->ant_rssi_cnt[i];4124is_pkt_filter_macth_path_a = true;4125}41264127if (fat_tab->ant_ave_rssi[i] > max_rssi_path_a) {4128max_rssi_path_a = fat_tab->ant_ave_rssi[i];4129pckcnt_path_a = fat_tab->ant_rssi_cnt[i];4130target_ant_path_a = i;4131} else if (fat_tab->ant_ave_rssi[i] == max_rssi_path_a) {4132if (fat_tab->ant_rssi_cnt[i] > pckcnt_path_a) {4133max_rssi_path_a = fat_tab->ant_ave_rssi[i];4134pckcnt_path_a = fat_tab->ant_rssi_cnt[i];4135target_ant_path_a = i;4136}4137}41384139PHYDM_DBG(4140"*** ant-index : [ %d ], counter = (( %d )), Avg RSSI = (( %d ))\n",4141i, fat_tab->ant_rssi_cnt[i],4142fat_tab->ant_ave_rssi[i]);4143}41444145#if 04146#if (RTL8192E_SUPPORT == 1)4147/* @3 [path-B]--------------------------- */4148for (i = 0; i < (dm->fat_comb_b); i++) {4149if (fat_tab->antRSSIcnt_pathB[i] == 0)4150fat_tab->antAveRSSI_pathB[i] = 0;4151else { /* @(ant_rssi_cnt[i] != 0) */4152fat_tab->antAveRSSI_pathB[i] = fat_tab->antSumRSSI_pathB[i] / fat_tab->antRSSIcnt_pathB[i];4153is_pkt_filter_macth_path_b = true;4154}4155if (fat_tab->antAveRSSI_pathB[i] > max_rssi_path_b) {4156max_rssi_path_b = fat_tab->antAveRSSI_pathB[i];4157pckcnt_path_b = fat_tab->antRSSIcnt_pathB[i];4158target_ant_path_b = (u8)i;4159}4160if (fat_tab->antAveRSSI_pathB[i] == max_rssi_path_b) {4161if (fat_tab->antRSSIcnt_pathB > pckcnt_path_b) {4162max_rssi_path_b = fat_tab->antAveRSSI_pathB[i];4163target_ant_path_b = (u8)i;4164}4165}4166if (dm->fat_print_rssi == 1) {4167PHYDM_DBG(dm, DBG_ANT_DIV,4168"***{path-B}: Sum RSSI[%d] = (( %d )), cnt RSSI [%d] = (( %d )), Avg RSSI[%d] = (( %d ))\n",4169i, fat_tab->antSumRSSI_pathB[i], i,4170fat_tab->antRSSIcnt_pathB[i], i,4171fat_tab->antAveRSSI_pathB[i]);4172}4173}4174#endif4175#endif41764177/* @1 DECISION STATE */41784179/* @2 Select TRX Antenna */41804181phydm_fast_training_enable(dm, FAT_OFF);41824183/* @3 [path-A]--------------------------- */4184if (is_pkt_filter_macth_path_a == false) {4185#if 04186/* PHYDM_DBG(dm,DBG_ANT_DIV, "{path-A}: None Packet is matched\n"); */4187#endif4188PHYDM_DBG(dm, DBG_ANT_DIV,4189"{path-A}: None Packet is matched\n");4190odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);4191} else {4192PHYDM_DBG(4193"target_ant_path_a = (( %d )) , max_rssi_path_a = (( %d ))\n",4194target_ant_path_a, max_rssi_path_a);41954196/* @3 [ update RX-optional ant ] Default RX is Omni, Optional RX is the best decision by FAT */4197if (dm->support_ic_type == ODM_RTL8188E)4198odm_set_bb_reg(dm, R_0x864, BIT(8) | BIT(7) | BIT(6), target_ant_path_a);4199else if (dm->support_ic_type == ODM_RTL8192E)4200odm_set_bb_reg(dm, R_0xb38, BIT(8) | BIT(7) | BIT(6), target_ant_path_a); /* Optional RX [pth-A] */42014202/* @3 [ update TX ant ] */4203odm_update_tx_ant(dm, target_ant_path_a, (fat_tab->train_idx));42044205if (target_ant_path_a == 0)4206odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);4207}4208#if 04209#if (RTL8192E_SUPPORT == 1)4210/* @3 [path-B]--------------------------- */4211if (is_pkt_filter_macth_path_b == false) {4212if (dm->fat_print_rssi == 1)4213PHYDM_DBG(dm, DBG_ANT_DIV,4214"***[%d]{path-B}: None Packet is matched\n\n\n",4215__LINE__);4216} else {4217if (dm->fat_print_rssi == 1) {4218PHYDM_DBG(dm, DBG_ANT_DIV,4219" ***target_ant_path_b = (( %d )) *** max_rssi = (( %d ))***\n\n\n",4220target_ant_path_b, max_rssi_path_b);4221}4222odm_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 */4223odm_set_bb_reg(dm, R_0x80c, BIT(21), 1); /* Reg80c[21]=1'b1 //from TX Info */42244225fat_tab->antsel_pathB[fat_tab->train_idx] = target_ant_path_b;4226}4227#endif4228#endif42294230/* @2 Reset counter */4231for (i = 0; i < (dm->fat_comb_a); i++) {4232fat_tab->ant_sum_rssi[i] = 0;4233fat_tab->ant_rssi_cnt[i] = 0;4234}4235/*@4236#if (RTL8192E_SUPPORT == 1)4237for(i=0; i<=(dm->fat_comb_b); i++)4238{4239fat_tab->antSumRSSI_pathB[i] = 0;4240fat_tab->antRSSIcnt_pathB[i] = 0;4241}4242#endif4243*/42444245fat_tab->fat_state = FAT_PREPARE_STATE;4246return;4247}42484249/* @1 NORMAL STATE */4250if (fat_tab->fat_state == FAT_PREPARE_STATE) {4251PHYDM_DBG(dm, DBG_ANT_DIV, "[ Start Prepare state ]\n");42524253odm_set_next_mac_addr_target(dm);42544255/* @2 Prepare Training */4256fat_tab->fat_state = FAT_TRAINING_STATE;4257phydm_fast_training_enable(dm, FAT_ON);4258odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);4259/* @enable HW AntDiv */4260PHYDM_DBG(dm, DBG_ANT_DIV, "[Start Training state]\n");42614262odm_set_timer(dm, &dm->fast_ant_training_timer, dm->antdiv_intvl); /* @ms */4263}4264}42654266void odm_fast_ant_training_callback(4267void *dm_void)4268{4269struct dm_struct *dm = (struct dm_struct *)dm_void;42704271#if (DM_ODM_SUPPORT_TYPE == ODM_CE)4272if (*(dm->is_net_closed) == true)4273return;4274#endif42754276#if USE_WORKITEM4277odm_schedule_work_item(&dm->fast_ant_training_workitem);4278#else4279PHYDM_DBG(dm, DBG_ANT_DIV, "******%s******\n", __func__);4280odm_fast_ant_training(dm);4281#endif4282}42834284void odm_fast_ant_training_work_item_callback(4285void *dm_void)4286{4287struct dm_struct *dm = (struct dm_struct *)dm_void;42884289PHYDM_DBG(dm, DBG_ANT_DIV, "******%s******\n", __func__);4290odm_fast_ant_training(dm);4291}42924293#endif42944295void odm_ant_div_init(void *dm_void)4296{4297struct dm_struct *dm = (struct dm_struct *)dm_void;4298struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;4299struct sw_antenna_switch *swat_tab = &dm->dm_swat_table;43004301if (!(dm->support_ability & ODM_BB_ANT_DIV)) {4302PHYDM_DBG(dm, DBG_ANT_DIV,4303"[Return!!!] Not Support Antenna Diversity Function\n");4304return;4305}4306/* @--- */4307#if (DM_ODM_SUPPORT_TYPE == ODM_AP)4308if (fat_tab->ant_div_2g_5g == ODM_ANTDIV_2G) {4309PHYDM_DBG(dm, DBG_ANT_DIV,4310"[2G AntDiv Init]: Only Support 2G Antenna Diversity Function\n");4311if (!(dm->support_ic_type & ODM_ANTDIV_2G_SUPPORT_IC))4312return;4313} else if (fat_tab->ant_div_2g_5g == ODM_ANTDIV_5G) {4314PHYDM_DBG(dm, DBG_ANT_DIV,4315"[5G AntDiv Init]: Only Support 5G Antenna Diversity Function\n");4316if (!(dm->support_ic_type & ODM_ANTDIV_5G_SUPPORT_IC))4317return;4318} else if (fat_tab->ant_div_2g_5g == (ODM_ANTDIV_2G | ODM_ANTDIV_5G))4319PHYDM_DBG(dm, DBG_ANT_DIV,4320"[2G & 5G AntDiv Init]:Support Both 2G & 5G Antenna Diversity Function\n");43214322#endif4323/* @--- */43244325/* @2 [--General---] */4326dm->antdiv_period = 0;43274328fat_tab->is_become_linked = false;4329fat_tab->ant_div_on_off = 0xff;43304331/* @3 - AP - */4332#if (DM_ODM_SUPPORT_TYPE == ODM_AP)43334334#ifdef PHYDM_BEAMFORMING_SUPPORT4335#if (DM_ODM_SUPPORT_TYPE == ODM_AP)4336odm_bdc_init(dm);4337#endif4338#endif43394340/* @3 - WIN - */4341#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)4342swat_tab->ant_5g = MAIN_ANT;4343swat_tab->ant_2g = MAIN_ANT;4344#endif43454346/* @2 [---Set MAIN_ANT as default antenna if Auto-ant enable---] */4347if (fat_tab->div_path_type == ANT_PATH_A)4348odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);4349else if (fat_tab->div_path_type == ANT_PATH_B)4350odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_B);4351else if (fat_tab->div_path_type == ANT_PATH_AB)4352odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_AB);43534354dm->ant_type = ODM_AUTO_ANT;43554356fat_tab->rx_idle_ant = 0xff;4357/*to make RX-idle-antenna will be updated absolutly*/4358odm_update_rx_idle_ant(dm, MAIN_ANT);4359phydm_keep_rx_ack_ant_by_tx_ant_time(dm, 0);4360/* Timming issue: keep Rx ant after tx for ACK(5 x 3.2 mu = 16mu sec)*/43614362/* @2 [---Set TX Antenna---] */4363if (!fat_tab->p_force_tx_by_desc) {4364fat_tab->force_tx_by_desc = 0;4365fat_tab->p_force_tx_by_desc = &fat_tab->force_tx_by_desc;4366}4367PHYDM_DBG(dm, DBG_ANT_DIV, "p_force_tx_by_desc = %d\n",4368*fat_tab->p_force_tx_by_desc);43694370if (*fat_tab->p_force_tx_by_desc)4371odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);4372else4373odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);43744375/* @2 [--88E---] */4376if (dm->support_ic_type == ODM_RTL8188E) {4377#if (RTL8188E_SUPPORT == 1)4378/* @dm->ant_div_type = CGCS_RX_HW_ANTDIV; */4379/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */4380/* @dm->ant_div_type = CG_TRX_SMART_ANTDIV; */43814382if (dm->ant_div_type != CGCS_RX_HW_ANTDIV &&4383dm->ant_div_type != CG_TRX_HW_ANTDIV &&4384dm->ant_div_type != CG_TRX_SMART_ANTDIV) {4385PHYDM_DBG(dm, DBG_ANT_DIV,4386"[Return!!!] 88E Not Supprrt This AntDiv type\n");4387dm->support_ability &= ~(ODM_BB_ANT_DIV);4388return;4389}43904391if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)4392odm_rx_hw_ant_div_init_88e(dm);4393else if (dm->ant_div_type == CG_TRX_HW_ANTDIV)4394odm_trx_hw_ant_div_init_88e(dm);4395#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))4396else if (dm->ant_div_type == CG_TRX_SMART_ANTDIV)4397odm_smart_hw_ant_div_init_88e(dm);4398#endif4399#endif4400}44014402/* @2 [--92E---] */4403#if (RTL8192E_SUPPORT == 1)4404else if (dm->support_ic_type == ODM_RTL8192E) {4405/* @dm->ant_div_type = CGCS_RX_HW_ANTDIV; */4406/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */4407/* @dm->ant_div_type = CG_TRX_SMART_ANTDIV; */44084409if (dm->ant_div_type != CGCS_RX_HW_ANTDIV &&4410dm->ant_div_type != CG_TRX_HW_ANTDIV &&4411dm->ant_div_type != CG_TRX_SMART_ANTDIV) {4412PHYDM_DBG(dm, DBG_ANT_DIV,4413"[Return!!!] 8192E Not Supprrt This AntDiv type\n");4414dm->support_ability &= ~(ODM_BB_ANT_DIV);4415return;4416}44174418if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)4419odm_rx_hw_ant_div_init_92e(dm);4420else if (dm->ant_div_type == CG_TRX_HW_ANTDIV)4421odm_trx_hw_ant_div_init_92e(dm);4422#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))4423else if (dm->ant_div_type == CG_TRX_SMART_ANTDIV)4424odm_smart_hw_ant_div_init_92e(dm);4425#endif4426}4427#endif44284429/* @2 [--92F---] */4430#if (RTL8192F_SUPPORT == 1)4431else if (dm->support_ic_type == ODM_RTL8192F) {4432/* @dm->ant_div_type = CGCS_RX_HW_ANTDIV; */4433/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */4434/* @dm->ant_div_type = CG_TRX_SMART_ANTDIV; */44354436if (dm->ant_div_type != CGCS_RX_HW_ANTDIV) {4437if (dm->ant_div_type != CG_TRX_HW_ANTDIV) {4438PHYDM_DBG(dm, DBG_ANT_DIV,4439"[Return!!!] 8192F Not Supprrt This AntDiv type\n");4440dm->support_ability &= ~(ODM_BB_ANT_DIV);4441return;4442}4443}4444if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)4445odm_rx_hw_ant_div_init_92f(dm);4446else if (dm->ant_div_type == CG_TRX_HW_ANTDIV)4447odm_trx_hw_ant_div_init_92f(dm);4448}4449#endif44504451#if (RTL8197F_SUPPORT == 1)4452else if (dm->support_ic_type == ODM_RTL8197F) {4453dm->ant_div_type = CGCS_RX_HW_ANTDIV;44544455if (dm->ant_div_type != CGCS_RX_HW_ANTDIV) {4456PHYDM_DBG(dm, DBG_ANT_DIV,4457"[Return!!!] 8197F Not Supprrt This AntDiv type\n");4458dm->support_ability &= ~(ODM_BB_ANT_DIV);4459return;4460}4461phydm_rx_hw_ant_div_init_97f(dm);4462}4463#endif4464/* @2 [--8723B---] */4465#if (RTL8723B_SUPPORT == 1)4466else if (dm->support_ic_type == ODM_RTL8723B) {4467dm->ant_div_type = S0S1_SW_ANTDIV;4468/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */44694470if (dm->ant_div_type != S0S1_SW_ANTDIV &&4471dm->ant_div_type != CG_TRX_HW_ANTDIV) {4472PHYDM_DBG(dm, DBG_ANT_DIV,4473"[Return!!!] 8723B Not Supprrt This AntDiv type\n");4474dm->support_ability &= ~(ODM_BB_ANT_DIV);4475return;4476}44774478if (dm->ant_div_type == S0S1_SW_ANTDIV)4479odm_s0s1_sw_ant_div_init_8723b(dm);4480else if (dm->ant_div_type == CG_TRX_HW_ANTDIV)4481odm_trx_hw_ant_div_init_8723b(dm);4482}4483#endif4484/*@2 [--8723D---]*/4485#if (RTL8723D_SUPPORT == 1)4486else if (dm->support_ic_type == ODM_RTL8723D) {4487if (fat_tab->p_default_s0_s1 == NULL) {4488fat_tab->default_s0_s1 = 1;4489fat_tab->p_default_s0_s1 = &fat_tab->default_s0_s1;4490}4491PHYDM_DBG(dm, DBG_ANT_DIV, "default_s0_s1 = %d\n",4492*fat_tab->p_default_s0_s1);44934494if (*fat_tab->p_default_s0_s1 == true)4495odm_update_rx_idle_ant(dm, MAIN_ANT);4496else4497odm_update_rx_idle_ant(dm, AUX_ANT);44984499if (dm->ant_div_type == S0S1_TRX_HW_ANTDIV)4500odm_trx_hw_ant_div_init_8723d(dm);4501else if (dm->ant_div_type == S0S1_SW_ANTDIV)4502odm_s0s1_sw_ant_div_init_8723d(dm);4503else {4504PHYDM_DBG(dm, DBG_ANT_DIV,4505"[Return!!!] 8723D Not Supprrt This AntDiv type\n");4506dm->support_ability &= ~(ODM_BB_ANT_DIV);4507return;4508}4509}4510#endif4511#if (RTL8721D_SUPPORT == 1)4512else if (dm->support_ic_type == ODM_RTL8721D) {4513/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */45144515if (dm->ant_div_type != CG_TRX_HW_ANTDIV) {4516PHYDM_DBG(dm, DBG_ANT_DIV,4517"[Return!!!] 8721D Not Supprrt This AntDiv type\n");4518dm->support_ability &= ~(ODM_BB_ANT_DIV);4519return;4520}4521if (dm->ant_div_type == CG_TRX_HW_ANTDIV)4522odm_trx_hw_ant_div_init_8721d(dm);4523}4524#endif4525/* @2 [--8811A 8821A---] */4526#if (RTL8821A_SUPPORT == 1)4527else if (dm->support_ic_type == ODM_RTL8821) {4528#ifdef CONFIG_HL_SMART_ANTENNA_TYPE14529dm->ant_div_type = HL_SW_SMART_ANT_TYPE1;45304531if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE1) {4532odm_trx_hw_ant_div_init_8821a(dm);4533phydm_hl_smart_ant_type1_init_8821a(dm);4534} else4535#endif4536{4537#ifdef ODM_CONFIG_BT_COEXIST4538dm->ant_div_type = S0S1_SW_ANTDIV;4539#else4540dm->ant_div_type = CG_TRX_HW_ANTDIV;4541#endif45424543if (dm->ant_div_type != CG_TRX_HW_ANTDIV &&4544dm->ant_div_type != S0S1_SW_ANTDIV) {4545PHYDM_DBG(dm, DBG_ANT_DIV,4546"[Return!!!] 8821A & 8811A Not Supprrt This AntDiv type\n");4547dm->support_ability &= ~(ODM_BB_ANT_DIV);4548return;4549}4550if (dm->ant_div_type == CG_TRX_HW_ANTDIV)4551odm_trx_hw_ant_div_init_8821a(dm);4552else if (dm->ant_div_type == S0S1_SW_ANTDIV)4553odm_s0s1_sw_ant_div_init_8821a(dm);4554}4555}4556#endif45574558/* @2 [--8821C---] */4559#if (RTL8821C_SUPPORT == 1)4560else if (dm->support_ic_type == ODM_RTL8821C) {4561dm->ant_div_type = S0S1_SW_ANTDIV;4562if (dm->ant_div_type != S0S1_SW_ANTDIV) {4563PHYDM_DBG(dm, DBG_ANT_DIV,4564"[Return!!!] 8821C Not Supprrt This AntDiv type\n");4565dm->support_ability &= ~(ODM_BB_ANT_DIV);4566return;4567}4568phydm_s0s1_sw_ant_div_init_8821c(dm);4569odm_trx_hw_ant_div_init_8821c(dm);4570}4571#endif45724573/* @2 [--8881A---] */4574#if (RTL8881A_SUPPORT == 1)4575else if (dm->support_ic_type == ODM_RTL8881A) {4576/* @dm->ant_div_type = CGCS_RX_HW_ANTDIV; */4577/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */45784579if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {4580odm_trx_hw_ant_div_init_8881a(dm);4581} else {4582PHYDM_DBG(dm, DBG_ANT_DIV,4583"[Return!!!] 8881A Not Supprrt This AntDiv type\n");4584dm->support_ability &= ~(ODM_BB_ANT_DIV);4585return;4586}45874588odm_trx_hw_ant_div_init_8881a(dm);4589}4590#endif45914592/* @2 [--8812---] */4593#if (RTL8812A_SUPPORT == 1)4594else if (dm->support_ic_type == ODM_RTL8812) {4595/* @dm->ant_div_type = CG_TRX_HW_ANTDIV; */45964597if (dm->ant_div_type != CG_TRX_HW_ANTDIV) {4598PHYDM_DBG(dm, DBG_ANT_DIV,4599"[Return!!!] 8812A Not Supprrt This AntDiv type\n");4600dm->support_ability &= ~(ODM_BB_ANT_DIV);4601return;4602}4603odm_trx_hw_ant_div_init_8812a(dm);4604}4605#endif46064607/*@[--8188F---]*/4608#if (RTL8188F_SUPPORT == 1)4609else if (dm->support_ic_type == ODM_RTL8188F) {4610dm->ant_div_type = S0S1_SW_ANTDIV;4611odm_s0s1_sw_ant_div_init_8188f(dm);4612}4613#endif46144615/*@[--8822B---]*/4616#if (RTL8822B_SUPPORT == 1)4617else if (dm->support_ic_type == ODM_RTL8822B) {4618dm->ant_div_type = CG_TRX_HW_ANTDIV;46194620if (dm->ant_div_type != CG_TRX_HW_ANTDIV) {4621PHYDM_DBG(dm, DBG_ANT_DIV,4622"[Return!!!] 8822B Not Supprrt This AntDiv type\n");4623dm->support_ability &= ~(ODM_BB_ANT_DIV);4624return;4625}4626phydm_trx_hw_ant_div_init_22b(dm);4627#ifdef CONFIG_HL_SMART_ANTENNA_TYPE24628dm->ant_div_type = HL_SW_SMART_ANT_TYPE2;46294630if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE2)4631phydm_hl_smart_ant_type2_init_8822b(dm);4632#endif4633}4634#endif46354636/*@PHYDM_DBG(dm, DBG_ANT_DIV, "*** support_ic_type=[%lu]\n",*/4637/*dm->support_ic_type);*/4638/*PHYDM_DBG(dm, DBG_ANT_DIV, "*** AntDiv support_ability=[%lu]\n",*/4639/* (dm->support_ability & ODM_BB_ANT_DIV)>>6);*/4640/*PHYDM_DBG(dm, DBG_ANT_DIV, "*** AntDiv type=[%d]\n",dm->ant_div_type);*/4641}46424643void odm_ant_div(void *dm_void)4644{4645struct dm_struct *dm = (struct dm_struct *)dm_void;4646void *adapter = dm->adapter;4647struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;4648#if (defined(CONFIG_HL_SMART_ANTENNA))4649struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;4650#endif46514652#ifdef ODM_EVM_ENHANCE_ANTDIV4653if (dm->is_linked) {4654PHYDM_DBG(dm, DBG_ANT_DIV,4655"tp_active_occur=((%d)), evm_method_enable=((%d))\n",4656dm->tp_active_occur, fat_tab->evm_method_enable);46574658if (dm->tp_active_occur == 1 &&4659fat_tab->evm_method_enable == 1) {4660fat_tab->idx_ant_div_counter_5g = dm->antdiv_period;4661fat_tab->idx_ant_div_counter_2g = dm->antdiv_period;4662}4663}4664#endif46654666if (*dm->band_type == ODM_BAND_5G) {4667if (fat_tab->idx_ant_div_counter_5g < dm->antdiv_period) {4668fat_tab->idx_ant_div_counter_5g++;4669return;4670} else4671fat_tab->idx_ant_div_counter_5g = 0;4672} else if (*dm->band_type == ODM_BAND_2_4G) {4673if (fat_tab->idx_ant_div_counter_2g < dm->antdiv_period) {4674fat_tab->idx_ant_div_counter_2g++;4675return;4676} else4677fat_tab->idx_ant_div_counter_2g = 0;4678}46794680#if (DM_ODM_SUPPORT_TYPE == ODM_WIN || DM_ODM_SUPPORT_TYPE == ODM_CE)46814682if (fat_tab->enable_ctrl_frame_antdiv) {4683if (dm->data_frame_num <= 10 && dm->is_linked)4684fat_tab->use_ctrl_frame_antdiv = 1;4685else4686fat_tab->use_ctrl_frame_antdiv = 0;46874688PHYDM_DBG(dm, DBG_ANT_DIV,4689"use_ctrl_frame_antdiv = (( %d )), data_frame_num = (( %d ))\n",4690fat_tab->use_ctrl_frame_antdiv, dm->data_frame_num);4691dm->data_frame_num = 0;4692}46934694{4695#ifdef PHYDM_BEAMFORMING_SUPPORT46964697enum beamforming_cap beamform_cap = phydm_get_beamform_cap(dm);4698PHYDM_DBG(dm, DBG_ANT_DIV, "is_bt_continuous_turn = ((%d))\n",4699dm->is_bt_continuous_turn);4700PHYDM_DBG(dm, DBG_ANT_DIV,4701"[ AntDiv Beam Cap ] cap= ((%d))\n", beamform_cap);4702if (!dm->is_bt_continuous_turn) {4703if ((beamform_cap & BEAMFORMEE_CAP) &&4704(!(*fat_tab->is_no_csi_feedback))) {4705/* @BFmee On && Div On->Div Off */4706PHYDM_DBG(dm, DBG_ANT_DIV,4707"[ AntDiv : OFF ] BFmee ==1; cap= ((%d))\n",4708beamform_cap);4709PHYDM_DBG(dm, DBG_ANT_DIV,4710"[ AntDiv BF] is_no_csi_feedback= ((%d))\n",4711*(fat_tab->is_no_csi_feedback));4712if (fat_tab->fix_ant_bfee == 0) {4713odm_ant_div_on_off(dm, ANTDIV_OFF,4714ANT_PATH_A);4715fat_tab->fix_ant_bfee = 1;4716}4717return;4718} else { /* @BFmee Off && Div Off->Div On */4719if (fat_tab->fix_ant_bfee == 1 &&4720dm->is_linked) {4721PHYDM_DBG(dm, DBG_ANT_DIV,4722"[ AntDiv : ON ] BFmee ==0; cap=((%d))\n",4723beamform_cap);4724PHYDM_DBG(dm, DBG_ANT_DIV,4725"[ AntDiv BF] is_no_csi_feedback= ((%d))\n",4726*fat_tab->is_no_csi_feedback);4727if (dm->ant_div_type != S0S1_SW_ANTDIV)4728odm_ant_div_on_off(dm, ANTDIV_ON4729, ANT_PATH_A)4730;4731fat_tab->fix_ant_bfee = 0;4732}4733}4734} else {4735if (fat_tab->div_path_type == ANT_PATH_A)4736odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);4737else if (fat_tab->div_path_type == ANT_PATH_B)4738odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_B);4739else if (fat_tab->div_path_type == ANT_PATH_AB)4740odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_AB);4741}4742#endif4743}4744#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)4745/* @----------just for fool proof */47464747if (dm->antdiv_rssi)4748dm->debug_components |= DBG_ANT_DIV;4749else4750dm->debug_components &= ~DBG_ANT_DIV;47514752if (fat_tab->ant_div_2g_5g == ODM_ANTDIV_2G) {4753if (!(dm->support_ic_type & ODM_ANTDIV_2G_SUPPORT_IC))4754return;4755} else if (fat_tab->ant_div_2g_5g == ODM_ANTDIV_5G) {4756if (!(dm->support_ic_type & ODM_ANTDIV_5G_SUPPORT_IC))4757return;4758}4759#endif47604761/* @---------- */47624763if (dm->antdiv_select == 1)4764dm->ant_type = ODM_FIX_MAIN_ANT;4765else if (dm->antdiv_select == 2)4766dm->ant_type = ODM_FIX_AUX_ANT;4767else { /* @if (dm->antdiv_select==0) */4768dm->ant_type = ODM_AUTO_ANT;47694770#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)4771/*Stop Antenna diversity for CMW500 testing case*/4772if (dm->consecutive_idlel_time >= 10) {4773dm->ant_type = ODM_FIX_MAIN_ANT;4774PHYDM_DBG(dm, DBG_ANT_DIV,4775"[AntDiv: OFF] No TP case, consecutive_idlel_time=((%d))\n",4776dm->consecutive_idlel_time);4777}4778#endif4779}47804781/*PHYDM_DBG(dm, DBG_ANT_DIV,"ant_type= (%d), pre_ant_type= (%d)\n",*/4782/*dm->ant_type,dm->pre_ant_type); */47834784if (dm->ant_type != ODM_AUTO_ANT) {4785PHYDM_DBG(dm, DBG_ANT_DIV, "Fix Antenna at (( %s ))\n",4786(dm->ant_type == ODM_FIX_MAIN_ANT) ? "MAIN" : "AUX");47874788if (dm->ant_type != dm->pre_ant_type) {4789odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_A);4790odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);47914792if (dm->ant_type == ODM_FIX_MAIN_ANT)4793odm_update_rx_idle_ant(dm, MAIN_ANT);4794else if (dm->ant_type == ODM_FIX_AUX_ANT)4795odm_update_rx_idle_ant(dm, AUX_ANT);4796}4797dm->pre_ant_type = dm->ant_type;4798return;4799} else {4800if (dm->ant_type != dm->pre_ant_type) {4801odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);4802odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);4803}4804dm->pre_ant_type = dm->ant_type;4805}4806#if (defined(CONFIG_2T4R_ANTENNA))4807if (dm->ant_type2 != ODM_AUTO_ANT) {4808PHYDM_DBG(dm, DBG_ANT_DIV, "PathB Fix Ant at (( %s ))\n",4809(dm->ant_type2 == ODM_FIX_MAIN_ANT) ? "MAIN" : "AUX");48104811if (dm->ant_type2 != dm->pre_ant_type2) {4812odm_ant_div_on_off(dm, ANTDIV_OFF, ANT_PATH_B);4813odm_tx_by_tx_desc_or_reg(dm, TX_BY_REG);48144815if (dm->ant_type2 == ODM_FIX_MAIN_ANT)4816phydm_update_rx_idle_ant_pathb(dm, MAIN_ANT);4817else if (dm->ant_type2 == ODM_FIX_AUX_ANT)4818phydm_update_rx_idle_ant_pathb(dm, AUX_ANT);4819}4820dm->pre_ant_type2 = dm->ant_type2;4821return;4822}4823if (dm->ant_type2 != dm->pre_ant_type2) {4824odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_B);4825odm_tx_by_tx_desc_or_reg(dm, TX_BY_DESC);4826}4827dm->pre_ant_type2 = dm->ant_type2;48284829#endif48304831/*@ ----------------------------------------------- */4832/*@ [--8188E--] */4833if (dm->support_ic_type == ODM_RTL8188E) {4834#if (RTL8188E_SUPPORT == 1)4835if (dm->ant_div_type == CG_TRX_HW_ANTDIV ||4836dm->ant_div_type == CGCS_RX_HW_ANTDIV)4837odm_hw_ant_div(dm);48384839#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) ||\4840(defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))4841else if (dm->ant_div_type == CG_TRX_SMART_ANTDIV)4842odm_fast_ant_training(dm);4843#endif48444845#endif4846}4847/*@ [--8192E--] */4848#if (RTL8192E_SUPPORT == 1)4849else if (dm->support_ic_type == ODM_RTL8192E) {4850if (dm->ant_div_type == CGCS_RX_HW_ANTDIV ||4851dm->ant_div_type == CG_TRX_HW_ANTDIV)4852odm_hw_ant_div(dm);48534854#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) ||\4855(defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))4856else if (dm->ant_div_type == CG_TRX_SMART_ANTDIV)4857odm_fast_ant_training(dm);4858#endif4859}4860#endif4861/*@ [--8197F--] */4862#if (RTL8197F_SUPPORT == 1)4863else if (dm->support_ic_type == ODM_RTL8197F) {4864if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)4865odm_hw_ant_div(dm);4866}4867#endif48684869#if (RTL8723B_SUPPORT == 1)4870/*@ [--8723B---] */4871else if (dm->support_ic_type == ODM_RTL8723B) {4872if (phydm_is_bt_enable_8723b(dm)) {4873PHYDM_DBG(dm, DBG_ANT_DIV, "[BT is enable!!!]\n");4874if (fat_tab->is_become_linked == true) {4875PHYDM_DBG(dm, DBG_ANT_DIV,4876"Set REG 948[9:6]=0x0\n");4877if (dm->support_ic_type == ODM_RTL8723B)4878odm_set_bb_reg(dm, R_0x948, 0x3c0, 0x0)4879;48804881fat_tab->is_become_linked = false;4882}4883} else {4884if (dm->ant_div_type == S0S1_SW_ANTDIV) {4885#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY4886odm_s0s1_sw_ant_div(dm, SWAW_STEP_PEEK);4887#endif4888} else if (dm->ant_div_type == CG_TRX_HW_ANTDIV)4889odm_hw_ant_div(dm);4890}4891}4892#endif4893/*@ [--8723D--]*/4894#if (RTL8723D_SUPPORT == 1)4895else if (dm->support_ic_type == ODM_RTL8723D) {4896if (dm->ant_div_type == S0S1_SW_ANTDIV) {4897#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY4898if (dm->antdiv_counter == CONFIG_ANTDIV_PERIOD) {4899odm_s0s1_sw_ant_div(dm, SWAW_STEP_PEEK);4900dm->antdiv_counter--;4901} else {4902dm->antdiv_counter--;4903}4904if (dm->antdiv_counter == 0)4905dm->antdiv_counter = CONFIG_ANTDIV_PERIOD;4906#endif4907} else if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {4908odm_hw_ant_div(dm);4909}4910}4911#endif4912#if (RTL8721D_SUPPORT == 1)4913else if (dm->support_ic_type == ODM_RTL8721D) {4914if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {4915odm_hw_ant_div(dm);4916}4917}4918#endif4919/*@ [--8821A--] */4920#if (RTL8821A_SUPPORT == 1)4921else if (dm->support_ic_type == ODM_RTL8821) {4922#ifdef CONFIG_HL_SMART_ANTENNA_TYPE14923if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE1) {4924if (sat_tab->fix_beam_pattern_en != 0) {4925PHYDM_DBG(dm, DBG_ANT_DIV,4926" [ SmartAnt ] Fix SmartAnt Pattern = 0x%x\n",4927sat_tab->fix_beam_pattern_codeword);4928/*return;*/4929} else {4930odm_fast_ant_training_hl_smart_antenna_type1(dm);4931}49324933} else4934#endif4935{4936#ifdef ODM_CONFIG_BT_COEXIST4937if (!dm->bt_info_table.is_bt_enabled) { /*@BT disabled*/4938if (dm->ant_div_type == S0S1_SW_ANTDIV) {4939dm->ant_div_type = CG_TRX_HW_ANTDIV;4940PHYDM_DBG(dm, DBG_ANT_DIV,4941" [S0S1_SW_ANTDIV] -> [CG_TRX_HW_ANTDIV]\n");4942/*odm_set_bb_reg(dm, 0x8d4, BIT24, 1);*/4943if (fat_tab->is_become_linked == true)4944odm_ant_div_on_off(dm,4945ANTDIV_ON,4946ANT_PATH_A);4947}49484949} else { /*@BT enabled*/49504951if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {4952dm->ant_div_type = S0S1_SW_ANTDIV;4953PHYDM_DBG(dm, DBG_ANT_DIV,4954" [CG_TRX_HW_ANTDIV] -> [S0S1_SW_ANTDIV]\n");4955/*odm_set_bb_reg(dm, 0x8d4, BIT24, 0);*/4956odm_ant_div_on_off(dm, ANTDIV_OFF,4957ANT_PATH_A);4958}4959}4960#endif49614962if (dm->ant_div_type == S0S1_SW_ANTDIV) {4963#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY4964odm_s0s1_sw_ant_div(dm, SWAW_STEP_PEEK);4965#endif4966} else if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {4967odm_hw_ant_div(dm);4968}4969}4970}4971#endif49724973/*@ [--8821C--] */4974#if (RTL8821C_SUPPORT == 1)4975else if (dm->support_ic_type == ODM_RTL8821C) {4976if (!dm->is_bt_continuous_turn) {4977dm->ant_div_type = S0S1_SW_ANTDIV;4978PHYDM_DBG(dm, DBG_ANT_DIV,4979"is_bt_continuous_turn = ((%d)) ==> SW AntDiv\n",4980dm->is_bt_continuous_turn);49814982} else {4983dm->ant_div_type = CG_TRX_HW_ANTDIV;4984PHYDM_DBG(dm, DBG_ANT_DIV,4985"is_bt_continuous_turn = ((%d)) ==> HW AntDiv\n",4986dm->is_bt_continuous_turn);4987odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);4988}49894990if (fat_tab->force_antdiv_type)4991dm->ant_div_type = fat_tab->antdiv_type_dbg;49924993if (dm->ant_div_type == S0S1_SW_ANTDIV) {4994#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY4995odm_s0s1_sw_ant_div(dm, SWAW_STEP_PEEK);4996#endif4997} else if (dm->ant_div_type == CG_TRX_HW_ANTDIV) {4998odm_ant_div_on_off(dm, ANTDIV_ON, ANT_PATH_A);4999odm_hw_ant_div(dm);5000}5001}5002#endif50035004/* @ [--8881A--] */5005#if (RTL8881A_SUPPORT == 1)5006else if (dm->support_ic_type == ODM_RTL8881A)5007odm_hw_ant_div(dm);5008#endif50095010/*@ [--8812A--] */5011#if (RTL8812A_SUPPORT == 1)5012else if (dm->support_ic_type == ODM_RTL8812)5013odm_hw_ant_div(dm);5014#endif50155016#if (RTL8188F_SUPPORT == 1)5017/*@ [--8188F--]*/5018else if (dm->support_ic_type == ODM_RTL8188F) {5019#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY5020odm_s0s1_sw_ant_div(dm, SWAW_STEP_PEEK);5021#endif5022}5023#endif50245025/*@ [--8822B--]*/5026#if (RTL8822B_SUPPORT == 1)5027else if (dm->support_ic_type == ODM_RTL8822B) {5028if (dm->ant_div_type == CG_TRX_HW_ANTDIV)5029odm_hw_ant_div(dm);5030#ifdef CONFIG_HL_SMART_ANTENNA_TYPE25031if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE2) {5032if (sat_tab->fix_beam_pattern_en != 0)5033PHYDM_DBG(dm, DBG_ANT_DIV,5034" [ SmartAnt ] Fix SmartAnt Pattern = 0x%x\n",5035sat_tab->fix_beam_pattern_codeword);5036else5037phydm_fast_ant_training_hl_smart_antenna_type2(dm);5038}5039#endif5040}5041#endif5042}50435044void odm_antsel_statistics(void *dm_void, void *phy_info_void,5045u8 antsel_tr_mux, u32 mac_id, u32 utility, u8 method,5046u8 is_cck_rate)5047{5048struct dm_struct *dm = (struct dm_struct *)dm_void;5049struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;5050struct phydm_phyinfo_struct *phy_info = NULL;50515052phy_info = (struct phydm_phyinfo_struct *)phy_info_void;50535054if (method == RSSI_METHOD) {5055if (is_cck_rate) {5056if (antsel_tr_mux == ANT1_2G) {5057/*to prevent u16 overflow, max(RSSI)=100, 65435+100 = 65535 (u16)*/5058if (fat_tab->main_sum_cck[mac_id] > 65435)5059return;50605061fat_tab->main_sum_cck[mac_id] += (u16)utility;5062fat_tab->main_cnt_cck[mac_id]++;5063} else {5064if (fat_tab->aux_sum_cck[mac_id] > 65435)5065return;50665067fat_tab->aux_sum_cck[mac_id] += (u16)utility;5068fat_tab->aux_cnt_cck[mac_id]++;5069}50705071} else { /*ofdm rate*/50725073if (antsel_tr_mux == ANT1_2G) {5074if (fat_tab->main_sum[mac_id] > 65435)5075return;50765077fat_tab->main_sum[mac_id] += (u16)utility;5078fat_tab->main_cnt[mac_id]++;5079} else {5080if (fat_tab->aux_sum[mac_id] > 65435)5081return;50825083fat_tab->aux_sum[mac_id] += (u16)utility;5084fat_tab->aux_cnt[mac_id]++;5085}5086}5087}5088#ifdef ODM_EVM_ENHANCE_ANTDIV5089else if (method == EVM_METHOD) {5090if (!fat_tab->get_stats)5091return;50925093if (dm->rate_ss == 1) {5094phydm_statistics_evm_1ss(dm, phy_info, antsel_tr_mux,5095mac_id, utility);5096} else { /*@>= 2SS*/5097phydm_statistics_evm_2ss(dm, phy_info, antsel_tr_mux,5098mac_id, utility);5099}51005101} else if (method == CRC32_METHOD) {5102if (antsel_tr_mux == ANT1_2G) {5103fat_tab->main_crc32_ok_cnt += utility;5104fat_tab->main_crc32_fail_cnt++;5105} else {5106fat_tab->aux_crc32_ok_cnt += utility;5107fat_tab->aux_crc32_fail_cnt++;5108}51095110} else if (method == TP_METHOD) {5111if (!fat_tab->get_stats)5112return;5113if (utility <= ODM_RATEMCS15 && utility >= ODM_RATEMCS0) {5114if (antsel_tr_mux == ANT1_2G) {5115fat_tab->main_tp += (phy_rate_table[utility])5116<< 5;5117fat_tab->main_tp_cnt++;5118} else {5119fat_tab->aux_tp += (phy_rate_table[utility])5120<< 5;5121fat_tab->aux_tp_cnt++;5122}5123}5124}5125#endif5126}51275128void odm_process_rssi_smart(void *dm_void, void *phy_info_void,5129void *pkt_info_void, u8 rx_power_ant0)5130{5131struct dm_struct *dm = (struct dm_struct *)dm_void;5132struct phydm_phyinfo_struct *phy_info = NULL;5133struct phydm_perpkt_info_struct *pktinfo = NULL;5134struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;51355136phy_info = (struct phydm_phyinfo_struct *)phy_info_void;5137pktinfo = (struct phydm_perpkt_info_struct *)pkt_info_void;51385139if ((dm->support_ic_type & ODM_SMART_ANT_SUPPORT) &&5140pktinfo->is_packet_to_self &&5141fat_tab->fat_state == FAT_TRAINING_STATE) {5142/* @(pktinfo->is_packet_match_bssid && (!pktinfo->is_packet_beacon)) */5143u8 antsel_tr_mux;51445145antsel_tr_mux = (fat_tab->antsel_rx_keep_2 << 2) |5146(fat_tab->antsel_rx_keep_1 << 1) |5147fat_tab->antsel_rx_keep_0;5148fat_tab->ant_sum_rssi[antsel_tr_mux] += rx_power_ant0;5149fat_tab->ant_rssi_cnt[antsel_tr_mux]++;5150}5151}51525153void odm_process_rssi_normal(void *dm_void, void *phy_info_void,5154void *pkt_info_void, u8 rx_pwr0)5155{5156struct dm_struct *dm = (struct dm_struct *)dm_void;5157struct phydm_phyinfo_struct *phy_info = NULL;5158struct phydm_perpkt_info_struct *pktinfo = NULL;5159struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;5160u8 rx_evm0, rx_evm1;5161boolean b_main;51625163phy_info = (struct phydm_phyinfo_struct *)phy_info_void;5164pktinfo = (struct phydm_perpkt_info_struct *)pkt_info_void;5165rx_evm0 = phy_info->rx_mimo_signal_quality[0];5166rx_evm1 = phy_info->rx_mimo_signal_quality[1];51675168if (!(pktinfo->is_packet_to_self || fat_tab->use_ctrl_frame_antdiv))5169return;51705171if (dm->ant_div_type == S0S1_SW_ANTDIV) {5172if (pktinfo->is_cck_rate ||5173dm->support_ic_type == ODM_RTL8188F) {51745175b_main = (fat_tab->rx_idle_ant == MAIN_ANT);5176fat_tab->antsel_rx_keep_0 = b_main ? ANT1_2G : ANT2_2G;5177}51785179odm_antsel_statistics(dm, phy_info, fat_tab->antsel_rx_keep_0,5180pktinfo->station_id, rx_pwr0, RSSI_METHOD,5181pktinfo->is_cck_rate);5182} else {5183odm_antsel_statistics(dm, phy_info, fat_tab->antsel_rx_keep_0,5184pktinfo->station_id, rx_pwr0, RSSI_METHOD,5185pktinfo->is_cck_rate);51865187#ifdef ODM_EVM_ENHANCE_ANTDIV5188if (!(dm->support_ic_type & ODM_EVM_ANTDIV_IC))5189return;5190if (pktinfo->is_cck_rate)5191return;51925193odm_antsel_statistics(dm, phy_info, fat_tab->antsel_rx_keep_0,5194pktinfo->station_id, rx_evm0, EVM_METHOD,5195pktinfo->is_cck_rate);5196odm_antsel_statistics(dm, phy_info, fat_tab->antsel_rx_keep_0,5197pktinfo->station_id, rx_evm0, TP_METHOD,5198pktinfo->is_cck_rate);5199#endif5200}5201}52025203void odm_process_rssi_for_ant_div(void *dm_void, void *phy_info_void,5204void *pkt_info_void)5205{5206struct dm_struct *dm = (struct dm_struct *)dm_void;5207struct phydm_phyinfo_struct *phy_info = NULL;5208struct phydm_perpkt_info_struct *pktinfo = NULL;5209struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;5210#if (defined(CONFIG_HL_SMART_ANTENNA))5211struct smt_ant_honbo *sat_tab = &dm->dm_sat_table;5212u32 beam_tmp;5213u8 next_ant;5214u8 train_pkt_number;5215#endif5216boolean b_main;5217u8 rx_power_ant0, rx_power_ant1;5218u8 rx_evm_ant0, rx_evm_ant1;5219u8 rssi_avg;5220u64 rssi_linear = 0;52215222phy_info = (struct phydm_phyinfo_struct *)phy_info_void;5223pktinfo = (struct phydm_perpkt_info_struct *)pkt_info_void;5224rx_power_ant0 = phy_info->rx_mimo_signal_strength[0];5225rx_power_ant1 = phy_info->rx_mimo_signal_strength[1];5226rx_evm_ant0 = phy_info->rx_mimo_signal_quality[0];5227rx_evm_ant1 = phy_info->rx_mimo_signal_quality[1];52285229if ((dm->support_ic_type & ODM_IC_2SS) && !pktinfo->is_cck_rate) {5230if (rx_power_ant1 < 100) {5231rssi_linear = phydm_db_2_linear(rx_power_ant0) +5232phydm_db_2_linear(rx_power_ant1);5233/* @Rounding and removing fractional bits */5234rssi_linear = (rssi_linear +5235(1 << (FRAC_BITS - 1))) >> FRAC_BITS;5236/* @Calculate average RSSI */5237rssi_linear = DIVIDED_2(rssi_linear);5238/* @averaged PWDB */5239rssi_avg = (u8)odm_convert_to_db(rssi_linear);5240}52415242} else {5243rx_power_ant0 = (u8)phy_info->rx_pwdb_all;5244rssi_avg = rx_power_ant0;5245}52465247#ifdef CONFIG_HL_SMART_ANTENNA_TYPE25248if ((dm->ant_div_type == HL_SW_SMART_ANT_TYPE2) && (fat_tab->fat_state == FAT_TRAINING_STATE))5249phydm_process_rssi_for_hb_smtant_type2(dm, phy_info, pktinfo, rssi_avg); /*@for 8822B*/5250else5251#endif52525253#ifdef CONFIG_HL_SMART_ANTENNA_TYPE15254#ifdef CONFIG_FAT_PATCH5255if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE1 && fat_tab->fat_state == FAT_TRAINING_STATE) {5256/*@[Beacon]*/5257if (pktinfo->is_packet_beacon) {5258sat_tab->beacon_counter++;5259PHYDM_DBG(dm, DBG_ANT_DIV,5260"MatchBSSID_beacon_counter = ((%d))\n",5261sat_tab->beacon_counter);52625263if (sat_tab->beacon_counter >= sat_tab->pre_beacon_counter + 2) {5264if (sat_tab->ant_num > 1) {5265next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;5266odm_update_rx_idle_ant(dm, next_ant);5267}52685269sat_tab->update_beam_idx++;52705271PHYDM_DBG(dm, DBG_ANT_DIV,5272"pre_beacon_counter = ((%d)), pkt_counter = ((%d)), update_beam_idx = ((%d))\n",5273sat_tab->pre_beacon_counter,5274sat_tab->pkt_counter,5275sat_tab->update_beam_idx);52765277sat_tab->pre_beacon_counter = sat_tab->beacon_counter;5278sat_tab->pkt_counter = 0;5279}5280}5281/*@[data]*/5282else if (pktinfo->is_packet_to_self) {5283if (sat_tab->pkt_skip_statistic_en == 0) {5284/*@5285PHYDM_DBG(dm, DBG_ANT_DIV, "StaID[%d]: antsel_pathA = ((%d)), hw_antsw_occur = ((%d)), Beam_num = ((%d)), RSSI = ((%d))\n",5286pktinfo->station_id, fat_tab->antsel_rx_keep_0, fat_tab->hw_antsw_occur, sat_tab->fast_training_beam_num, rx_power_ant0);5287*/5288PHYDM_DBG(dm, DBG_ANT_DIV,5289"ID[%d][pkt_cnt = %d]: {ANT, Beam} = {%d, %d}, RSSI = ((%d))\n",5290pktinfo->station_id,5291sat_tab->pkt_counter,5292fat_tab->antsel_rx_keep_0,5293sat_tab->fast_training_beam_num,5294rx_power_ant0);52955296sat_tab->pkt_rssi_sum[fat_tab->antsel_rx_keep_0][sat_tab->fast_training_beam_num] += rx_power_ant0;5297sat_tab->pkt_rssi_cnt[fat_tab->antsel_rx_keep_0][sat_tab->fast_training_beam_num]++;5298sat_tab->pkt_counter++;52995300#if 15301train_pkt_number = sat_tab->beam_train_cnt[fat_tab->rx_idle_ant - 1][sat_tab->fast_training_beam_num];5302#else5303train_pkt_number = sat_tab->per_beam_training_pkt_num;5304#endif53055306/*Swich Antenna erery N pkts*/5307if (sat_tab->pkt_counter == train_pkt_number) {5308if (sat_tab->ant_num > 1) {5309PHYDM_DBG(dm, DBG_ANT_DIV, "packet enugh ((%d ))pkts ---> Switch antenna\n", train_pkt_number);5310next_ant = (fat_tab->rx_idle_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;5311odm_update_rx_idle_ant(dm, next_ant);5312}53135314sat_tab->update_beam_idx++;5315PHYDM_DBG(dm, DBG_ANT_DIV, "pre_beacon_counter = ((%d)), update_beam_idx_counter = ((%d))\n",5316sat_tab->pre_beacon_counter, sat_tab->update_beam_idx);53175318sat_tab->pre_beacon_counter = sat_tab->beacon_counter;5319sat_tab->pkt_counter = 0;5320}5321}5322}53235324/*Swich Beam after switch "sat_tab->ant_num" antennas*/5325if (sat_tab->update_beam_idx == sat_tab->ant_num) {5326sat_tab->update_beam_idx = 0;5327sat_tab->pkt_counter = 0;5328beam_tmp = sat_tab->fast_training_beam_num;53295330if (sat_tab->fast_training_beam_num >= (sat_tab->beam_patten_num_each_ant - 1)) {5331fat_tab->fat_state = FAT_DECISION_STATE;53325333#if DEV_BUS_TYPE == RT_PCI_INTERFACE5334if (dm->support_interface == ODM_ITRF_PCIE)5335odm_fast_ant_training_hl_smart_antenna_type1(dm);5336#endif5337#if DEV_BUS_TYPE == RT_USB_INTERFACE || DEV_BUS_TYPE == RT_SDIO_INTERFACE5338if (dm->support_interface == ODM_ITRF_USB || dm->support_interface == ODM_ITRF_SDIO)5339odm_schedule_work_item(&sat_tab->hl_smart_antenna_decision_workitem);5340#endif53415342} else {5343sat_tab->fast_training_beam_num++;5344PHYDM_DBG(dm, DBG_ANT_DIV,5345"Update Beam_num (( %d )) -> (( %d ))\n",5346beam_tmp,5347sat_tab->fast_training_beam_num);5348phydm_set_all_ant_same_beam_num(dm);53495350fat_tab->fat_state = FAT_TRAINING_STATE;5351}5352}5353}5354#else53555356if (dm->ant_div_type == HL_SW_SMART_ANT_TYPE1) {5357if ((dm->support_ic_type & ODM_HL_SMART_ANT_TYPE1_SUPPORT) &&5358pktinfo->is_packet_to_self &&5359fat_tab->fat_state == FAT_TRAINING_STATE) {5360if (sat_tab->pkt_skip_statistic_en == 0) {5361/*@5362PHYDM_DBG(dm, DBG_ANT_DIV, "StaID[%d]: antsel_pathA = ((%d)), hw_antsw_occur = ((%d)), Beam_num = ((%d)), RSSI = ((%d))\n",5363pktinfo->station_id, fat_tab->antsel_rx_keep_0, fat_tab->hw_antsw_occur, sat_tab->fast_training_beam_num, rx_power_ant0);5364*/5365PHYDM_DBG(dm, DBG_ANT_DIV,5366"StaID[%d]: antsel_pathA = ((%d)), is_packet_to_self = ((%d)), Beam_num = ((%d)), RSSI = ((%d))\n",5367pktinfo->station_id,5368fat_tab->antsel_rx_keep_0,5369pktinfo->is_packet_to_self,5370sat_tab->fast_training_beam_num,5371rx_power_ant0);53725373sat_tab->pkt_rssi_sum[fat_tab->antsel_rx_keep_0][sat_tab->fast_training_beam_num] += rx_power_ant0;5374sat_tab->pkt_rssi_cnt[fat_tab->antsel_rx_keep_0][sat_tab->fast_training_beam_num]++;5375sat_tab->pkt_counter++;53765377/*swich beam every N pkt*/5378if (sat_tab->pkt_counter >= sat_tab->per_beam_training_pkt_num) {5379sat_tab->pkt_counter = 0;5380beam_tmp = sat_tab->fast_training_beam_num;53815382if (sat_tab->fast_training_beam_num >= (sat_tab->beam_patten_num_each_ant - 1)) {5383fat_tab->fat_state = FAT_DECISION_STATE;53845385#if DEV_BUS_TYPE == RT_PCI_INTERFACE5386if (dm->support_interface == ODM_ITRF_PCIE)5387odm_fast_ant_training_hl_smart_antenna_type1(dm);5388#endif5389#if DEV_BUS_TYPE == RT_USB_INTERFACE || DEV_BUS_TYPE == RT_SDIO_INTERFACE5390if (dm->support_interface == ODM_ITRF_USB || dm->support_interface == ODM_ITRF_SDIO)5391odm_schedule_work_item(&sat_tab->hl_smart_antenna_decision_workitem);5392#endif53935394} else {5395sat_tab->fast_training_beam_num++;5396phydm_set_all_ant_same_beam_num(dm);53975398fat_tab->fat_state = FAT_TRAINING_STATE;5399PHYDM_DBG(dm, DBG_ANT_DIV, "Update Beam_num (( %d )) -> (( %d ))\n", beam_tmp, sat_tab->fast_training_beam_num);5400}5401}5402}5403}5404}5405#endif5406else5407#endif5408if (dm->ant_div_type == CG_TRX_SMART_ANTDIV) {5409odm_process_rssi_smart(dm, phy_info, pktinfo,5410rx_power_ant0);5411} else { /* @ant_div_type != CG_TRX_SMART_ANTDIV */5412odm_process_rssi_normal(dm, phy_info, pktinfo,5413rx_power_ant0);5414}5415#if 05416/* PHYDM_DBG(dm,DBG_ANT_DIV,"is_cck_rate=%d, pwdb_all=%d\n",5417* pktinfo->is_cck_rate, phy_info->rx_pwdb_all);5418* PHYDM_DBG(dm,DBG_ANT_DIV,"antsel_tr_mux=3'b%d%d%d\n",5419* fat_tab->antsel_rx_keep_2, fat_tab->antsel_rx_keep_1,5420* fat_tab->antsel_rx_keep_0);5421*/5422#endif5423}54245425#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE | ODM_IOT))5426void odm_set_tx_ant_by_tx_info(void *dm_void, u8 *desc, u8 mac_id)5427{5428struct dm_struct *dm = (struct dm_struct *)dm_void;5429struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;54305431if (!(dm->support_ability & ODM_BB_ANT_DIV))5432return;54335434if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)5435return;54365437if (dm->support_ic_type == (ODM_RTL8723B | ODM_RTL8721D)) {5438#if (RTL8723B_SUPPORT == 1 || RTL8721D_SUPPORT == 1)5439SET_TX_DESC_ANTSEL_A_8723B(desc, fat_tab->antsel_a[mac_id]);5440/*PHYDM_DBG(dm,DBG_ANT_DIV,5441* "[8723B] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",5442* mac_id, fat_tab->antsel_c[mac_id], fat_tab->antsel_b[mac_id],5443* fat_tab->antsel_a[mac_id]);5444*/5445#endif5446} else if (dm->support_ic_type == ODM_RTL8821) {5447#if (RTL8821A_SUPPORT == 1)5448SET_TX_DESC_ANTSEL_A_8812(desc, fat_tab->antsel_a[mac_id]);5449/*PHYDM_DBG(dm,DBG_ANT_DIV,5450* "[8821A] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",5451* mac_id, fat_tab->antsel_c[mac_id], fat_tab->antsel_b[mac_id],5452* fat_tab->antsel_a[mac_id]);5453*/5454#endif5455} else if (dm->support_ic_type == ODM_RTL8188E) {5456#if (RTL8188E_SUPPORT == 1)5457SET_TX_DESC_ANTSEL_A_88E(desc, fat_tab->antsel_a[mac_id]);5458SET_TX_DESC_ANTSEL_B_88E(desc, fat_tab->antsel_b[mac_id]);5459SET_TX_DESC_ANTSEL_C_88E(desc, fat_tab->antsel_c[mac_id]);5460/*PHYDM_DBG(dm,DBG_ANT_DIV,5461* "[8188E] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",5462* mac_id, fat_tab->antsel_c[mac_id], fat_tab->antsel_b[mac_id],5463* fat_tab->antsel_a[mac_id]);5464*/5465#endif5466} else if (dm->support_ic_type == ODM_RTL8821C) {5467#if (RTL8821C_SUPPORT == 1)5468SET_TX_DESC_ANTSEL_A_8821C(desc, fat_tab->antsel_a[mac_id]);5469/*PHYDM_DBG(dm,DBG_ANT_DIV,5470* "[8821C] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",5471* mac_id, fat_tab->antsel_c[mac_id], fat_tab->antsel_b[mac_id],5472* fat_tab->antsel_a[mac_id]);5473*/5474#endif5475} else if (dm->support_ic_type == ODM_RTL8822B) {5476#if (RTL8822B_SUPPORT == 1)5477SET_TX_DESC_ANTSEL_A_8822B(desc, fat_tab->antsel_a[mac_id]);5478#endif54795480}5481}5482#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)54835484void odm_set_tx_ant_by_tx_info(5485struct rtl8192cd_priv *priv,5486struct tx_desc *pdesc,5487unsigned short aid)5488{5489struct dm_struct *dm = GET_PDM_ODM(priv); /*@&(priv->pshare->_dmODM);*/5490struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;54915492if (!(dm->support_ability & ODM_BB_ANT_DIV))5493return;54945495if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)5496return;54975498if (dm->support_ic_type == ODM_RTL8881A) {5499#if 05500/*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E******\n",__FUNCTION__,__LINE__); */5501#endif5502pdesc->Dword6 &= set_desc(~(BIT(18) | BIT(17) | BIT(16)));5503pdesc->Dword6 |= set_desc(fat_tab->antsel_a[aid] << 16);5504} else if (dm->support_ic_type == ODM_RTL8192E) {5505#if 05506/*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8192E******\n",__FUNCTION__,__LINE__); */5507#endif5508pdesc->Dword6 &= set_desc(~(BIT(18) | BIT(17) | BIT(16)));5509pdesc->Dword6 |= set_desc(fat_tab->antsel_a[aid] << 16);5510} else if (dm->support_ic_type == ODM_RTL8197F) {5511#if 05512/*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8192E******\n",__FUNCTION__,__LINE__); */5513#endif5514pdesc->Dword6 &= set_desc(~(BIT(17) | BIT(16)));5515pdesc->Dword6 |= set_desc(fat_tab->antsel_a[aid] << 16);5516} else if (dm->support_ic_type == ODM_RTL8822B) {5517pdesc->Dword6 &= set_desc(~(BIT(17) | BIT(16)));5518pdesc->Dword6 |= set_desc(fat_tab->antsel_a[aid] << 16);5519} else if (dm->support_ic_type == ODM_RTL8188E) {5520#if 05521/*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8188E******\n",__FUNCTION__,__LINE__);*/5522#endif5523pdesc->Dword2 &= set_desc(~BIT(24));5524pdesc->Dword2 &= set_desc(~BIT(25));5525pdesc->Dword7 &= set_desc(~BIT(29));55265527pdesc->Dword2 |= set_desc(fat_tab->antsel_a[aid] << 24);5528pdesc->Dword2 |= set_desc(fat_tab->antsel_b[aid] << 25);5529pdesc->Dword7 |= set_desc(fat_tab->antsel_c[aid] << 29);55305531} else if (dm->support_ic_type == ODM_RTL8812) {5532/*@[path-A]*/5533#if 05534/*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E******\n",__FUNCTION__,__LINE__);*/5535#endif55365537pdesc->Dword6 &= set_desc(~BIT(16));5538pdesc->Dword6 &= set_desc(~BIT(17));5539pdesc->Dword6 &= set_desc(~BIT(18));55405541pdesc->Dword6 |= set_desc(fat_tab->antsel_a[aid] << 16);5542pdesc->Dword6 |= set_desc(fat_tab->antsel_b[aid] << 17);5543pdesc->Dword6 |= set_desc(fat_tab->antsel_c[aid] << 18);5544}5545}55465547#if 1 /*@def CONFIG_WLAN_HAL*/5548void odm_set_tx_ant_by_tx_info_hal(5549struct rtl8192cd_priv *priv,5550void *pdesc_data,5551u16 aid)5552{5553struct dm_struct *dm = GET_PDM_ODM(priv); /*@&(priv->pshare->_dmODM);*/5554struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;5555PTX_DESC_DATA_88XX pdescdata = (PTX_DESC_DATA_88XX)pdesc_data;55565557if (!(dm->support_ability & ODM_BB_ANT_DIV))5558return;55595560if (dm->ant_div_type == CGCS_RX_HW_ANTDIV)5561return;55625563if (dm->support_ic_type & (ODM_RTL8881A | ODM_RTL8192E | ODM_RTL8814A |5564ODM_RTL8197F | ODM_RTL8822B)) {5565#if 05566/*panic_printk("[%s] [%d] **odm_set_tx_ant_by_tx_info_hal**\n",5567* __FUNCTION__,__LINE__);5568*/5569#endif5570pdescdata->ant_sel = 1;5571pdescdata->ant_sel_a = fat_tab->antsel_a[aid];5572}5573}5574#endif /*@#ifdef CONFIG_WLAN_HAL*/55755576#endif55775578void odm_ant_div_config(void *dm_void)5579{5580struct dm_struct *dm = (struct dm_struct *)dm_void;5581struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;5582#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))5583PHYDM_DBG(dm, DBG_ANT_DIV, "WIN Config Antenna Diversity\n");5584/*@5585if(dm->support_ic_type==ODM_RTL8723B)5586{5587if((!dm->swat_tab.ANTA_ON || !dm->swat_tab.ANTB_ON))5588dm->support_ability &= ~(ODM_BB_ANT_DIV);5589}5590*/5591#if (defined(CONFIG_2T3R_ANTENNA))5592#if (RTL8822B_SUPPORT == 1)5593dm->rfe_type = ANT_2T3R_RFE_TYPE;5594#endif5595#endif55965597#if (defined(CONFIG_2T4R_ANTENNA))5598#if (RTL8822B_SUPPORT == 1)5599dm->rfe_type = ANT_2T4R_RFE_TYPE;5600#endif5601#endif56025603if (dm->support_ic_type == ODM_RTL8723D)5604dm->ant_div_type = S0S1_SW_ANTDIV;5605#elif (DM_ODM_SUPPORT_TYPE & (ODM_CE))56065607PHYDM_DBG(dm, DBG_ANT_DIV, "CE Config Antenna Diversity\n");56085609if (dm->support_ic_type == ODM_RTL8723B)5610dm->ant_div_type = S0S1_SW_ANTDIV;56115612if (dm->support_ic_type == ODM_RTL8723D)5613dm->ant_div_type = S0S1_SW_ANTDIV;5614#elif (DM_ODM_SUPPORT_TYPE & (ODM_IOT))56155616PHYDM_DBG(dm, DBG_ANT_DIV, "IOT Config Antenna Diversity\n");56175618if (dm->support_ic_type == ODM_RTL8721D)5619dm->ant_div_type = CG_TRX_HW_ANTDIV;56205621#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))56225623PHYDM_DBG(dm, DBG_ANT_DIV, "AP Config Antenna Diversity\n");56245625/* @2 [ NOT_SUPPORT_ANTDIV ] */5626#if (defined(CONFIG_NOT_SUPPORT_ANTDIV))5627dm->support_ability &= ~(ODM_BB_ANT_DIV);5628PHYDM_DBG(dm, DBG_ANT_DIV,5629"[ Disable AntDiv function] : Not Support 2.4G & 5G Antenna Diversity\n");56305631/* @2 [ 2G&5G_SUPPORT_ANTDIV ] */5632#elif (defined(CONFIG_2G5G_SUPPORT_ANTDIV))5633PHYDM_DBG(dm, DBG_ANT_DIV,5634"[ Enable AntDiv function] : 2.4G & 5G Support Antenna Diversity Simultaneously\n");5635fat_tab->ant_div_2g_5g = (ODM_ANTDIV_2G | ODM_ANTDIV_5G);56365637if (dm->support_ic_type & ODM_ANTDIV_SUPPORT)5638dm->support_ability |= ODM_BB_ANT_DIV;5639if (*dm->band_type == ODM_BAND_5G) {5640#if (defined(CONFIG_5G_CGCS_RX_DIVERSITY))5641dm->ant_div_type = CGCS_RX_HW_ANTDIV;5642PHYDM_DBG(dm, DBG_ANT_DIV,5643"[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");5644panic_printk("[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");5645#elif (defined(CONFIG_5G_CG_TRX_DIVERSITY) ||\5646defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A))5647dm->ant_div_type = CG_TRX_HW_ANTDIV;5648PHYDM_DBG(dm, DBG_ANT_DIV,5649"[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n");5650panic_printk("[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n");5651#elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY))5652dm->ant_div_type = CG_TRX_SMART_ANTDIV;5653PHYDM_DBG(dm, DBG_ANT_DIV,5654"[ 5G] : AntDiv type = CG_SMART_ANTDIV\n");5655#elif (defined(CONFIG_5G_S0S1_SW_ANT_DIVERSITY))5656dm->ant_div_type = S0S1_SW_ANTDIV;5657PHYDM_DBG(dm, DBG_ANT_DIV,5658"[ 5G] : AntDiv type = S0S1_SW_ANTDIV\n");5659#endif5660} else if (*dm->band_type == ODM_BAND_2_4G) {5661#if (defined(CONFIG_2G_CGCS_RX_DIVERSITY))5662dm->ant_div_type = CGCS_RX_HW_ANTDIV;5663PHYDM_DBG(dm, DBG_ANT_DIV,5664"[ 2.4G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");5665#elif (defined(CONFIG_2G_CG_TRX_DIVERSITY) ||\5666defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A))5667dm->ant_div_type = CG_TRX_HW_ANTDIV;5668PHYDM_DBG(dm, DBG_ANT_DIV,5669"[ 2.4G] : AntDiv type = CG_TRX_HW_ANTDIV\n");5670#elif (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))5671dm->ant_div_type = CG_TRX_SMART_ANTDIV;5672PHYDM_DBG(dm, DBG_ANT_DIV,5673"[ 2.4G] : AntDiv type = CG_SMART_ANTDIV\n");5674#elif (defined(CONFIG_2G_S0S1_SW_ANT_DIVERSITY))5675dm->ant_div_type = S0S1_SW_ANTDIV;5676PHYDM_DBG(dm, DBG_ANT_DIV,5677"[ 2.4G] : AntDiv type = S0S1_SW_ANTDIV\n");5678#endif5679}56805681/* @2 [ 5G_SUPPORT_ANTDIV ] */5682#elif (defined(CONFIG_5G_SUPPORT_ANTDIV))5683PHYDM_DBG(dm, DBG_ANT_DIV,5684"[ Enable AntDiv function] : Only 5G Support Antenna Diversity\n");5685panic_printk("[ Enable AntDiv function] : Only 5G Support Antenna Diversity\n");5686fat_tab->ant_div_2g_5g = (ODM_ANTDIV_5G);5687if (*dm->band_type == ODM_BAND_5G) {5688if (dm->support_ic_type & ODM_ANTDIV_5G_SUPPORT_IC)5689dm->support_ability |= ODM_BB_ANT_DIV;5690#if (defined(CONFIG_5G_CGCS_RX_DIVERSITY))5691dm->ant_div_type = CGCS_RX_HW_ANTDIV;5692PHYDM_DBG(dm, DBG_ANT_DIV,5693"[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");5694panic_printk("[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");5695#elif (defined(CONFIG_5G_CG_TRX_DIVERSITY))5696dm->ant_div_type = CG_TRX_HW_ANTDIV;5697panic_printk("[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n");5698PHYDM_DBG(dm, DBG_ANT_DIV,5699"[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n");5700#elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY))5701dm->ant_div_type = CG_TRX_SMART_ANTDIV;5702PHYDM_DBG(dm, DBG_ANT_DIV,5703"[ 5G] : AntDiv type = CG_SMART_ANTDIV\n");5704#elif (defined(CONFIG_5G_S0S1_SW_ANT_DIVERSITY))5705dm->ant_div_type = S0S1_SW_ANTDIV;5706PHYDM_DBG(dm, DBG_ANT_DIV,5707"[ 5G] : AntDiv type = S0S1_SW_ANTDIV\n");5708#endif5709} else if (*dm->band_type == ODM_BAND_2_4G) {5710PHYDM_DBG(dm, DBG_ANT_DIV, "Not Support 2G ant_div_type\n");5711dm->support_ability &= ~(ODM_BB_ANT_DIV);5712}57135714/* @2 [ 2G_SUPPORT_ANTDIV ] */5715#elif (defined(CONFIG_2G_SUPPORT_ANTDIV))5716PHYDM_DBG(dm, DBG_ANT_DIV,5717"[ Enable AntDiv function] : Only 2.4G Support Antenna Diversity\n");5718fat_tab->ant_div_2g_5g = (ODM_ANTDIV_2G);5719if (*dm->band_type == ODM_BAND_2_4G) {5720if (dm->support_ic_type & ODM_ANTDIV_2G_SUPPORT_IC)5721dm->support_ability |= ODM_BB_ANT_DIV;5722#if (defined(CONFIG_2G_CGCS_RX_DIVERSITY))5723dm->ant_div_type = CGCS_RX_HW_ANTDIV;5724PHYDM_DBG(dm, DBG_ANT_DIV,5725"[ 2.4G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");5726#elif (defined(CONFIG_2G_CG_TRX_DIVERSITY))5727dm->ant_div_type = CG_TRX_HW_ANTDIV;5728PHYDM_DBG(dm, DBG_ANT_DIV,5729"[ 2.4G] : AntDiv type = CG_TRX_HW_ANTDIV\n");5730#elif (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))5731dm->ant_div_type = CG_TRX_SMART_ANTDIV;5732PHYDM_DBG(dm, DBG_ANT_DIV,5733"[ 2.4G] : AntDiv type = CG_SMART_ANTDIV\n");5734#elif (defined(CONFIG_2G_S0S1_SW_ANT_DIVERSITY))5735dm->ant_div_type = S0S1_SW_ANTDIV;5736PHYDM_DBG(dm, DBG_ANT_DIV,5737"[ 2.4G] : AntDiv type = S0S1_SW_ANTDIV\n");5738#endif5739} else if (*dm->band_type == ODM_BAND_5G) {5740PHYDM_DBG(dm, DBG_ANT_DIV, "Not Support 5G ant_div_type\n");5741dm->support_ability &= ~(ODM_BB_ANT_DIV);5742}5743#endif5744#endif57455746PHYDM_DBG(dm, DBG_ANT_DIV,5747"[AntDiv Config Info] AntDiv_SupportAbility = (( %x ))\n",5748((dm->support_ability & ODM_BB_ANT_DIV) ? 1 : 0));5749PHYDM_DBG(dm, DBG_ANT_DIV,5750"[AntDiv Config Info] be_fix_tx_ant = ((%d))\n",5751dm->dm_fat_table.b_fix_tx_ant);5752}57535754void odm_ant_div_timers(void *dm_void, u8 state)5755{5756struct dm_struct *dm = (struct dm_struct *)dm_void;5757if (state == INIT_ANTDIV_TIMMER) {5758#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY5759odm_initialize_timer(dm,5760&dm->dm_swat_table.sw_antdiv_timer,5761(void *)odm_sw_antdiv_callback, NULL,5762"sw_antdiv_timer");5763#elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) ||\5764(defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))5765odm_initialize_timer(dm, &dm->fast_ant_training_timer,5766(void *)odm_fast_ant_training_callback,5767NULL, "fast_ant_training_timer");5768#endif57695770#ifdef ODM_EVM_ENHANCE_ANTDIV5771odm_initialize_timer(dm, &dm->evm_fast_ant_training_timer,5772(void *)phydm_evm_antdiv_callback, NULL,5773"evm_fast_ant_training_timer");5774#endif5775} else if (state == CANCEL_ANTDIV_TIMMER) {5776#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY5777odm_cancel_timer(dm,5778&dm->dm_swat_table.sw_antdiv_timer);5779#elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) ||\5780(defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))5781odm_cancel_timer(dm, &dm->fast_ant_training_timer);5782#endif57835784#ifdef ODM_EVM_ENHANCE_ANTDIV5785odm_cancel_timer(dm, &dm->evm_fast_ant_training_timer);5786#endif5787} else if (state == RELEASE_ANTDIV_TIMMER) {5788#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY5789odm_release_timer(dm,5790&dm->dm_swat_table.sw_antdiv_timer);5791#elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) ||\5792(defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))5793odm_release_timer(dm, &dm->fast_ant_training_timer);5794#endif57955796#ifdef ODM_EVM_ENHANCE_ANTDIV5797odm_release_timer(dm, &dm->evm_fast_ant_training_timer);5798#endif5799}5800}58015802void phydm_antdiv_debug(void *dm_void, char input[][16], u32 *_used,5803char *output, u32 *_out_len)5804{5805struct dm_struct *dm = (struct dm_struct *)dm_void;5806struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;5807u32 used = *_used;5808u32 out_len = *_out_len;5809u32 dm_value[10] = {0};5810char help[] = "-h";5811u8 i, input_idx = 0;58125813for (i = 0; i < 5; i++) {5814if (input[i + 1]) {5815PHYDM_SSCANF(input[i + 1], DCMD_HEX, &dm_value[i]);5816input_idx++;5817}5818}58195820if (input_idx == 0)5821return;58225823if ((strcmp(input[1], help) == 0)) {5824PDM_SNPF(out_len, used, output + used, out_len - used,5825"{1} {0:auto, 1:fix main, 2:fix auto}\n");5826PDM_SNPF(out_len, used, output + used, out_len - used,5827"{2} {antdiv_period}\n");5828#if (RTL8821C_SUPPORT == 1)5829PDM_SNPF(out_len, used, output + used, out_len - used,5830"{3} {en} {0:Default, 1:HW_Div, 2:SW_Div}\n");5831#endif58325833} else if (dm_value[0] == 1) {5834/*@fixed or auto antenna*/5835if (dm_value[1] == 0) {5836dm->ant_type = ODM_AUTO_ANT;5837PDM_SNPF(out_len, used, output + used, out_len - used,5838"AntDiv: Auto\n");5839} else if (dm_value[1] == 1) {5840dm->ant_type = ODM_FIX_MAIN_ANT;5841PDM_SNPF(out_len, used, output + used, out_len - used,5842"AntDiv: Fix Main\n");5843} else if (dm_value[1] == 2) {5844dm->ant_type = ODM_FIX_AUX_ANT;5845PDM_SNPF(out_len, used, output + used, out_len - used,5846"AntDiv: Fix Aux\n");5847}58485849if (dm->ant_type != ODM_AUTO_ANT) {5850odm_stop_antenna_switch_dm(dm);5851if (dm->ant_type == ODM_FIX_MAIN_ANT)5852odm_update_rx_idle_ant(dm, MAIN_ANT);5853else if (dm->ant_type == ODM_FIX_AUX_ANT)5854odm_update_rx_idle_ant(dm, AUX_ANT);5855} else {5856phydm_enable_antenna_diversity(dm);5857}5858dm->pre_ant_type = dm->ant_type;5859} else if (dm_value[0] == 2) {5860/*@dynamic period for AntDiv*/5861dm->antdiv_period = (u8)dm_value[1];5862PDM_SNPF(out_len, used, output + used, out_len - used,5863"AntDiv_period=((%d))\n", dm->antdiv_period);5864}5865#if (RTL8821C_SUPPORT == 1)5866else if (dm_value[0] == 3 &&5867dm->support_ic_type == ODM_RTL8821C) {5868/*Only for 8821C*/5869if (dm_value[1] == 0) {5870fat_tab->force_antdiv_type = false;5871PDM_SNPF(out_len, used, output + used, out_len - used,5872"[8821C] AntDiv: Default\n");5873} else if (dm_value[1] == 1) {5874fat_tab->force_antdiv_type = true;5875fat_tab->antdiv_type_dbg = CG_TRX_HW_ANTDIV;5876PDM_SNPF(out_len, used, output + used, out_len - used,5877"[8821C] AntDiv: HW diversity\n");5878} else if (dm_value[1] == 2) {5879fat_tab->force_antdiv_type = true;5880fat_tab->antdiv_type_dbg = S0S1_SW_ANTDIV;5881PDM_SNPF(out_len, used, output + used, out_len - used,5882"[8821C] AntDiv: SW diversity\n");5883}5884}5885#endif5886#ifdef ODM_EVM_ENHANCE_ANTDIV5887else if (dm_value[0] == 4) {5888if (dm_value[1] == 0) {5889/*@init parameters for EVM AntDiv*/5890phydm_evm_sw_antdiv_init(dm);5891PDM_SNPF(out_len, used, output + used, out_len - used,5892"init evm antdiv parameters\n");5893} else if (dm_value[1] == 1) {5894/*training number for EVM AntDiv*/5895dm->antdiv_train_num = (u8)dm_value[2];5896PDM_SNPF(out_len, used, output + used, out_len - used,5897"antdiv_train_num = ((%d))\n",5898dm->antdiv_train_num);5899} else if (dm_value[1] == 2) {5900/*training interval for EVM AntDiv*/5901dm->antdiv_intvl = (u8)dm_value[2];5902PDM_SNPF(out_len, used, output + used, out_len - used,5903"antdiv_intvl = ((%d))\n",5904dm->antdiv_intvl);5905} else if (dm_value[1] == 3) {5906/*@function period for EVM AntDiv*/5907dm->evm_antdiv_period = (u8)dm_value[2];5908PDM_SNPF(out_len, used, output + used, out_len - used,5909"evm_antdiv_period = ((%d))\n",5910dm->evm_antdiv_period);5911} else if (dm_value[1] == 100) {/*show parameters*/5912PDM_SNPF(out_len, used, output + used, out_len - used,5913"ant_type = ((%d))\n", dm->ant_type);5914PDM_SNPF(out_len, used, output + used, out_len - used,5915"antdiv_train_num = ((%d))\n",5916dm->antdiv_train_num);5917PDM_SNPF(out_len, used, output + used, out_len - used,5918"antdiv_intvl = ((%d))\n",5919dm->antdiv_intvl);5920PDM_SNPF(out_len, used, output + used, out_len - used,5921"evm_antdiv_period = ((%d))\n",5922dm->evm_antdiv_period);5923}5924}5925#ifdef CONFIG_2T4R_ANTENNA5926else if (dm_value[0] == 5) { /*Only for 8822B 2T4R case*/59275928if (dm_value[1] == 0) {5929dm->ant_type2 = ODM_AUTO_ANT;5930PDM_SNPF(out_len, used, output + used, out_len - used,5931"AntDiv: PathB Auto\n");5932} else if (dm_value[1] == 1) {5933dm->ant_type2 = ODM_FIX_MAIN_ANT;5934PDM_SNPF(out_len, used, output + used, out_len - used,5935"AntDiv: PathB Fix Main\n");5936} else if (dm_value[1] == 2) {5937dm->ant_type2 = ODM_FIX_AUX_ANT;5938PDM_SNPF(out_len, used, output + used, out_len - used,5939"AntDiv: PathB Fix Aux\n");5940}59415942if (dm->ant_type2 != ODM_AUTO_ANT) {5943odm_stop_antenna_switch_dm(dm);5944if (dm->ant_type2 == ODM_FIX_MAIN_ANT)5945phydm_update_rx_idle_ant_pathb(dm, MAIN_ANT);5946else if (dm->ant_type2 == ODM_FIX_AUX_ANT)5947phydm_update_rx_idle_ant_pathb(dm, AUX_ANT);5948} else {5949phydm_enable_antenna_diversity(dm);5950}5951dm->pre_ant_type2 = dm->ant_type2;5952}5953#endif5954#endif5955*_used = used;5956*_out_len = out_len;5957}59585959void odm_ant_div_reset(void *dm_void)5960{5961struct dm_struct *dm = (struct dm_struct *)dm_void;59625963#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY5964if (dm->ant_div_type == S0S1_SW_ANTDIV)5965odm_s0s1_sw_ant_div_reset(dm);5966#endif5967}59685969void odm_antenna_diversity_init(void *dm_void)5970{5971struct dm_struct *dm = (struct dm_struct *)dm_void;59725973odm_ant_div_config(dm);5974odm_ant_div_init(dm);5975}59765977void odm_antenna_diversity(void *dm_void)5978{5979struct dm_struct *dm = (struct dm_struct *)dm_void;59805981if (*dm->mp_mode)5982return;59835984if (!(dm->support_ability & ODM_BB_ANT_DIV)) {5985PHYDM_DBG(dm, DBG_ANT_DIV,5986"[Return!!!] Not Support Antenna Diversity Function\n");5987return;5988}59895990if (dm->pause_ability & ODM_BB_ANT_DIV) {5991PHYDM_DBG(dm, DBG_ANT_DIV, "Return: Pause AntDIv in LV=%d\n",5992dm->pause_lv_table.lv_antdiv);5993return;5994}59955996odm_ant_div(dm);5997}5998#endif /*@#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY*/5999600060016002