diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/ps.c')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/ps.c | 97 | 
1 files changed, 16 insertions, 81 deletions
diff --git a/drivers/net/wireless/rtlwifi/ps.c b/drivers/net/wireless/rtlwifi/ps.c index 39b0297ce925..a693feffbe72 100644 --- a/drivers/net/wireless/rtlwifi/ps.c +++ b/drivers/net/wireless/rtlwifi/ps.c @@ -68,6 +68,7 @@ bool rtl_ps_disable_nic(struct ieee80211_hw *hw)  	/*<2> Disable Interrupt */  	rtlpriv->cfg->ops->disable_interrupt(hw); +	tasklet_kill(&rtlpriv->works.irq_tasklet);  	/*<3> Disable Adapter */  	rtlpriv->cfg->ops->hw_disable(hw); @@ -78,65 +79,18 @@ EXPORT_SYMBOL(rtl_ps_disable_nic);  bool rtl_ps_set_rf_state(struct ieee80211_hw *hw,  			 enum rf_pwrstate state_toset, -			 u32 changesource, bool protect_or_not) +			 u32 changesource)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); -	enum rf_pwrstate rtstate;  	bool actionallowed = false; -	u16 rfwait_cnt = 0; -	unsigned long flag; - -	/*protect_or_not = true; */ - -	if (protect_or_not) -		goto no_protect; - -	/* -	 *Only one thread can change -	 *the RF state at one time, and others -	 *should wait to be executed. -	 */ -	while (true) { -		spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag); -		if (ppsc->rfchange_inprogress) { -			spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, -					       flag); - -			RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, -				 ("RF Change in progress!" -				  "Wait to set..state_toset(%d).\n", -				  state_toset)); - -			/* Set RF after the previous action is done.  */ -			while (ppsc->rfchange_inprogress) { -				rfwait_cnt++; -				mdelay(1); - -				/* -				 *Wait too long, return false to avoid -				 *to be stuck here. -				 */ -				if (rfwait_cnt > 100) -					return false; -			} -		} else { -			ppsc->rfchange_inprogress = true; -			spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, -					       flag); -			break; -		} -	} - -no_protect: -	rtstate = ppsc->rfpwr_state;  	switch (state_toset) {  	case ERFON:  		ppsc->rfoff_reason &= (~changesource);  		if ((changesource == RF_CHANGE_BY_HW) && -		    (ppsc->hwradiooff == true)) { +		    (ppsc->hwradiooff)) {  			ppsc->hwradiooff = false;  		} @@ -172,12 +126,6 @@ no_protect:  	if (actionallowed)  		rtlpriv->cfg->ops->set_rf_power_state(hw, state_toset); -	if (!protect_or_not) { -		spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag); -		ppsc->rfchange_inprogress = false; -		spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag); -	} -  	return actionallowed;  }  EXPORT_SYMBOL(rtl_ps_set_rf_state); @@ -200,8 +148,7 @@ static void _rtl_ps_inactive_ps(struct ieee80211_hw *hw)  		}  	} -	rtl_ps_set_rf_state(hw, ppsc->inactive_pwrstate, -			    RF_CHANGE_BY_IPS, false); +	rtl_ps_set_rf_state(hw, ppsc->inactive_pwrstate, RF_CHANGE_BY_IPS);  	if (ppsc->inactive_pwrstate == ERFOFF &&  	    rtlhal->interface == INTF_PCI) { @@ -289,12 +236,11 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)  	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));  	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));  	enum rf_pwrstate rtstate; -	unsigned long flags;  	if (mac->opmode != NL80211_IFTYPE_STATION)  		return; -	spin_lock_irqsave(&rtlpriv->locks.ips_lock, flags); +	spin_lock(&rtlpriv->locks.ips_lock);  	if (ppsc->inactiveps) {  		rtstate = ppsc->rfpwr_state; @@ -310,7 +256,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)  		}  	} -	spin_unlock_irqrestore(&rtlpriv->locks.ips_lock, flags); +	spin_unlock(&rtlpriv->locks.ips_lock);  }  /*for FW LPS*/ @@ -428,7 +374,6 @@ void rtl_lps_enter(struct ieee80211_hw *hw)  	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));  	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));  	struct rtl_priv *rtlpriv = rtl_priv(hw); -	unsigned long flag;  	if (!ppsc->fwctrl_lps)  		return; @@ -449,7 +394,7 @@ void rtl_lps_enter(struct ieee80211_hw *hw)  	if (mac->link_state != MAC80211_LINKED)  		return; -	spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag); +	spin_lock(&rtlpriv->locks.lps_lock);  	/* Idle for a while if we connect to AP a while ago. */  	if (mac->cnt_after_linked >= 2) { @@ -461,7 +406,7 @@ void rtl_lps_enter(struct ieee80211_hw *hw)  		}  	} -	spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag); +	spin_unlock(&rtlpriv->locks.lps_lock);  }  /*Leave the leisure power save mode.*/ @@ -470,9 +415,8 @@ void rtl_lps_leave(struct ieee80211_hw *hw)  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));  	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); -	unsigned long flag; -	spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag); +	spin_lock(&rtlpriv->locks.lps_lock);  	if (ppsc->fwctrl_lps) {  		if (ppsc->dot11_psmode != EACTIVE) { @@ -493,7 +437,7 @@ void rtl_lps_leave(struct ieee80211_hw *hw)  			rtl_lps_set_psmode(hw, EACTIVE);  		}  	} -	spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag); +	spin_unlock(&rtlpriv->locks.lps_lock);  }  /* For sw LPS*/ @@ -582,7 +526,6 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw)  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));  	struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); -	unsigned long flag;  	if (!rtlpriv->psc.swctrl_lps)  		return; @@ -595,9 +538,9 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw)  		RT_CLEAR_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM);  	} -	spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag); -	rtl_ps_set_rf_state(hw, ERFON, RF_CHANGE_BY_PS, false); -	spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag); +	spin_lock(&rtlpriv->locks.lps_lock); +	rtl_ps_set_rf_state(hw, ERFON, RF_CHANGE_BY_PS); +	spin_unlock(&rtlpriv->locks.lps_lock);  }  void rtl_swlps_rfon_wq_callback(void *data) @@ -614,7 +557,6 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));  	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); -	unsigned long flag;  	u8 sleep_intv;  	if (!rtlpriv->psc.sw_ps_enabled) @@ -631,16 +573,9 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)  	if (rtlpriv->link_info.busytraffic)  		return; -	spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag); -	if (rtlpriv->psc.rfchange_inprogress) { -		spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag); -		return; -	} -	spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag); - -	spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag); -	rtl_ps_set_rf_state(hw, ERFSLEEP, RF_CHANGE_BY_PS, false); -	spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag); +	spin_lock(&rtlpriv->locks.lps_lock); +	rtl_ps_set_rf_state(hw, ERFSLEEP, RF_CHANGE_BY_PS); +	spin_unlock(&rtlpriv->locks.lps_lock);  	if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM &&  		!RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) {  |