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 "reg.h" 762306a36Sopenharmony_ci#include "def.h" 862306a36Sopenharmony_ci#include "phy.h" 962306a36Sopenharmony_ci#include "dm.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_civoid rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw) 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 1462306a36Sopenharmony_ci struct rtl_phy *rtlphy = &(rtlpriv->phy); 1562306a36Sopenharmony_ci struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1662306a36Sopenharmony_ci long undec_sm_pwdb; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci if (!rtlpriv->dm.dynamic_txpower_enable) 1962306a36Sopenharmony_ci return; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci if (rtlpriv->dm.dm_flag & HAL_DM_HIPWR_DISABLE) { 2262306a36Sopenharmony_ci rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; 2362306a36Sopenharmony_ci return; 2462306a36Sopenharmony_ci } 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci if ((mac->link_state < MAC80211_LINKED) && 2762306a36Sopenharmony_ci (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) { 2862306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE, 2962306a36Sopenharmony_ci "Not connected to any\n"); 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL; 3462306a36Sopenharmony_ci return; 3562306a36Sopenharmony_ci } 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci if (mac->link_state >= MAC80211_LINKED) { 3862306a36Sopenharmony_ci if (mac->opmode == NL80211_IFTYPE_ADHOC) { 3962306a36Sopenharmony_ci undec_sm_pwdb = rtlpriv->dm.entry_min_undec_sm_pwdb; 4062306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 4162306a36Sopenharmony_ci "AP Client PWDB = 0x%lx\n", 4262306a36Sopenharmony_ci undec_sm_pwdb); 4362306a36Sopenharmony_ci } else { 4462306a36Sopenharmony_ci undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb; 4562306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 4662306a36Sopenharmony_ci "STA Default Port PWDB = 0x%lx\n", 4762306a36Sopenharmony_ci undec_sm_pwdb); 4862306a36Sopenharmony_ci } 4962306a36Sopenharmony_ci } else { 5062306a36Sopenharmony_ci undec_sm_pwdb = rtlpriv->dm.entry_min_undec_sm_pwdb; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 5362306a36Sopenharmony_ci "AP Ext Port PWDB = 0x%lx\n", 5462306a36Sopenharmony_ci undec_sm_pwdb); 5562306a36Sopenharmony_ci } 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) { 5862306a36Sopenharmony_ci rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1; 5962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 6062306a36Sopenharmony_ci "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n"); 6162306a36Sopenharmony_ci } else if ((undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) && 6262306a36Sopenharmony_ci (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL1)) { 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1; 6562306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 6662306a36Sopenharmony_ci "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n"); 6762306a36Sopenharmony_ci } else if (undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) { 6862306a36Sopenharmony_ci rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; 6962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 7062306a36Sopenharmony_ci "TXHIGHPWRLEVEL_NORMAL\n"); 7162306a36Sopenharmony_ci } 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci if ((rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl)) { 7462306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 7562306a36Sopenharmony_ci "PHY_SetTxPowerLevel8192S() Channel = %d\n", 7662306a36Sopenharmony_ci rtlphy->current_channel); 7762306a36Sopenharmony_ci rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel); 7862306a36Sopenharmony_ci if (rtlpriv->dm.dynamic_txhighpower_lvl == 7962306a36Sopenharmony_ci TXHIGHPWRLEVEL_NORMAL) 8062306a36Sopenharmony_ci dm_restorepowerindex(hw); 8162306a36Sopenharmony_ci else if (rtlpriv->dm.dynamic_txhighpower_lvl == 8262306a36Sopenharmony_ci TXHIGHPWRLEVEL_LEVEL1) 8362306a36Sopenharmony_ci dm_writepowerindex(hw, 0x14); 8462306a36Sopenharmony_ci else if (rtlpriv->dm.dynamic_txhighpower_lvl == 8562306a36Sopenharmony_ci TXHIGHPWRLEVEL_LEVEL2) 8662306a36Sopenharmony_ci dm_writepowerindex(hw, 0x10); 8762306a36Sopenharmony_ci } 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl; 9062306a36Sopenharmony_ci} 91