162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* Copyright(c) 2009-2012 Realtek Corporation.*/ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include "../wifi.h" 562306a36Sopenharmony_ci#include "../base.h" 662306a36Sopenharmony_ci#include "../pci.h" 762306a36Sopenharmony_ci#include "../core.h" 862306a36Sopenharmony_ci#include "reg.h" 962306a36Sopenharmony_ci#include "def.h" 1062306a36Sopenharmony_ci#include "phy.h" 1162306a36Sopenharmony_ci#include "dm.h" 1262306a36Sopenharmony_ci#include "../rtl8192c/fw_common.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_civoid rtl92ce_dm_dynamic_txpower(struct ieee80211_hw *hw) 1562306a36Sopenharmony_ci{ 1662306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 1762306a36Sopenharmony_ci struct rtl_phy *rtlphy = &(rtlpriv->phy); 1862306a36Sopenharmony_ci struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1962306a36Sopenharmony_ci long undec_sm_pwdb; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci if (!rtlpriv->dm.dynamic_txpower_enable) 2262306a36Sopenharmony_ci return; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci if (rtlpriv->dm.dm_flag & HAL_DM_HIPWR_DISABLE) { 2562306a36Sopenharmony_ci rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; 2662306a36Sopenharmony_ci return; 2762306a36Sopenharmony_ci } 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci if ((mac->link_state < MAC80211_LINKED) && 3062306a36Sopenharmony_ci (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) { 3162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE, 3262306a36Sopenharmony_ci "Not connected to any\n"); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL; 3762306a36Sopenharmony_ci return; 3862306a36Sopenharmony_ci } 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci if (mac->link_state >= MAC80211_LINKED) { 4162306a36Sopenharmony_ci if (mac->opmode == NL80211_IFTYPE_ADHOC) { 4262306a36Sopenharmony_ci undec_sm_pwdb = rtlpriv->dm.entry_min_undec_sm_pwdb; 4362306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 4462306a36Sopenharmony_ci "AP Client PWDB = 0x%lx\n", 4562306a36Sopenharmony_ci undec_sm_pwdb); 4662306a36Sopenharmony_ci } else { 4762306a36Sopenharmony_ci undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb; 4862306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 4962306a36Sopenharmony_ci "STA Default Port PWDB = 0x%lx\n", 5062306a36Sopenharmony_ci undec_sm_pwdb); 5162306a36Sopenharmony_ci } 5262306a36Sopenharmony_ci } else { 5362306a36Sopenharmony_ci undec_sm_pwdb = rtlpriv->dm.entry_min_undec_sm_pwdb; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 5662306a36Sopenharmony_ci "AP Ext Port PWDB = 0x%lx\n", 5762306a36Sopenharmony_ci undec_sm_pwdb); 5862306a36Sopenharmony_ci } 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) { 6162306a36Sopenharmony_ci rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1; 6262306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 6362306a36Sopenharmony_ci "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n"); 6462306a36Sopenharmony_ci } else if ((undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) && 6562306a36Sopenharmony_ci (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL1)) { 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1; 6862306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 6962306a36Sopenharmony_ci "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n"); 7062306a36Sopenharmony_ci } else if (undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) { 7162306a36Sopenharmony_ci rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; 7262306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 7362306a36Sopenharmony_ci "TXHIGHPWRLEVEL_NORMAL\n"); 7462306a36Sopenharmony_ci } 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci if ((rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl)) { 7762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 7862306a36Sopenharmony_ci "PHY_SetTxPowerLevel8192S() Channel = %d\n", 7962306a36Sopenharmony_ci rtlphy->current_channel); 8062306a36Sopenharmony_ci rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel); 8162306a36Sopenharmony_ci } 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl; 8462306a36Sopenharmony_ci} 85