Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_api.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* ************************************************************28*/2930#include "mp_precomp.h"31#include "phydm_precomp.h"3233void phydm_reset_bb_hw_cnt(void *dm_void)34{35struct dm_struct *dm = (struct dm_struct *)dm_void;3637/*@ Reset all counter when 1 */38if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {39odm_set_bb_reg(dm, R_0x1eb4, BIT(25), 1);40odm_set_bb_reg(dm, R_0x1eb4, BIT(25), 0);41} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {42/*@ Reset all counter when 1 (including PMAC and PHY)*/43/* Reset Page F counter*/44odm_set_bb_reg(dm, R_0xb58, BIT(0), 1);45odm_set_bb_reg(dm, R_0xb58, BIT(0), 0);46} else if (dm->support_ic_type & ODM_IC_11N_SERIES) {47odm_set_bb_reg(dm, R_0xf14, BIT(16), 0x1);48odm_set_bb_reg(dm, R_0xf14, BIT(16), 0x0);49}50}5152void phydm_dynamic_ant_weighting(void *dm_void)53{54struct dm_struct *dm = (struct dm_struct *)dm_void;5556#ifdef DYN_ANT_WEIGHTING_SUPPORT57#if (RTL8197F_SUPPORT)58if (dm->support_ic_type & (ODM_RTL8197F))59phydm_dynamic_ant_weighting_8197f(dm);60#endif6162#if (RTL8812A_SUPPORT)63if (dm->support_ic_type & (ODM_RTL8812)) {64phydm_dynamic_ant_weighting_8812a(dm);65}66#endif6768#if (RTL8822B_SUPPORT)69if (dm->support_ic_type & (ODM_RTL8822B))70phydm_dynamic_ant_weighting_8822b(dm);71#endif72#endif73}7475#ifdef DYN_ANT_WEIGHTING_SUPPORT76void phydm_ant_weight_dbg(void *dm_void, char input[][16], u32 *_used,77char *output, u32 *_out_len)78{79struct dm_struct *dm = (struct dm_struct *)dm_void;80char help[] = "-h";81u32 var1[10] = {0};82u32 used = *_used;83u32 out_len = *_out_len;8485if ((strcmp(input[1], help) == 0)) {86PDM_SNPF(out_len, used, output + used, out_len - used,87"echo dis_dym_ant_weighting {0/1}\n");8889} else {90PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);9192if (var1[0] == 1) {93dm->is_disable_dym_ant_weighting = 1;94PDM_SNPF(out_len, used, output + used, out_len - used,95"Disable dyn-ant-weighting\n");96} else {97dm->is_disable_dym_ant_weighting = 0;98PDM_SNPF(out_len, used, output + used, out_len - used,99"Enable dyn-ant-weighting\n");100}101}102*_used = used;103*_out_len = out_len;104}105#endif106107void phydm_trx_antenna_setting_init(void *dm_void, u8 num_rf_path)108{109struct dm_struct *dm = (struct dm_struct *)dm_void;110u8 rx_ant = 0, tx_ant = 0;111u8 path_bitmap = 1;112113path_bitmap = (u8)phydm_gen_bitmask(num_rf_path);114#if 0115/*PHYDM_DBG(dm, ODM_COMP_INIT, "path_bitmap=0x%x\n", path_bitmap);*/116#endif117118dm->tx_ant_status = path_bitmap;119dm->rx_ant_status = path_bitmap;120121if (num_rf_path == PDM_1SS)122return;123124#if (defined(PHYDM_COMPILE_ABOVE_2SS))125if (dm->support_ic_type &126(ODM_RTL8192F | ODM_RTL8192E | ODM_RTL8197F)) {127dm->rx_ant_status = (u8)odm_get_bb_reg(dm, R_0xc04, 0x3);128dm->tx_ant_status = (u8)odm_get_bb_reg(dm, R_0x90c, 0x3);129} else if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8814A)) {130dm->rx_ant_status = (u8)odm_get_bb_reg(dm, R_0x808, 0xf);131dm->tx_ant_status = (u8)odm_get_bb_reg(dm, R_0x80c, 0xf);132}133#endif134/* @trx_ant_status are already updated in trx mode API in JGR3 ICs */135136PHYDM_DBG(dm, ODM_COMP_INIT, "[%s]ant_status{tx,rx}={0x%x, 0x%x}\n",137__func__, dm->tx_ant_status, dm->rx_ant_status);138}139140void phydm_config_ofdm_tx_path(void *dm_void, enum bb_path path)141{142#if (RTL8192E_SUPPORT || RTL8192F_SUPPORT || RTL8812A_SUPPORT)143struct dm_struct *dm = (struct dm_struct *)dm_void;144u8 ofdm_tx_path = 0x33;145146if (dm->num_rf_path == PDM_1SS)147return;148149switch (dm->support_ic_type) {150#if (RTL8192E_SUPPORT || RTL8192F_SUPPORT)151case ODM_RTL8192E:152case ODM_RTL8192F:153if (path == BB_PATH_A)154odm_set_bb_reg(dm, R_0x90c, MASKDWORD, 0x81121313);155else if (path == BB_PATH_B)156odm_set_bb_reg(dm, R_0x90c, MASKDWORD, 0x82221323);157else if (path == BB_PATH_AB)158odm_set_bb_reg(dm, R_0x90c, MASKDWORD, 0x83321333);159160break;161#endif162163#if (RTL8812A_SUPPORT)164case ODM_RTL8812:165if (path == BB_PATH_A)166ofdm_tx_path = 0x11;167else if (path == BB_PATH_B)168ofdm_tx_path = 0x22;169else if (path == BB_PATH_AB)170ofdm_tx_path = 0x33;171172odm_set_bb_reg(dm, R_0x80c, 0xff00, ofdm_tx_path);173174break;175#endif176177default:178break;179}180#endif181}182183void phydm_config_ofdm_rx_path(void *dm_void, enum bb_path path)184{185struct dm_struct *dm = (struct dm_struct *)dm_void;186u8 val = 0;187188if (dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8192F)) {189#if (RTL8192E_SUPPORT || RTL8192F_SUPPORT)190if (path == BB_PATH_A)191val = 1;192else if (path == BB_PATH_B)193val = 2;194else if (path == BB_PATH_AB)195val = 3;196197odm_set_bb_reg(dm, R_0xc04, 0xff, ((val << 4) | val));198odm_set_bb_reg(dm, R_0xd04, 0xf, val);199#endif200}201#if (RTL8812A_SUPPORT || RTL8822B_SUPPORT)202else if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8822B)) {203if (path == BB_PATH_A)204val = 1;205else if (path == BB_PATH_B)206val = 2;207else if (path == BB_PATH_AB)208val = 3;209210odm_set_bb_reg(dm, R_0x808, MASKBYTE0, ((val << 4) | val));211}212#endif213}214215void phydm_config_cck_rx_antenna_init(void *dm_void)216{217struct dm_struct *dm = (struct dm_struct *)dm_void;218219#if (defined(PHYDM_COMPILE_ABOVE_2SS))220if (dm->support_ic_type & ODM_IC_1SS)221return;222223/*@CCK 2R CCA parameters*/224odm_set_bb_reg(dm, R_0xa00, BIT(15), 0x0); /*@Disable Ant diversity*/225odm_set_bb_reg(dm, R_0xa70, BIT(7), 0); /*@Concurrent CCA at LSB & USB*/226odm_set_bb_reg(dm, R_0xa74, BIT(8), 0); /*RX path diversity enable*/227odm_set_bb_reg(dm, R_0xa14, BIT(7), 0); /*r_en_mrc_antsel*/228odm_set_bb_reg(dm, R_0xa20, (BIT(5) | BIT(4)), 1); /*@MBC weighting*/229230if (dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8197F | ODM_RTL8192F))231odm_set_bb_reg(dm, R_0xa08, BIT(28), 1); /*r_cck_2nd_sel_eco*/232else if (dm->support_ic_type & ODM_RTL8814A)233odm_set_bb_reg(dm, R_0xa84, BIT(28), 1); /*@2R CCA only*/234#endif235}236237void phydm_config_cck_rx_path(void *dm_void, enum bb_path path)238{239#if (defined(PHYDM_COMPILE_ABOVE_2SS))240struct dm_struct *dm = (struct dm_struct *)dm_void;241u8 path_div_select = 0;242u8 cck_path[2] = {0};243u8 en_2R_path = 0;244u8 en_2R_mrc = 0;245u8 i = 0, j = 0;246u8 num_enable_path = 0;247u8 cck_mrc_max_path = 2;248249if (dm->support_ic_type & ODM_IC_1SS)250return;251252for (i = 0; i < 4; i++) {253if (path & BIT(i)) { /*@ex: PHYDM_ABCD*/254num_enable_path++;255cck_path[j] = i;256j++;257}258if (num_enable_path >= cck_mrc_max_path)259break;260}261262if (num_enable_path > 1) {263path_div_select = 1;264en_2R_path = 1;265en_2R_mrc = 1;266} else {267path_div_select = 0;268en_2R_path = 0;269en_2R_mrc = 0;270}271/*@CCK_1 input signal path*/272odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), cck_path[0]);273/*@CCK_2 input signal path*/274odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), cck_path[1]);275/*@enable Rx path diversity*/276odm_set_bb_reg(dm, R_0xa74, BIT(8), path_div_select);277/*@enable 2R Rx path*/278odm_set_bb_reg(dm, R_0xa2c, BIT(18), en_2R_path);279/*@enable 2R MRC*/280odm_set_bb_reg(dm, R_0xa2c, BIT(22), en_2R_mrc);281if (dm->support_ic_type & (ODM_RTL8192F | ODM_RTL8197F)) {282if (path == BB_PATH_A) {283odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 0);284odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 0);285odm_set_bb_reg(dm, R_0xa74, BIT(8), 0);286odm_set_bb_reg(dm, R_0xa2c, (BIT(18) | BIT(17)), 0);287odm_set_bb_reg(dm, R_0xa2c, (BIT(22) | BIT(21)), 0);288} else if (path == BB_PATH_B) {/*@for DC cancellation*/289odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 1);290odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 1);291odm_set_bb_reg(dm, R_0xa74, BIT(8), 0);292odm_set_bb_reg(dm, R_0xa2c, (BIT(18) | BIT(17)), 0);293odm_set_bb_reg(dm, R_0xa2c, (BIT(22) | BIT(21)), 0);294} else if (path == BB_PATH_AB) {295odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 0);296odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 1);297odm_set_bb_reg(dm, R_0xa74, BIT(8), 1);298odm_set_bb_reg(dm, R_0xa2c, (BIT(18) | BIT(17)), 1);299odm_set_bb_reg(dm, R_0xa2c, (BIT(22) | BIT(21)), 1);300}301} else if (dm->support_ic_type & ODM_RTL8822B) {302if (path == BB_PATH_A) {303odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 0);304odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 0);305} else {306odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 1);307odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 1);308}309}310311#endif312}313314void phydm_config_cck_tx_path(void *dm_void, enum bb_path path)315{316#if (defined(PHYDM_COMPILE_ABOVE_2SS))317struct dm_struct *dm = (struct dm_struct *)dm_void;318319if (path == BB_PATH_A)320odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0x8);321else if (path == BB_PATH_B)322odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0x4);323else /*if (path == BB_PATH_AB)*/324odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0xc);325#endif326}327328void phydm_config_trx_path_v2(void *dm_void, char input[][16], u32 *_used,329char *output, u32 *_out_len)330{331#if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT ||\332RTL8822C_SUPPORT || RTL8814B_SUPPORT || RTL8197G_SUPPORT ||\333RTL8812F_SUPPORT)334struct dm_struct *dm = (struct dm_struct *)dm_void;335u32 used = *_used;336u32 out_len = *_out_len;337u32 val[10] = {0};338char help[] = "-h";339u8 i = 0, input_idx = 0;340enum bb_path tx_path, rx_path, tx_path_ctrl;341boolean dbg_mode_en;342343if (!(dm->support_ic_type &344(ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F | ODM_RTL8822C |345ODM_RTL8814B | ODM_RTL8812F | ODM_RTL8197G)))346return;347348for (i = 0; i < 5; i++) {349if (input[i + 1]) {350PHYDM_SSCANF(input[i + 1], DCMD_HEX, &val[i]);351input_idx++;352}353}354355if (input_idx == 0)356return;357358dbg_mode_en = (boolean)val[0];359tx_path = (enum bb_path)val[1];360rx_path = (enum bb_path)val[2];361tx_path_ctrl = (enum bb_path)val[3];362363if ((strcmp(input[1], help) == 0)) {364if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8822B |365ODM_RTL8192F)) {366PDM_SNPF(out_len, used, output + used, out_len - used,367"{en} {tx_path} {rx_path} {ff:auto, else:1ss_tx_path}\n"368);369} else {370PDM_SNPF(out_len, used, output + used, out_len - used,371"{en} {tx_path} {rx_path} {is_tx_2_path}\n");372}373374} else if (dbg_mode_en) {375dm->is_disable_phy_api = false;376phydm_api_trx_mode(dm, tx_path, rx_path, tx_path_ctrl);377dm->is_disable_phy_api = true;378PDM_SNPF(out_len, used, output + used, out_len - used,379"T/RX path = 0x%x/0x%x, tx_path_ctrl=%d\n",380tx_path, rx_path, tx_path_ctrl);381PDM_SNPF(out_len, used, output + used, out_len - used,382"T/RX path_en={0x%x, 0x%x}, tx_1ss=%d\n",383dm->tx_ant_status, dm->rx_ant_status,384dm->tx_1ss_status);385} else {386dm->is_disable_phy_api = false;387PDM_SNPF(out_len, used, output + used, out_len - used,388"Disable API debug mode\n");389}390#endif391}392393void phydm_config_trx_path_v1(void *dm_void, char input[][16], u32 *_used,394char *output, u32 *_out_len)395{396#if (RTL8192E_SUPPORT || RTL8812A_SUPPORT)397struct dm_struct *dm = (struct dm_struct *)dm_void;398u32 used = *_used;399u32 out_len = *_out_len;400u32 val[10] = {0};401char help[] = "-h";402u8 i = 0, input_idx = 0;403404if (!(dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8812)))405return;406407for (i = 0; i < 5; i++) {408if (input[i + 1]) {409PHYDM_SSCANF(input[i + 1], DCMD_HEX, &val[i]);410input_idx++;411}412}413414if (input_idx == 0)415return;416417if ((strcmp(input[1], help) == 0)) {418PDM_SNPF(out_len, used, output + used, out_len - used,419"{0:CCK, 1:OFDM} {1:TX, 2:RX} {1:path_A, 2:path_B, 3:path_AB}\n");420421*_used = used;422*_out_len = out_len;423return;424425} else if (val[0] == 0) {426/* @CCK */427if (val[1] == 1) { /*TX*/428if (val[2] == 1)429phydm_config_cck_tx_path(dm, BB_PATH_A);430else if (val[2] == 2)431phydm_config_cck_tx_path(dm, BB_PATH_B);432else if (val[2] == 3)433phydm_config_cck_tx_path(dm, BB_PATH_AB);434} else if (val[1] == 2) { /*RX*/435436phydm_config_cck_rx_antenna_init(dm);437438if (val[2] == 1)439phydm_config_cck_rx_path(dm, BB_PATH_A);440else if (val[2] == 2)441phydm_config_cck_rx_path(dm, BB_PATH_B);442else if (val[2] == 3)443phydm_config_cck_rx_path(dm, BB_PATH_AB);444}445}446/* OFDM */447else if (val[0] == 1) {448if (val[1] == 1) /*TX*/449phydm_config_ofdm_tx_path(dm, val[2]);450else if (val[1] == 2) /*RX*/451phydm_config_ofdm_rx_path(dm, val[2]);452}453454PDM_SNPF(out_len, used, output + used, out_len - used,455"PHYDM Set path [%s] [%s] = [%s%s%s%s]\n",456(val[0] == 1) ? "OFDM" : "CCK",457(val[1] == 1) ? "TX" : "RX",458(val[2] & 0x1) ? "A" : "", (val[2] & 0x2) ? "B" : "",459(val[2] & 0x4) ? "C" : "",460(val[2] & 0x8) ? "D" : "");461462*_used = used;463*_out_len = out_len;464#endif465}466467void phydm_config_trx_path(void *dm_void, char input[][16], u32 *_used,468char *output, u32 *_out_len)469{470struct dm_struct *dm = (struct dm_struct *)dm_void;471472if (dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8812)) {473#if (RTL8192E_SUPPORT || RTL8812A_SUPPORT)474phydm_config_trx_path_v1(dm, input, _used, output, _out_len);475#endif476} else if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8197F |477ODM_RTL8192F | ODM_RTL8822C | ODM_RTL8812F |478ODM_RTL8197G | ODM_RTL8814B)) {479#if (RTL8822B_SUPPORT || RTL8197F_SUPPORT ||\480RTL8192F_SUPPORT || RTL8822C_SUPPORT ||\481RTL8814B_SUPPORT || RTL8812F_SUPPORT ||\482RTL8197G_SUPPORT)483phydm_config_trx_path_v2(dm, input, _used, output, _out_len);484#endif485}486}487488void phydm_tx_2path(void *dm_void)489{490#if (defined(PHYDM_COMPILE_IC_2SS))491struct dm_struct *dm = (struct dm_struct *)dm_void;492enum bb_path rx_path = (enum bb_path)dm->rx_ant_status;493494PHYDM_DBG(dm, ODM_COMP_API, "%s ======>\n", __func__);495496497if (!(dm->support_ic_type & ODM_IC_2SS))498return;499500#if (RTL8822B_SUPPORT || RTL8192F_SUPPORT || RTL8197F_SUPPORT ||\501RTL8822C_SUPPORT || RTL8812F_SUPPORT || RTL8197G_SUPPORT)502if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F |503ODM_RTL8822C | ODM_RTL8812F | ODM_RTL8197G))504phydm_api_trx_mode(dm, BB_PATH_AB, rx_path, BB_PATH_AB);505#endif506507#if (RTL8812A_SUPPORT || RTL8192E_SUPPORT)508if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8192E)) {509phydm_config_cck_tx_path(dm, BB_PATH_AB);510phydm_config_ofdm_tx_path(dm, BB_PATH_AB);511}512#endif513#endif514}515516void phydm_stop_3_wire(void *dm_void, u8 set_type)517{518struct dm_struct *dm = (struct dm_struct *)dm_void;519520if (set_type == PHYDM_SET) {521/*@[Stop 3-wires]*/522if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {523odm_set_bb_reg(dm, R_0x180c, 0x3, 0x0);524odm_set_bb_reg(dm, R_0x180c, BIT(28), 0x1);525526#if (defined(PHYDM_COMPILE_ABOVE_2SS))527if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS) {528odm_set_bb_reg(dm, R_0x410c, 0x3, 0x0);529odm_set_bb_reg(dm, R_0x410c, BIT(28), 0x1);530}531#endif532533#if (defined(PHYDM_COMPILE_ABOVE_4SS))534if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {535odm_set_bb_reg(dm, R_0x520c, 0x3, 0x0);536odm_set_bb_reg(dm, R_0x520c, BIT(28), 0x1);537odm_set_bb_reg(dm, R_0x530c, 0x3, 0x0);538odm_set_bb_reg(dm, R_0x530c, BIT(28), 0x1);539}540#endif541} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {542odm_set_bb_reg(dm, R_0xc00, 0xf, 0x4);543odm_set_bb_reg(dm, R_0xe00, 0xf, 0x4);544} else {545odm_set_bb_reg(dm, R_0x88c, 0xf00000, 0xf);546}547548} else { /*@if (set_type == PHYDM_REVERT)*/549550/*@[Start 3-wires]*/551if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {552odm_set_bb_reg(dm, R_0x180c, 0x3, 0x3);553odm_set_bb_reg(dm, R_0x180c, BIT(28), 0x1);554555#if (defined(PHYDM_COMPILE_ABOVE_2SS))556if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS) {557odm_set_bb_reg(dm, R_0x410c, 0x3, 0x3);558odm_set_bb_reg(dm, R_0x410c, BIT(28), 0x1);559}560#endif561562#if (defined(PHYDM_COMPILE_ABOVE_4SS))563if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {564odm_set_bb_reg(dm, R_0x520c, 0x3, 0x3);565odm_set_bb_reg(dm, R_0x520c, BIT(28), 0x1);566odm_set_bb_reg(dm, R_0x530c, 0x3, 0x3);567odm_set_bb_reg(dm, R_0x530c, BIT(28), 0x1);568}569#endif570} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {571odm_set_bb_reg(dm, R_0xc00, 0xf, 0x7);572odm_set_bb_reg(dm, R_0xe00, 0xf, 0x7);573} else {574odm_set_bb_reg(dm, R_0x88c, 0xf00000, 0x0);575}576}577}578579u8 phydm_stop_ic_trx(void *dm_void, u8 set_type)580{581struct dm_struct *dm = (struct dm_struct *)dm_void;582struct phydm_api_stuc *api = &dm->api_table;583u32 i = 0;584u8 trx_idle_success = false;585u32 dbg_port_value = 0;586587if (set_type == PHYDM_SET) {588/*@[Stop TRX]---------------------------------------------------------*/589/*set debug port to 0x0*/590if (!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3, 0x0))591return PHYDM_SET_FAIL;592593for (i = 0; i < 100; i++) {594dbg_port_value = phydm_get_bb_dbg_port_val(dm);595596if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {597/* BB idle */598if ((dbg_port_value & 0x1FFEFF3F) == 0 &&599(dbg_port_value & 0xC0010000) ==6000xC0010000) {601PHYDM_DBG(dm, ODM_COMP_API,602"Stop trx wait for (%d) times\n",603i);604605trx_idle_success = true;606break;607}608} else {609/* PHYTXON && CCA_all */610if (dm->support_ic_type & (ODM_RTL8721D |611ODM_RTL8710C)) {612if ((dbg_port_value &613(BIT(20) | BIT(15))) == 0) {614PHYDM_DBG(dm, ODM_COMP_API,615"Stop trx wait for (%d) times\n",616i);617618trx_idle_success = true;619break;620}621} else {622if ((dbg_port_value &623(BIT(17) | BIT(3))) == 0) {624PHYDM_DBG(dm, ODM_COMP_API,625"Stop trx wait for (%d) times\n",626i);627628trx_idle_success = true;629break;630}631}632}633ODM_delay_ms(1);634}635phydm_release_bb_dbg_port(dm);636637if (trx_idle_success) {638api->tx_queue_bitmap = odm_read_1byte(dm, R_0x522);639640/*pause all TX queue*/641odm_set_mac_reg(dm, R_0x520, 0xff0000, 0xff);642643if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {644/*@disable OFDM RX CCA*/645odm_set_bb_reg(dm, R_0x1c68, BIT(24), 1);646} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {647/*@disable OFDM RX CCA*/648odm_set_bb_reg(dm, R_0x838, BIT(1), 1);649} else {650api->rxiqc_reg1 = odm_read_4byte(dm, R_0xc14);651api->rxiqc_reg2 = odm_read_4byte(dm, R_0xc1c);652/* @[ Set IQK Matrix = 0 ]653* equivalent to [ Turn off CCA]654*/655odm_set_bb_reg(dm, R_0xc14, MASKDWORD, 0x0);656odm_set_bb_reg(dm, R_0xc1c, MASKDWORD, 0x0);657}658phydm_dis_cck_trx(dm, PHYDM_SET);659} else {660return PHYDM_SET_FAIL;661}662663return PHYDM_SET_SUCCESS;664665} else { /*@if (set_type == PHYDM_REVERT)*/666/*Release all TX queue*/667odm_write_1byte(dm, R_0x522, api->tx_queue_bitmap);668669if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {670/*@enable OFDM RX CCA*/671odm_set_bb_reg(dm, R_0x1c68, BIT(24), 0);672} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {673/*@enable OFDM RX CCA*/674odm_set_bb_reg(dm, R_0x838, BIT(1), 0);675} else {676/* @[Set IQK Matrix = 0] equivalent to [ Turn off CCA]*/677odm_write_4byte(dm, R_0xc14, api->rxiqc_reg1);678odm_write_4byte(dm, R_0xc1c, api->rxiqc_reg2);679}680phydm_dis_cck_trx(dm, PHYDM_REVERT);681return PHYDM_SET_SUCCESS;682}683}684685void phydm_dis_cck_trx(void *dm_void, u8 set_type)686{687struct dm_struct *dm = (struct dm_struct *)dm_void;688struct phydm_api_stuc *api = &dm->api_table;689690if (set_type == PHYDM_SET) {691if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {692api->ccktx_path = (u8)odm_get_bb_reg(dm, R_0x1a04,6930xf0000000);694/* @CCK RxIQ weighting = [0,0] */695odm_set_bb_reg(dm, R_0x1a14, 0x300, 0x3);696/* @disable CCK Tx */697odm_set_bb_reg(dm, R_0x1a04, 0xf0000000, 0x0);698} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {699api->ccktx_path = (u8)odm_get_bb_reg(dm, R_0xa04,7000xf0000000);701/* @disable CCK block */702odm_set_bb_reg(dm, R_0x808, BIT(28), 0);703/* @disable CCK Tx */704odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0x0);705} else {706api->ccktx_path = (u8)odm_get_bb_reg(dm, R_0xa04,7070xf0000000);708/* @disable whole CCK block */709odm_set_bb_reg(dm, R_0x800, BIT(24), 0);710/* @disable CCK Tx */711odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0x0);712}713} else if (set_type == PHYDM_REVERT) {714if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {715/* @CCK RxIQ weighting = [1,1] */716odm_set_bb_reg(dm, R_0x1a14, 0x300, 0x0);717/* @enable CCK Tx */718odm_set_bb_reg(dm, R_0x1a04, 0xf0000000,719api->ccktx_path);720} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {721/* @enable CCK block */722odm_set_bb_reg(dm, R_0x808, BIT(28), 1);723/* @enable CCK Tx */724odm_set_bb_reg(dm, R_0xa04, 0xf0000000,725api->ccktx_path);726} else {727/* @enable whole CCK block */728odm_set_bb_reg(dm, R_0x800, BIT(24), 1);729/* @enable CCK Tx */730odm_set_bb_reg(dm, R_0xa04, 0xf0000000,731api->ccktx_path);732}733}734}735void phydm_set_ext_switch(void *dm_void, u32 ext_ant_switch)736{737#if (RTL8821A_SUPPORT || RTL8881A_SUPPORT)738struct dm_struct *dm = (struct dm_struct *)dm_void;739740if (!(dm->support_ic_type & (ODM_RTL8821 | ODM_RTL8881A)))741return;742743/*Output Pin Settings*/744745/*select DPDT_P and DPDT_N as output pin*/746odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);747748/*@by WLAN control*/749odm_set_mac_reg(dm, R_0x4c, BIT(24), 1);750751/*@DPDT_N = 1b'0*/ /*@DPDT_P = 1b'0*/752odm_set_bb_reg(dm, R_0xcb4, 0xFF, 77);753754if (ext_ant_switch == 1) { /*@2b'01*/755odm_set_bb_reg(dm, R_0xcb4, (BIT(29) | BIT(28)), 1);756PHYDM_DBG(dm, ODM_COMP_API, "8821A ant swh=2b'01\n");757} else if (ext_ant_switch == 2) { /*@2b'10*/758odm_set_bb_reg(dm, R_0xcb4, BIT(29) | BIT(28), 2);759PHYDM_DBG(dm, ODM_COMP_API, "*8821A ant swh=2b'10\n");760}761#endif762}763764void phydm_csi_mask_enable(void *dm_void, u32 enable)765{766struct dm_struct *dm = (struct dm_struct *)dm_void;767boolean en = false;768769en = (enable == FUNC_ENABLE) ? true : false;770771if (dm->support_ic_type & ODM_IC_11N_SERIES) {772odm_set_bb_reg(dm, R_0xd2c, BIT(28), en);773PHYDM_DBG(dm, ODM_COMP_API,774"Enable CSI Mask: Reg 0xD2C[28] = ((0x%x))\n", en);775#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT776} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {777odm_set_bb_reg(dm, R_0xc0c, BIT(3), en);778PHYDM_DBG(dm, ODM_COMP_API,779"Enable CSI Mask: Reg 0xc0c[3] = ((0x%x))\n", en);780#endif781} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {782odm_set_bb_reg(dm, R_0x874, BIT(0), en);783PHYDM_DBG(dm, ODM_COMP_API,784"Enable CSI Mask: Reg 0x874[0] = ((0x%x))\n", en);785}786}787788void phydm_clean_all_csi_mask(void *dm_void)789{790struct dm_struct *dm = (struct dm_struct *)dm_void;791792if (dm->support_ic_type & ODM_IC_11N_SERIES) {793odm_set_bb_reg(dm, R_0xd40, MASKDWORD, 0);794odm_set_bb_reg(dm, R_0xd44, MASKDWORD, 0);795odm_set_bb_reg(dm, R_0xd48, MASKDWORD, 0);796odm_set_bb_reg(dm, R_0xd4c, MASKDWORD, 0);797#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT798} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {799u8 i = 0, idx_lmt = 0;800801if (dm->support_ic_type &802(ODM_RTL8822C | ODM_RTL8812F | ODM_RTL8197G))803idx_lmt = 127;804else /*@for IC supporting 80 + 80*/805idx_lmt = 255;806807odm_set_bb_reg(dm, R_0x1ee8, 0x3, 0x3);808odm_set_bb_reg(dm, R_0x1d94, BIT(31) | BIT(30), 0x1);809for (i = 0; i < idx_lmt; i++) {810odm_set_bb_reg(dm, R_0x1d94, MASKBYTE2, i);811odm_set_bb_reg(dm, R_0x1d94, MASKBYTE0, 0x0);812}813odm_set_bb_reg(dm, R_0x1ee8, 0x3, 0x0);814#endif815} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {816odm_set_bb_reg(dm, R_0x880, MASKDWORD, 0);817odm_set_bb_reg(dm, R_0x884, MASKDWORD, 0);818odm_set_bb_reg(dm, R_0x888, MASKDWORD, 0);819odm_set_bb_reg(dm, R_0x88c, MASKDWORD, 0);820odm_set_bb_reg(dm, R_0x890, MASKDWORD, 0);821odm_set_bb_reg(dm, R_0x894, MASKDWORD, 0);822odm_set_bb_reg(dm, R_0x898, MASKDWORD, 0);823odm_set_bb_reg(dm, R_0x89c, MASKDWORD, 0);824}825}826827void phydm_set_csi_mask(void *dm_void, u32 tone_idx_tmp, u8 tone_direction)828{829struct dm_struct *dm = (struct dm_struct *)dm_void;830u8 byte_offset = 0, bit_offset = 0;831u32 target_reg = 0;832u8 reg_tmp_value = 0;833u32 tone_num = 64;834u32 tone_num_shift = 0;835u32 csi_mask_reg_p = 0, csi_mask_reg_n = 0;836837/* @calculate real tone idx*/838if ((tone_idx_tmp % 10) >= 5)839tone_idx_tmp += 10;840841tone_idx_tmp = (tone_idx_tmp / 10);842843if (dm->support_ic_type & ODM_IC_11N_SERIES) {844tone_num = 64;845csi_mask_reg_p = 0xD40;846csi_mask_reg_n = 0xD48;847848} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {849tone_num = 128;850csi_mask_reg_p = 0x880;851csi_mask_reg_n = 0x890;852}853854if (tone_direction == FREQ_POSITIVE) {855if (tone_idx_tmp >= (tone_num - 1))856tone_idx_tmp = (tone_num - 1);857858byte_offset = (u8)(tone_idx_tmp >> 3);859bit_offset = (u8)(tone_idx_tmp & 0x7);860target_reg = csi_mask_reg_p + byte_offset;861862} else {863tone_num_shift = tone_num;864865if (tone_idx_tmp >= tone_num)866tone_idx_tmp = tone_num;867868tone_idx_tmp = tone_num - tone_idx_tmp;869870byte_offset = (u8)(tone_idx_tmp >> 3);871bit_offset = (u8)(tone_idx_tmp & 0x7);872target_reg = csi_mask_reg_n + byte_offset;873}874875reg_tmp_value = odm_read_1byte(dm, target_reg);876PHYDM_DBG(dm, ODM_COMP_API,877"Pre Mask tone idx[%d]: Reg0x%x = ((0x%x))\n",878(tone_idx_tmp + tone_num_shift), target_reg, reg_tmp_value);879reg_tmp_value |= BIT(bit_offset);880odm_write_1byte(dm, target_reg, reg_tmp_value);881PHYDM_DBG(dm, ODM_COMP_API,882"New Mask tone idx[%d]: Reg0x%x = ((0x%x))\n",883(tone_idx_tmp + tone_num_shift), target_reg, reg_tmp_value);884}885886void phydm_set_nbi_reg(void *dm_void, u32 tone_idx_tmp, u32 bw)887{888struct dm_struct *dm = (struct dm_struct *)dm_void;889/*tone_idx X 10*/890u32 nbi_128[NBI_128TONE] = {25, 55, 85, 115, 135,891155, 185, 205, 225, 245,892265, 285, 305, 335, 355,893375, 395, 415, 435, 455,894485, 505, 525, 555, 585, 615, 635};895/*tone_idx X 10*/896u32 nbi_256[NBI_256TONE] = {25, 55, 85, 115, 135,897155, 175, 195, 225, 245,898265, 285, 305, 325, 345,899365, 385, 405, 425, 445,900465, 485, 505, 525, 545,901565, 585, 605, 625, 645,902665, 695, 715, 735, 755,903775, 795, 815, 835, 855,904875, 895, 915, 935, 955,905975, 995, 1015, 1035, 1055,9061085, 1105, 1125, 1145, 1175,9071195, 1225, 1255, 1275};908u32 reg_idx = 0;909u32 i;910u8 nbi_table_idx = FFT_128_TYPE;911912if (dm->support_ic_type & ODM_IC_11N_SERIES) {913nbi_table_idx = FFT_128_TYPE;914} else if (dm->support_ic_type & ODM_IC_11AC_1_SERIES) {915nbi_table_idx = FFT_256_TYPE;916} else if (dm->support_ic_type & ODM_IC_11AC_2_SERIES) {917if (bw == 80)918nbi_table_idx = FFT_256_TYPE;919else /*@20M, 40M*/920nbi_table_idx = FFT_128_TYPE;921}922923if (nbi_table_idx == FFT_128_TYPE) {924for (i = 0; i < NBI_128TONE; i++) {925if (tone_idx_tmp < nbi_128[i]) {926reg_idx = i + 1;927break;928}929}930931} else if (nbi_table_idx == FFT_256_TYPE) {932for (i = 0; i < NBI_256TONE; i++) {933if (tone_idx_tmp < nbi_256[i]) {934reg_idx = i + 1;935break;936}937}938}939940if (dm->support_ic_type & ODM_IC_11N_SERIES) {941odm_set_bb_reg(dm, R_0xc40, 0x1f000000, reg_idx);942PHYDM_DBG(dm, ODM_COMP_API,943"Set tone idx: Reg0xC40[28:24] = ((0x%x))\n",944reg_idx);945} else {946odm_set_bb_reg(dm, R_0x87c, 0xfc000, reg_idx);947PHYDM_DBG(dm, ODM_COMP_API,948"Set tone idx: Reg0x87C[19:14] = ((0x%x))\n",949reg_idx);950}951}952953void phydm_nbi_enable(void *dm_void, u32 enable)954{955struct dm_struct *dm = (struct dm_struct *)dm_void;956u32 val = 0;957958val = (enable == FUNC_ENABLE) ? 1 : 0;959960PHYDM_DBG(dm, ODM_COMP_API, "Enable NBI=%d\n", val);961962if (dm->support_ic_type & ODM_IC_11N_SERIES) {963if (dm->support_ic_type & (ODM_RTL8192F | ODM_RTL8197F)) {964val = (enable == FUNC_ENABLE) ? 0xf : 0;965odm_set_bb_reg(dm, R_0xc50, 0xf000000, val);966} else {967odm_set_bb_reg(dm, R_0xc40, BIT(9), val);968}969} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {970if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8821C)) {971odm_set_bb_reg(dm, R_0x87c, BIT(13), val);972odm_set_bb_reg(dm, R_0xc20, BIT(28), val);973if (dm->rf_type > RF_1T1R)974odm_set_bb_reg(dm, R_0xe20, BIT(28), val);975} else {976odm_set_bb_reg(dm, R_0x87c, BIT(13), val);977}978}979}980981u8 phydm_find_fc(void *dm_void, u32 channel, u32 bw, u32 second_ch, u32 *fc_in)982{983struct dm_struct *dm = (struct dm_struct *)dm_void;984u32 fc = *fc_in;985u32 start_ch_per_40m[NUM_START_CH_40M] = {36, 44, 52, 60, 100,986108, 116, 124, 132, 140,987149, 157, 165, 173};988u32 start_ch_per_80m[NUM_START_CH_80M] = {36, 52, 100, 116, 132,989149, 165};990u32 *start_ch = &start_ch_per_40m[0];991u32 num_start_channel = NUM_START_CH_40M;992u32 channel_offset = 0;993u32 i;994995/*@2.4G*/996if (channel <= 14 && channel > 0) {997if (bw == 80)998return PHYDM_SET_FAIL;9991000fc = 2412 + (channel - 1) * 5;10011002if (bw == 40 && second_ch == PHYDM_ABOVE) {1003if (channel >= 10) {1004PHYDM_DBG(dm, ODM_COMP_API,1005"CH = ((%d)), Scnd_CH = ((%d)) Error setting\n",1006channel, second_ch);1007return PHYDM_SET_FAIL;1008}1009fc += 10;1010} else if (bw == 40 && (second_ch == PHYDM_BELOW)) {1011if (channel <= 2) {1012PHYDM_DBG(dm, ODM_COMP_API,1013"CH = ((%d)), Scnd_CH = ((%d)) Error setting\n",1014channel, second_ch);1015return PHYDM_SET_FAIL;1016}1017fc -= 10;1018}1019}1020/*@5G*/1021else if (channel >= 36 && channel <= 177) {1022if (bw != 20) {1023if (bw == 40) {1024num_start_channel = NUM_START_CH_40M;1025start_ch = &start_ch_per_40m[0];1026channel_offset = CH_OFFSET_40M;1027} else if (bw == 80) {1028num_start_channel = NUM_START_CH_80M;1029start_ch = &start_ch_per_80m[0];1030channel_offset = CH_OFFSET_80M;1031}10321033for (i = 0; i < (num_start_channel - 1); i++) {1034if (channel < start_ch[i + 1]) {1035channel = start_ch[i] + channel_offset;1036break;1037}1038}1039PHYDM_DBG(dm, ODM_COMP_API, "Mod_CH = ((%d))\n",1040channel);1041}10421043fc = 5180 + (channel - 36) * 5;10441045} else {1046PHYDM_DBG(dm, ODM_COMP_API, "CH = ((%d)) Error setting\n",1047channel);1048return PHYDM_SET_FAIL;1049}10501051*fc_in = fc;10521053return PHYDM_SET_SUCCESS;1054}10551056u8 phydm_find_intf_distance(void *dm_void, u32 bw, u32 fc, u32 f_interference,1057u32 *tone_idx_tmp_in)1058{1059struct dm_struct *dm = (struct dm_struct *)dm_void;1060u32 bw_up = 0, bw_low = 0;1061u32 int_distance = 0;1062u32 tone_idx_tmp = 0;1063u8 set_result = PHYDM_SET_NO_NEED;10641065bw_up = fc + bw / 2;1066bw_low = fc - bw / 2;10671068PHYDM_DBG(dm, ODM_COMP_API,1069"[f_l, fc, fh] = [ %d, %d, %d ], f_int = ((%d))\n", bw_low,1070fc, bw_up, f_interference);10711072if (f_interference >= bw_low && f_interference <= bw_up) {1073int_distance = DIFF_2(fc, f_interference);1074/*@10*(int_distance /0.3125)*/1075tone_idx_tmp = (int_distance << 5);1076PHYDM_DBG(dm, ODM_COMP_API,1077"int_distance = ((%d MHz)) Mhz, tone_idx_tmp = ((%d.%d))\n",1078int_distance, tone_idx_tmp / 10,1079tone_idx_tmp % 10);1080*tone_idx_tmp_in = tone_idx_tmp;1081set_result = PHYDM_SET_SUCCESS;1082}10831084return set_result;1085}10861087u8 phydm_csi_mask_setting(void *dm_void, u32 enable, u32 ch, u32 bw,1088u32 f_intf, u32 sec_ch)1089{1090struct dm_struct *dm = (struct dm_struct *)dm_void;1091u32 fc = 2412;1092u8 direction = FREQ_POSITIVE;1093u32 tone_idx = 0;1094u8 set_result = PHYDM_SET_SUCCESS;1095u8 rpt = 0;10961097if (enable == FUNC_DISABLE) {1098set_result = PHYDM_SET_SUCCESS;1099phydm_clean_all_csi_mask(dm);11001101} else {1102PHYDM_DBG(dm, ODM_COMP_API,1103"[Set CSI MASK_] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",1104ch, bw, f_intf,1105(((bw == 20) || (ch > 14)) ? "Don't care" :1106(sec_ch == PHYDM_ABOVE) ? "H" : "L"));11071108/*@calculate fc*/1109if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {1110set_result = PHYDM_SET_FAIL;1111} else {1112/*@calculate interference distance*/1113rpt = phydm_find_intf_distance(dm, bw, fc, f_intf,1114&tone_idx);1115if (rpt == PHYDM_SET_SUCCESS) {1116if (f_intf >= fc)1117direction = FREQ_POSITIVE;1118else1119direction = FREQ_NEGATIVE;11201121phydm_set_csi_mask(dm, tone_idx, direction);1122set_result = PHYDM_SET_SUCCESS;1123} else {1124set_result = PHYDM_SET_NO_NEED;1125}1126}1127}11281129if (set_result == PHYDM_SET_SUCCESS)1130phydm_csi_mask_enable(dm, enable);1131else1132phydm_csi_mask_enable(dm, FUNC_DISABLE);11331134return set_result;1135}11361137#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1138u8 phydm_find_intf_distance_jgr3(void *dm_void, u32 bw, u32 fc,1139u32 f_interference, u32 *tone_idx_tmp_in)1140{1141struct dm_struct *dm = (struct dm_struct *)dm_void;1142u32 bw_up = 0, bw_low = 0;1143u32 int_distance = 0;1144u32 tone_idx_tmp = 0;1145u8 set_result = PHYDM_SET_NO_NEED;11461147bw_up = 1000 * (fc + bw / 2);1148bw_low = 1000 * (fc - bw / 2);1149fc = 1000 * fc;11501151PHYDM_DBG(dm, ODM_COMP_API,1152"[f_l, fc, fh] = [ %d, %d, %d ], f_int = ((%d))\n", bw_low,1153fc, bw_up, f_interference);11541155if (f_interference >= bw_low && f_interference <= bw_up) {1156int_distance = DIFF_2(fc, f_interference);1157/*@10*(int_distance /0.3125)*/1158tone_idx_tmp = ((int_distance + 156) / 312);1159PHYDM_DBG(dm, ODM_COMP_API,1160"int_distance = ((%d)) , tone_idx_tmp = ((%d))\n",1161int_distance, tone_idx_tmp);1162*tone_idx_tmp_in = tone_idx_tmp;1163set_result = PHYDM_SET_SUCCESS;1164}11651166return set_result;1167}1168u8 phydm_csi_mask_setting_jgr3(void *dm_void, u32 enable, u32 ch, u32 bw,1169u32 f_intf, u32 sec_ch, u8 wgt)1170{1171struct dm_struct *dm = (struct dm_struct *)dm_void;1172u32 fc = 2412;1173u8 direction = FREQ_POSITIVE;1174u32 tone_idx = 0;1175u8 set_result = PHYDM_SET_SUCCESS;1176u8 rpt = 0;11771178if (enable == FUNC_DISABLE) {1179phydm_csi_mask_enable(dm, FUNC_ENABLE);1180phydm_clean_all_csi_mask(dm);1181phydm_csi_mask_enable(dm, FUNC_DISABLE);1182set_result = PHYDM_SET_SUCCESS;1183} else {1184PHYDM_DBG(dm, ODM_COMP_API,1185"[Set CSI MASK] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s)), wgt = ((%d))\n",1186ch, bw, f_intf,1187(((bw == 20) || (ch > 14)) ? "Don't care" :1188(sec_ch == PHYDM_ABOVE) ? "H" : "L"), wgt);11891190/*@calculate fc*/1191if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {1192set_result = PHYDM_SET_FAIL;1193} else {1194/*@calculate interference distance*/1195rpt = phydm_find_intf_distance_jgr3(dm, bw, fc, f_intf,1196&tone_idx);1197if (rpt == PHYDM_SET_SUCCESS) {1198if (f_intf >= 1000 * fc)1199direction = FREQ_POSITIVE;1200else1201direction = FREQ_NEGATIVE;12021203phydm_csi_mask_enable(dm, FUNC_ENABLE);1204phydm_set_csi_mask_jgr3(dm, tone_idx, direction,1205wgt);1206set_result = PHYDM_SET_SUCCESS;1207} else {1208set_result = PHYDM_SET_NO_NEED;1209}1210}1211if (!(set_result == PHYDM_SET_SUCCESS))1212phydm_csi_mask_enable(dm, FUNC_DISABLE);1213}12141215return set_result;1216}12171218void phydm_set_csi_mask_jgr3(void *dm_void, u32 tone_idx_tmp, u8 tone_direction,1219u8 wgt)1220{1221struct dm_struct *dm = (struct dm_struct *)dm_void;1222u32 reg_tmp_value = 0;1223u32 tone_num = 64;1224u32 table_addr = 0;1225u32 addr = 0;1226u8 rf_bw = 0;1227u8 value = 0;12281229rf_bw = odm_read_1byte(dm, R_0x9b0);1230if (((rf_bw & 0xc) >> 2) == 0x2)1231tone_num = 128; /* @RF80 : tone(-1) at tone_idx=255 */1232else1233tone_num = 64; /* @RF20/40 : tone(-1) at tone_idx=127 */12341235if (tone_direction == FREQ_POSITIVE) {1236if (tone_idx_tmp >= (tone_num - 1))1237tone_idx_tmp = (tone_num - 1);1238} else {1239if (tone_idx_tmp >= tone_num)1240tone_idx_tmp = tone_num;12411242tone_idx_tmp = (tone_num << 1) - tone_idx_tmp;1243}1244table_addr = tone_idx_tmp >> 1;12451246reg_tmp_value = odm_read_4byte(dm, R_0x1d94);1247PHYDM_DBG(dm, ODM_COMP_API,1248"Pre Mask tone idx[%d]: Reg0x1d94 = ((0x%x))\n",1249tone_idx_tmp, reg_tmp_value);1250odm_set_bb_reg(dm, R_0x1ee8, 0x3, 0x3);1251odm_set_bb_reg(dm, R_0x1d94, BIT(31) | BIT(30), 0x1);1252odm_set_bb_reg(dm, R_0x1d94, MASKBYTE2, (table_addr & 0xff));1253if (tone_idx_tmp % 2)1254value = (BIT(3) | (wgt & 0x7)) << 4;1255else1256value = BIT(3) | (wgt & 0x7);12571258odm_set_bb_reg(dm, R_0x1d94, 0xff, value);1259reg_tmp_value = odm_read_4byte(dm, R_0x1d94);1260PHYDM_DBG(dm, ODM_COMP_API,1261"New Mask tone idx[%d]: Reg0x1d94 = ((0x%x))\n",1262tone_idx_tmp, reg_tmp_value);1263odm_set_bb_reg(dm, R_0x1ee8, 0x3, 0x0);1264}12651266void phydm_nbi_reset_jgr3(void *dm_void)1267{1268struct dm_struct *dm = (struct dm_struct *)dm_void;12691270odm_set_bb_reg(dm, R_0x818, BIT(3), 1);1271odm_set_bb_reg(dm, R_0x1d3c, 0x78000000, 0);1272odm_set_bb_reg(dm, R_0x818, BIT(3), 0);1273odm_set_bb_reg(dm, R_0x818, BIT(11), 0);1274#if RTL8814B_SUPPORT1275if (dm->support_ic_type & ODM_RTL8814B) {1276odm_set_bb_reg(dm, R_0x1944, 0x300, 0x3);1277odm_set_bb_reg(dm, R_0x4044, 0x300, 0x3);1278odm_set_bb_reg(dm, R_0x5044, 0x300, 0x3);1279odm_set_bb_reg(dm, R_0x5144, 0x300, 0x3);1280odm_set_bb_reg(dm, R_0x810, 0xf, 0x0);1281odm_set_bb_reg(dm, R_0x810, 0xf0000, 0x0);1282odm_set_bb_reg(dm, R_0xc24, MASKDWORD, 0x406000ff);1283}1284#endif1285}12861287u8 phydm_nbi_setting_jgr3(void *dm_void, u32 enable, u32 ch, u32 bw, u32 f_intf,1288u32 sec_ch, u8 path)1289{1290struct dm_struct *dm = (struct dm_struct *)dm_void;1291u32 fc = 2412;1292u8 direction = FREQ_POSITIVE;1293u32 tone_idx = 0;1294u8 set_result = PHYDM_SET_SUCCESS;1295u8 rpt = 0;12961297if (enable == FUNC_DISABLE) {1298phydm_nbi_reset_jgr3(dm);1299set_result = PHYDM_SET_SUCCESS;1300} else {1301PHYDM_DBG(dm, ODM_COMP_API,1302"[Set NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",1303ch, bw, f_intf,1304(((sec_ch == PHYDM_DONT_CARE) || (bw == 20) ||1305(ch > 14)) ? "Don't care" :1306(sec_ch == PHYDM_ABOVE) ? "H" : "L"));13071308/*@calculate fc*/1309if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {1310set_result = PHYDM_SET_FAIL;1311} else {1312/*@calculate interference distance*/1313rpt = phydm_find_intf_distance_jgr3(dm, bw, fc, f_intf,1314&tone_idx);1315if (rpt == PHYDM_SET_SUCCESS) {1316if (f_intf >= 1000 * fc)1317direction = FREQ_POSITIVE;1318else1319direction = FREQ_NEGATIVE;13201321phydm_set_nbi_reg_jgr3(dm, tone_idx, direction,1322path);1323set_result = PHYDM_SET_SUCCESS;1324} else {1325set_result = PHYDM_SET_NO_NEED;1326}1327}1328}13291330if (set_result == PHYDM_SET_SUCCESS)1331phydm_nbi_enable_jgr3(dm, enable, path);1332else1333phydm_nbi_enable_jgr3(dm, FUNC_DISABLE, path);13341335return set_result;1336}13371338void phydm_set_nbi_reg_jgr3(void *dm_void, u32 tone_idx_tmp, u8 tone_direction,1339u8 path)1340{1341struct dm_struct *dm = (struct dm_struct *)dm_void;1342u32 reg_tmp_value = 0;1343u32 tone_num = 64;1344u32 addr = 0;1345u8 rf_bw = 0;13461347rf_bw = odm_read_1byte(dm, R_0x9b0);1348if (((rf_bw & 0xc) >> 2) == 0x2)1349tone_num = 128; /* RF80 : tone-1 at tone_idx=255 */1350else1351tone_num = 64; /* RF20/40 : tone-1 at tone_idx=127 */13521353if (tone_direction == FREQ_POSITIVE) {1354if (tone_idx_tmp >= (tone_num - 1))1355tone_idx_tmp = (tone_num - 1);1356} else {1357if (tone_idx_tmp >= tone_num)1358tone_idx_tmp = tone_num;13591360tone_idx_tmp = (tone_num << 1) - tone_idx_tmp;1361}1362/*Mark the tone idx for Packet detection*/1363#if RTL8814B_SUPPORT1364if (dm->support_ic_type & ODM_RTL8814B) {1365odm_set_bb_reg(dm, R_0xc24, 0xff, 0xff);1366odm_set_bb_reg(dm, R_0xc24, 0xff00, tone_idx_tmp);1367}1368#endif1369switch (path) {1370case RF_PATH_A:1371odm_set_bb_reg(dm, R_0x1944, 0x001FF000, tone_idx_tmp);1372PHYDM_DBG(dm, ODM_COMP_API,1373"Set tone idx[%d]:PATH-A = ((0x%x))\n",1374tone_idx_tmp, tone_idx_tmp);1375break;1376#if (defined(PHYDM_COMPILE_ABOVE_2SS))1377case RF_PATH_B:1378odm_set_bb_reg(dm, R_0x4044, 0x001FF000, tone_idx_tmp);1379PHYDM_DBG(dm, ODM_COMP_API,1380"Set tone idx[%d]:PATH-B = ((0x%x))\n",1381tone_idx_tmp, tone_idx_tmp);1382break;1383#endif1384#if (defined(PHYDM_COMPILE_ABOVE_3SS))1385case RF_PATH_C:1386odm_set_bb_reg(dm, R_0x5044, 0x001FF000, tone_idx_tmp);1387PHYDM_DBG(dm, ODM_COMP_API,1388"Set tone idx[%d]:PATH-C = ((0x%x))\n",1389tone_idx_tmp, tone_idx_tmp);1390break;1391#endif1392#if (defined(PHYDM_COMPILE_ABOVE_4SS))1393case RF_PATH_D:1394odm_set_bb_reg(dm, R_0x5144, 0x001FF000, tone_idx_tmp);1395PHYDM_DBG(dm, ODM_COMP_API,1396"Set tone idx[%d]:PATH-D = ((0x%x))\n",1397tone_idx_tmp, tone_idx_tmp);1398break;1399#endif1400default:1401break;1402}1403}14041405void phydm_nbi_enable_jgr3(void *dm_void, u32 enable, u8 path)1406{1407struct dm_struct *dm = (struct dm_struct *)dm_void;1408boolean val = false;14091410val = (enable == FUNC_ENABLE) ? true : false;14111412PHYDM_DBG(dm, ODM_COMP_API, "Enable NBI=%d\n", val);14131414if (dm->support_ic_type & ODM_RTL8814B) {1415odm_set_bb_reg(dm, R_0x1d3c, BIT(19), val);1416odm_set_bb_reg(dm, R_0x818, BIT(3), val);1417} else if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8812F)) {1418odm_set_bb_reg(dm, R_0x818, BIT(3), !val);1419}1420odm_set_bb_reg(dm, R_0x818, BIT(11), val);1421odm_set_bb_reg(dm, R_0x1d3c, 0x78000000, 0xf);14221423if (enable == FUNC_ENABLE) {1424switch (path) {1425case RF_PATH_A:1426odm_set_bb_reg(dm, R_0x1940, BIT(31), val);1427break;1428#if (defined(PHYDM_COMPILE_ABOVE_2SS))1429case RF_PATH_B:1430odm_set_bb_reg(dm, R_0x4040, BIT(31), val);1431break;1432#endif1433#if (defined(PHYDM_COMPILE_ABOVE_3SS))1434case RF_PATH_C:1435odm_set_bb_reg(dm, R_0x5040, BIT(31), val);1436break;1437#endif1438#if (defined(PHYDM_COMPILE_ABOVE_4SS))1439case RF_PATH_D:1440odm_set_bb_reg(dm, R_0x5140, BIT(31), val);1441break;1442#endif1443default:1444break;1445}1446} else {1447odm_set_bb_reg(dm, R_0x1940, BIT(31), val);1448#if (defined(PHYDM_COMPILE_ABOVE_2SS))1449odm_set_bb_reg(dm, R_0x4040, BIT(31), val);1450#endif1451#if (defined(PHYDM_COMPILE_ABOVE_3SS))1452odm_set_bb_reg(dm, R_0x5040, BIT(31), val);1453#endif1454#if (defined(PHYDM_COMPILE_ABOVE_4SS))1455odm_set_bb_reg(dm, R_0x5140, BIT(31), val);1456#endif1457}1458}14591460u8 phydm_phystat_rpt_jgr3(void *dm_void, enum phystat_rpt info,1461enum rf_path ant_path)1462{1463struct dm_struct *dm = (struct dm_struct *)dm_void;1464s8 evm_org, cfo_org, rxsnr_org;1465u8 i, return_info = 0, tmp_lsb = 0, tmp_msb = 0, tmp_info = 0;14661467/* Update the status for each pkt */1468odm_set_bb_reg(dm, R_0x8c4, 0xfff000, 0x448);1469odm_set_bb_reg(dm, R_0x8c0, MASKLWORD, 0x4001);1470/* PHY status Page1 */1471odm_set_bb_reg(dm, R_0x8c0, 0x3C00000, 0x1);1472/*choose debug port for phystatus */1473odm_set_bb_reg(dm, R_0x1c3c, 0xFFF00, 0x380);14741475if (info == PHY_PWDB) {1476/* Choose the report of the diff path */1477if (ant_path == RF_PATH_A)1478odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x1);1479else if (ant_path == RF_PATH_B)1480odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x2);1481else if (ant_path == RF_PATH_C)1482odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x3);1483else if (ant_path == RF_PATH_D)1484odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x4);1485} else if (info == PHY_EVM) {1486/* Choose the report of the diff path */1487if (ant_path == RF_PATH_A)1488odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x10);1489else if (ant_path == RF_PATH_B)1490odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x11);1491else if (ant_path == RF_PATH_C)1492odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x12);1493else if (ant_path == RF_PATH_D)1494odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x13);1495return_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xff);1496} else if (info == PHY_CFO) {1497/* Choose the report of the diff path */1498if (ant_path == RF_PATH_A)1499odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x14);1500else if (ant_path == RF_PATH_B)1501odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x15);1502else if (ant_path == RF_PATH_C)1503odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x16);1504else if (ant_path == RF_PATH_D)1505odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x17);1506return_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xff);1507} else if (info == PHY_RXSNR) {1508/* Choose the report of the diff path */1509if (ant_path == RF_PATH_A)1510odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x18);1511else if (ant_path == RF_PATH_B)1512odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x19);1513else if (ant_path == RF_PATH_C)1514odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x1a);1515else if (ant_path == RF_PATH_D)1516odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x1b);1517return_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xff);1518} else if (info == PHY_LGAIN) {1519/* choose page */1520odm_set_bb_reg(dm, R_0x8c0, 0x3c00000, 0x2);1521/* Choose the report of the diff path */1522if (ant_path == RF_PATH_A) {1523odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0xd);1524tmp_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0x3f);1525return_info = tmp_info;1526} else if (ant_path == RF_PATH_B) {1527odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0xd);1528tmp_lsb = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xc0);1529odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0xe);1530tmp_msb = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xf);1531tmp_info |= (tmp_msb << 2) | tmp_lsb;1532return_info = tmp_info;1533} else if (ant_path == RF_PATH_C) {1534odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0xe);1535tmp_lsb = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xf0);1536odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0xf);1537tmp_msb = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0x3);1538tmp_info |= (tmp_msb << 4) | tmp_lsb;1539return_info = tmp_info;1540} else if (ant_path == RF_PATH_D) {1541odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x10);1542tmp_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0x3f);1543return_info = tmp_info;1544}1545} else if (info == PHY_HT_AAGC_GAIN) {1546/* choose page */1547odm_set_bb_reg(dm, R_0x8c0, 0x3c00000, 0x2);1548/* Choose the report of the diff path */1549if (ant_path == RF_PATH_A)1550odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x12);1551else if (ant_path == RF_PATH_B)1552odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x13);1553else if (ant_path == RF_PATH_C)1554odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x14);1555else if (ant_path == RF_PATH_D)1556odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x15);1557return_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xff);1558}1559return return_info;1560}15611562void phydm_ex_hal8814b_wifi_only_hw_config(void *dm_void)1563{1564/*BB control*/1565/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x4c, 0x01800000, 0x2);*/1566/*SW control*/1567/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0xcb4, 0xff, 0x77);*/1568/*antenna mux switch */1569/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x974, 0x300, 0x3);*/15701571/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x1990, 0x300, 0x0);*/15721573/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0xcbc, 0x80000, 0x0);*/1574/*switch to WL side controller and gnt_wl gnt_bt debug signal */1575/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x70, 0xff000000, 0x0e);*/1576/*gnt_wl=1 , gnt_bt=0*/1577/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x1704, 0xffffffff,1578* 0x7700);1579*/1580/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x1700, 0xffffffff,1581* 0xc00f0038);1582*/1583}15841585void phydm_user_position_for_sniffer(void *dm_void, u8 user_position)1586{1587struct dm_struct *dm = (struct dm_struct *)dm_void;15881589/* user position valid */1590odm_set_bb_reg(dm, R_0xa68, BIT(17), 1);1591/* Select user seat from pmac */1592odm_set_bb_reg(dm, R_0xa68, BIT(16), 1);1593/*user seat*/1594odm_set_bb_reg(dm, R_0xa68, (BIT(19) | BIT(18)), user_position);1595}15961597boolean1598phydm_bb_ctrl_txagc_ofst_jgr3(void *dm_void, s8 pw_offset, /*@(unit: dB)*/1599u8 add_half_db /*@(+0.5 dB)*/)1600{1601struct dm_struct *dm = (struct dm_struct *)dm_void;1602s8 pw_idx = pw_offset * 4; /*@ 7Bit, 0.25dB unit*/16031604if (pw_offset < -16 || pw_offset > 15) {1605pr_debug("[Warning][%s]Ofst error=%d", __func__, pw_offset);1606return false;1607}16081609if (add_half_db)1610pw_idx += 2;16111612PHYDM_DBG(dm, ODM_COMP_API, "Pw_ofst=0x%x\n", pw_idx);16131614odm_set_bb_reg(dm, R_0x18a0, 0x3f, pw_idx);16151616if (dm->num_rf_path >= 2)1617odm_set_bb_reg(dm, R_0x41a0, 0x3f, pw_idx);16181619if (dm->num_rf_path >= 3)1620odm_set_bb_reg(dm, R_0x52a0, 0x3f, pw_idx);16211622if (dm->num_rf_path >= 4)1623odm_set_bb_reg(dm, R_0x53a0, 0x3f, pw_idx);16241625return true;1626}16271628#endif1629u8 phydm_nbi_setting(void *dm_void, u32 enable, u32 ch, u32 bw, u32 f_intf,1630u32 sec_ch)1631{1632struct dm_struct *dm = (struct dm_struct *)dm_void;1633u32 fc = 2412;1634u8 direction = FREQ_POSITIVE;1635u32 tone_idx = 0;1636u8 set_result = PHYDM_SET_SUCCESS;1637u8 rpt = 0;16381639if (enable == FUNC_DISABLE) {1640set_result = PHYDM_SET_SUCCESS;1641} else {1642PHYDM_DBG(dm, ODM_COMP_API,1643"[Set NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",1644ch, bw, f_intf,1645(((sec_ch == PHYDM_DONT_CARE) || (bw == 20) ||1646(ch > 14)) ? "Don't care" :1647(sec_ch == PHYDM_ABOVE) ? "H" : "L"));16481649/*@calculate fc*/1650if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {1651set_result = PHYDM_SET_FAIL;1652} else {1653/*@calculate interference distance*/1654rpt = phydm_find_intf_distance(dm, bw, fc, f_intf,1655&tone_idx);1656if (rpt == PHYDM_SET_SUCCESS) {1657if (f_intf >= fc)1658direction = FREQ_POSITIVE;1659else1660direction = FREQ_NEGATIVE;16611662phydm_set_nbi_reg(dm, tone_idx, bw);16631664set_result = PHYDM_SET_SUCCESS;1665} else {1666set_result = PHYDM_SET_NO_NEED;1667}1668}1669}16701671if (set_result == PHYDM_SET_SUCCESS)1672phydm_nbi_enable(dm, enable);1673else1674phydm_nbi_enable(dm, FUNC_DISABLE);16751676return set_result;1677}16781679void phydm_nbi_debug(void *dm_void, char input[][16], u32 *_used, char *output,1680u32 *_out_len)1681{1682struct dm_struct *dm = (struct dm_struct *)dm_void;1683u32 used = *_used;1684u32 out_len = *_out_len;1685u32 val[10] = {0};1686char help[] = "-h";1687u8 i = 0, input_idx = 0, idx_lmt = 0;1688u32 enable = 0; /*@function enable*/1689u32 ch = 0;1690u32 bw = 0;1691u32 f_int = 0; /*@interference frequency*/1692u32 sec_ch = 0; /*secondary channel*/1693u8 rpt = 0;1694u8 path = 0;16951696if (dm->support_ic_type & ODM_IC_JGR3_SERIES)1697idx_lmt = 6;1698else1699idx_lmt = 5;1700for (i = 0; i < idx_lmt; i++) {1701if (input[i + 1]) {1702PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);1703input_idx++;1704}1705}17061707if (input_idx == 0)1708return;17091710enable = val[0];1711ch = val[1];1712bw = val[2];1713f_int = val[3];1714sec_ch = val[4];1715#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1716path = (u8)val[5];1717#endif17181719if ((strcmp(input[1], help) == 0)) {1720#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1721if (dm->support_ic_type & ODM_IC_JGR3_SERIES)1722PDM_SNPF(out_len, used, output + used, out_len - used,1723"{en:1 Dis:2} {ch} {BW:20/40/80} {f_intf(khz)} {Scnd_CH(L=1, H=2)} {Path:A~D(0~3)}\n");1724else1725#endif1726PDM_SNPF(out_len, used, output + used, out_len - used,1727"{en:1 Dis:2} {ch} {BW:20/40/80} {f_intf(khz)} {Scnd_CH(L=1, H=2)}\n");1728*_used = used;1729*_out_len = out_len;1730return;1731} else if (val[0] == FUNC_ENABLE) {1732PDM_SNPF(out_len, used, output + used, out_len - used,1733"[Enable NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",1734ch, bw, f_int,1735((sec_ch == PHYDM_DONT_CARE) ||1736(bw == 20) || (ch > 14)) ? "Don't care" :1737((sec_ch == PHYDM_ABOVE) ? "H" : "L"));1738#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1739if (dm->support_ic_type & ODM_IC_JGR3_SERIES)1740rpt = phydm_nbi_setting_jgr3(dm, enable, ch, bw, f_int,1741sec_ch, path);1742else1743#endif1744rpt = phydm_nbi_setting(dm, enable, ch, bw, f_int,1745sec_ch);1746} else if (val[0] == FUNC_DISABLE) {1747PDM_SNPF(out_len, used, output + used, out_len - used,1748"[Disable NBI]\n");1749#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1750if (dm->support_ic_type & ODM_IC_JGR3_SERIES)1751rpt = phydm_nbi_setting_jgr3(dm, enable, ch, bw, f_int,1752sec_ch, path);1753else1754#endif1755rpt = phydm_nbi_setting(dm, enable, ch, bw, f_int,1756sec_ch);1757} else {1758rpt = PHYDM_SET_FAIL;1759}17601761PDM_SNPF(out_len, used, output + used, out_len - used,1762"[NBI set result: %s]\n",1763(rpt == PHYDM_SET_SUCCESS) ? "Success" :1764((rpt == PHYDM_SET_NO_NEED) ? "No need" : "Error"));17651766*_used = used;1767*_out_len = out_len;1768}17691770void phydm_csi_debug(void *dm_void, char input[][16], u32 *_used, char *output,1771u32 *_out_len)1772{1773struct dm_struct *dm = (struct dm_struct *)dm_void;1774u32 used = *_used;1775u32 out_len = *_out_len;1776u32 val[10] = {0};1777char help[] = "-h";1778u8 i = 0, input_idx = 0, idx_lmt = 0;1779u32 enable = 0; /*@function enable*/1780u32 ch = 0;1781u32 bw = 0;1782u32 f_int = 0; /*@interference frequency*/1783u32 sec_ch = 0; /*secondary channel*/1784u8 rpt = 0;1785u8 wgt = 0;17861787if (dm->support_ic_type & ODM_IC_JGR3_SERIES)1788idx_lmt = 6;1789else1790idx_lmt = 5;17911792for (i = 0; i < idx_lmt; i++) {1793if (input[i + 1]) {1794PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);1795input_idx++;1796}1797}17981799if (input_idx == 0)1800return;18011802enable = val[0];1803ch = val[1];1804bw = val[2];1805f_int = val[3];1806sec_ch = val[4];1807#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1808wgt = (u8)val[5];1809#endif18101811if ((strcmp(input[1], help) == 0)) {1812#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1813if (dm->support_ic_type & ODM_IC_JGR3_SERIES)1814PDM_SNPF(out_len, used, output + used, out_len - used,1815"{en:1 Dis:2} {ch} {BW:20/40/80} {f_intf(KHz)} {Scnd_CH(L=1, H=2)}\n{wgt:(7:3/4),(6~1: 1/2 ~ 1/64),(0:0)}\n");1816else1817#endif1818PDM_SNPF(out_len, used, output + used, out_len - used,1819"{en:1 Dis:2} {ch} {BW:20/40/80} {f_intf(Mhz)} {Scnd_CH(L=1, H=2)}\n");18201821*_used = used;1822*_out_len = out_len;1823return;18241825} else if (val[0] == FUNC_ENABLE) {1826PDM_SNPF(out_len, used, output + used, out_len - used,1827"[Enable CSI MASK] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",1828ch, bw, f_int,1829(ch > 14) ? "Don't care" :1830(((sec_ch == PHYDM_DONT_CARE) ||1831(bw == 20) || (ch > 14)) ? "H" : "L"));1832#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1833if (dm->support_ic_type & ODM_IC_JGR3_SERIES)1834rpt = phydm_csi_mask_setting_jgr3(dm, enable, ch, bw,1835f_int, sec_ch, wgt);1836else1837#endif1838rpt = phydm_csi_mask_setting(dm, enable, ch, bw, f_int,1839sec_ch);1840} else if (val[0] == FUNC_DISABLE) {1841PDM_SNPF(out_len, used, output + used, out_len - used,1842"[Disable CSI MASK]\n");1843#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1844if (dm->support_ic_type & ODM_IC_JGR3_SERIES)1845rpt = phydm_csi_mask_setting_jgr3(dm, enable, ch, bw,1846f_int, sec_ch, wgt);1847else1848#endif1849rpt = phydm_csi_mask_setting(dm, enable, ch, bw, f_int,1850sec_ch);1851} else {1852rpt = PHYDM_SET_FAIL;1853}1854PDM_SNPF(out_len, used, output + used, out_len - used,1855"[CSI MASK set result: %s]\n",1856(rpt == PHYDM_SET_SUCCESS) ? "Success" :1857((rpt == PHYDM_SET_NO_NEED) ? "No need" : "Error"));18581859*_used = used;1860*_out_len = out_len;1861}18621863void phydm_stop_ck320(void *dm_void, u8 enable)1864{1865struct dm_struct *dm = (struct dm_struct *)dm_void;1866u32 val = enable ? 1 : 0;18671868if (dm->support_ic_type & ODM_IC_11AC_SERIES) {1869odm_set_bb_reg(dm, R_0x8b4, BIT(6), val);1870} else {1871if (dm->support_ic_type & ODM_IC_N_2SS) /*N-2SS*/1872odm_set_bb_reg(dm, R_0x87c, BIT(29), val);1873else /*N-1SS*/1874odm_set_bb_reg(dm, R_0x87c, BIT(31), val);1875}1876}18771878boolean1879phydm_bb_ctrl_txagc_ofst(void *dm_void, s8 pw_offset, /*@(unit: dB)*/1880u8 add_half_db /*@(+0.5 dB)*/)1881{1882struct dm_struct *dm = (struct dm_struct *)dm_void;1883s8 pw_idx;1884u8 offset_bit_num = 0;18851886if (dm->support_ic_type & N_IC_TX_OFFEST_5_BIT) {1887/*@ 5Bit, 0.5dB unit*/1888if (pw_offset < -8 || pw_offset > 7) {1889pr_debug("[Warning][%s] Ofst=%d", __func__, pw_offset);1890return false;1891}1892offset_bit_num = 5;1893} else {1894if (pw_offset < -16 || pw_offset > 15) {1895pr_debug("[Warning][%s] Ofst=%d", __func__, pw_offset);1896return false;1897}1898if (dm->support_ic_type & N_IC_TX_OFFEST_7_BIT) {1899/*@ 7Bit, 0.25dB unit*/1900offset_bit_num = 7;1901} else {1902/*@ 6Bit, 0.5dB unit*/1903offset_bit_num = 6;1904}1905}19061907pw_idx = (offset_bit_num == 7) ? pw_offset * 4 : pw_offset * 2;19081909if (add_half_db)1910pw_idx = (offset_bit_num == 7) ? pw_idx + 2 : pw_idx + 1;19111912PHYDM_DBG(dm, ODM_COMP_API, "Pw_ofst=0x%x\n", pw_idx);19131914switch (dm->ic_ip_series) {1915case PHYDM_IC_AC:1916odm_set_bb_reg(dm, R_0x8b4, 0x3f, pw_idx); /*6Bit*/1917break;1918case PHYDM_IC_N:1919if (offset_bit_num == 5) {1920odm_set_bb_reg(dm, R_0x80c, 0x1f00, pw_idx);1921if (dm->num_rf_path >= 2)1922odm_set_bb_reg(dm, R_0x80c, 0x3e000, pw_idx);1923} else if (offset_bit_num == 6) {1924odm_set_bb_reg(dm, R_0x80c, 0x3f00, pw_idx);1925if (dm->num_rf_path >= 2)1926odm_set_bb_reg(dm, R_0x80c, 0xfc000, pw_idx);1927} else { /*7Bit*/1928odm_set_bb_reg(dm, R_0x80c, 0x7f00, pw_idx);1929if (dm->num_rf_path >= 2)1930odm_set_bb_reg(dm, R_0x80c, 0x3f8000, pw_idx);1931}1932break;1933}1934return true;1935}19361937boolean1938phydm_set_bb_txagc_offset(void *dm_void, s8 pw_offset, /*@(unit: dB)*/1939u8 add_half_db /*@(+0.5 dB)*/)1940{1941struct dm_struct *dm = (struct dm_struct *)dm_void;1942boolean rpt = false;19431944PHYDM_DBG(dm, ODM_COMP_API, "power_offset=%d, add_half_db =%d\n",1945pw_offset, add_half_db);19461947#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1948if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {1949rpt = phydm_bb_ctrl_txagc_ofst_jgr3(dm, pw_offset, add_half_db);1950} else1951#endif1952{1953rpt = phydm_bb_ctrl_txagc_ofst(dm, pw_offset, add_half_db);1954}19551956PHYDM_DBG(dm, ODM_COMP_API, "TX AGC Offset set_success=%d", rpt);19571958return rpt;1959}19601961#ifdef PHYDM_COMMON_API_SUPPORT1962void phydm_reset_txagc(void *dm_void)1963{1964struct dm_struct *dm = (struct dm_struct *)dm_void;1965u32 r_txagc_cck[4] = {R_0x18a0, R_0x41a0, R_0x52a0, R_0x53a0};1966u32 r_txagc_ofdm[4] = {R_0x18e8, R_0x41e8, R_0x52e8, R_0x53e8};1967u32 r_txagc_diff = R_0x3a00;1968u8 i = 0;19691970if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES)) {1971PHYDM_DBG(dm, ODM_COMP_API, "Only for JGR3 ICs!\n");1972return;1973}19741975for (i = RF_PATH_A; i < dm->num_rf_path; i++) {1976odm_set_bb_reg(dm, r_txagc_cck[i], 0x7f0000, 0x0);1977odm_set_bb_reg(dm, r_txagc_ofdm[i], 0x1fc00, 0x0);1978}19791980for (i = 0; i <= ODM_RATEVHTSS4MCS6; i = i + 4)1981odm_set_bb_reg(dm, r_txagc_diff + i, MASKDWORD, 0x0);1982}1983boolean1984phydm_api_shift_txagc(void *dm_void, u32 pwr_offset, enum rf_path path,1985boolean is_positive) {1986struct dm_struct *dm = (struct dm_struct *)dm_void;1987boolean ret = false;1988u32 txagc_cck = 0;1989u32 txagc_ofdm = 0;1990u32 r_txagc_ofdm[4] = {R_0x18e8, R_0x41e8, R_0x52e8, R_0x53e8};1991u32 r_txagc_cck[4] = {R_0x18a0, R_0x41a0, R_0x52a0, R_0x53a0};19921993#if (RTL8822C_SUPPORT || RTL8812F_SUPPORT || RTL8197G_SUPPORT)1994if (dm->support_ic_type &1995(ODM_RTL8822C | ODM_RTL8812F | ODM_RTL8197G)) {1996if (path > RF_PATH_B) {1997PHYDM_DBG(dm, ODM_PHY_CONFIG, "Unsupported path (%d)\n",1998path);1999return false;2000}2001txagc_cck = (u8)odm_get_bb_reg(dm, r_txagc_cck[path],20020x7F0000);2003txagc_ofdm = (u8)odm_get_bb_reg(dm, r_txagc_ofdm[path],20040x1FC00);2005if (is_positive) {2006if (((txagc_cck + pwr_offset) > 127) ||2007((txagc_ofdm + pwr_offset) > 127))2008return false;20092010txagc_cck += pwr_offset;2011txagc_ofdm += pwr_offset;2012} else {2013if (pwr_offset > txagc_cck || pwr_offset > txagc_ofdm)2014return false;20152016txagc_cck -= pwr_offset;2017txagc_ofdm -= pwr_offset;2018}2019#if (RTL8822C_SUPPORT)2020ret = config_phydm_write_txagc_ref_8822c(dm, (u8)txagc_cck,2021path, PDM_CCK);2022ret &= config_phydm_write_txagc_ref_8822c(dm, (u8)txagc_ofdm,2023path, PDM_OFDM);2024#endif2025#if (RTL8812F_SUPPORT)2026ret = config_phydm_write_txagc_ref_8812f(dm, (u8)txagc_cck,2027path, PDM_CCK);2028ret &= config_phydm_write_txagc_ref_8812f(dm, (u8)txagc_ofdm,2029path, PDM_OFDM);2030#endif2031#if (RTL8197G_SUPPORT)2032ret = config_phydm_write_txagc_ref_8197g(dm, (u8)txagc_cck,2033path, PDM_CCK);2034ret &= config_phydm_write_txagc_ref_8197g(dm, (u8)txagc_ofdm,2035path, PDM_OFDM);2036#endif2037PHYDM_DBG(dm, ODM_PHY_CONFIG,2038"%s: path-%d txagc_cck_ref=%x txagc_ofdm_ref=0x%x\n",2039__func__, path, txagc_cck, txagc_ofdm);2040}2041#endif20422043#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)2044if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B)) {2045if (path > RF_PATH_D) {2046PHYDM_DBG(dm, ODM_PHY_CONFIG, "Unsupported path (%d)\n",2047path);2048return false;2049}2050txagc_cck = (u8)odm_get_bb_reg(dm, r_txagc_cck[path],20510x7F0000);2052txagc_ofdm = (u8)odm_get_bb_reg(dm, r_txagc_ofdm[path],20530x1FC00);2054if (is_positive) {2055if (((txagc_cck + pwr_offset) > 127) ||2056((txagc_ofdm + pwr_offset) > 127))2057return false;20582059txagc_cck += pwr_offset;2060txagc_ofdm += pwr_offset;2061} else {2062if (pwr_offset > txagc_cck || pwr_offset > txagc_ofdm)2063return false;20642065txagc_cck -= pwr_offset;2066txagc_ofdm -= pwr_offset;2067}2068#if (RTL8198F_SUPPORT)2069ret = config_phydm_write_txagc_ref_8198f(dm, (u8)txagc_cck,2070path, PDM_CCK);2071ret &= config_phydm_write_txagc_ref_8198f(dm, (u8)txagc_ofdm,2072path, PDM_OFDM);2073#endif2074#if (RTL8814B_SUPPORT)2075ret = config_phydm_write_txagc_ref_8814b(dm, (u8)txagc_cck,2076path, PDM_CCK);2077ret &= config_phydm_write_txagc_ref_8814b(dm, (u8)txagc_ofdm,2078path, PDM_OFDM);2079#endif2080PHYDM_DBG(dm, ODM_PHY_CONFIG,2081"%s: path-%d txagc_cck_ref=%x txagc_ofdm_ref=0x%x\n",2082__func__, path, txagc_cck, txagc_ofdm);2083}2084#endif20852086return ret;2087}20882089boolean2090phydm_api_set_txagc(void *dm_void, u32 pwr_idx, enum rf_path path,2091u8 rate, boolean is_single_rate)2092{2093struct dm_struct *dm = (struct dm_struct *)dm_void;2094boolean ret = false;2095#if (RTL8198F_SUPPORT || RTL8822C_SUPPORT || RTL8812F_SUPPORT ||\2096RTL8814B_SUPPORT || RTL8197G_SUPPORT)2097u8 base = 0;2098u8 txagc_tmp = 0;2099s8 pw_by_rate_tmp = 0;2100s8 pw_by_rate_new = 0;2101#endif2102#if (DM_ODM_SUPPORT_TYPE & ODM_AP)2103u8 i = 0;2104#endif21052106#if (RTL8822B_SUPPORT || RTL8821C_SUPPORT || RTL8195B_SUPPORT)2107if (dm->support_ic_type &2108(ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8195B)) {2109if (is_single_rate) {2110#if (RTL8822B_SUPPORT)2111if (dm->support_ic_type == ODM_RTL8822B)2112ret = phydm_write_txagc_1byte_8822b(dm, pwr_idx,2113path, rate);2114#endif21152116#if (RTL8821C_SUPPORT)2117if (dm->support_ic_type == ODM_RTL8821C)2118ret = phydm_write_txagc_1byte_8821c(dm, pwr_idx,2119path, rate);2120#endif21212122#if (RTL8195B_SUPPORT)2123if (dm->support_ic_type == ODM_RTL8195B)2124ret = phydm_write_txagc_1byte_8195b(dm, pwr_idx,2125path, rate);2126#endif21272128#if (DM_ODM_SUPPORT_TYPE & ODM_AP)2129set_current_tx_agc(dm->priv, path, rate, (u8)pwr_idx);2130#endif21312132} else {2133#if (RTL8822B_SUPPORT)2134if (dm->support_ic_type == ODM_RTL8822B)2135ret = config_phydm_write_txagc_8822b(dm,2136pwr_idx,2137path,2138rate);2139#endif21402141#if (RTL8821C_SUPPORT)2142if (dm->support_ic_type == ODM_RTL8821C)2143ret = config_phydm_write_txagc_8821c(dm,2144pwr_idx,2145path,2146rate);2147#endif21482149#if (RTL8195B_SUPPORT)2150if (dm->support_ic_type == ODM_RTL8195B)2151ret = config_phydm_write_txagc_8195b(dm,2152pwr_idx,2153path,2154rate);2155#endif21562157#if (DM_ODM_SUPPORT_TYPE & ODM_AP)2158for (i = 0; i < 4; i++)2159set_current_tx_agc(dm->priv, path, (rate + i),2160(u8)pwr_idx);2161#endif2162}2163}2164#endif21652166#if (RTL8198F_SUPPORT)2167if (dm->support_ic_type & ODM_RTL8198F) {2168if (rate < 0x4)2169txagc_tmp = config_phydm_read_txagc_8198f(dm, path,2170rate,2171PDM_CCK);2172else2173txagc_tmp = config_phydm_read_txagc_8198f(dm, path,2174rate,2175PDM_OFDM);21762177pw_by_rate_tmp = config_phydm_read_txagc_diff_8198f(dm, rate);2178base = txagc_tmp - pw_by_rate_tmp;2179base = base & 0x7f;2180if (DIFF_2((pwr_idx & 0x7f), base) > 64 || pwr_idx > 127)2181return false;21822183pw_by_rate_new = (s8)(pwr_idx - base);2184ret = phydm_write_txagc_1byte_8198f(dm, pw_by_rate_new, rate);2185PHYDM_DBG(dm, ODM_PHY_CONFIG,2186"%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",2187__func__, path, rate, base, pw_by_rate_new);2188}2189#endif21902191#if (RTL8822C_SUPPORT)2192if (dm->support_ic_type & ODM_RTL8822C) {2193if (rate < 0x4)2194txagc_tmp = config_phydm_read_txagc_8822c(dm, path,2195rate,2196PDM_CCK);2197else2198txagc_tmp = config_phydm_read_txagc_8822c(dm, path,2199rate,2200PDM_OFDM);22012202pw_by_rate_tmp = config_phydm_read_txagc_diff_8822c(dm, rate);2203base = txagc_tmp - pw_by_rate_tmp;2204base = base & 0x7f;2205if (DIFF_2((pwr_idx & 0x7f), base) > 63 || pwr_idx > 127)2206return false;22072208pw_by_rate_new = (s8)(pwr_idx - base);2209ret = phydm_write_txagc_1byte_8822c(dm, pw_by_rate_new, rate);2210PHYDM_DBG(dm, ODM_PHY_CONFIG,2211"%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",2212__func__, path, rate, base, pw_by_rate_new);2213}2214#endif22152216#if (RTL8814B_SUPPORT)2217if (dm->support_ic_type & ODM_RTL8814B) {2218if (rate < 0x4)2219txagc_tmp = config_phydm_read_txagc_8814b(dm, path,2220rate,2221PDM_CCK);2222else2223txagc_tmp = config_phydm_read_txagc_8814b(dm, path,2224rate,2225PDM_OFDM);22262227pw_by_rate_tmp = config_phydm_read_txagc_diff_8814b(dm, rate);2228base = txagc_tmp - pw_by_rate_tmp;2229base = base & 0x7f;2230if (DIFF_2((pwr_idx & 0x7f), base) > 64)2231return false;22322233pw_by_rate_new = (s8)(pwr_idx - base);2234ret = phydm_write_txagc_1byte_8814b(dm, pw_by_rate_new, rate);2235PHYDM_DBG(dm, ODM_PHY_CONFIG,2236"%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",2237__func__, path, rate, base, pw_by_rate_new);2238}2239#endif22402241#if (RTL8812F_SUPPORT)2242if (dm->support_ic_type & ODM_RTL8812F) {2243if (rate < 0x4)2244txagc_tmp = config_phydm_read_txagc_8812f(dm, path,2245rate,2246PDM_CCK);2247else2248txagc_tmp = config_phydm_read_txagc_8812f(dm, path,2249rate,2250PDM_OFDM);22512252pw_by_rate_tmp = config_phydm_read_txagc_diff_8812f(dm, rate);2253base = txagc_tmp - pw_by_rate_tmp;2254base = base & 0x7f;2255if (DIFF_2((pwr_idx & 0x7f), base) > 63 || pwr_idx > 127)2256return false;22572258pw_by_rate_new = (s8)(pwr_idx - base);2259ret = phydm_write_txagc_1byte_8812f(dm, pw_by_rate_new, rate);2260PHYDM_DBG(dm, ODM_PHY_CONFIG,2261"%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",2262__func__, path, rate, base, pw_by_rate_new);2263}2264#endif22652266#if (RTL8197G_SUPPORT)2267if (dm->support_ic_type & ODM_RTL8197G) {2268if (rate < 0x4)2269txagc_tmp = config_phydm_read_txagc_8197g(dm, path,2270rate,2271PDM_CCK);2272else2273txagc_tmp = config_phydm_read_txagc_8197g(dm, path,2274rate,2275PDM_OFDM);22762277pw_by_rate_tmp = config_phydm_read_txagc_diff_8197g(dm, rate);2278base = txagc_tmp - pw_by_rate_tmp;2279base = base & 0x7f;2280if (DIFF_2((pwr_idx & 0x7f), base) > 63 || pwr_idx > 127)2281return false;22822283pw_by_rate_new = (s8)(pwr_idx - base);2284ret = phydm_write_txagc_1byte_8197g(dm, pw_by_rate_new, rate);2285PHYDM_DBG(dm, ODM_PHY_CONFIG,2286"%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",2287__func__, path, rate, base, pw_by_rate_new);2288}2289#endif22902291#if (RTL8197F_SUPPORT)2292if (dm->support_ic_type & ODM_RTL8197F)2293ret = config_phydm_write_txagc_8197f(dm, pwr_idx, path, rate);2294#endif22952296#if (RTL8192F_SUPPORT)2297if (dm->support_ic_type & ODM_RTL8192F)2298ret = config_phydm_write_txagc_8192f(dm, pwr_idx, path, rate);2299#endif23002301#if (RTL8721D_SUPPORT)2302if (dm->support_ic_type & ODM_RTL8721D)2303ret = config_phydm_write_txagc_8721d(dm, pwr_idx, path, rate);2304#endif2305#if (RTL8710C_SUPPORT)2306if (dm->support_ic_type & ODM_RTL8710C)2307ret = config_phydm_write_txagc_8710c(dm, pwr_idx, path, rate);2308#endif2309return ret;2310}23112312u8 phydm_api_get_txagc(void *dm_void, enum rf_path path, u8 hw_rate)2313{2314struct dm_struct *dm = (struct dm_struct *)dm_void;2315u8 ret = 0;23162317#if (RTL8822B_SUPPORT)2318if (dm->support_ic_type & ODM_RTL8822B)2319ret = config_phydm_read_txagc_8822b(dm, path, hw_rate);2320#endif23212322#if (RTL8197F_SUPPORT)2323if (dm->support_ic_type & ODM_RTL8197F)2324ret = config_phydm_read_txagc_8197f(dm, path, hw_rate);2325#endif23262327#if (RTL8821C_SUPPORT)2328if (dm->support_ic_type & ODM_RTL8821C)2329ret = config_phydm_read_txagc_8821c(dm, path, hw_rate);2330#endif23312332#if (RTL8195B_SUPPORT)2333if (dm->support_ic_type & ODM_RTL8195B)2334ret = config_phydm_read_txagc_8195b(dm, path, hw_rate);2335#endif23362337/*@jj add 20170822*/2338#if (RTL8192F_SUPPORT)2339if (dm->support_ic_type & ODM_RTL8192F)2340ret = config_phydm_read_txagc_8192f(dm, path, hw_rate);2341#endif23422343#if (RTL8198F_SUPPORT)2344if (dm->support_ic_type & ODM_RTL8198F) {2345if (hw_rate < 0x4) {2346ret = config_phydm_read_txagc_8198f(dm, path, hw_rate,2347PDM_CCK);2348} else {2349ret = config_phydm_read_txagc_8198f(dm, path, hw_rate,2350PDM_OFDM);2351}2352}2353#endif23542355#if (RTL8822C_SUPPORT)2356if (dm->support_ic_type & ODM_RTL8822C) {2357if (hw_rate < 0x4) {2358ret = config_phydm_read_txagc_8822c(dm, path, hw_rate,2359PDM_CCK);2360} else {2361ret = config_phydm_read_txagc_8822c(dm, path, hw_rate,2362PDM_OFDM);2363}2364}2365#endif23662367#if (RTL8814B_SUPPORT)2368if (dm->support_ic_type & ODM_RTL8814B) {2369if (hw_rate < 0x4) {2370ret = config_phydm_read_txagc_8814b(dm, path, hw_rate,2371PDM_CCK);2372} else {2373ret = config_phydm_read_txagc_8814b(dm, path, hw_rate,2374PDM_OFDM);2375}2376}2377#endif23782379#if (RTL8812F_SUPPORT)2380if (dm->support_ic_type & ODM_RTL8812F) {2381if (hw_rate < 0x4) {2382ret = config_phydm_read_txagc_8812f(dm, path, hw_rate,2383PDM_CCK);2384} else {2385ret = config_phydm_read_txagc_8812f(dm, path, hw_rate,2386PDM_OFDM);2387}2388}2389#endif23902391#if (RTL8197G_SUPPORT)2392if (dm->support_ic_type & ODM_RTL8197G) {2393if (hw_rate < 0x4) {2394ret = config_phydm_read_txagc_8197g(dm, path,2395hw_rate,2396PDM_CCK);2397} else {2398ret = config_phydm_read_txagc_8197g(dm, path,2399hw_rate,2400PDM_OFDM);2401}2402}2403#endif24042405#if (RTL8721D_SUPPORT)2406if (dm->support_ic_type & ODM_RTL8721D)2407ret = config_phydm_read_txagc_8721d(dm, path, hw_rate);2408#endif2409#if (RTL8710C_SUPPORT)2410if (dm->support_ic_type & ODM_RTL8710C)2411ret = config_phydm_read_txagc_8710c(dm, path, hw_rate);2412#endif2413return ret;2414}24152416boolean2417phydm_api_switch_bw_channel(void *dm_void, u8 ch, u8 pri_ch,2418enum channel_width bw)2419{2420struct dm_struct *dm = (struct dm_struct *)dm_void;2421boolean ret = false;24222423switch (dm->support_ic_type) {2424#if (RTL8822B_SUPPORT)2425case ODM_RTL8822B:2426ret = config_phydm_switch_channel_bw_8822b(dm, ch, pri_ch, bw);2427break;2428#endif24292430#if (RTL8197F_SUPPORT)2431case ODM_RTL8197F:2432ret = config_phydm_switch_channel_bw_8197f(dm, ch, pri_ch, bw);2433break;2434#endif24352436#if (RTL8821C_SUPPORT)2437case ODM_RTL8821C:2438ret = config_phydm_switch_channel_bw_8821c(dm, ch, pri_ch, bw);2439break;2440#endif24412442#if (RTL8192F_SUPPORT)2443case ODM_RTL8192F:2444ret = config_phydm_switch_channel_bw_8192f(dm, ch, pri_ch, bw);2445break;2446#endif24472448#if (RTL8198F_SUPPORT)2449case ODM_RTL8198F:2450ret = config_phydm_switch_channel_bw_8198f(dm, ch, pri_ch, bw);2451break;2452#endif24532454#if (RTL8822C_SUPPORT)2455case ODM_RTL8822C:2456ret = config_phydm_switch_channel_bw_8822c(dm, ch, pri_ch, bw);2457break;2458#endif24592460#if (RTL8814B_SUPPORT)2461case ODM_RTL8814B:2462ret = config_phydm_switch_channel_bw_8814b(dm, ch, pri_ch, bw);2463break;2464#endif24652466#if (RTL8812F_SUPPORT)2467case ODM_RTL8812F:2468ret = config_phydm_switch_channel_bw_8812f(dm, ch, pri_ch, bw);2469break;2470#endif24712472#if (RTL8197G_SUPPORT)2473case ODM_RTL8197G:2474ret = config_phydm_switch_channel_bw_8197g(dm, ch, pri_ch, bw);2475break;2476#endif24772478#if (RTL8721D_SUPPORT)2479case ODM_RTL8721D:2480ret = config_phydm_switch_channel_bw_8721d(dm, ch, pri_ch, bw);2481break;2482#endif2483#if (RTL8710C_SUPPORT)2484case ODM_RTL8710C:2485ret = config_phydm_switch_channel_bw_8710c(dm, ch, pri_ch, bw);2486break;2487#endif24882489default:2490break;2491}2492return ret;2493}24942495boolean2496phydm_api_trx_mode(void *dm_void, enum bb_path tx_path, enum bb_path rx_path,2497enum bb_path tx_path_ctrl)2498{2499struct dm_struct *dm = (struct dm_struct *)dm_void;2500boolean ret = false;2501boolean is_2tx = false;25022503if (tx_path_ctrl == BB_PATH_AB)2504is_2tx = true;25052506switch (dm->support_ic_type) {2507#if (RTL8822B_SUPPORT)2508case ODM_RTL8822B:2509ret = config_phydm_trx_mode_8822b(dm, tx_path, rx_path,2510tx_path_ctrl);2511break;2512#endif25132514#if (RTL8197F_SUPPORT)2515case ODM_RTL8197F:2516ret = config_phydm_trx_mode_8197f(dm, tx_path, rx_path, is_2tx);2517break;2518#endif25192520#if (RTL8192F_SUPPORT)2521case ODM_RTL8192F:2522ret = config_phydm_trx_mode_8192f(dm, tx_path, rx_path,2523tx_path_ctrl);2524break;2525#endif25262527#if (RTL8198F_SUPPORT)2528case ODM_RTL8198F:2529ret = config_phydm_trx_mode_8198f(dm, tx_path, rx_path, is_2tx);2530break;2531#endif25322533#if (RTL8814B_SUPPORT)2534case ODM_RTL8814B:2535ret = config_phydm_trx_mode_8814b(dm, tx_path, rx_path);2536break;2537#endif25382539#if (RTL8822C_SUPPORT)2540case ODM_RTL8822C:2541ret = config_phydm_trx_mode_8822c(dm, tx_path, rx_path,2542tx_path_ctrl);2543break;2544#endif25452546#if (RTL8812F_SUPPORT)2547case ODM_RTL8812F:2548ret = config_phydm_trx_mode_8812f(dm, tx_path, rx_path, is_2tx);2549break;2550#endif25512552#if (RTL8197G_SUPPORT)2553case ODM_RTL8197G:2554ret = config_phydm_trx_mode_8197g(dm, tx_path, rx_path, is_2tx);2555break;2556#endif25572558#if (RTL8721D_SUPPORT)2559case ODM_RTL8721D:2560ret = config_phydm_trx_mode_8721d(dm, tx_path, rx_path, is_2tx);2561break;2562#endif25632564#if (RTL8710C_SUPPORT)2565case ODM_RTL8710C:2566ret = config_phydm_trx_mode_8710c(dm, tx_path, rx_path, is_2tx);2567break;2568#endif2569}2570return ret;2571}2572#else2573u8 config_phydm_read_txagc_n(void *dm_void, enum rf_path path, u8 hw_rate)2574{2575struct dm_struct *dm = (struct dm_struct *)dm_void;2576u8 read_back_data = INVALID_TXAGC_DATA;2577u32 reg_txagc;2578u32 reg_mask;2579/* This function is for 92E/88E etc... */2580/* @Input need to be HW rate index, not driver rate index!!!! */25812582/* @Error handling */2583if (path > RF_PATH_B || hw_rate > ODM_RATEMCS15) {2584PHYDM_DBG(dm, ODM_PHY_CONFIG, "%s: unsupported path (%d)\n",2585__func__, path);2586return INVALID_TXAGC_DATA;2587}25882589if (path == RF_PATH_A) {2590switch (hw_rate) {2591case ODM_RATE1M:2592reg_txagc = R_0xe08;2593reg_mask = 0x00007f00;2594break;2595case ODM_RATE2M:2596reg_txagc = R_0x86c;2597reg_mask = 0x00007f00;2598break;2599case ODM_RATE5_5M:2600reg_txagc = R_0x86c;2601reg_mask = 0x007f0000;2602break;2603case ODM_RATE11M:2604reg_txagc = R_0x86c;2605reg_mask = 0x7f000000;2606break;26072608case ODM_RATE6M:2609reg_txagc = R_0xe00;2610reg_mask = 0x0000007f;2611break;2612case ODM_RATE9M:2613reg_txagc = R_0xe00;2614reg_mask = 0x00007f00;2615break;2616case ODM_RATE12M:2617reg_txagc = R_0xe00;2618reg_mask = 0x007f0000;2619break;2620case ODM_RATE18M:2621reg_txagc = R_0xe00;2622reg_mask = 0x7f000000;2623break;2624case ODM_RATE24M:2625reg_txagc = R_0xe04;2626reg_mask = 0x0000007f;2627break;2628case ODM_RATE36M:2629reg_txagc = R_0xe04;2630reg_mask = 0x00007f00;2631break;2632case ODM_RATE48M:2633reg_txagc = R_0xe04;2634reg_mask = 0x007f0000;2635break;2636case ODM_RATE54M:2637reg_txagc = R_0xe04;2638reg_mask = 0x7f000000;2639break;26402641case ODM_RATEMCS0:2642reg_txagc = R_0xe10;2643reg_mask = 0x0000007f;2644break;2645case ODM_RATEMCS1:2646reg_txagc = R_0xe10;2647reg_mask = 0x00007f00;2648break;2649case ODM_RATEMCS2:2650reg_txagc = R_0xe10;2651reg_mask = 0x007f0000;2652break;2653case ODM_RATEMCS3:2654reg_txagc = R_0xe10;2655reg_mask = 0x7f000000;2656break;2657case ODM_RATEMCS4:2658reg_txagc = R_0xe14;2659reg_mask = 0x0000007f;2660break;2661case ODM_RATEMCS5:2662reg_txagc = R_0xe14;2663reg_mask = 0x00007f00;2664break;2665case ODM_RATEMCS6:2666reg_txagc = R_0xe14;2667reg_mask = 0x007f0000;2668break;2669case ODM_RATEMCS7:2670reg_txagc = R_0xe14;2671reg_mask = 0x7f000000;2672break;26732674case ODM_RATEMCS8:2675reg_txagc = R_0xe18;2676reg_mask = 0x0000007f;2677break;2678case ODM_RATEMCS9:2679reg_txagc = R_0xe18;2680reg_mask = 0x00007f00;2681break;2682case ODM_RATEMCS10:2683reg_txagc = R_0xe18;2684reg_mask = 0x007f0000;2685break;2686case ODM_RATEMCS11:2687reg_txagc = R_0xe18;2688reg_mask = 0x7f000000;2689break;2690case ODM_RATEMCS12:2691reg_txagc = R_0xe1c;2692reg_mask = 0x0000007f;2693break;2694case ODM_RATEMCS13:2695reg_txagc = R_0xe1c;2696reg_mask = 0x00007f00;2697break;2698case ODM_RATEMCS14:2699reg_txagc = R_0xe1c;2700reg_mask = 0x007f0000;2701break;2702case ODM_RATEMCS15:2703reg_txagc = R_0xe1c;2704reg_mask = 0x7f000000;2705break;27062707default:2708PHYDM_DBG(dm, ODM_PHY_CONFIG, "Invalid HWrate!\n");2709break;2710}2711} else if (path == RF_PATH_B) {2712switch (hw_rate) {2713case ODM_RATE1M:2714reg_txagc = R_0x838;2715reg_mask = 0x00007f00;2716break;2717case ODM_RATE2M:2718reg_txagc = R_0x838;2719reg_mask = 0x007f0000;2720break;2721case ODM_RATE5_5M:2722reg_txagc = R_0x838;2723reg_mask = 0x7f000000;2724break;2725case ODM_RATE11M:2726reg_txagc = R_0x86c;2727reg_mask = 0x0000007f;2728break;27292730case ODM_RATE6M:2731reg_txagc = R_0x830;2732reg_mask = 0x0000007f;2733break;2734case ODM_RATE9M:2735reg_txagc = R_0x830;2736reg_mask = 0x00007f00;2737break;2738case ODM_RATE12M:2739reg_txagc = R_0x830;2740reg_mask = 0x007f0000;2741break;2742case ODM_RATE18M:2743reg_txagc = R_0x830;2744reg_mask = 0x7f000000;2745break;2746case ODM_RATE24M:2747reg_txagc = R_0x834;2748reg_mask = 0x0000007f;2749break;2750case ODM_RATE36M:2751reg_txagc = R_0x834;2752reg_mask = 0x00007f00;2753break;2754case ODM_RATE48M:2755reg_txagc = R_0x834;2756reg_mask = 0x007f0000;2757break;2758case ODM_RATE54M:2759reg_txagc = R_0x834;2760reg_mask = 0x7f000000;2761break;27622763case ODM_RATEMCS0:2764reg_txagc = R_0x83c;2765reg_mask = 0x0000007f;2766break;2767case ODM_RATEMCS1:2768reg_txagc = R_0x83c;2769reg_mask = 0x00007f00;2770break;2771case ODM_RATEMCS2:2772reg_txagc = R_0x83c;2773reg_mask = 0x007f0000;2774break;2775case ODM_RATEMCS3:2776reg_txagc = R_0x83c;2777reg_mask = 0x7f000000;2778break;2779case ODM_RATEMCS4:2780reg_txagc = R_0x848;2781reg_mask = 0x0000007f;2782break;2783case ODM_RATEMCS5:2784reg_txagc = R_0x848;2785reg_mask = 0x00007f00;2786break;2787case ODM_RATEMCS6:2788reg_txagc = R_0x848;2789reg_mask = 0x007f0000;2790break;2791case ODM_RATEMCS7:2792reg_txagc = R_0x848;2793reg_mask = 0x7f000000;2794break;27952796case ODM_RATEMCS8:2797reg_txagc = R_0x84c;2798reg_mask = 0x0000007f;2799break;2800case ODM_RATEMCS9:2801reg_txagc = R_0x84c;2802reg_mask = 0x00007f00;2803break;2804case ODM_RATEMCS10:2805reg_txagc = R_0x84c;2806reg_mask = 0x007f0000;2807break;2808case ODM_RATEMCS11:2809reg_txagc = R_0x84c;2810reg_mask = 0x7f000000;2811break;2812case ODM_RATEMCS12:2813reg_txagc = R_0x868;2814reg_mask = 0x0000007f;2815break;2816case ODM_RATEMCS13:2817reg_txagc = R_0x868;2818reg_mask = 0x00007f00;2819break;2820case ODM_RATEMCS14:2821reg_txagc = R_0x868;2822reg_mask = 0x007f0000;2823break;2824case ODM_RATEMCS15:2825reg_txagc = R_0x868;2826reg_mask = 0x7f000000;2827break;28282829default:2830PHYDM_DBG(dm, ODM_PHY_CONFIG, "Invalid HWrate!\n");2831break;2832}2833} else {2834PHYDM_DBG(dm, ODM_PHY_CONFIG, "Invalid RF path!!\n");2835}2836read_back_data = (u8)odm_get_bb_reg(dm, reg_txagc, reg_mask);2837PHYDM_DBG(dm, ODM_PHY_CONFIG, "%s: path-%d rate index 0x%x = 0x%x\n",2838__func__, path, hw_rate, read_back_data);2839return read_back_data;2840}2841#endif28422843#ifdef CONFIG_MCC_DM2844#ifdef DYN_ANT_WEIGHTING_SUPPORT2845void phydm_set_weighting_cmn(struct dm_struct *dm)2846{2847PHYDM_DBG(dm, DBG_COMP_MCC, "%s\n", __func__);2848odm_set_bb_reg(dm, 0xc04, (BIT(18) | BIT(21)), 0x0);2849odm_set_bb_reg(dm, 0xe04, (BIT(18) | BIT(21)), 0x0);2850}28512852void phydm_set_weighting_mcc(u8 b_equal_weighting, void *dm_void, u8 port)2853{2854/*u8 reg_8;*/2855struct dm_struct *dm = (struct dm_struct *)dm_void;2856struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;2857u8 val_0x98e, val_0x98f, val_0x81b;2858u32 temp_reg;28592860PHYDM_DBG(dm, DBG_COMP_MCC, "ant_weighting_mcc, port = %d\n", port);2861if (b_equal_weighting) {2862temp_reg = odm_get_bb_reg(dm, 0x98c, 0x00ff0000);2863val_0x98e = (u8)(temp_reg >> 16) & 0xc0;2864temp_reg = odm_get_bb_reg(dm, 0x98c, 0xff000000);2865val_0x98f = (u8)(temp_reg >> 24) & 0x7f;2866temp_reg = odm_get_bb_reg(dm, 0x818, 0xff000000);2867val_0x81b = (u8)(temp_reg >> 24) & 0xfd;2868PHYDM_DBG(dm, DBG_COMP_MCC, "Equal weighting ,rssi_min = %d\n",2869dm->rssi_min);2870/*equal weighting*/2871} else {2872val_0x98e = 0x44;2873val_0x98f = 0x43;2874temp_reg = odm_get_bb_reg(dm, 0x818, 0xff000000);2875val_0x81b = (u8)(temp_reg >> 24) | BIT(2);2876PHYDM_DBG(dm, DBG_COMP_MCC, "AGC weighting ,rssi_min = %d\n",2877dm->rssi_min);2878/*fix sec_min_wgt = 1/2*/2879}2880mcc_dm->mcc_reg_id[2] = 0x2;2881mcc_dm->mcc_dm_reg[2] = 0x98e;2882mcc_dm->mcc_dm_val[2][port] = val_0x98e;28832884mcc_dm->mcc_reg_id[3] = 0x3;2885mcc_dm->mcc_dm_reg[3] = 0x98f;2886mcc_dm->mcc_dm_val[3][port] = val_0x98f;28872888mcc_dm->mcc_reg_id[4] = 0x4;2889mcc_dm->mcc_dm_reg[4] = 0x81b;2890mcc_dm->mcc_dm_val[4][port] = val_0x81b;2891}28922893void phydm_dyn_ant_dec_mcc(u8 port, u8 rssi_in, void *dm_void)2894{2895struct dm_struct *dm = (struct dm_struct *)dm_void;2896u8 rssi_l2h = 43, rssi_h2l = 37;28972898if (rssi_in == 0xff)2899phydm_set_weighting_mcc(FALSE, dm, port);2900else if (rssi_in >= rssi_l2h)2901phydm_set_weighting_mcc(TRUE, dm, port);2902else if (rssi_in <= rssi_h2l)2903phydm_set_weighting_mcc(FALSE, dm, port);2904}29052906void phydm_dynamic_ant_weighting_mcc_8822b(void *dm_void)2907{2908struct dm_struct *dm = (struct dm_struct *)dm_void;2909struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;2910u8 i;29112912phydm_set_weighting_cmn(dm);2913for (i = 0; i <= 1; i++)2914phydm_dyn_ant_dec_mcc(i, mcc_dm->mcc_rssi[i], dm);2915}2916#endif /*#ifdef DYN_ANT_WEIGHTING_SUPPORT*/29172918void phydm_mcc_init(void *dm_void)2919{2920struct dm_struct *dm = (struct dm_struct *)dm_void;2921struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;2922u8 i;29232924/*PHYDM_DBG(dm, DBG_COMP_MCC, ("MCC init\n"));*/2925PHYDM_DBG(dm, DBG_COMP_MCC, "MCC init\n");2926for (i = 0; i < MCC_DM_REG_NUM; i++) {2927mcc_dm->mcc_reg_id[i] = 0xff;2928mcc_dm->mcc_dm_reg[i] = 0;2929mcc_dm->mcc_dm_val[i][0] = 0;2930mcc_dm->mcc_dm_val[i][1] = 0;2931}2932for (i = 0; i < NUM_STA; i++) {2933mcc_dm->sta_macid[0][i] = 0xff;2934mcc_dm->sta_macid[1][i] = 0xff;2935}2936/* Function init */2937dm->is_stop_dym_ant_weighting = 0;2938}29392940u8 phydm_check(void *dm_void)2941{2942struct dm_struct *dm = (struct dm_struct *)dm_void;2943struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;2944struct cmn_sta_info *p_entry = NULL;2945u8 shift = 0;2946u8 i = 0;2947u8 j = 0;2948u8 rssi_min[2] = {0xff, 0xff};2949u8 sta_num = 8;2950u8 mcc_macid = 0;29512952for (i = 0; i <= 1; i++) {2953for (j = 0; j < sta_num; j++) {2954if (mcc_dm->sta_macid[i][j] != 0xff) {2955mcc_macid = mcc_dm->sta_macid[i][j];2956p_entry = dm->phydm_sta_info[mcc_macid];2957if (!p_entry) {2958PHYDM_DBG(dm, DBG_COMP_MCC,2959"PEntry NULL(mac=%d)\n",2960mcc_dm->sta_macid[i][j]);2961return _FAIL;2962}2963PHYDM_DBG(dm, DBG_COMP_MCC,2964"undec_smoothed_pwdb=%d\n",2965p_entry->rssi_stat.rssi);2966if (p_entry->rssi_stat.rssi < rssi_min[i])2967rssi_min[i] = p_entry->rssi_stat.rssi;2968}2969}2970}2971mcc_dm->mcc_rssi[0] = (u8)rssi_min[0];2972mcc_dm->mcc_rssi[1] = (u8)rssi_min[1];2973return _SUCCESS;2974}29752976void phydm_mcc_h2ccmd_rst(void *dm_void)2977{2978struct dm_struct *dm = (struct dm_struct *)dm_void;2979struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;2980u8 i;2981u8 regid;2982u8 h2c_mcc[H2C_MAX_LENGTH];29832984/* RST MCC */2985for (i = 0; i < H2C_MAX_LENGTH; i++)2986h2c_mcc[i] = 0xff;2987h2c_mcc[0] = 0x00;2988odm_fill_h2c_cmd(dm, PHYDM_H2C_MCC, H2C_MAX_LENGTH, h2c_mcc);2989PHYDM_DBG(dm, DBG_COMP_MCC, "MCC H2C RST\n");2990}29912992void phydm_mcc_h2ccmd(void *dm_void)2993{2994struct dm_struct *dm = (struct dm_struct *)dm_void;2995struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;2996u8 i;2997u8 regid;2998u8 h2c_mcc[H2C_MAX_LENGTH];29993000if (mcc_dm->mcc_rf_ch[0] == 0xff && mcc_dm->mcc_rf_ch[1] == 0xff) {3001PHYDM_DBG(dm, DBG_COMP_MCC, "MCC channel Error\n");3002return;3003}3004/* Set Channel number */3005for (i = 0; i < H2C_MAX_LENGTH; i++)3006h2c_mcc[i] = 0xff;3007h2c_mcc[0] = 0xe0;3008h2c_mcc[1] = (u8)(mcc_dm->mcc_rf_ch[0]);3009h2c_mcc[2] = (u8)(mcc_dm->mcc_rf_ch[0] >> 8);3010h2c_mcc[3] = (u8)(mcc_dm->mcc_rf_ch[1]);3011h2c_mcc[4] = (u8)(mcc_dm->mcc_rf_ch[1] >> 8);3012h2c_mcc[5] = 0xff;3013h2c_mcc[6] = 0xff;3014odm_fill_h2c_cmd(dm, PHYDM_H2C_MCC, H2C_MAX_LENGTH, h2c_mcc);3015PHYDM_DBG(dm, DBG_COMP_MCC,3016"MCC H2C SetCH: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",3017h2c_mcc[0], h2c_mcc[1], h2c_mcc[2], h2c_mcc[3],3018h2c_mcc[4], h2c_mcc[5], h2c_mcc[6]);30193020/* Set Reg and value*/3021for (i = 0; i < H2C_MAX_LENGTH; i++)3022h2c_mcc[i] = 0xff;30233024for (i = 0; i < MCC_DM_REG_NUM; i++) {3025regid = mcc_dm->mcc_reg_id[i];3026if (regid != 0xff) {3027h2c_mcc[0] = 0xa0 | (regid & 0x1f);3028h2c_mcc[1] = (u8)(mcc_dm->mcc_dm_reg[i]);3029h2c_mcc[2] = (u8)(mcc_dm->mcc_dm_reg[i] >> 8);3030h2c_mcc[3] = mcc_dm->mcc_dm_val[i][0];3031h2c_mcc[4] = mcc_dm->mcc_dm_val[i][1];3032h2c_mcc[5] = 0xff;3033h2c_mcc[6] = 0xff;3034odm_fill_h2c_cmd(dm, PHYDM_H2C_MCC, H2C_MAX_LENGTH,3035h2c_mcc);3036PHYDM_DBG(dm, DBG_COMP_MCC,3037"MCC H2C: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",3038h2c_mcc[0], h2c_mcc[1], h2c_mcc[2],3039h2c_mcc[3], h2c_mcc[4],3040h2c_mcc[5], h2c_mcc[6]);3041}3042}3043}30443045void phydm_mcc_ctrl(void *dm_void)3046{3047struct dm_struct *dm = (struct dm_struct *)dm_void;3048struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;3049struct phydm_dig_struct *dig_t = &dm->dm_dig_table;30503051PHYDM_DBG(dm, DBG_COMP_MCC, "MCC status: %x\n", mcc_dm->mcc_status);3052/*MCC stage no change*/3053if (mcc_dm->mcc_status == mcc_dm->mcc_pre_status)3054return;3055/*Not in MCC stage*/3056if (mcc_dm->mcc_status == 0) {3057/* Enable normal Ant-weighting */3058dm->is_stop_dym_ant_weighting = 0;3059/* Enable normal DIG */3060odm_pause_dig(dm, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_1, 0x20);3061} else {3062/* Disable normal Ant-weighting */3063dm->is_stop_dym_ant_weighting = 1;3064/* Enable normal DIG */3065odm_pause_dig(dm, PHYDM_PAUSE_NO_SET, PHYDM_PAUSE_LEVEL_1,30660x20);3067}3068if (mcc_dm->mcc_status == 0 && mcc_dm->mcc_pre_status != 0)3069phydm_mcc_init(dm);3070mcc_dm->mcc_pre_status = mcc_dm->mcc_status;3071}30723073void phydm_fill_mcccmd(void *dm_void, u8 regid, u16 reg_add,3074u8 val0, u8 val1)3075{3076struct dm_struct *dm = (struct dm_struct *)dm_void;3077struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;30783079mcc_dm->mcc_reg_id[regid] = regid;3080mcc_dm->mcc_dm_reg[regid] = reg_add;3081mcc_dm->mcc_dm_val[regid][0] = val0;3082mcc_dm->mcc_dm_val[regid][1] = val1;3083}30843085void phydm_mcc_switch(void *dm_void)3086{3087struct dm_struct *dm = (struct dm_struct *)dm_void;3088struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;3089s8 ret;30903091phydm_mcc_ctrl(dm);3092if (mcc_dm->mcc_status == 0) {/*Not in MCC stage*/3093phydm_mcc_h2ccmd_rst(dm);3094return;3095}3096PHYDM_DBG(dm, DBG_COMP_MCC, "MCC switch\n");3097ret = phydm_check(dm);3098if (ret == _FAIL) {3099PHYDM_DBG(dm, DBG_COMP_MCC, "MCC check fail\n");3100return;3101}3102/* Set IGI*/3103phydm_mcc_igi_cal(dm);31043105/* Set Antenna Gain*/3106#if (RTL8822B_SUPPORT == 1)3107phydm_dynamic_ant_weighting_mcc_8822b(dm);3108#endif3109/* Set H2C Cmd*/3110phydm_mcc_h2ccmd(dm);3111}3112#endif31133114#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)3115void phydm_normal_driver_rx_sniffer(3116struct dm_struct *dm,3117u8 *desc,3118PRT_RFD_STATUS rt_rfd_status,3119u8 *drv_info,3120u8 phy_status)3121{3122#if (defined(CONFIG_PHYDM_RX_SNIFFER_PARSING))3123u32 *msg;3124u16 seq_num;31253126if (rt_rfd_status->packet_report_type != NORMAL_RX)3127return;31283129if (!dm->is_linked) {3130if (rt_rfd_status->is_hw_error)3131return;3132}31333134if (phy_status == true) {3135if (dm->rx_pkt_type == type_block_ack ||3136dm->rx_pkt_type == type_rts || dm->rx_pkt_type == type_cts)3137seq_num = 0;3138else3139seq_num = rt_rfd_status->seq_num;31403141PHYDM_DBG_F(dm, ODM_COMP_SNIFFER,3142"%04d , %01s, rate=0x%02x, L=%04d , %s , %s",3143seq_num,3144/*rt_rfd_status->mac_id,*/3145(rt_rfd_status->is_crc ? "C" :3146rt_rfd_status->is_ampdu ? "A" : "_"),3147rt_rfd_status->data_rate,3148rt_rfd_status->length,3149((rt_rfd_status->band_width == 0) ? "20M" :3150((rt_rfd_status->band_width == 1) ? "40M" : "80M")),3151(rt_rfd_status->is_ldpc ? "LDP" : "BCC"));31523153if (dm->rx_pkt_type == type_asoc_req)3154PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "AS_REQ");3155else if (dm->rx_pkt_type == type_asoc_rsp)3156PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "AS_RSP");3157else if (dm->rx_pkt_type == type_probe_req)3158PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "PR_REQ");3159else if (dm->rx_pkt_type == type_probe_rsp)3160PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "PR_RSP");3161else if (dm->rx_pkt_type == type_deauth)3162PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "DEAUTH");3163else if (dm->rx_pkt_type == type_beacon)3164PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "BEACON");3165else if (dm->rx_pkt_type == type_block_ack_req)3166PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "BA_REQ");3167else if (dm->rx_pkt_type == type_rts)3168PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__RTS_");3169else if (dm->rx_pkt_type == type_cts)3170PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__CTS_");3171else if (dm->rx_pkt_type == type_ack)3172PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__ACK_");3173else if (dm->rx_pkt_type == type_block_ack)3174PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__BA__");3175else if (dm->rx_pkt_type == type_data)3176PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "_DATA_");3177else if (dm->rx_pkt_type == type_data_ack)3178PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "Data_Ack");3179else if (dm->rx_pkt_type == type_qos_data)3180PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "QoS_Data");3181else3182PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [0x%x]",3183dm->rx_pkt_type);31843185PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [RSSI=%d,%d,%d,%d ]",3186dm->rssi_a,3187dm->rssi_b,3188dm->rssi_c,3189dm->rssi_d);31903191msg = (u32 *)drv_info;31923193PHYDM_DBG_F(dm, ODM_COMP_SNIFFER,3194" , P-STS[28:0]=%08x-%08x-%08x-%08x-%08x-%08x-%08x\n",3195msg[6], msg[5], msg[4], msg[3],3196msg[2], msg[1], msg[1]);3197} else {3198PHYDM_DBG_F(dm, ODM_COMP_SNIFFER,3199"%04d , %01s, rate=0x%02x, L=%04d , %s , %s\n",3200rt_rfd_status->seq_num,3201/*rt_rfd_status->mac_id,*/3202(rt_rfd_status->is_crc ? "C" :3203(rt_rfd_status->is_ampdu) ? "A" : "_"),3204rt_rfd_status->data_rate,3205rt_rfd_status->length,3206((rt_rfd_status->band_width == 0) ? "20M" :3207((rt_rfd_status->band_width == 1) ? "40M" : "80M")),3208(rt_rfd_status->is_ldpc ? "LDP" : "BCC"));3209}32103211#endif3212}32133214#endif321532163217