FILE
rtl8723b_dm.c
File preview with syntax highlighting.
linux-6.19.14/drivers/staging/rtl8723bs/hal/rtl8723b_dm.c
1// SPDX-License-Identifier: GPL-2.0 2/****************************************************************************** 3 * 4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. 5 * 6 ******************************************************************************/ 7/* Description: */ 8/* This file is for 92CE/92CU dynamic mechanism only */ 9 10#include <drv_types.h> 11#include <rtl8723b_hal.h> 12 13/* Global var */ 14 15/* */ 16/* functions */ 17/* */ 18static void Init_ODM_ComInfo_8723b(struct adapter *Adapter) 19{ 20 21 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 22 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv; 23 struct dm_priv *pdmpriv = &pHalData->dmpriv; 24 u8 cut_ver, fab_ver; 25 26 /* */ 27 /* Init Value */ 28 /* */ 29 memset(pDM_Odm, 0, sizeof(*pDM_Odm)); 30 31 pDM_Odm->Adapter = Adapter; 32#define ODM_CE 0x04 33 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PLATFORM, ODM_CE); 34 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, RTW_SDIO); 35 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType); 36 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8723B); 37 38 fab_ver = ODM_TSMC; 39 cut_ver = ODM_CUT_A; 40 41 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_FAB_VER, fab_ver); 42 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_CUT_VER, cut_ver); 43 44 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID); 45 /* ODM_CMNINFO_BINHCT_TEST only for MP Team */ 46 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, Adapter->registrypriv.wifi_spec); 47 48 pdmpriv->InitODMFlag = ODM_RF_CALIBRATION|ODM_RF_TX_PWR_TRACK; 49 50 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag); 51} 52 53static void Update_ODM_ComInfo_8723b(struct adapter *Adapter) 54{ 55 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; 56 struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; 57 struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter); 58 struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter); 59 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 60 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv; 61 struct dm_priv *pdmpriv = &pHalData->dmpriv; 62 int i; 63 u8 zero = 0; 64 65 pdmpriv->InitODMFlag = 0 66 | ODM_BB_DIG 67 | ODM_BB_RA_MASK 68 | ODM_BB_DYNAMIC_TXPWR 69 | ODM_BB_FA_CNT 70 | ODM_BB_RSSI_MONITOR 71 | ODM_BB_CCK_PD 72 | ODM_BB_PWR_SAVE 73 | ODM_BB_CFO_TRACKING 74 | ODM_MAC_EDCA_TURBO 75 | ODM_RF_TX_PWR_TRACK 76 | ODM_RF_CALIBRATION 77 ; 78 79 /* */ 80 /* Pointer reference */ 81 /* */ 82 /* ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D */ 83 /* ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u8_temp)); */ 84 85 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag); 86 87 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes)); 88 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes)); 89 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_WM_MODE, &(pmlmeext->cur_wireless_mode)); 90 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC)); 91 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(Adapter->securitypriv.dot11PrivacyAlgrthm)); 92 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->CurrentChannelBW)); 93 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->CurrentChannel)); 94 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(Adapter->net_closed)); 95 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MP_MODE, &zero); 96 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb)); 97 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate)); 98 99 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess)); 100 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctrlpriv->bpower_saving)); 101 102 103 for (i = 0; i < NUM_STA; i++) 104 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL); 105} 106 107void rtl8723b_InitHalDm(struct adapter *Adapter) 108{ 109 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 110 struct dm_priv *pdmpriv = &pHalData->dmpriv; 111 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv; 112 113 pdmpriv->DM_Type = DM_Type_ByDriver; 114 pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; 115 116 pdmpriv->DMFlag |= DYNAMIC_FUNC_BT; 117 118 pdmpriv->InitDMFlag = pdmpriv->DMFlag; 119 120 Update_ODM_ComInfo_8723b(Adapter); 121 122 ODM_DMInit(pDM_Odm); 123} 124 125void rtl8723b_HalDmWatchDog(struct adapter *Adapter) 126{ 127 bool fw_current_in_ps_mode = false; 128 bool bFwPSAwake = true; 129 u8 hw_init_completed = false; 130 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 131 132 hw_init_completed = Adapter->hw_init_completed; 133 134 if (hw_init_completed == false) 135 goto skip_dm; 136 137 fw_current_in_ps_mode = adapter_to_pwrctl(Adapter)->fw_current_in_ps_mode; 138 rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake)); 139 140 if ( 141 (hw_init_completed == true) && 142 ((!fw_current_in_ps_mode) && bFwPSAwake) 143 ) { 144 rtw_hal_check_rxfifo_full(Adapter); 145 } 146 147 /* ODM */ 148 if (hw_init_completed == true) { 149 u8 bLinked = false; 150 u8 bsta_state = false; 151 bool bBtDisabled = true; 152 153 if (rtw_linked_check(Adapter)) { 154 bLinked = true; 155 if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE)) 156 bsta_state = true; 157 } 158 159 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked); 160 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state); 161 162 /* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */ 163 164 bBtDisabled = hal_btcoex_IsBtDisabled(Adapter); 165 166 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, 167 !bBtDisabled); 168 169 ODM_DMWatchdog(&pHalData->odmpriv); 170 } 171 172skip_dm: 173 return; 174} 175 176void rtl8723b_hal_dm_in_lps(struct adapter *padapter) 177{ 178 u32 PWDB_rssi = 0; 179 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 180 struct hal_com_data *pHalData = GET_HAL_DATA(padapter); 181 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv; 182 struct sta_priv *pstapriv = &padapter->stapriv; 183 struct sta_info *psta = NULL; 184 185 /* update IGI */ 186 ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min); 187 188 189 /* set rssi to fw */ 190 psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); 191 if (psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0)) { 192 PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16)); 193 194 rtl8723b_set_rssi_cmd(padapter, (u8 *)&PWDB_rssi); 195 } 196 197} 198 199void rtl8723b_HalDmWatchDog_in_LPS(struct adapter *Adapter) 200{ 201 u8 bLinked = false; 202 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 203 struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; 204 struct dm_priv *pdmpriv = &pHalData->dmpriv; 205 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv; 206 struct dig_t *pDM_DigTable = &pDM_Odm->DM_DigTable; 207 struct sta_priv *pstapriv = &Adapter->stapriv; 208 struct sta_info *psta = NULL; 209 210 if (Adapter->hw_init_completed == false) 211 goto skip_lps_dm; 212 213 214 if (rtw_linked_check(Adapter)) 215 bLinked = true; 216 217 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked); 218 219 if (bLinked == false) 220 goto skip_lps_dm; 221 222 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR)) 223 goto skip_lps_dm; 224 225 226 /* ODM_DMWatchdog(&pHalData->odmpriv); */ 227 /* Do DIG by RSSI In LPS-32K */ 228 229 /* 1 Find MIN-RSSI */ 230 psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); 231 if (!psta) 232 goto skip_lps_dm; 233 234 pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; 235 236 if (pdmpriv->EntryMinUndecoratedSmoothedPWDB <= 0) 237 goto skip_lps_dm; 238 239 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB; 240 241 pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM; 242 243 /* if (pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min) */ 244 if ( 245 (pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) || 246 (pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5) 247 ) 248 rtw_dm_in_lps_wk_cmd(Adapter); 249 250 251skip_lps_dm: 252 253 return; 254 255} 256 257void rtl8723b_init_dm_priv(struct adapter *Adapter) 258{ 259 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 260 struct dm_priv *pdmpriv = &pHalData->dmpriv; 261 262 memset(pdmpriv, 0, sizeof(struct dm_priv)); 263 Init_ODM_ComInfo_8723b(Adapter); 264}
~/
Read-only file preview.