diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192cu')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/dm.c | 9 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/dm.h | 3 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 37 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/mac.c | 193 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/phy.c | 77 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/rf.c | 29 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/rf.h | 13 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | 23 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/table.c | 40 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/trx.c | 15 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/trx.h | 2 | 
11 files changed, 125 insertions, 316 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c b/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c index 16a0b9e59ac..c16209a336e 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c @@ -101,6 +101,15 @@ void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw)  			 "PHY_SetTxPowerLevel8192S() Channel = %d\n",  			 rtlphy->current_channel);  		rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel); +		if (rtlpriv->dm.dynamic_txhighpower_lvl == +		    TXHIGHPWRLEVEL_NORMAL) +			dm_restorepowerindex(hw); +		else if (rtlpriv->dm.dynamic_txhighpower_lvl == +			 TXHIGHPWRLEVEL_LEVEL1) +			dm_writepowerindex(hw, 0x14); +		else if (rtlpriv->dm.dynamic_txhighpower_lvl == +			 TXHIGHPWRLEVEL_LEVEL2) +			dm_writepowerindex(hw, 0x10);  	}  	rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl; diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/dm.h b/drivers/net/wireless/rtlwifi/rtl8192cu/dm.h index d947e7d350b..fafa6bac2a3 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/dm.h +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/dm.h @@ -30,3 +30,6 @@  #include "../rtl8192ce/dm.h"  void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw); +void dm_savepowerindex(struct ieee80211_hw *hw); +void dm_writepowerindex(struct ieee80211_hw *hw, u8 value); +void dm_restorepowerindex(struct ieee80211_hw *hw); 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; diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c index da4f587199e..e26312fb435 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c @@ -32,6 +32,7 @@  #include "../usb.h"  #include "../ps.h"  #include "../cam.h" +#include "../stats.h"  #include "reg.h"  #include "def.h"  #include "phy.h" @@ -738,16 +739,6 @@ static u8 _rtl92c_evm_db_to_percentage(char value)  	return ret_val;  } -static long _rtl92c_translate_todbm(struct ieee80211_hw *hw, -				     u8 signal_strength_index) -{ -	long signal_power; - -	signal_power = (long)((signal_strength_index + 1) >> 1); -	signal_power -= 95; -	return signal_power; -} -  static long _rtl92c_signal_scale_mapping(struct ieee80211_hw *hw,  		long currsig)  { @@ -778,7 +769,7 @@ static long _rtl92c_signal_scale_mapping(struct ieee80211_hw *hw,  static void _rtl92c_query_rxphystatus(struct ieee80211_hw *hw,  				      struct rtl_stats *pstats, -				      struct rx_desc_92c *pdesc, +				      struct rx_desc_92c *p_desc,  				      struct rx_fwinfo_92c *p_drvinfo,  				      bool packet_match_bssid,  				      bool packet_toself, @@ -793,11 +784,11 @@ static void _rtl92c_query_rxphystatus(struct ieee80211_hw *hw,  	u32 rssi, total_rssi = 0;  	bool in_powersavemode = false;  	bool is_cck_rate; +	u8 *pdesc = (u8 *)p_desc; -	is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc); +	is_cck_rate = RX_HAL_IS_CCK_RATE(p_desc);  	pstats->packet_matchbssid = packet_match_bssid;  	pstats->packet_toself = packet_toself; -	pstats->is_cck = is_cck_rate;  	pstats->packet_beacon = packet_beacon;  	pstats->is_cck = is_cck_rate;  	pstats->RX_SIGQ[0] = -1; @@ -913,180 +904,6 @@ static void _rtl92c_query_rxphystatus(struct ieee80211_hw *hw,  			  (hw, total_rssi /= rf_rx_num));  } -static void _rtl92c_process_ui_rssi(struct ieee80211_hw *hw, -		struct rtl_stats *pstats) -{ -	struct rtl_priv *rtlpriv = rtl_priv(hw); -	struct rtl_phy *rtlphy = &(rtlpriv->phy); -	u8 rfpath; -	u32 last_rssi, tmpval; - -	if (pstats->packet_toself || pstats->packet_beacon) { -		rtlpriv->stats.rssi_calculate_cnt++; -		if (rtlpriv->stats.ui_rssi.total_num++ >= -		    PHY_RSSI_SLID_WIN_MAX) { -			rtlpriv->stats.ui_rssi.total_num = -			    PHY_RSSI_SLID_WIN_MAX; -			last_rssi = -			    rtlpriv->stats.ui_rssi.elements[rtlpriv-> -							   stats.ui_rssi.index]; -			rtlpriv->stats.ui_rssi.total_val -= last_rssi; -		} -		rtlpriv->stats.ui_rssi.total_val += pstats->signalstrength; -		rtlpriv->stats.ui_rssi.elements[rtlpriv->stats.ui_rssi. -					index++] = pstats->signalstrength; -		if (rtlpriv->stats.ui_rssi.index >= PHY_RSSI_SLID_WIN_MAX) -			rtlpriv->stats.ui_rssi.index = 0; -		tmpval = rtlpriv->stats.ui_rssi.total_val / -		    rtlpriv->stats.ui_rssi.total_num; -		rtlpriv->stats.signal_strength = -		    _rtl92c_translate_todbm(hw, (u8) tmpval); -		pstats->rssi = rtlpriv->stats.signal_strength; -	} -	if (!pstats->is_cck && pstats->packet_toself) { -		for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath; -		     rfpath++) { -			if (!rtl8192_phy_check_is_legal_rfpath(hw, rfpath)) -				continue; -			if (rtlpriv->stats.rx_rssi_percentage[rfpath] == 0) { -				rtlpriv->stats.rx_rssi_percentage[rfpath] = -				    pstats->rx_mimo_signalstrength[rfpath]; -			} -			if (pstats->rx_mimo_signalstrength[rfpath] > -			    rtlpriv->stats.rx_rssi_percentage[rfpath]) { -				rtlpriv->stats.rx_rssi_percentage[rfpath] = -				    ((rtlpriv->stats. -				      rx_rssi_percentage[rfpath] * -				      (RX_SMOOTH_FACTOR - 1)) + -				     (pstats->rx_mimo_signalstrength[rfpath])) / -				    (RX_SMOOTH_FACTOR); - -				rtlpriv->stats.rx_rssi_percentage[rfpath] = -				    rtlpriv->stats.rx_rssi_percentage[rfpath] + -				    1; -			} else { -				rtlpriv->stats.rx_rssi_percentage[rfpath] = -				    ((rtlpriv->stats. -				      rx_rssi_percentage[rfpath] * -				      (RX_SMOOTH_FACTOR - 1)) + -				     (pstats->rx_mimo_signalstrength[rfpath])) / -				    (RX_SMOOTH_FACTOR); -			} -		} -	} -} - -static void _rtl92c_update_rxsignalstatistics(struct ieee80211_hw *hw, -					       struct rtl_stats *pstats) -{ -	struct rtl_priv *rtlpriv = rtl_priv(hw); -	int weighting = 0; - -	if (rtlpriv->stats.recv_signal_power == 0) -		rtlpriv->stats.recv_signal_power = pstats->recvsignalpower; -	if (pstats->recvsignalpower > rtlpriv->stats.recv_signal_power) -		weighting = 5; -	else if (pstats->recvsignalpower < rtlpriv->stats.recv_signal_power) -		weighting = (-5); -	rtlpriv->stats.recv_signal_power = -	    (rtlpriv->stats.recv_signal_power * 5 + -	     pstats->recvsignalpower + weighting) / 6; -} - -static void _rtl92c_process_pwdb(struct ieee80211_hw *hw, -		struct rtl_stats *pstats) -{ -	struct rtl_priv *rtlpriv = rtl_priv(hw); -	struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); -	long undec_sm_pwdb = 0; - -	if (mac->opmode == NL80211_IFTYPE_ADHOC) { -		return; -	} else { -		undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb; -	} -	if (pstats->packet_toself || pstats->packet_beacon) { -		if (undec_sm_pwdb < 0) -			undec_sm_pwdb = pstats->rx_pwdb_all; -		if (pstats->rx_pwdb_all > (u32) undec_sm_pwdb) { -			undec_sm_pwdb = (((undec_sm_pwdb) * -			      (RX_SMOOTH_FACTOR - 1)) + -			     (pstats->rx_pwdb_all)) / (RX_SMOOTH_FACTOR); -			undec_sm_pwdb += 1; -		} else { -			undec_sm_pwdb = (((undec_sm_pwdb) * -			      (RX_SMOOTH_FACTOR - 1)) + -			     (pstats->rx_pwdb_all)) / (RX_SMOOTH_FACTOR); -		} -		rtlpriv->dm.undec_sm_pwdb = undec_sm_pwdb; -		_rtl92c_update_rxsignalstatistics(hw, pstats); -	} -} - -static void _rtl92c_process_LINK_Q(struct ieee80211_hw *hw, -					     struct rtl_stats *pstats) -{ -	struct rtl_priv *rtlpriv = rtl_priv(hw); -	u32 last_evm = 0, n_stream, tmpval; - -	if (pstats->signalquality != 0) { -		if (pstats->packet_toself || pstats->packet_beacon) { -			if (rtlpriv->stats.LINK_Q.total_num++ >= -			    PHY_LINKQUALITY_SLID_WIN_MAX) { -				rtlpriv->stats.LINK_Q.total_num = -				    PHY_LINKQUALITY_SLID_WIN_MAX; -				last_evm = -				    rtlpriv->stats.LINK_Q.elements -				    [rtlpriv->stats.LINK_Q.index]; -				rtlpriv->stats.LINK_Q.total_val -= -				    last_evm; -			} -			rtlpriv->stats.LINK_Q.total_val += -			    pstats->signalquality; -			rtlpriv->stats.LINK_Q.elements -			   [rtlpriv->stats.LINK_Q.index++] = -			    pstats->signalquality; -			if (rtlpriv->stats.LINK_Q.index >= -			    PHY_LINKQUALITY_SLID_WIN_MAX) -				rtlpriv->stats.LINK_Q.index = 0; -			tmpval = rtlpriv->stats.LINK_Q.total_val / -			    rtlpriv->stats.LINK_Q.total_num; -			rtlpriv->stats.signal_quality = tmpval; -			rtlpriv->stats.last_sigstrength_inpercent = tmpval; -			for (n_stream = 0; n_stream < 2; -			     n_stream++) { -				if (pstats->RX_SIGQ[n_stream] != -1) { -					if (!rtlpriv->stats.RX_EVM[n_stream]) { -						rtlpriv->stats.RX_EVM[n_stream] -						 = pstats->RX_SIGQ[n_stream]; -					} -					rtlpriv->stats.RX_EVM[n_stream] = -					    ((rtlpriv->stats.RX_EVM -					    [n_stream] * -					    (RX_SMOOTH_FACTOR - 1)) + -					    (pstats->RX_SIGQ -					    [n_stream] * 1)) / -					    (RX_SMOOTH_FACTOR); -				} -			} -		} -	} else { -		; -	} -} - -static void _rtl92c_process_phyinfo(struct ieee80211_hw *hw, -				     u8 *buffer, -				     struct rtl_stats *pcurrent_stats) -{ -	if (!pcurrent_stats->packet_matchbssid && -	    !pcurrent_stats->packet_beacon) -		return; -	_rtl92c_process_ui_rssi(hw, pcurrent_stats); -	_rtl92c_process_pwdb(hw, pcurrent_stats); -	_rtl92c_process_LINK_Q(hw, pcurrent_stats); -} -  void rtl92c_translate_rx_signal_stuff(struct ieee80211_hw *hw,  					       struct sk_buff *skb,  					       struct rtl_stats *pstats, @@ -1123,5 +940,5 @@ void rtl92c_translate_rx_signal_stuff(struct ieee80211_hw *hw,  	_rtl92c_query_rxphystatus(hw, pstats, pdesc, p_drvinfo,  				   packet_matchbssid, packet_toself,  				   packet_beacon); -	_rtl92c_process_phyinfo(hw, tmp_buf, pstats); +	rtl_process_phyinfo(hw, tmp_buf, pstats);  } diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c index 34e56308301..9831ff1128c 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c @@ -30,6 +30,7 @@  #include "../wifi.h"  #include "../pci.h"  #include "../ps.h" +#include "../core.h"  #include "reg.h"  #include "def.h"  #include "phy.h" @@ -120,6 +121,7 @@ bool rtl92cu_phy_bb_config(struct ieee80211_hw *hw)  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));  	u16 regval; +	u32 regval32;  	u8 b_reg_hwparafile = 1;  	_rtl92c_phy_init_bb_rf_register_definition(hw); @@ -135,8 +137,11 @@ bool rtl92cu_phy_bb_config(struct ieee80211_hw *hw)  	} else if (IS_HARDWARE_TYPE_8192CU(rtlhal)) {  		rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, FEN_USBA | FEN_USBD |  			       FEN_BB_GLB_RSTn | FEN_BBRSTB); -		rtl_write_byte(rtlpriv, REG_LDOHCI12_CTRL, 0x0f);  	} +	regval32 = rtl_read_dword(rtlpriv, 0x87c); +	rtl_write_dword(rtlpriv, 0x87c, regval32 & (~BIT(31))); +	if (IS_HARDWARE_TYPE_8192CU(rtlhal)) +		rtl_write_byte(rtlpriv, REG_LDOHCI12_CTRL, 0x0f);  	rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);  	if (b_reg_hwparafile == 1)  		rtstatus = _rtl92c_phy_bb8192c_config_parafile(hw); @@ -184,18 +189,7 @@ bool _rtl92cu_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,  	}  	if (configtype == BASEBAND_CONFIG_PHY_REG) {  		for (i = 0; i < phy_reg_arraylen; i = i + 2) { -			if (phy_regarray_table[i] == 0xfe) -				mdelay(50); -			else if (phy_regarray_table[i] == 0xfd) -				mdelay(5); -			else if (phy_regarray_table[i] == 0xfc) -				mdelay(1); -			else if (phy_regarray_table[i] == 0xfb) -				udelay(50); -			else if (phy_regarray_table[i] == 0xfa) -				udelay(5); -			else if (phy_regarray_table[i] == 0xf9) -				udelay(1); +			rtl_addr_delay(phy_regarray_table[i]);  			rtl_set_bbreg(hw, phy_regarray_table[i], MASKDWORD,  				      phy_regarray_table[i + 1]);  			udelay(1); @@ -232,18 +226,7 @@ bool _rtl92cu_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,  	phy_regarray_table_pg = rtlphy->hwparam_tables[PHY_REG_PG].pdata;  	if (configtype == BASEBAND_CONFIG_PHY_REG) {  		for (i = 0; i < phy_regarray_pg_len; i = i + 3) { -			if (phy_regarray_table_pg[i] == 0xfe) -				mdelay(50); -			else if (phy_regarray_table_pg[i] == 0xfd) -				mdelay(5); -			else if (phy_regarray_table_pg[i] == 0xfc) -				mdelay(1); -			else if (phy_regarray_table_pg[i] == 0xfb) -				udelay(50); -			else if (phy_regarray_table_pg[i] == 0xfa) -				udelay(5); -			else if (phy_regarray_table_pg[i] == 0xf9) -				udelay(1); +			rtl_addr_delay(phy_regarray_table_pg[i]);  			_rtl92c_store_pwrIndex_diffrate_offset(hw,  						  phy_regarray_table_pg[i],  						  phy_regarray_table_pg[i + 1], @@ -290,46 +273,16 @@ bool rtl92cu_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,  	switch (rfpath) {  	case RF90_PATH_A:  		for (i = 0; i < radioa_arraylen; i = i + 2) { -			if (radioa_array_table[i] == 0xfe) -				mdelay(50); -			else if (radioa_array_table[i] == 0xfd) -				mdelay(5); -			else if (radioa_array_table[i] == 0xfc) -				mdelay(1); -			else if (radioa_array_table[i] == 0xfb) -				udelay(50); -			else if (radioa_array_table[i] == 0xfa) -				udelay(5); -			else if (radioa_array_table[i] == 0xf9) -				udelay(1); -			else { -				rtl_set_rfreg(hw, rfpath, radioa_array_table[i], -					      RFREG_OFFSET_MASK, -					      radioa_array_table[i + 1]); -				udelay(1); -			} +			rtl_rfreg_delay(hw, rfpath, radioa_array_table[i], +					RFREG_OFFSET_MASK, +					radioa_array_table[i + 1]);  		}  		break;  	case RF90_PATH_B:  		for (i = 0; i < radiob_arraylen; i = i + 2) { -			if (radiob_array_table[i] == 0xfe) { -				mdelay(50); -			} else if (radiob_array_table[i] == 0xfd) -				mdelay(5); -			else if (radiob_array_table[i] == 0xfc) -				mdelay(1); -			else if (radiob_array_table[i] == 0xfb) -				udelay(50); -			else if (radiob_array_table[i] == 0xfa) -				udelay(5); -			else if (radiob_array_table[i] == 0xf9) -				udelay(1); -			else { -				rtl_set_rfreg(hw, rfpath, radiob_array_table[i], -					      RFREG_OFFSET_MASK, -					      radiob_array_table[i + 1]); -				udelay(1); -			} +			rtl_rfreg_delay(hw, rfpath, radiob_array_table[i], +					RFREG_OFFSET_MASK, +					radiob_array_table[i + 1]);  		}  		break;  	case RF90_PATH_C: @@ -340,6 +293,8 @@ bool rtl92cu_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,  		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,  			 "switch case not processed\n");  		break; +	default: +		break;  	}  	return true;  } diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c index 2119313a737..b878d56d2f4 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c @@ -85,17 +85,15 @@ void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,  	if (mac->act_scanning) {  		tx_agc[RF90_PATH_A] = 0x3f3f3f3f;  		tx_agc[RF90_PATH_B] = 0x3f3f3f3f; -		if (turbo_scanoff) { -			for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { -				tx_agc[idx1] = ppowerlevel[idx1] | -				    (ppowerlevel[idx1] << 8) | -				    (ppowerlevel[idx1] << 16) | -				    (ppowerlevel[idx1] << 24); -				if (rtlhal->interface == INTF_USB) { -					if (tx_agc[idx1] > 0x20 && -					    rtlefuse->external_pa) -						tx_agc[idx1] = 0x20; -				} +		for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { +			tx_agc[idx1] = ppowerlevel[idx1] | +			    (ppowerlevel[idx1] << 8) | +			    (ppowerlevel[idx1] << 16) | +			    (ppowerlevel[idx1] << 24); +			if (rtlhal->interface == INTF_USB) { +				if (tx_agc[idx1] > 0x20 && +				    rtlefuse->external_pa) +					tx_agc[idx1] = 0x20;  			}  		}  	} else { @@ -107,7 +105,7 @@ void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,  			   TXHIGHPWRLEVEL_LEVEL2) {  			tx_agc[RF90_PATH_A] = 0x00000000;  			tx_agc[RF90_PATH_B] = 0x00000000; -		} else{ +		} else {  			for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {  				tx_agc[idx1] = ppowerlevel[idx1] |  				    (ppowerlevel[idx1] << 8) | @@ -373,7 +371,12 @@ static void _rtl92c_write_ofdm_power_reg(struct ieee80211_hw *hw,  			    regoffset == RTXAGC_B_MCS07_MCS04)  				regoffset = 0xc98;  			for (i = 0; i < 3; i++) { -				writeVal = (writeVal > 6) ? (writeVal - 6) : 0; +				if (i != 2) +					writeVal = (writeVal > 8) ? +						   (writeVal - 8) : 0; +				else +					writeVal = (writeVal > 6) ? +						   (writeVal - 6) : 0;  				rtl_write_byte(rtlpriv, (u32)(regoffset + i),  					      (u8)writeVal);  			} diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.h b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.h index 090fd33a158..11b439d6b67 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.h +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.h @@ -34,15 +34,14 @@  #define RF6052_MAX_REG			0x3F  #define RF6052_MAX_PATH			2 -extern void rtl92cu_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, -					    u8 bandwidth); -extern void rtl92c_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, -					      u8 *ppowerlevel); -extern void rtl92c_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw, -					       u8 *ppowerlevel, u8 channel); +void rtl92cu_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth); +void rtl92c_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, +				       u8 *ppowerlevel); +void rtl92c_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw, +					u8 *ppowerlevel, u8 channel);  bool rtl92cu_phy_rf6052_config(struct ieee80211_hw *hw);  bool rtl92cu_phy_config_rf_with_headerfile(struct ieee80211_hw *hw, -					  enum radio_path rfpath); +					   enum radio_path rfpath);  void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,  					u8 *ppowerlevel);  void rtl92cu_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw, diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c index 2bd59852621..361435f8608 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c @@ -31,6 +31,7 @@  #include "../core.h"  #include "../usb.h"  #include "../efuse.h" +#include "../base.h"  #include "reg.h"  #include "def.h"  #include "phy.h" @@ -49,6 +50,9 @@ MODULE_AUTHOR("Larry Finger	<Larry.Finger@lwfinger.net>");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless");  MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin"); +MODULE_FIRMWARE("rtlwifi/rtl8192cufw_A.bin"); +MODULE_FIRMWARE("rtlwifi/rtl8192cufw_B.bin"); +MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin");  static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)  { @@ -68,14 +72,21 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)  			 "Can't alloc buffer for fw\n");  		return 1;  	} - +	if (IS_VENDOR_UMC_A_CUT(rtlpriv->rtlhal.version) && +	    !IS_92C_SERIAL(rtlpriv->rtlhal.version)) { +		rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_A.bin"; +	} else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlpriv->rtlhal.version)) { +		rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_B.bin"; +	} else { +		rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_TMSC.bin"; +	} +	/* provide name of alternative file */ +	rtlpriv->cfg->alt_fw_name = "rtlwifi/rtl8192cufw.bin";  	pr_info("Loading firmware %s\n", rtlpriv->cfg->fw_name);  	rtlpriv->max_fw_size = 0x4000;  	err = request_firmware_nowait(THIS_MODULE, 1,  				      rtlpriv->cfg->fw_name, rtlpriv->io.dev,  				      GFP_KERNEL, hw, rtl_fw_cb); - -  	return err;  } @@ -117,7 +128,7 @@ static struct rtl_hal_ops rtl8192cu_hal_ops = {  	.set_bw_mode = rtl92c_phy_set_bw_mode,  	.switch_channel = rtl92c_phy_sw_chnl,  	.dm_watchdog = rtl92c_dm_watchdog, -	.scan_operation_backup = rtl92c_phy_scan_operation_backup, +	.scan_operation_backup = rtl_phy_scan_operation_backup,  	.set_rf_power_state = rtl92cu_phy_set_rf_power_state,  	.led_control = rtl92cu_led_control,  	.enable_hw_sec = rtl92cu_enable_hw_security_config, @@ -306,6 +317,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {  	{RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/  	{RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/  	{RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ +	{RTL_USB_DEVICE(0x0df6, 0x0077, rtl92cu_hal_cfg)}, /*Sitecom-WLA2100V2*/  	{RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/  	{RTL_USB_DEVICE(0x4856, 0x0091, rtl92cu_hal_cfg)}, /*NetweeN - Feixun*/  	/* HP - Lite-On ,8188CUS Slim Combo */ @@ -383,9 +395,6 @@ static struct usb_driver rtl8192cu_driver = {  	/* .resume = rtl_usb_resume, */  	/* .reset_resume = rtl8192c_resume, */  #endif /* CONFIG_PM */ -#ifdef CONFIG_AUTOSUSPEND -	.supports_autosuspend = 1, -#endif  	.disable_hub_initiated_lpm = 1,  }; diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/table.c b/drivers/net/wireless/rtlwifi/rtl8192cu/table.c index 966be519edb..7903c154de0 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/table.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/table.c @@ -36,7 +36,7 @@ u32 RTL8192CUPHY_REG_2TARRAY[RTL8192CUPHY_REG_2TARRAY_LENGTH] = {  	0x804, 0x00000003,  	0x808, 0x0000fc00,  	0x80c, 0x0000000a, -	0x810, 0x10005388, +	0x810, 0x10000330,  	0x814, 0x020c3d10,  	0x818, 0x02200385,  	0x81c, 0x00000000, @@ -110,22 +110,22 @@ u32 RTL8192CUPHY_REG_2TARRAY[RTL8192CUPHY_REG_2TARRAY_LENGTH] = {  	0xc44, 0x000100b7,  	0xc48, 0xec020107,  	0xc4c, 0x007f037f, -	0xc50, 0x6954341e, +	0xc50, 0x69543420,  	0xc54, 0x43bc0094, -	0xc58, 0x6954341e, +	0xc58, 0x69543420,  	0xc5c, 0x433c0094,  	0xc60, 0x00000000,  	0xc64, 0x5116848b,  	0xc68, 0x47c00bff,  	0xc6c, 0x00000036,  	0xc70, 0x2c7f000d, -	0xc74, 0x0186115b, +	0xc74, 0x2186115b,  	0xc78, 0x0000001f,  	0xc7c, 0x00b99612,  	0xc80, 0x40000100,  	0xc84, 0x20f60000,  	0xc88, 0x40000100, -	0xc8c, 0x20200000, +	0xc8c, 0xa0e40000,  	0xc90, 0x00121820,  	0xc94, 0x00000000,  	0xc98, 0x00121820, @@ -226,7 +226,7 @@ u32 RTL8192CUPHY_REG_1TARRAY[RTL8192CUPHY_REG_1TARRAY_LENGTH] = {  	0x804, 0x00000001,  	0x808, 0x0000fc00,  	0x80c, 0x0000000a, -	0x810, 0x10005388, +	0x810, 0x10000330,  	0x814, 0x020c3d10,  	0x818, 0x02200385,  	0x81c, 0x00000000, @@ -300,9 +300,9 @@ u32 RTL8192CUPHY_REG_1TARRAY[RTL8192CUPHY_REG_1TARRAY_LENGTH] = {  	0xc44, 0x000100b7,  	0xc48, 0xec020107,  	0xc4c, 0x007f037f, -	0xc50, 0x6954341e, +	0xc50, 0x69543420,  	0xc54, 0x43bc0094, -	0xc58, 0x6954341e, +	0xc58, 0x69543420,  	0xc5c, 0x433c0094,  	0xc60, 0x00000000,  	0xc64, 0x5116848b, @@ -340,7 +340,7 @@ u32 RTL8192CUPHY_REG_1TARRAY[RTL8192CUPHY_REG_1TARRAY_LENGTH] = {  	0xce4, 0x00000000,  	0xce8, 0x37644302,  	0xcec, 0x2f97d40c, -	0xd00, 0x00080740, +	0xd00, 0x00000740,  	0xd04, 0x00020401,  	0xd08, 0x0000907f,  	0xd0c, 0x20010201, @@ -633,17 +633,17 @@ u32 RTL8192CURADIOA_2TARRAY[RTL8192CURADIOA_2TARRAYLENGTH] = {  	0x012, 0x00071000,  	0x012, 0x000b0000,  	0x012, 0x000fc000, -	0x013, 0x000287af, +	0x013, 0x000287b3,  	0x013, 0x000244b7,  	0x013, 0x000204ab,  	0x013, 0x0001c49f,  	0x013, 0x00018493, -	0x013, 0x00014297, -	0x013, 0x00010295, -	0x013, 0x0000c298, -	0x013, 0x0000819c, -	0x013, 0x000040a8, -	0x013, 0x0000001c, +	0x013, 0x0001429b, +	0x013, 0x00010299, +	0x013, 0x0000c29c, +	0x013, 0x000081a0, +	0x013, 0x000040ac, +	0x013, 0x00000020,  	0x014, 0x0001944c,  	0x014, 0x00059444,  	0x014, 0x0009944c, @@ -932,10 +932,10 @@ u32 RTL8192CUMAC_2T_ARRAY[RTL8192CUMAC_2T_ARRAYLENGTH] = {  	0x608, 0x0000000e,  	0x609, 0x0000002a,  	0x652, 0x00000020, -	0x63c, 0x0000000a, -	0x63d, 0x0000000e, -	0x63e, 0x0000000a, -	0x63f, 0x0000000e, +	0x63c, 0x00000008, +	0x63d, 0x00000008, +	0x63e, 0x0000000c, +	0x63f, 0x0000000c,  	0x66e, 0x00000005,  	0x700, 0x00000021,  	0x701, 0x00000043, diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c index 763cf1defab..035e0dc3922 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c @@ -303,10 +303,10 @@ out:  bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,  			   struct rtl_stats *stats,  			   struct ieee80211_rx_status *rx_status, -			   u8 *p_desc, struct sk_buff *skb) +			   u8 *pdesc, struct sk_buff *skb)  {  	struct rx_fwinfo_92c *p_drvinfo; -	struct rx_desc_92c *pdesc = (struct rx_desc_92c *)p_desc; +	struct rx_desc_92c *p_desc = (struct rx_desc_92c *)pdesc;  	u32 phystatus = GET_RX_DESC_PHY_STATUS(pdesc);  	stats->length = (u16) GET_RX_DESC_PKT_LEN(pdesc); @@ -343,13 +343,13 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,  					(bool)GET_RX_DESC_PAGGR(pdesc));  	rx_status->mactime = GET_RX_DESC_TSFL(pdesc);  	if (phystatus) { -		p_drvinfo = (struct rx_fwinfo_92c *)(pdesc + RTL_RX_DESC_SIZE); -		rtl92c_translate_rx_signal_stuff(hw, skb, stats, pdesc, +		p_drvinfo = (struct rx_fwinfo_92c *)(skb->data + +						     stats->rx_bufshift); +		rtl92c_translate_rx_signal_stuff(hw, skb, stats, p_desc,  						 p_drvinfo);  	}  	/*rx_status->qual = stats->signal; */ -	rx_status->signal = stats->rssi + 10; -	/*rx_status->noise = -stats->noise; */ +	rx_status->signal = stats->recvsignalpower + 10;  	return true;  } @@ -364,7 +364,6 @@ static void _rtl_rx_process(struct ieee80211_hw *hw, struct sk_buff *skb)  	u8 *rxdesc;  	struct rtl_stats stats = {  		.signal = 0, -		.noise = -98,  		.rate = 0,  	};  	struct rx_fwinfo_92c *p_drvinfo; @@ -496,7 +495,7 @@ static void _rtl_tx_desc_checksum(u8 *txdesc)  void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,  			  struct ieee80211_hdr *hdr, u8 *pdesc_tx, -			  struct ieee80211_tx_info *info, +			  u8 *pbd_desc_tx, struct ieee80211_tx_info *info,  			  struct ieee80211_sta *sta,  			  struct sk_buff *skb,  			  u8 queue_index, diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.h b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.h index 725c53accc5..fd8051dcd98 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.h +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.h @@ -420,7 +420,7 @@ struct sk_buff *rtl8192c_tx_aggregate_hdl(struct ieee80211_hw *,  					   struct sk_buff_head *);  void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,  			  struct ieee80211_hdr *hdr, u8 *pdesc_tx, -			  struct ieee80211_tx_info *info, +			  u8 *pbd_desc_tx, struct ieee80211_tx_info *info,  			  struct ieee80211_sta *sta,  			  struct sk_buff *skb,  			  u8 queue_index,  | 
