diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192se/hw.c')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192se/hw.c | 68 | 
1 files changed, 31 insertions, 37 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c index 4f461786a7e..1c7101bcd79 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c @@ -251,7 +251,7 @@ void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  			u8 e_aci = *val;  			rtl92s_dm_init_edca_turbo(hw); -			if (rtlpci->acm_method != eAcmWay2_SW) +			if (rtlpci->acm_method != EACMWAY2_SW)  				rtlpriv->cfg->ops->set_hw_reg(hw,  						 HW_VAR_ACM_CTRL,  						 &e_aci); @@ -413,20 +413,18 @@ void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  					(u8 *)(&fw_current_inps));  			rtlpriv->cfg->ops->set_hw_reg(hw,  					HW_VAR_H2C_FW_PWRMODE, -					(u8 *)(&ppsc->fwctrl_psmode)); +					&ppsc->fwctrl_psmode); -			rtlpriv->cfg->ops->set_hw_reg(hw, -					HW_VAR_SET_RPWM, -					(u8 *)(&rpwm_val)); +			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, +						      &rpwm_val);  		} else {  			rpwm_val = 0x0C;	/* RF on */  			fw_pwrmode = FW_PS_ACTIVE_MODE;  			fw_current_inps = false;  			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, -					(u8 *)(&rpwm_val)); -			rtlpriv->cfg->ops->set_hw_reg(hw, -					HW_VAR_H2C_FW_PWRMODE, -					(u8 *)(&fw_pwrmode)); +						      &rpwm_val); +			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, +						      &fw_pwrmode);  			rtlpriv->cfg->ops->set_hw_reg(hw,  					HW_VAR_FW_PSMODE_STATUS, @@ -955,7 +953,7 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)  	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));  	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));  	u8 tmp_byte = 0; - +	unsigned long flags;  	bool rtstatus = true;  	u8 tmp_u1b;  	int err = false; @@ -967,6 +965,16 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)  	rtlpci->being_init_adapter = true; +	/* As this function can take a very long time (up to 350 ms) +	 * and can be called with irqs disabled, reenable the irqs +	 * to let the other devices continue being serviced. +	 * +	 * It is safe doing so since our own interrupts will only be enabled +	 * in a subsequent step. +	 */ +	local_save_flags(flags); +	local_irq_enable(); +  	rtlpriv->intf_ops->disable_aspm(hw);  	/* 1. MAC Initialize */ @@ -984,7 +992,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)  		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,  			 "Failed to download FW. Init HW without FW now... "  			 "Please copy FW into /lib/firmware/rtlwifi\n"); -		return 1; +		err = 1; +		goto exit;  	}  	/* After FW download, we have to reset MAC register */ @@ -997,7 +1006,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)  	/* 3. Initialize MAC/PHY Config by MACPHY_reg.txt */  	if (!rtl92s_phy_mac_config(hw)) {  		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "MAC Config failed\n"); -		return rtstatus; +		err = rtstatus; +		goto exit;  	}  	/* because last function modify RCR, so we update @@ -1016,7 +1026,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)  	/* 4. Initialize BB After MAC Config PHY_reg.txt, AGC_Tab.txt */  	if (!rtl92s_phy_bb_config(hw)) {  		RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, "BB Config failed\n"); -		return rtstatus; +		err = rtstatus; +		goto exit;  	}  	/* 5. Initiailze RF RAIO_A.txt RF RAIO_B.txt */ @@ -1033,7 +1044,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)  	if (!rtl92s_phy_rf_config(hw)) {  		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "RF Config failed\n"); -		return rtstatus; +		err = rtstatus; +		goto exit;  	}  	/* After read predefined TXT, we must set BB/MAC/RF @@ -1122,8 +1134,9 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)  	rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_ON);  	rtl92s_dm_init(hw); +exit: +	local_irq_restore(flags);  	rtlpci->being_init_adapter = false; -  	return err;  } @@ -1135,12 +1148,13 @@ void rtl92se_set_mac_addr(struct rtl_io *io, const u8 *addr)  void rtl92se_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw); -	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); -	u32 reg_rcr = rtlpci->receive_config; +	u32 reg_rcr;  	if (rtlpriv->psc.rfpwr_state != ERFON)  		return; +	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *)(®_rcr)); +  	if (check_bssid) {  		reg_rcr |= (RCR_CBSSID);  		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, (u8 *)(®_rcr)); @@ -2530,23 +2544,3 @@ void rtl92se_resume(struct ieee80211_hw *hw)  		pci_write_config_dword(rtlpci->pdev, 0x40,  			val & 0xffff00ff);  } - -/* Turn on AAP (RCR:bit 0) for promicuous mode. */ -void rtl92se_allow_all_destaddr(struct ieee80211_hw *hw, -				bool allow_all_da, bool write_into_reg) -{ -	struct rtl_priv *rtlpriv = rtl_priv(hw); -	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); - -	if (allow_all_da) /* Set BIT0 */ -		rtlpci->receive_config |= RCR_AAP; -	else /* Clear BIT0 */ -		rtlpci->receive_config &= ~RCR_AAP; - -	if (write_into_reg) -		rtl_write_dword(rtlpriv, RCR, rtlpci->receive_config); - -	RT_TRACE(rtlpriv, COMP_TURBO | COMP_INIT, DBG_LOUD, -		 "receive_config=0x%08X, write_into_reg=%d\n", -		 rtlpci->receive_config, write_into_reg); -}  | 
