diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192cu/hw.c')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 37 | 
1 files changed, 26 insertions, 11 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c index 189ba124a8c..a903c2671b4 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c @@ -394,7 +394,7 @@ static void _rtl92cu_read_adapter_info(struct ieee80211_hw *hw)  			if (rtlefuse->eeprom_did == 0x8176) {  				if ((rtlefuse->eeprom_svid == 0x103C &&  				     rtlefuse->eeprom_smid == 0x1629)) -					rtlhal->oem_id = RT_CID_819x_HP; +					rtlhal->oem_id = RT_CID_819X_HP;  				else  					rtlhal->oem_id = RT_CID_DEFAULT;  			} else { @@ -405,7 +405,7 @@ static void _rtl92cu_read_adapter_info(struct ieee80211_hw *hw)  			rtlhal->oem_id = RT_CID_TOSHIBA;  			break;  		case EEPROM_CID_QMI: -			rtlhal->oem_id = RT_CID_819x_QMI; +			rtlhal->oem_id = RT_CID_819X_QMI;  			break;  		case EEPROM_CID_WHQL:  		default: @@ -423,14 +423,14 @@ static void _rtl92cu_hal_customized_behavior(struct ieee80211_hw *hw)  	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));  	switch (rtlhal->oem_id) { -	case RT_CID_819x_HP: +	case RT_CID_819X_HP:  		usb_priv->ledctl.led_opendrain = true;  		break; -	case RT_CID_819x_Lenovo: +	case RT_CID_819X_LENOVO:  	case RT_CID_DEFAULT:  	case RT_CID_TOSHIBA:  	case RT_CID_CCX: -	case RT_CID_819x_Acer: +	case RT_CID_819X_ACER:  	case RT_CID_WHQL:  	default:  		break; @@ -511,7 +511,7 @@ static int _rtl92cu_init_power_on(struct ieee80211_hw *hw)  			pr_info("MAC auto ON okay!\n");  			break;  		} -		if (pollingCount++ > 100) { +		if (pollingCount++ > 1000) {  			RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,  				 "Failed to polling REG_APS_FSMCO[APFM_ONMAC] done!\n");  			return -ENODEV; @@ -985,19 +985,30 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw)  	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));  	int err = 0;  	static bool iqk_initialized; +	unsigned long flags; + +	/* 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();  	rtlhal->hw_type = HARDWARE_TYPE_RTL8192CU;  	err = _rtl92cu_init_mac(hw);  	if (err) {  		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "init mac failed!\n"); -		return err; +		goto exit;  	}  	err = rtl92c_download_fw(hw);  	if (err) {  		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,  			 "Failed to download FW. Init HW without FW now..\n");  		err = 1; -		return err; +		goto exit;  	}  	rtlhal->last_hmeboxnum = 0; /* h2c */  	_rtl92cu_phy_param_tab_init(hw); @@ -1022,7 +1033,7 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw)  	if (ppsc->rfpwr_state == ERFON) {  		rtl92c_phy_set_rfpath_switch(hw, 1);  		if (iqk_initialized) { -			rtl92c_phy_iq_calibrate(hw, false); +			rtl92c_phy_iq_calibrate(hw, true);  		} else {  			rtl92c_phy_iq_calibrate(hw, false);  			iqk_initialized = true; @@ -1034,6 +1045,8 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw)  	_InitPABias(hw);  	_update_mac_setting(hw);  	rtl92c_dm_init(hw); +exit: +	local_irq_restore(flags);  	return err;  } @@ -1379,11 +1392,13 @@ void rtl92cu_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct rtl_hal *rtlhal = rtl_hal(rtlpriv); -	u32 reg_rcr = rtl_read_dword(rtlpriv, REG_RCR); +	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) {  		u8 tmp;  		if (IS_NORMAL_CHIP(rtlhal->version)) { @@ -1795,7 +1810,7 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  					  e_aci);  				break;  			} -			if (rtlusb->acm_method != eAcmWay2_SW) +			if (rtlusb->acm_method != EACMWAY2_SW)  				rtlpriv->cfg->ops->set_hw_reg(hw,  					 HW_VAR_ACM_CTRL, &e_aci);  			break;  | 
