From 30ba4de6ef5c08aa0b1d7598d8893ad9f77e26d7 Mon Sep 17 00:00:00 2001 From: Maxim Buzdalov Date: Thu, 22 Aug 2019 02:02:40 +0300 Subject: [PATCH] Enable power management (hopefully). I mean, it does not crash, but I have no hardware to tell whether the output power actually changes. --- hal/rtl8192e/rtl8192e_dm.c | 6 ++--- hal/rtl8192e/rtl8192e_phycfg.c | 27 +++++++------------ include/hal_data.h | 1 + os_dep/linux/ioctl_cfg80211.c | 49 +++++++++++++--------------------- 4 files changed, 32 insertions(+), 51 deletions(-) diff --git a/hal/rtl8192e/rtl8192e_dm.c b/hal/rtl8192e/rtl8192e_dm.c index 6b6e4af..29e659a 100644 --- a/hal/rtl8192e/rtl8192e_dm.c +++ b/hal/rtl8192e/rtl8192e_dm.c @@ -460,16 +460,16 @@ void rtl8192e_init_dm_priv(IN PADAPTER Adapter) PDM_ODM_T podmpriv = &pHalData->odmpriv; //_rtw_spinlock_init(&(pHalData->odm_stainfo_lock)); Init_ODM_ComInfo_8192e(Adapter); - ODM_InitAllTimers(podmpriv ); + ODM_InitAllTimers(podmpriv); PHYDM_InitDebugSetting(podmpriv); - + pHalData->CurrentTxPwrIdx = 20; } void rtl8192e_deinit_dm_priv(IN PADAPTER Adapter) { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); PDM_ODM_T podmpriv = &pHalData->odmpriv; - //_rtw_spinlock_free(&pHalData->odm_stainfo_lock); + //_rtw_spinlock_free(&pHalData->odm_stainfo_lock); ODM_CancelAllTimers(podmpriv); } diff --git a/hal/rtl8192e/rtl8192e_phycfg.c b/hal/rtl8192e/rtl8192e_phycfg.c index aff074b..bdde0bb 100644 --- a/hal/rtl8192e/rtl8192e_phycfg.c +++ b/hal/rtl8192e/rtl8192e_phycfg.c @@ -503,17 +503,8 @@ PHY_GetTxPowerLevel8192E( OUT s32* powerlevel ) { -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - s4Byte TxPwrDbm = 13; - RT_TRACE(COMP_TXAGC, DBG_LOUD, ("PHY_GetTxPowerLevel8192E(): TxPowerLevel: %#x\n", TxPwrDbm)); - - if ( pMgntInfo->ClientConfigPwrInDbm != UNSPECIFIED_PWR_DBM ) - *powerlevel = pMgntInfo->ClientConfigPwrInDbm; - else - *powerlevel = TxPwrDbm; -#endif + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + *powerlevel = pHalData->CurrentTxPwrIdx; } VOID @@ -683,29 +674,29 @@ PHY_GetTxPowerIndex_8192E( //DBG_871X("===> PHY_GetTxPowerIndex_8192E\n"); txPower = (s8) PHY_GetTxPowerIndexBase( pAdapter,RFPath, Rate, BandWidth, Channel, &bIn24G ); - + powerDiffByRate = PHY_GetTxPowerByRate( pAdapter, BAND_ON_2_4G, RFPath, txNum, Rate ); limit = PHY_GetTxPowerLimit( pAdapter, pAdapter->registrypriv.RegPwrTblSel, (u8)(!bIn24G), pHalData->CurrentChannelBW, RFPath, Rate, pHalData->CurrentChannel); tpt_offset = PHY_GetTxPowerTrackingOffset( pAdapter, RFPath, Rate ); -#if defined(DBG_TX_POWER_IDX) +#if defined(DBG_TX_POWER_IDX) DBG_871X("%s (RF-%c, Channel: %d, BW:0x%02x ,Rate:0x%02x) \n==> txPower= (0x%02x),powerDiffByRate= (0x%02x),limit= (0x%02x),tpt_offset=(0x%02x)\n", __FUNCTION__,((RFPath==0)?'A':'B'), Channel,BandWidth,Rate,txPower,powerDiffByRate,limit,tpt_offset); #endif powerDiffByRate = powerDiffByRate > limit ? limit : powerDiffByRate; txPower += powerDiffByRate; - txPower += tpt_offset; + txPower += pHalData->CurrentTxPwrIdx - 20; + if (txPower > RF6052_MAX_TX_PWR) txPower = RF6052_MAX_TX_PWR; + if (txPower > MAX_POWER_INDEX) txPower = MAX_POWER_INDEX; - if(txPower > MAX_POWER_INDEX) - txPower = MAX_POWER_INDEX; -#if defined(DBG_TX_POWER_IDX) +#if defined(DBG_TX_POWER_IDX) DBG_871X("Final Tx Power(RF-%c, Channel: %d) = %d(0x%X)\n\n", ((RFPath==0)?'A':'B'), Channel, txPower, txPower); #endif - return (u8)txPower; + return (u8)txPower; } VOID diff --git a/include/hal_data.h b/include/hal_data.h index 235c0ea..67cc43f 100644 --- a/include/hal_data.h +++ b/include/hal_data.h @@ -402,6 +402,7 @@ typedef struct hal_com_data u8 CurrentOfdm24GTxPwrIdx; u8 CurrentBW2024GTxPwrIdx; u8 CurrentBW4024GTxPwrIdx; + u8 CurrentTxPwrIdx; // Read/write are allow for following hardware information variables u8 pwrGroupCnt; diff --git a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c index dbd6899..8e2f1d7 100644 --- a/os_dep/linux/ioctl_cfg80211.c +++ b/os_dep/linux/ioctl_cfg80211.c @@ -46,6 +46,7 @@ #endif /* Linux kernel >= 4.7.0 */ #include +#include #define RTW_MAX_MGMT_TX_CNT (8) #define RTW_MAX_MGMT_TX_MS_GAS (500) @@ -3464,39 +3465,28 @@ static int cfg80211_rtw_set_txpower(struct wiphy *wiphy, struct wireless_dev *wdev, #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) || defined(COMPAT_KERNEL_RELEASE) - enum nl80211_tx_power_setting type, int mbm) + enum nl80211_tx_power_setting type, #else - enum tx_power_setting type, int dbm) + enum tx_power_setting type, #endif + int value) { -#if 0 - struct iwm_priv *iwm = wiphy_to_iwm(wiphy); - int ret; + _adapter *padapter = wiphy_to_adapter(wiphy); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) || defined(COMPAT_KERNEL_RELEASE) + value /= 100; +#endif - switch (type) { - case NL80211_TX_POWER_AUTOMATIC: + if (value < 0) value = 0; + if (value > 20) value = 20; + + if (type == NL80211_TX_POWER_FIXED) { + pHalData->CurrentTxPwrIdx = value; + rtw_hal_set_tx_power_level(padapter, pHalData->CurrentChannel); return 0; - case NL80211_TX_POWER_FIXED: - if (mbm < 0 || (mbm % 100)) - return -EOPNOTSUPP; - - if (!test_bit(IWM_STATUS_READY, &iwm->status)) - return 0; - - ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, - CFG_TX_PWR_LIMIT_USR, - MBM_TO_DBM(mbm) * 2); - if (ret < 0) - return ret; - - return iwm_tx_power_trigger(iwm); - default: - IWM_ERR(iwm, "Unsupported power type: %d\n", type); + } else { return -EOPNOTSUPP; } -#endif - DBG_8192C("%s\n", __func__); - return 0; } static int cfg80211_rtw_get_txpower(struct wiphy *wiphy, @@ -3505,10 +3495,9 @@ static int cfg80211_rtw_get_txpower(struct wiphy *wiphy, #endif int *dbm) { - DBG_8192C("%s\n", __func__); - - *dbm = (12); - + _adapter *padapter = wiphy_to_adapter(wiphy); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + *dbm = pHalData->CurrentTxPwrIdx; return 0; }