diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8188ee/hw.c')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8188ee/hw.c | 149 | 
1 files changed, 68 insertions, 81 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c b/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c index b68cae3024f..b14cf5a10f4 100644 --- a/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c @@ -41,7 +41,6 @@  #include "fw.h"  #include "led.h"  #include "hw.h" -#include "pwrseqcmd.h"  #include "pwrseq.h"  #define LLT_CONFIG		5 @@ -143,12 +142,12 @@ static void _rtl88ee_set_fw_clock_on(struct ieee80211_hw *hw,  		} else {  			rtlhal->fw_clk_change_in_progress = false;  			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); +			break;  		}  	}  	if (IS_IN_LOW_POWER_STATE_88E(rtlhal->fw_ps_state)) { -		rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM, -					      (u8 *)(&rpwm_val)); +		rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM, &rpwm_val);  		if (FW_PS_IS_ACK(rpwm_val)) {  			isr_regaddr = REG_HISR;  			content = rtl_read_dword(rtlpriv, isr_regaddr); @@ -225,7 +224,7 @@ static void _rtl88ee_set_fw_clock_off(struct ieee80211_hw *hw,  			rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);  			rtl_write_word(rtlpriv, REG_HISR, 0x0100);  			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, -						      (u8 *)(&rpwm_val)); +						      &rpwm_val);  			spin_lock_bh(&rtlpriv->locks.fw_ps_lock);  			rtlhal->fw_clk_change_in_progress = false;  			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); @@ -273,15 +272,14 @@ static void _rtl88ee_fwlps_leave(struct ieee80211_hw *hw)  		_rtl88ee_set_fw_clock_on(hw, rpwm_val, false);  		rtlhal->allow_sw_to_change_hwclc = false;  		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, -					      (u8 *)(&fw_pwrmode)); +					      &fw_pwrmode);  		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,  					      (u8 *)(&fw_current_inps));  	} else {  		rpwm_val = FW_PS_STATE_ALL_ON_88E;	/* RF on */ -		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);  		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, -					      (u8 *)(&fw_pwrmode)); +					      &fw_pwrmode);  		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,  					      (u8 *)(&fw_current_inps));  	} @@ -300,7 +298,7 @@ static void _rtl88ee_fwlps_enter(struct ieee80211_hw *hw)  		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,  					      (u8 *)(&fw_current_inps));  		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, -					      (u8 *)(&ppsc->fwctrl_psmode)); +					      &ppsc->fwctrl_psmode);  		rtlhal->allow_sw_to_change_hwclc = true;  		_rtl88ee_set_fw_clock_off(hw, rpwm_val);  	} else { @@ -308,9 +306,8 @@ static void _rtl88ee_fwlps_enter(struct ieee80211_hw *hw)  		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,  					      (u8 *)(&fw_current_inps));  		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, -					      (u8 *)(&ppsc->fwctrl_psmode)); -		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, -					      (u8 *)(&rpwm_val)); +					      &ppsc->fwctrl_psmode); +		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, &rpwm_val);  	}  } @@ -419,12 +416,12 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		for (e_aci = 0; e_aci < AC_MAX; e_aci++) {  			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM, -						      (u8 *)(&e_aci)); +						      &e_aci);  		}  		break; }  	case HW_VAR_ACK_PREAMBLE:{  		u8 reg_tmp; -		u8 short_preamble = (bool) (*(u8 *)val); +		u8 short_preamble = (bool)*val;  		reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL+2);  		if (short_preamble) {  			reg_tmp |= 0x02; @@ -435,13 +432,13 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *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_AMPDU_MIN_SPACE:{  		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; @@ -464,7 +461,7 @@ void rtl88ee_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, @@ -482,7 +479,7 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		reg = regtoset_normal; -		factor = *((u8 *)val); +		factor = *val;  		if (factor <= 3) {  			factor = (1 << (factor + 2));  			if (factor > 0xf) @@ -505,15 +502,15 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		}  		break; }  	case HW_VAR_AC_PARAM:{ -		u8 e_aci = *((u8 *)val); +		u8 e_aci = *val;  		rtl88e_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, -						      (u8 *)(&e_aci)); +						      &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; @@ -566,7 +563,7 @@ void rtl88ee_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 | @@ -579,7 +576,7 @@ void rtl88ee_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:  		rtl88e_phy_set_io_cmd(hw, (*(enum io_type *)val)); @@ -591,15 +588,13 @@ void rtl88ee_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: -		rtl88e_set_fw_pwrmode_cmd(hw, (*(u8 *)val)); +		rtl88e_set_fw_pwrmode_cmd(hw, *val);  		break;  	case HW_VAR_FW_PSMODE_STATUS:  		ppsc->fw_current_inpsmode = *((bool *)val); @@ -616,7 +611,7 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  			_rtl88ee_fwlps_leave(hw);  		 break; }  	case HW_VAR_H2C_FW_JOINBSSRPT:{ -		u8 mstatus = (*(u8 *)val); +		u8 mstatus = *val;  		u8 tmp, tmp_reg422, uval;  		u8 count = 0, dlbcn_count = 0;  		bool recover = false; @@ -667,10 +662,10 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  			}  			rtl_write_byte(rtlpriv, REG_CR + 1, (tmp & ~(BIT(0))));  		} -		rtl88e_set_fw_joinbss_report_cmd(hw, (*(u8 *)val)); +		rtl88e_set_fw_joinbss_report_cmd(hw, *val);  		break; }  	case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: -		rtl88e_set_p2p_ps_offload_cmd(hw, (*(u8 *)val)); +		rtl88e_set_p2p_ps_offload_cmd(hw, *val);  		break;  	case HW_VAR_AID:{  		u16 u2btmp; @@ -680,7 +675,7 @@ void rtl88ee_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)  			_rtl88ee_stop_tx_beacon(hw); @@ -814,11 +809,11 @@ static bool _rtl88ee_init_mac(struct ieee80211_hw *hw)  	rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);  	/* HW Power on sequence */ -	if (!rtl88_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, -					PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, -					Rtl8188E_NIC_ENABLE_FLOW)) { +	if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, +				      PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, +				      Rtl8188E_NIC_ENABLE_FLOW)) {  		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, -			 "init MAC Fail as rtl88_hal_pwrseqcmdparsing\n"); +			 "init MAC Fail as rtl_hal_pwrseqcmdparsing\n");  		return false;  	} @@ -1024,9 +1019,20 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)  	bool rtstatus = true;  	int err = 0;  	u8 tmp_u1b, u1byte; +	unsigned long flags;  	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Rtl8188EE hw init\n");  	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);  	tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CLKR+1); @@ -1042,7 +1048,7 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)  	if (rtstatus != true) {  		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");  		err = 1; -		return err; +		goto exit;  	}  	err = rtl88e_download_fw(hw, false); @@ -1050,8 +1056,7 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)  		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;  	} @@ -1096,7 +1101,7 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)  	if (ppsc->rfpwr_state == ERFON) {  		if ((rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) ||  		    ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) && -		    (rtlhal->oem_id == RT_CID_819x_HP))) { +		    (rtlhal->oem_id == RT_CID_819X_HP))) {  			rtl88e_phy_set_rfpath_switch(hw, true);  			rtlpriv->dm.fat_table.rx_idle_ant = MAIN_ANT;  		} else { @@ -1134,10 +1139,12 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)  	}  	rtl_write_byte(rtlpriv, REG_NAV_CTRL+2,  ((30000+127)/128));  	rtl88e_dm_init(hw); +exit: +	local_irq_restore(flags);  	rtlpriv->rtlhal.being_init_adapter = false;  	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "end of Rtl8188EE hw init %x\n",  		 err); -	return 0; +	return err;  }  static enum version_8188e _rtl88ee_read_chip_version(struct ieee80211_hw *hw) @@ -1234,12 +1241,13 @@ static int _rtl88ee_set_media_status(struct ieee80211_hw *hw,  void rtl88ee_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, @@ -1344,9 +1352,9 @@ static void _rtl88ee_poweroff_adapter(struct ieee80211_hw *hw)  	}  	rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG+1, 0xFF); -	rtl88_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, -				   PWR_INTF_PCI_MSK, -				   Rtl8188E_NIC_LPS_ENTER_FLOW); +	rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, +				 PWR_INTF_PCI_MSK, +				 Rtl8188E_NIC_LPS_ENTER_FLOW);  	rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); @@ -1360,8 +1368,8 @@ static void _rtl88ee_poweroff_adapter(struct ieee80211_hw *hw)  	u1b_tmp = rtl_read_byte(rtlpriv, REG_32K_CTRL);  	rtl_write_byte(rtlpriv, REG_32K_CTRL, (u1b_tmp & (~BIT(0)))); -	rtl88_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, -				   PWR_INTF_PCI_MSK, Rtl8188E_NIC_DISABLE_FLOW); +	rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, +				 PWR_INTF_PCI_MSK, Rtl8188E_NIC_DISABLE_FLOW);  	u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);  	rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3)))); @@ -1815,7 +1823,7 @@ static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)  	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,  		 "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);  	/*customer ID*/ -	rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID]; +	rtlefuse->eeprom_oemid = hwinfo[EEPROM_CUSTOMER_ID];  	if (rtlefuse->eeprom_oemid == 0xFF)  		rtlefuse->eeprom_oemid = 0; @@ -1832,7 +1840,7 @@ static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)  	RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,  		 "dev_addr: %pM\n", rtlefuse->dev_addr);  	/*channel plan */ -	rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN]; +	rtlefuse->eeprom_channelplan = hwinfo[EEPROM_CHANNELPLAN];  	/* set channel paln to world wide 13 */  	rtlefuse->channel_plan = COUNTRY_CODE_WORLD_WIDE_13;  	/*tx power*/ @@ -1844,7 +1852,7 @@ static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)  						 rtlefuse->autoload_failflag,  						 hwinfo);  	/*board type*/ -	rtlefuse->board_type = (((*(u8 *)&hwinfo[jj]) & 0xE0) >> 5); +	rtlefuse->board_type = (hwinfo[jj] & 0xE0) >> 5;  	/*Wake on wlan*/  	rtlefuse->wowlan_enable = ((hwinfo[kk] & 0x40) >> 6);  	/*parse xtal*/ @@ -1871,15 +1879,15 @@ static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)  		case EEPROM_CID_DEFAULT:  			if (rtlefuse->eeprom_did == 0x8179) {  				if (rtlefuse->eeprom_svid == 0x1025) { -					rtlhal->oem_id = RT_CID_819x_Acer; +					rtlhal->oem_id = RT_CID_819X_ACER;  				} else if ((rtlefuse->eeprom_svid == 0x10EC &&  					    rtlefuse->eeprom_smid == 0x0179) ||  					    (rtlefuse->eeprom_svid == 0x17AA &&  					    rtlefuse->eeprom_smid == 0x0179)) { -					rtlhal->oem_id = RT_CID_819x_Lenovo; +					rtlhal->oem_id = RT_CID_819X_LENOVO;  				} else if (rtlefuse->eeprom_svid == 0x103c &&  					 rtlefuse->eeprom_smid == 0x197d) { -					rtlhal->oem_id = RT_CID_819x_HP; +					rtlhal->oem_id = RT_CID_819X_HP;  				} else {  					rtlhal->oem_id = RT_CID_DEFAULT;  				} @@ -1891,7 +1899,7 @@ static void _rtl88ee_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: @@ -1910,14 +1918,14 @@ static void _rtl88ee_hal_customized_behavior(struct ieee80211_hw *hw)  	pcipriv->ledctl.led_opendrain = true;  	switch (rtlhal->oem_id) { -	case RT_CID_819x_HP: +	case RT_CID_819X_HP:  		pcipriv->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; @@ -2210,8 +2218,7 @@ void rtl88ee_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 @@ -2508,23 +2515,3 @@ void rtl88ee_suspend(struct ieee80211_hw *hw)  void rtl88ee_resume(struct ieee80211_hw *hw)  {  } - -/* Turn on AAP (RCR:bit 0) for promicuous mode. */ -void rtl88ee_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); -}  | 
