/* * Return: * 0: Leave OK * -1: Timeout * -2: Other error */ int32_t LPS_RF_ON_check(struct rtl_priv *rtlpriv, uint32_t delay_ms) { uint32_t start_time; uint8_t bAwake = _FALSE; int32_t err = 0; start_time = jiffies; while (1) { rtw_hal_get_hwreg(rtlpriv, HW_VAR_FWLPS_RF_ON, &bAwake); if (_TRUE == bAwake) break; if (_TRUE == rtlpriv->bSurpriseRemoved) { err = -2; DBG_871X("%s: device surprise removed!!\n", __FUNCTION__); break; } if (rtw_get_passing_time_ms(start_time) > delay_ms) { err = -1; DBG_871X("%s: Wait for FW LPS leave more than %u ms!!!\n", __FUNCTION__, delay_ms); break; } rtw_usleep_os(100); } return err; }
void _rtw_udelay_os(int us, const char *func, const int line) { #if 0 if(us > 1000) { DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, us); rtw_usleep_os(us); return; } #endif DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, us); #if defined(PLATFORM_LINUX) udelay((unsigned long)us); #elif defined(PLATFORM_WINDOWS) NdisStallExecution(us); //(us) #endif }
/* * Return: * 0: Leave OK * -1: Timeout * -2: Other error */ int32_t LPS_RF_ON_check(struct rtl_priv *rtlpriv, uint32_t delay_ms) { uint32_t start_time; uint8_t bAwake = false; int32_t err = 0; start_time = jiffies; while (1) { rtlpriv->cfg->ops->get_hw_reg(rtlpriv, HW_VAR_FWLPS_RF_ON, &bAwake); if (true == bAwake) break; if (true == rtlpriv->bSurpriseRemoved) { err = -2; RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, "%s: device surprise removed!!\n", __FUNCTION__); break; } if (rtw_get_passing_time_ms(start_time) > delay_ms) { err = -1; RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, "%s: Wait for FW LPS leave more than %u ms!!!\n", __FUNCTION__, delay_ms); break; } rtw_usleep_os(100); } return err; }
/* * General use */ static u8 fw_cmd(PADAPTER pAdapter, u32 cmd) { int pollingcnts = 50; rtw_write32(pAdapter, IOCMD_CTRL_REG, cmd); rtw_usleep_os(100); while ((0 != rtw_read32(pAdapter, IOCMD_CTRL_REG)) && (pollingcnts > 0)) { pollingcnts--; rtw_usleep_os(10); } if (pollingcnts == 0) { RT_TRACE(_module_rtl871x_mp_c_, _drv_err_, ("!!fw_cmd timeout ........\n")); return _FALSE; } return _TRUE; }
VOID ODM_sleep_us(IN u4Byte us) { #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) rtw_usleep_os(us); #elif(DM_ODM_SUPPORT_TYPE & ODM_MP) #endif }
void ODM_sleep_us(u32 us) { #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) rtw_usleep_os(us); #elif(DM_ODM_SUPPORT_TYPE & ODM_MP) #endif }
static u8 fw_iocmd_write(PADAPTER pAdapter, IOCMD_STRUCT iocmd, u32 value) { u32 cmd32 = 0; u8 iocmd_class = iocmd.cmdclass; u32 iocmd_value = iocmd.value; u8 iocmd_idx = iocmd.index; fw_cmd_data(pAdapter, &value, 0); rtw_usleep_os(100); cmd32 = (iocmd_class << 24) | (iocmd_value << 8) | iocmd_idx ; return fw_cmd(pAdapter, cmd32); }
void rtw_lps_leave(struct rtw_adapter *padapter) { #define LPS_LEAVE_TIMEOUT_MS 100 struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; u32 start_time; bool bAwake = false; #ifdef CONFIG_CONCURRENT_MODE if (padapter->iface_type != IFACE_PORT0) return; /* Skip power saving for concurrent mode port 1 */ #endif if (pwrpriv->bLeisurePs) { if (pwrpriv->pwr_mode != PS_MODE_ACTIVE) { rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0); if (pwrpriv->pwr_mode == PS_MODE_ACTIVE) { start_time = rtw_get_current_time(); while (1) { rtw_hal_get_hwreg(padapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bAwake)); if (bAwake || padapter->bSurpriseRemoved) break; if (rtw_get_passing_time_ms(start_time) > LPS_LEAVE_TIMEOUT_MS) { DBG_8192D ("Wait for FW LPS leave more than %u ms!!!\n", LPS_LEAVE_TIMEOUT_MS); break; } rtw_usleep_os(100); } } } } }
void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode) { struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); #endif //CONFIG_P2P #ifdef CONFIG_TDLS struct sta_priv *pstapriv = &padapter->stapriv; _irqL irqL; int i, j; _list *plist, *phead; struct sta_info *ptdls_sta; #endif //CONFIG_TDLS _func_enter_; RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, ("%s: PowerMode=%d Smart_PS=%d\n", __FUNCTION__, ps_mode, smart_ps)); if(ps_mode > PM_Card_Disable) { RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("ps_mode:%d error\n", ps_mode)); return; } if (pwrpriv->pwr_mode == ps_mode) { if (PS_MODE_ACTIVE == ps_mode) return; if ((pwrpriv->smart_ps == smart_ps) && (pwrpriv->bcn_ant_mode == bcn_ant_mode)) { return; } } #ifdef CONFIG_LPS_LCLK _enter_pwrlock(&pwrpriv->lock); #endif //if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) if(ps_mode == PS_MODE_ACTIVE) { #ifdef CONFIG_P2P_PS if(pwdinfo->opp_ps == 0) #endif //CONFIG_P2P_PS { DBG_871X("rtw_set_ps_mode: Leave 802.11 power save\n"); #ifdef CONFIG_TDLS _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); for(i=0; i< NUM_STA; i++) { phead = &(pstapriv->sta_hash[i]); plist = get_next(phead); while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { ptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list); if( ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE ) issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta, 0); plist = get_next(plist); } } _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); #endif //CONFIG_TDLS pwrpriv->pwr_mode = ps_mode; rtw_set_rpwm(padapter, PS_STATE_S4); #ifdef CONFIG_WOWLAN if (padapter->pwrctrlpriv.wowlan_mode == _TRUE) { u32 start_time, delay_ms; u8 val8; delay_ms = 20; start_time = rtw_get_current_time(); do { val8 = rtw_read8(padapter, 0x90); if (!(val8 & BIT(0))) break; if (rtw_get_passing_time_ms(start_time) > delay_ms) { DBG_871X("%s: Wait for FW 32K leave more than %u ms!!!\n", __FUNCTION__, delay_ms); break; } rtw_usleep_os(100); } while (1); pwrpriv->cpwm = PS_STATE_S4; } #endif rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); pwrpriv->bFwCurrentInPSMode = _FALSE; } }
// // Description: Leave all power save mode: LPS, FwLPS, IPS if needed. // Move code to function by tynli. 2010.03.26. // void LeaveAllPowerSaveMode(IN PADAPTER Adapter) { struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); u32 LPSLeaveTimeOut = 10000; //u32 IPSLeaveTimeOut = 10000; _func_enter_; //DBG_8192C("%s.....\n",__FUNCTION__); if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { //connect #ifdef CONFIG_P2P p2p_ps_wk_cmd(Adapter, P2P_PS_DISABLE, 0); #endif //CONFIG_P2P #ifdef CONFIG_LPS //DBG_8192C("==> leave LPS.......\n"); LPS_Leave(Adapter); if (Adapter->pwrctrlpriv.bLeisurePs) { BOOLEAN bAwake = _TRUE; Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bAwake)); while(!bAwake) { rtw_usleep_os(100); LPSLeaveTimeOut--; if(LPSLeaveTimeOut <= 0) { DBG_8192C("Wait for FW LPS leave too long!!! LPSLeaveTimeOut = %d\n", LPSLeaveTimeOut ); break; } Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bAwake)); } } #endif } else { if(Adapter->pwrctrlpriv.rf_pwrstate== rf_off) { #ifdef CONFIG_AUTOSUSPEND if(Adapter->registrypriv.usbss_enable) { #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) usb_disable_autosuspend(Adapter->dvobjpriv.pusbdev); #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) Adapter->dvobjpriv.pusbdev->autosuspend_disabled = Adapter->bDisableAutosuspend;//autosuspend disabled by the user #endif } else #endif { /* #ifdef CONFIG_IPS if(_FALSE == ips_leave(Adapter)) { DBG_8192C("======> ips_leave fail.............\n"); } #endif */ } } } _func_exit_; }