Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_dynamictxpower.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#include "mp_precomp.h"29#include "phydm_precomp.h"3031#ifdef CONFIG_DYNAMIC_TX_TWR32#ifdef BB_RAM_SUPPORT33void phydm_rd_reg_pwr(void *dm_void, u32 *_used, char *output, u32 *_out_len)34{35struct dm_struct *dm = (struct dm_struct *)dm_void;36u32 used = *_used;37u32 out_len = *_out_len;38boolean pwr_ofst0_en = false;39boolean pwr_ofst1_en = false;40s8 pwr_ofst0 = 0;41s8 pwr_ofst1 = 0;4243pwr_ofst0_en = (boolean)odm_get_bb_reg(dm, R_0x1e70, BIT(23));44pwr_ofst1_en = (boolean)odm_get_bb_reg(dm, R_0x1e70, BIT(31));45pwr_ofst0 = (s8)odm_get_bb_reg(dm, R_0x1e70, 0x7f0000);46pwr_ofst1 = (s8)odm_get_bb_reg(dm, R_0x1e70, 0x7f000000);4748PDM_SNPF(out_len, used, output + used, out_len - used,49"reg0: en:%d, pwr_ofst:0x%x, reg1: en:%d, pwr_ofst:0x%x\n",50pwr_ofst0_en, pwr_ofst0, pwr_ofst1_en, pwr_ofst1);5152*_used = used;53*_out_len = out_len;54};5556void phydm_wt_reg_pwr(void *dm_void, boolean is_ofst1, boolean pwr_ofst_en,57s8 pwr_ofst)58{59struct dm_struct *dm = (struct dm_struct *)dm_void;60struct phydm_bb_ram_ctrl *bb_ctrl = &dm->p_bb_ram_ctrl;61u8 reg_0x1e70 = 0;6263if (!is_ofst1) {64bb_ctrl->tx_pwr_ofst_reg0_en = pwr_ofst_en;65bb_ctrl->tx_pwr_ofst_reg0 = pwr_ofst;6667reg_0x1e70 |= (pwr_ofst_en << 7) + (pwr_ofst & 0x7f);68odm_set_bb_reg(dm, R_0x1e70, 0x00ff0000, reg_0x1e70);69} else {70bb_ctrl->tx_pwr_ofst_reg1_en = pwr_ofst_en;71bb_ctrl->tx_pwr_ofst_reg1 = pwr_ofst;7273reg_0x1e70 |= (pwr_ofst_en << 7) + (pwr_ofst & 0x7f);74odm_set_bb_reg(dm, R_0x1e70, 0xff000000, reg_0x1e70);75}76};7778void phydm_rd_ram_pwr(void *dm_void, u8 macid, u32 *_used, char *output,79u32 *_out_len)80{81struct dm_struct *dm = (struct dm_struct *)dm_void;82u32 used = *_used;83u32 out_len = *_out_len;84boolean pwr_ofst0_en = false;85boolean pwr_ofst1_en = false;86s8 pwr_ofst0 = 0;87s8 pwr_ofst1 = 0;88u32 reg_0x1e84 = 0;8990reg_0x1e84 |= (macid & 0x3f) << 24; /* macid*/91reg_0x1e84 |= BIT(31); /* read_en*/92odm_set_bb_reg(dm, R_0x1e84, MASKDWORD, reg_0x1e84);9394pwr_ofst0_en = (boolean)odm_get_bb_reg(dm, R_0x2de8, BIT(23));95pwr_ofst1_en = (boolean)odm_get_bb_reg(dm, R_0x2de8, BIT(31));96pwr_ofst0 = (s8)odm_get_bb_reg(dm, R_0x2de8, 0x7f0000);97pwr_ofst1 = (s8)odm_get_bb_reg(dm, R_0x2de8, 0x7f000000);98odm_set_bb_reg(dm, R_0x1e84, MASKDWORD, 0x0); /* disable rd/wt*/99100PDM_SNPF(out_len, used, output + used, out_len - used,101"(macid:%d) ram0: en:%d, pwr_ofst:0x%x, ram1: en:%d, pwr_ofst:0x%x\n",102macid, pwr_ofst0_en, pwr_ofst0, pwr_ofst1_en, pwr_ofst1);103104*_used = used;105*_out_len = out_len;106};107108void phydm_wt_ram_pwr(void *dm_void, u8 macid, boolean is_ofst1,109boolean pwr_ofst_en, s8 pwr_ofst)110{111struct dm_struct *dm = (struct dm_struct *)dm_void;112struct phydm_bb_ram_per_sta *dm_ram_per_sta = NULL;113u32 reg_0x1e84 = 0;114boolean pwr_ofst_ano_en = false;115s8 pwr_ofst_ano = 0;116117if (macid > 63)118macid = 63;119120dm_ram_per_sta = &dm->p_bb_ram_ctrl.pram_sta_ctrl[macid];121reg_0x1e84 = (dm_ram_per_sta->hw_igi_en << 7) + dm_ram_per_sta->hw_igi;122if (!is_ofst1) {123dm_ram_per_sta->tx_pwr_offset0_en = pwr_ofst_en;124dm_ram_per_sta->tx_pwr_offset0 = pwr_ofst;125126pwr_ofst_ano_en = dm_ram_per_sta->tx_pwr_offset1_en;127pwr_ofst_ano = dm_ram_per_sta->tx_pwr_offset1;128129reg_0x1e84 |= (pwr_ofst_en << 15) + ((pwr_ofst & 0x7f) << 8) +130(pwr_ofst_ano_en << 23) +131((pwr_ofst_ano & 0x7f) << 16);132} else {133dm_ram_per_sta->tx_pwr_offset1_en = pwr_ofst_en;134dm_ram_per_sta->tx_pwr_offset1 = pwr_ofst;135136pwr_ofst_ano_en = dm_ram_per_sta->tx_pwr_offset0_en;137pwr_ofst_ano = dm_ram_per_sta->tx_pwr_offset1;138139reg_0x1e84 |= (pwr_ofst_ano_en << 15) +140((pwr_ofst_ano & 0x7f) << 8) +141(pwr_ofst_en << 23) + ((pwr_ofst & 0x7f) << 16);142}143reg_0x1e84 |= (macid & 0x3f) << 24;/* macid*/144reg_0x1e84 |= BIT(30); /* write_en*/145odm_set_bb_reg(dm, R_0x1e84, MASKDWORD, reg_0x1e84);146odm_set_bb_reg(dm, R_0x1e84, MASKDWORD, 0x80000000); /* read_en*/147odm_set_bb_reg(dm, R_0x1e84, MASKDWORD, 0x0); /* disable rd/wt*/148};149150void phydm_rst_ram_pwr(void *dm_void)151{152struct dm_struct *dm = (struct dm_struct *)dm_void;153struct phydm_bb_ram_per_sta *dm_ram_per_sta = NULL;154u32 reg_0x1e84 = 0;155u8 i = 0;156157for (i = 0; i < 64; i++) {158dm_ram_per_sta = &dm->p_bb_ram_ctrl.pram_sta_ctrl[i];159dm_ram_per_sta->tx_pwr_offset0_en = false;160dm_ram_per_sta->tx_pwr_offset1_en = false;161dm_ram_per_sta->tx_pwr_offset0 = 0x0;162dm_ram_per_sta->tx_pwr_offset1 = 0x0;163reg_0x1e84 = (dm_ram_per_sta->hw_igi_en << 7) +164dm_ram_per_sta->hw_igi;165reg_0x1e84 |= (i & 0x3f) << 24;166reg_0x1e84 |= BIT(30);167odm_set_bb_reg(dm, R_0x1e84, MASKDWORD, reg_0x1e84);168}169170odm_set_bb_reg(dm, R_0x1e84, MASKDWORD, 0x80000000);171odm_set_bb_reg(dm, R_0x1e84, MASKDWORD, 0x0);172};173174u8 phydm_pwr_lv_mapping_2nd(u8 tx_pwr_lv)175{176if (tx_pwr_lv == tx_high_pwr_level_level3)177return PHYDM_2ND_OFFSET_MINUS_11DB;178else if (tx_pwr_lv == tx_high_pwr_level_level2)179return PHYDM_2ND_OFFSET_MINUS_7DB;180else if (tx_pwr_lv == tx_high_pwr_level_level1)181return PHYDM_2ND_OFFSET_MINUS_3DB;182else183return PHYDM_2ND_OFFSET_ZERO;184}185186void phydm_pwr_lv_ctrl(void *dm_void, u8 macid, u8 tx_pwr_lv)187{188struct dm_struct *dm = (struct dm_struct *)dm_void;189s8 pwr_offset = 0;190191if (tx_pwr_lv == tx_high_pwr_level_level3)192pwr_offset = PHYDM_BBRAM_OFFSET_MINUS_11DB;193else if (tx_pwr_lv == tx_high_pwr_level_level2)194pwr_offset = PHYDM_BBRAM_OFFSET_MINUS_7DB;195else if (tx_pwr_lv == tx_high_pwr_level_level1)196pwr_offset = PHYDM_BBRAM_OFFSET_MINUS_3DB;197else198pwr_offset = PHYDM_BBRAM_OFFSET_ZERO;199200phydm_wt_ram_pwr(dm, macid, RAM_PWR_OFST0, true, pwr_offset);201/* still need to check with SD7*/202#if (RTL8822C_SUPPORT)203if (dm->support_ic_type & ODM_RTL8822C)204phydm_wt_ram_pwr(dm, 127, RAM_PWR_OFST0, true, pwr_offset);205#endif206}207208void phydm_dtp_fill_cmninfo_2nd(void *dm_void, u8 macid, u8 dtp_lvl)209{210struct dm_struct *dm = (struct dm_struct *)dm_void;211struct cmn_sta_info *sta = dm->phydm_sta_info[macid];212struct dtp_info *dtp = NULL;213214if (!is_sta_active(sta))215return;216217dtp = &dm->phydm_sta_info[macid]->dtp_stat;218dtp->dyn_tx_power = phydm_pwr_lv_mapping_2nd(dtp_lvl);219phydm_pwr_lv_ctrl(dm, macid, dtp_lvl);220221PHYDM_DBG(dm, DBG_DYN_TXPWR,222"Fill cmninfo TxPwr: macid=(%d), PwrLv (%d)\n", macid,223dtp->dyn_tx_power);224}225226void phydm_dtp_init_2nd(void *dm_void)227{228struct dm_struct *dm = (struct dm_struct *)dm_void;229230if (!(dm->support_ability & ODM_BB_DYNAMIC_TXPWR))231return;232233#if (RTL8822C_SUPPORT)234if (dm->support_ic_type & ODM_RTL8822C) {235phydm_rst_ram_pwr(dm);236/* rsp tx use type 0*/237odm_set_mac_reg(dm, R_0x6d8, BIT(19) | BIT(18), RAM_PWR_OFST0);238}239#endif240};241#endif242243boolean244phydm_check_rates(void *dm_void, u8 rate_idx)245{246struct dm_struct *dm = (struct dm_struct *)dm_void;247u32 check_rate_bitmap0 = 0x08080808; /* @check CCK11M, OFDM54M, MCS7, MCS15*/248u32 check_rate_bitmap1 = 0x80200808; /* @check MCS23, MCS31, VHT1SS M9, VHT2SS M9*/249u32 check_rate_bitmap2 = 0x00080200; /* @check VHT3SS M9, VHT4SS M9*/250u32 bitmap_result;251252#if (RTL8822B_SUPPORT)253if (dm->support_ic_type & ODM_RTL8822B) {254check_rate_bitmap2 &= 0;255check_rate_bitmap1 &= 0xfffff000;256check_rate_bitmap0 &= 0x0fffffff;257}258#endif259#if (RTL8197F_SUPPORT)260if (dm->support_ic_type & ODM_RTL8197F) {261check_rate_bitmap2 &= 0;262check_rate_bitmap1 &= 0;263check_rate_bitmap0 &= 0x0fffffff;264}265#endif266#if (RTL8192E_SUPPORT)267if (dm->support_ic_type & ODM_RTL8192E) {268check_rate_bitmap2 &= 0;269check_rate_bitmap1 &= 0;270check_rate_bitmap0 &= 0x0fffffff;271}272#endif273#if (RTL8192F_SUPPORT)274if (dm->support_ic_type & ODM_RTL8192F) {275check_rate_bitmap2 &= 0;276check_rate_bitmap1 &= 0;277check_rate_bitmap0 &= 0x0fffffff;278}279#endif280#if (RTL8721D_SUPPORT)281if (dm->support_ic_type & ODM_RTL8721D) {282check_rate_bitmap2 &= 0;283check_rate_bitmap1 &= 0;284check_rate_bitmap0 &= 0x000fffff;285}286#endif287#if (RTL8821C_SUPPORT)288if (dm->support_ic_type & ODM_RTL8821C) {289check_rate_bitmap2 &= 0;290check_rate_bitmap1 &= 0x003ff000;291check_rate_bitmap0 &= 0x000fffff;292}293#endif294if (rate_idx >= 64)295bitmap_result = BIT(rate_idx - 64) & check_rate_bitmap2;296else if (rate_idx >= 32)297bitmap_result = BIT(rate_idx - 32) & check_rate_bitmap1;298else if (rate_idx <= 31)299bitmap_result = BIT(rate_idx) & check_rate_bitmap0;300301if (bitmap_result != 0)302return true;303else304return false;305}306307enum rf_path308phydm_check_paths(void *dm_void)309{310struct dm_struct *dm = (struct dm_struct *)dm_void;311enum rf_path max_path = RF_PATH_A;312313if (dm->num_rf_path == 1)314max_path = RF_PATH_A;315if (dm->num_rf_path == 2)316max_path = RF_PATH_B;317if (dm->num_rf_path == 3)318max_path = RF_PATH_C;319if (dm->num_rf_path == 4)320max_path = RF_PATH_D;321322return max_path;323}324325#ifndef PHYDM_COMMON_API_SUPPORT326u8 phydm_dtp_get_txagc(void *dm_void, enum rf_path path, u8 hw_rate)327{328struct dm_struct *dm = (struct dm_struct *)dm_void;329u8 ret = 0xff;330331#if (RTL8192E_SUPPORT)332ret = config_phydm_read_txagc_n(dm, path, hw_rate);333#endif334return ret;335}336#endif337338u8 phydm_search_min_power_index(void *dm_void)339{340struct dm_struct *dm = (struct dm_struct *)dm_void;341enum rf_path path;342enum rf_path max_path;343u8 min_gain_index = 0x3f;344u8 gain_index;345u8 rate_idx;346347PHYDM_DBG(dm, DBG_DYN_TXPWR, "%s\n", __func__);348max_path = phydm_check_paths(dm);349for (path = 0; path <= max_path; path++)350for (rate_idx = 0; rate_idx < 84; rate_idx++)351if (phydm_check_rates(dm, rate_idx)) {352#ifdef PHYDM_COMMON_API_SUPPORT353/*This is for API support IC : 97F,8822B,92F,8821C*/354gain_index = phydm_api_get_txagc(dm, path, rate_idx);355#else356/*This is for API non-support IC : 92E */357gain_index = phydm_dtp_get_txagc(dm, path, rate_idx);358#endif359if (gain_index == 0xff) {360min_gain_index = 0x20;361PHYDM_DBG(dm, DBG_DYN_TXPWR,362"Error Gain idx!! Rewite to: ((%d))\n",363min_gain_index);364break;365}366PHYDM_DBG(dm, DBG_DYN_TXPWR,367"Support Rate: ((%d)) -> Gain idx: ((%d))\n",368rate_idx, gain_index);369if (gain_index < min_gain_index)370min_gain_index = gain_index;371}372return min_gain_index;373}374375void phydm_dynamic_tx_power_init(void *dm_void)376{377struct dm_struct *dm = (struct dm_struct *)dm_void;378u8 i = 0;379380dm->last_dtp_lvl = tx_high_pwr_level_normal;381dm->dynamic_tx_high_power_lvl = tx_high_pwr_level_normal;382383switch (dm->ic_ip_series) {384#ifdef BB_RAM_SUPPORT385case PHYDM_IC_JGR3:386dm->set_pwr_th[0] = TX_PWR_NEAR_FIELD_TH_JGR3_LVL1;387dm->set_pwr_th[1] = TX_PWR_NEAR_FIELD_TH_JGR3_LVL2;388dm->set_pwr_th[2] = TX_PWR_NEAR_FIELD_TH_JGR3_LVL3;389phydm_dtp_init_2nd(dm);390break;391#endif392default:393for (i = 0; i < 3; i++)394dm->enhance_pwr_th[i] = 0xff;395396dm->set_pwr_th[0] = TX_POWER_NEAR_FIELD_THRESH_LVL1;397dm->set_pwr_th[1] = TX_POWER_NEAR_FIELD_THRESH_LVL2;398dm->set_pwr_th[2] = 0xff;399dm->min_power_index = phydm_search_min_power_index(dm);400PHYDM_DBG(dm, DBG_DYN_TXPWR, "DTP init: Min Gain idx: ((%d))\n",401dm->min_power_index);402break;403}404}405406void phydm_noisy_enhance_hp_th(void *dm_void, u8 noisy_state)407{408struct dm_struct *dm = (struct dm_struct *)dm_void;409410if (noisy_state == 0) {411dm->enhance_pwr_th[0] = dm->set_pwr_th[0];412dm->enhance_pwr_th[1] = dm->set_pwr_th[1];413dm->enhance_pwr_th[2] = dm->set_pwr_th[2];414} else {415dm->enhance_pwr_th[0] = dm->set_pwr_th[0] + 8;416dm->enhance_pwr_th[1] = dm->set_pwr_th[1] + 5;417dm->enhance_pwr_th[2] = dm->set_pwr_th[2];418}419PHYDM_DBG(dm, DBG_DYN_TXPWR,420"DTP hp_enhance_th: Lv1_th =%d ,Lv2_th = %d ,Lv3_th = %d\n",421dm->enhance_pwr_th[0], dm->enhance_pwr_th[1],422dm->enhance_pwr_th[2]);423}424425u8 phydm_pwr_lvl_check(void *dm_void, u8 input_rssi)426{427struct dm_struct *dm = (struct dm_struct *)dm_void;428u8 th0, th1, th2;429430if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {431th2 = dm->set_pwr_th[2];432th1 = dm->set_pwr_th[1];433th0 = dm->set_pwr_th[0];434PHYDM_DBG(dm, DBG_DYN_TXPWR,435"DTP th: Lv1_th = %d, Lv2_th = %d, Lv3_th = %d\n",436th0, th1, th2);437} else {438th2 = dm->enhance_pwr_th[2];439th1 = dm->enhance_pwr_th[1];440th0 = dm->enhance_pwr_th[0];441}442443if (input_rssi >= th2)444return tx_high_pwr_level_level3;445else if (input_rssi < (th2 - 3) && input_rssi >= th1)446return tx_high_pwr_level_level2;447else if (input_rssi < (th1 - 3) && input_rssi >= th0)448return tx_high_pwr_level_level1;449else if (input_rssi < (th0 - 3))450return tx_high_pwr_level_normal;451else452return tx_high_pwr_level_unchange;453}454455u8 phydm_pwr_lv_mapping(u8 tx_pwr_lv)456{457if (tx_pwr_lv == tx_high_pwr_level_level3)458return PHYDM_OFFSET_MINUS_11DB;459else if (tx_pwr_lv == tx_high_pwr_level_level2)460return PHYDM_OFFSET_MINUS_7DB;461else if (tx_pwr_lv == tx_high_pwr_level_level1)462return PHYDM_OFFSET_MINUS_3DB;463else464return PHYDM_OFFSET_ZERO;465}466467void phydm_dynamic_response_power(void *dm_void)468{469struct dm_struct *dm = (struct dm_struct *)dm_void;470u8 rpwr = 0;471472if (!(dm->support_ability & ODM_BB_DYNAMIC_TXPWR))473return;474475if (dm->dynamic_tx_high_power_lvl == tx_high_pwr_level_unchange) {476dm->dynamic_tx_high_power_lvl = dm->last_dtp_lvl;477PHYDM_DBG(dm, DBG_DYN_TXPWR, "RespPwr not change\n");478return;479}480PHYDM_DBG(dm, DBG_DYN_TXPWR,481"RespPwr update_DTP_lv: ((%d)) -> ((%d))\n", dm->last_dtp_lvl,482dm->dynamic_tx_high_power_lvl);483dm->last_dtp_lvl = dm->dynamic_tx_high_power_lvl;484rpwr = phydm_pwr_lv_mapping(dm->dynamic_tx_high_power_lvl);485odm_set_mac_reg(dm, ODM_REG_RESP_TX_11AC, BIT(20) | BIT(19) | BIT(18),486rpwr);487PHYDM_DBG(dm, DBG_DYN_TXPWR, "RespPwr Set TxPwr: Lv (%d)\n",488dm->dynamic_tx_high_power_lvl);489}490491void phydm_dtp_fill_cmninfo(void *dm_void, u8 macid, u8 dtp_lvl)492{493struct dm_struct *dm = (struct dm_struct *)dm_void;494struct cmn_sta_info *sta = dm->phydm_sta_info[macid];495struct dtp_info *dtp = NULL;496497if (!is_sta_active(sta))498return;499500dtp = &sta->dtp_stat;501dtp->dyn_tx_power = phydm_pwr_lv_mapping(dtp_lvl);502PHYDM_DBG(dm, DBG_DYN_TXPWR,503"Fill cmninfo TxPwr: macid=(%d), PwrLv (%d)\n", macid,504dtp->dyn_tx_power);505}506507void phydm_dtp_per_sta(void *dm_void, u8 macid)508{509struct dm_struct *dm = (struct dm_struct *)dm_void;510struct cmn_sta_info *sta = dm->phydm_sta_info[macid];511struct dtp_info *dtp = NULL;512struct rssi_info *rssi = NULL;513514if (is_sta_active(sta)) {515dtp = &sta->dtp_stat;516rssi = &sta->rssi_stat;517dtp->sta_tx_high_power_lvl = phydm_pwr_lvl_check(dm,518rssi->rssi);519PHYDM_DBG(dm, DBG_DYN_TXPWR,520"STA=%d , RSSI: %d , GetPwrLv: %d\n", macid,521rssi->rssi, dtp->sta_tx_high_power_lvl);522523if (dtp->sta_tx_high_power_lvl == tx_high_pwr_level_unchange524|| dtp->sta_tx_high_power_lvl == dtp->sta_last_dtp_lvl) {525dtp->sta_tx_high_power_lvl = dtp->sta_last_dtp_lvl;526PHYDM_DBG(dm, DBG_DYN_TXPWR,527"DTP_lv not change: ((%d))\n",528dtp->sta_tx_high_power_lvl);529return;530}531532PHYDM_DBG(dm, DBG_DYN_TXPWR,533"DTP_lv update: ((%d)) -> ((%d))\n",534dtp->sta_last_dtp_lvl, dtp->sta_tx_high_power_lvl);535536dtp->sta_last_dtp_lvl = dtp->sta_tx_high_power_lvl;537538switch (dm->ic_ip_series) {539#ifdef BB_RAM_SUPPORT540case PHYDM_IC_JGR3:541phydm_dtp_fill_cmninfo_2nd(dm, macid,542dtp->sta_tx_high_power_lvl);543break;544#endif545default:546phydm_dtp_fill_cmninfo(dm, macid,547dtp->sta_tx_high_power_lvl);548break;549}550551}552}553554void odm_set_dyntxpwr(void *dm_void, u8 *desc, u8 macid)555{556struct dm_struct *dm = (struct dm_struct *)dm_void;557struct cmn_sta_info *sta = dm->phydm_sta_info[macid];558struct dtp_info *dtp = NULL;559560if (!is_sta_active(sta))561return;562dtp = &sta->dtp_stat;563564if (!(dm->support_ability & ODM_BB_DYNAMIC_TXPWR))565return;566567if (dm->fill_desc_dyntxpwr)568dm->fill_desc_dyntxpwr(dm, desc, dtp->dyn_tx_power);569else570PHYDM_DBG(dm, DBG_DYN_TXPWR,571"%s: fill_desc_dyntxpwr is null!\n", __func__);572573if (dtp->last_tx_power != dtp->dyn_tx_power) {574PHYDM_DBG(dm, DBG_DYN_TXPWR,575"%s: last_offset=%d, txpwr_offset=%d\n", __func__,576dtp->last_tx_power, dtp->dyn_tx_power);577dtp->last_tx_power = dtp->dyn_tx_power;578}579}580581void phydm_dtp_debug(void *dm_void, char input[][16], u32 *_used, char *output,582u32 *_out_len)583{584u32 used = *_used;585u32 out_len = *_out_len;586587struct dm_struct *dm = (struct dm_struct *)dm_void;588char help[] = "-h";589u32 var1[7] = {0};590u8 set_pwr_th1, set_pwr_th2, set_pwr_th3;591u8 i = 0;592#ifdef BB_RAM_SUPPORT593s8 pwr_ofst_tmp = 0x0;594#endif595596if ((strcmp(input[1], help) == 0)) {597PDM_SNPF(out_len, used, output + used, out_len - used,598"Set DTP threhosld: {1} {Lv1_th} {Lv2_th} {Lv3_th}\n");599#ifdef BB_RAM_SUPPORT600PDM_SNPF(out_len, used, output + used, out_len - used,601"Set pwr_tx_offset: {2} {0:reg 1:macid} {en} {offset 0/1} {0:-, 1:+} {Pwr Offset} {macid}\n");602PDM_SNPF(out_len, used, output + used, out_len - used,603"Read pwr_tx_offset : {3} {0:reg 1:macid} {macid(0~63), 255:all}\n");604PDM_SNPF(out_len, used, output + used, out_len - used,605"Reset all ram pwr_tx_offset : {4}\n");606#endif607} else {608for (i = 0; i < 7; i++) {609if (input[i + 1])610PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL,611&var1[i]);612}613switch (var1[0]) {614case 1:615for (i = 0; i < 3; i++) {616if (var1[i] == 0 || var1[i] > 100)617dm->set_pwr_th[i] = 0xff;618else619dm->set_pwr_th[i] = (u8)var1[1 + i];620}621622PDM_SNPF(out_len, used, output + used, out_len - used,623"DTP_TH[0:2] = {%d, %d, %d}\n",624dm->set_pwr_th[0], dm->set_pwr_th[1],625dm->set_pwr_th[2]);626break;627#ifdef BB_RAM_SUPPORT628case 2:629if ((boolean)var1[4])630pwr_ofst_tmp = (s8)var1[5];631else632pwr_ofst_tmp = 0x0 - (s8)var1[5];633634if ((boolean)var1[1])635phydm_wt_ram_pwr(dm, (u8)var1[6],636(boolean)var1[3],637(boolean)var1[2],638pwr_ofst_tmp);639else640phydm_wt_reg_pwr(dm, (boolean)var1[3],641(boolean)var1[2],642pwr_ofst_tmp);643break;644case 3:645if ((boolean)var1[1]) {646if ((u8)var1[2] == 0xff)647for (i = 0; i < 64; i++)648phydm_rd_ram_pwr(dm, i, &used,649output,650&out_len);651else652phydm_rd_ram_pwr(dm, (u8)var1[2], &used,653output, &out_len);654} else {655phydm_rd_reg_pwr(dm, &used, output, &out_len);656}657break;658case 4:659phydm_rst_ram_pwr(dm);660break;661#endif662}663}664*_used = used;665*_out_len = out_len;666}667668void phydm_dynamic_tx_power(void *dm_void)669{670struct dm_struct *dm = (struct dm_struct *)dm_void;671struct cmn_sta_info *sta = NULL;672u8 i = 0;673u8 cnt = 0;674u8 rssi_min = dm->rssi_min;675u8 rssi_tmp = 0;676677if (!(dm->support_ability & ODM_BB_DYNAMIC_TXPWR))678return;679680if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES)) {681PHYDM_DBG(dm, DBG_DYN_TXPWR,682"[%s] RSSI_min = %d, Noisy_dec = %d\n", __func__,683rssi_min, dm->noisy_decision);684phydm_noisy_enhance_hp_th(dm, dm->noisy_decision);685/* Response Power */686dm->dynamic_tx_high_power_lvl = phydm_pwr_lvl_check(dm,687rssi_min);688phydm_dynamic_response_power(dm);689}690/* Per STA Tx power */691for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {692phydm_dtp_per_sta(dm, i);693cnt++;694if (cnt >= dm->number_linked_client)695break;696}697}698#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)699700void phydm_dynamic_tx_power_init_win(void *dm_void)701{702struct dm_struct *dm = (struct dm_struct *)dm_void;703void *adapter = dm->adapter;704PMGNT_INFO mgnt_info = &((PADAPTER)adapter)->MgntInfo;705HAL_DATA_TYPE *hal_data = GET_HAL_DATA((PADAPTER)adapter);706707mgnt_info->bDynamicTxPowerEnable = false;708#if DEV_BUS_TYPE == RT_USB_INTERFACE709if (RT_GetInterfaceSelection((PADAPTER)adapter) ==710INTF_SEL1_USB_High_Power) {711mgnt_info->bDynamicTxPowerEnable = true;712}713#endif714715hal_data->LastDTPLvl = tx_high_pwr_level_normal;716hal_data->DynamicTxHighPowerLvl = tx_high_pwr_level_normal;717718PHYDM_DBG(dm, DBG_DYN_TXPWR, "[%s] DTP=%d\n", __func__,719mgnt_info->bDynamicTxPowerEnable);720}721722void phydm_dynamic_tx_power_win(void *dm_void)723{724struct dm_struct *dm = (struct dm_struct *)dm_void;725726if (!(dm->support_ability & ODM_BB_DYNAMIC_TXPWR))727return;728729#if (RTL8814A_SUPPORT)730if (dm->support_ic_type == ODM_RTL8814A)731odm_dynamic_tx_power_8814a(dm);732#endif733734#if (RTL8821A_SUPPORT)735if (dm->support_ic_type & ODM_RTL8821) {736void *adapter = dm->adapter;737PMGNT_INFO mgnt_info = GetDefaultMgntInfo((PADAPTER)adapter);738739if (mgnt_info->RegRspPwr == 1) {740if (dm->rssi_min > 60) {741/*Resp TXAGC offset = -3dB*/742odm_set_mac_reg(dm, R_0x6d8, 0x1C0000, 1);743} else if (dm->rssi_min < 55) {744/*Resp TXAGC offset = 0dB*/745odm_set_mac_reg(dm, R_0x6d8, 0x1C0000, 0);746}747}748}749#endif750}751#endif /*@#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/752#endif /* @#ifdef CONFIG_DYNAMIC_TX_TWR */753754755