diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8723ae/hw.c')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8723ae/hw.c | 148 | 
1 files changed, 67 insertions, 81 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c index c333dfd116b..87f69166a7e 100644 --- a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c @@ -38,10 +38,11 @@  #include "def.h"  #include "phy.h"  #include "dm.h" +#include "../rtl8723com/dm_common.h"  #include "fw.h" +#include "../rtl8723com/fw_common.h"  #include "led.h"  #include "hw.h" -#include "pwrseqcmd.h"  #include "pwrseq.h"  #include "btc.h" @@ -206,14 +207,13 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		rtl_write_byte(rtlpriv, REG_SLOT, val[0]);  		for (e_aci = 0; e_aci < AC_MAX; e_aci++) { -			rtlpriv->cfg->ops->set_hw_reg(hw, -						      HW_VAR_AC_PARAM, -						      (u8 *) (&e_aci)); +			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM, +						      &e_aci);  		}  		break; }  	case HW_VAR_ACK_PREAMBLE:{  		u8 reg_tmp; -		u8 short_preamble = (bool) (*(u8 *) val); +		u8 short_preamble = (bool)*val;  		reg_tmp = (mac->cur_40_prime_sc) << 5;  		if (short_preamble)  			reg_tmp |= 0x80; @@ -224,7 +224,7 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		u8 min_spacing_to_set;  		u8 sec_min_space; -		min_spacing_to_set = *((u8 *) val); +		min_spacing_to_set = *val;  		if (min_spacing_to_set <= 7) {  			sec_min_space = 0; @@ -248,7 +248,7 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  	case HW_VAR_SHORTGI_DENSITY:{  		u8 density_to_set; -		density_to_set = *((u8 *) val); +		density_to_set = *val;  		mac->min_space_cfg |= (density_to_set << 3);  		RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, @@ -272,7 +272,7 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		else  			p_regtoset = regtoset_normal; -		factor_toset = *((u8 *) val); +		factor_toset = *val;  		if (factor_toset <= 3) {  			factor_toset = (1 << (factor_toset + 2));  			if (factor_toset > 0xf) @@ -303,16 +303,15 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		}  		break; }  	case HW_VAR_AC_PARAM:{ -		u8 e_aci = *((u8 *) val); -		rtl8723ae_dm_init_edca_turbo(hw); +		u8 e_aci = *val; +		rtl8723_dm_init_edca_turbo(hw); -		if (rtlpci->acm_method != eAcmWay2_SW) -			rtlpriv->cfg->ops->set_hw_reg(hw, -						      HW_VAR_ACM_CTRL, -						      (u8 *) (&e_aci)); +		if (rtlpci->acm_method != EACMWAY2_SW) +			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACM_CTRL, +						      &e_aci);  		break; }  	case HW_VAR_ACM_CTRL:{ -		u8 e_aci = *((u8 *) val); +		u8 e_aci = *val;  		union aci_aifsn *p_aci_aifsn =  		    (union aci_aifsn *)(&(mac->ac[0].aifs));  		u8 acm = p_aci_aifsn->f.acm; @@ -365,7 +364,7 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		rtlpci->receive_config = ((u32 *) (val))[0];  		break;  	case HW_VAR_RETRY_LIMIT:{ -		u8 retry_limit = ((u8 *) (val))[0]; +		u8 retry_limit = *val;  		rtl_write_word(rtlpriv, REG_RL,  			       retry_limit << RETRY_LIMIT_SHORT_SHIFT | @@ -378,13 +377,13 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		rtlefuse->efuse_usedbytes = *((u16 *) val);  		break;  	case HW_VAR_EFUSE_USAGE: -		rtlefuse->efuse_usedpercentage = *((u8 *) val); +		rtlefuse->efuse_usedpercentage = *val;  		break;  	case HW_VAR_IO_CMD:  		rtl8723ae_phy_set_io_cmd(hw, (*(enum io_type *)val));  		break;  	case HW_VAR_WPA_CONFIG: -		rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *) val)); +		rtl_write_byte(rtlpriv, REG_SECCFG, *val);  		break;  	case HW_VAR_SET_RPWM:{  		u8 rpwm_val; @@ -393,27 +392,25 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		udelay(1);  		if (rpwm_val & BIT(7)) { -			rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, -				       (*(u8 *) val)); +			rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, *val);  		} else { -			rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, -				       ((*(u8 *) val) | BIT(7))); +			rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, *val | BIT(7));  		}  		break; }  	case HW_VAR_H2C_FW_PWRMODE:{ -		u8 psmode = (*(u8 *) val); +		u8 psmode = *val;  		if (psmode != FW_PS_ACTIVE_MODE)  			rtl8723ae_dm_rf_saving(hw, true); -		rtl8723ae_set_fw_pwrmode_cmd(hw, (*(u8 *) val)); +		rtl8723ae_set_fw_pwrmode_cmd(hw, *val);  		break; }  	case HW_VAR_FW_PSMODE_STATUS:  		ppsc->fw_current_inpsmode = *((bool *) val);  		break;  	case HW_VAR_H2C_FW_JOINBSSRPT:{ -		u8 mstatus = (*(u8 *) val); +		u8 mstatus = *val;  		u8 tmp_regcr, tmp_reg422;  		bool recover = false; @@ -446,11 +443,11 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  			rtl_write_byte(rtlpriv, REG_CR + 1,  				       (tmp_regcr & ~(BIT(0))));  		} -		rtl8723ae_set_fw_joinbss_report_cmd(hw, (*(u8 *) val)); +		rtl8723ae_set_fw_joinbss_report_cmd(hw, *val);  		break; }  	case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: -		rtl8723ae_set_p2p_ps_offload_cmd(hw, (*(u8 *)val)); +		rtl8723ae_set_p2p_ps_offload_cmd(hw, *val);  		break;  	case HW_VAR_AID:{  		u16 u2btmp; @@ -460,7 +457,7 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  				mac->assoc_id));  		break; }  	case HW_VAR_CORRECT_TSF:{ -		u8 btype_ibss = ((u8 *) (val))[0]; +		u8 btype_ibss = *val;  		if (btype_ibss == true)  			_rtl8723ae_stop_tx_beacon(hw); @@ -490,20 +487,18 @@ void rtl8723ae_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, @@ -880,23 +875,33 @@ int rtl8723ae_hw_init(struct ieee80211_hw *hw)  	bool rtstatus = true;  	int err;  	u8 tmp_u1b; +	unsigned long flags;  	rtlpriv->rtlhal.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);  	rtstatus = _rtl8712e_init_mac(hw);  	if (rtstatus != true) {  		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");  		err = 1; -		return err; +		goto exit;  	} -	err = rtl8723ae_download_fw(hw); +	err = rtl8723_download_fw(hw, false);  	if (err) {  		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,  			 "Failed to download FW. Init HW without FW now..\n");  		err = 1; -		rtlhal->fw_ready = false; -		return err; +		goto exit;  	} else {  		rtlhal->fw_ready = true;  	} @@ -971,6 +976,8 @@ int rtl8723ae_hw_init(struct ieee80211_hw *hw)  		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "under 1.5V\n");  	}  	rtl8723ae_dm_init(hw); +exit: +	local_irq_restore(flags);  	rtlpriv->rtlhal.being_init_adapter = false;  	return err;  } @@ -1112,12 +1119,13 @@ static int _rtl8723ae_set_media_status(struct ieee80211_hw *hw,  void rtl8723ae_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 == true) {  		reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);  		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, @@ -1153,7 +1161,7 @@ void rtl8723ae_set_qos(struct ieee80211_hw *hw, int aci)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw); -	rtl8723ae_dm_init_edca_turbo(hw); +	rtl8723_dm_init_edca_turbo(hw);  	switch (aci) {  	case AC1_BK:  		rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f); @@ -1614,10 +1622,10 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,  	rtl8723ae_read_bt_coexist_info_from_hwpg(hw,  			rtlefuse->autoload_failflag, hwinfo); -	rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN]; +	rtlefuse->eeprom_channelplan = hwinfo[EEPROM_CHANNELPLAN];  	rtlefuse->eeprom_version = *(u16 *)&hwinfo[EEPROM_VERSION];  	rtlefuse->txpwr_fromeprom = true; -	rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID]; +	rtlefuse->eeprom_oemid = hwinfo[EEPROM_CUSTOMER_ID];  	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,  		 "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid); @@ -1655,7 +1663,7 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,  				    CHK_SVID_SMID(0x10EC, 0x9185))  					rtlhal->oem_id = RT_CID_TOSHIBA;  				else if (rtlefuse->eeprom_svid == 0x1025) -					rtlhal->oem_id = RT_CID_819x_Acer; +					rtlhal->oem_id = RT_CID_819X_ACER;  				else if (CHK_SVID_SMID(0x10EC, 0x6191) ||  					 CHK_SVID_SMID(0x10EC, 0x6192) ||  					 CHK_SVID_SMID(0x10EC, 0x6193) || @@ -1665,7 +1673,7 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,  					 CHK_SVID_SMID(0x10EC, 0x8191) ||  					 CHK_SVID_SMID(0x10EC, 0x8192) ||  					 CHK_SVID_SMID(0x10EC, 0x8193)) -					rtlhal->oem_id = RT_CID_819x_SAMSUNG; +					rtlhal->oem_id = RT_CID_819X_SAMSUNG;  				else if (CHK_SVID_SMID(0x10EC, 0x8195) ||  					 CHK_SVID_SMID(0x10EC, 0x9195) ||  					 CHK_SVID_SMID(0x10EC, 0x7194) || @@ -1673,24 +1681,24 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,  					 CHK_SVID_SMID(0x10EC, 0x8201) ||  					 CHK_SVID_SMID(0x10EC, 0x8202) ||  					 CHK_SVID_SMID(0x10EC, 0x9200)) -					rtlhal->oem_id = RT_CID_819x_Lenovo; +					rtlhal->oem_id = RT_CID_819X_LENOVO;  				else if (CHK_SVID_SMID(0x10EC, 0x8197) ||  					 CHK_SVID_SMID(0x10EC, 0x9196)) -					rtlhal->oem_id = RT_CID_819x_CLEVO; +					rtlhal->oem_id = RT_CID_819X_CLEVO;  				else if (CHK_SVID_SMID(0x1028, 0x8194) ||  					 CHK_SVID_SMID(0x1028, 0x8198) ||  					 CHK_SVID_SMID(0x1028, 0x9197) ||  					 CHK_SVID_SMID(0x1028, 0x9198)) -					rtlhal->oem_id = RT_CID_819x_DELL; +					rtlhal->oem_id = RT_CID_819X_DELL;  				else if (CHK_SVID_SMID(0x103C, 0x1629)) -					rtlhal->oem_id = RT_CID_819x_HP; +					rtlhal->oem_id = RT_CID_819X_HP;  				else if (CHK_SVID_SMID(0x1A32, 0x2315)) -					rtlhal->oem_id = RT_CID_819x_QMI; +					rtlhal->oem_id = RT_CID_819X_QMI;  				else if (CHK_SVID_SMID(0x10EC, 0x8203)) -					rtlhal->oem_id = RT_CID_819x_PRONETS; +					rtlhal->oem_id = RT_CID_819X_PRONETS;  				else if (CHK_SVID_SMID(0x1043, 0x84B5))  					rtlhal->oem_id = -						 RT_CID_819x_Edimax_ASUS; +						 RT_CID_819X_EDIMAX_ASUS;  				else  					rtlhal->oem_id = RT_CID_DEFAULT;  			} else if (rtlefuse->eeprom_did == 0x8178) { @@ -1712,12 +1720,12 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,  				    CHK_SVID_SMID(0x10EC, 0x9185))  					rtlhal->oem_id = RT_CID_TOSHIBA;  				else if (rtlefuse->eeprom_svid == 0x1025) -					rtlhal->oem_id = RT_CID_819x_Acer; +					rtlhal->oem_id = RT_CID_819X_ACER;  				else if (CHK_SVID_SMID(0x10EC, 0x8186)) -					rtlhal->oem_id = RT_CID_819x_PRONETS; +					rtlhal->oem_id = RT_CID_819X_PRONETS;  				else if (CHK_SVID_SMID(0x1043, 0x8486))  					rtlhal->oem_id = -						     RT_CID_819x_Edimax_ASUS; +						     RT_CID_819X_EDIMAX_ASUS;  				else  					rtlhal->oem_id = RT_CID_DEFAULT;  			} else { @@ -1731,7 +1739,7 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,  			rtlhal->oem_id = RT_CID_CCX;  			break;  		case EEPROM_CID_QMI: -			rtlhal->oem_id = RT_CID_819x_QMI; +			rtlhal->oem_id = RT_CID_819X_QMI;  			break;  		case EEPROM_CID_WHQL:  				break; @@ -2037,8 +2045,7 @@ void rtl8723ae_update_channel_access_setting(struct ieee80211_hw *hw)  	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));  	u16 sifs_timer; -	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME, -				      (u8 *)&mac->slot_time); +	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME, &mac->slot_time);  	if (!mac->ht_enable)  		sifs_timer = 0x0a0a;  	else @@ -2376,24 +2383,3 @@ void rtl8723ae_suspend(struct ieee80211_hw *hw)  void rtl8723ae_resume(struct ieee80211_hw *hw)  {  } - -/* Turn on AAP (RCR:bit 0) for promicuous mode. */ -void rtl8723ae_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, REG_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); -}  | 
