diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192ce/hw.c')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | 165 | 
1 files changed, 81 insertions, 84 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c index 5c646d5f7bb8..303b299376c9 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c @@ -544,8 +544,13 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  						(u8 *)(&fw_current_inps));  			}  		break; } -	case HW_VAR_KEEP_ALIVE: -		break; +	case HW_VAR_KEEP_ALIVE: { +		u8 array[2]; + +		array[0] = 0xff; +		array[1] = *((u8 *)val); +		rtl92c_fill_h2c_cmd(hw, H2C_92C_KEEP_ALIVE_CTRL, 2, array); +		break; }  	default:  		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,  			 "switch case %d not processed\n", variable); @@ -1156,47 +1161,35 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	u8 bt_msr = rtl_read_byte(rtlpriv, MSR);  	enum led_ctl_mode ledaction = LED_CTL_NO_LINK; -	bt_msr &= 0xfc; +	u8 mode = MSR_NOLINK; -	if (type == NL80211_IFTYPE_UNSPECIFIED || -	    type == NL80211_IFTYPE_STATION) { -		_rtl92ce_stop_tx_beacon(hw); -		_rtl92ce_enable_bcn_sub_func(hw); -	} else if (type == NL80211_IFTYPE_ADHOC || type == NL80211_IFTYPE_AP || -		   type == NL80211_IFTYPE_MESH_POINT) { -		_rtl92ce_resume_tx_beacon(hw); -		_rtl92ce_disable_bcn_sub_func(hw); -	} else { -		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, -			 "Set HW_VAR_MEDIA_STATUS: No such media status(%x)\n", -			 type); -	} +	bt_msr &= 0xfc;  	switch (type) {  	case NL80211_IFTYPE_UNSPECIFIED: -		bt_msr |= MSR_NOLINK; -		ledaction = LED_CTL_LINK; +		mode = MSR_NOLINK;  		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,  			 "Set Network type to NO LINK!\n");  		break;  	case NL80211_IFTYPE_ADHOC: -		bt_msr |= MSR_ADHOC; +		mode = MSR_ADHOC;  		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,  			 "Set Network type to Ad Hoc!\n");  		break;  	case NL80211_IFTYPE_STATION: -		bt_msr |= MSR_INFRA; +		mode = MSR_INFRA;  		ledaction = LED_CTL_LINK;  		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,  			 "Set Network type to STA!\n");  		break;  	case NL80211_IFTYPE_AP: -		bt_msr |= MSR_AP; +		mode = MSR_AP; +		ledaction = LED_CTL_LINK;  		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,  			 "Set Network type to AP!\n");  		break;  	case NL80211_IFTYPE_MESH_POINT: -		bt_msr |= MSR_ADHOC; +		mode = MSR_ADHOC;  		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,  			 "Set Network type to Mesh Point!\n");  		break; @@ -1207,9 +1200,32 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,  	} -	rtl_write_byte(rtlpriv, (MSR), bt_msr); +	/* MSR_INFRA == Link in infrastructure network; +	 * MSR_ADHOC == Link in ad hoc network; +	 * Therefore, check link state is necessary. +	 * +	 * MSR_AP == AP mode; link state does not matter here. +	 */ +	if (mode != MSR_AP && +	    rtlpriv->mac80211.link_state < MAC80211_LINKED) { +		mode = MSR_NOLINK; +		ledaction = LED_CTL_NO_LINK; +	} +	if (mode == MSR_NOLINK || mode == MSR_INFRA) { +		_rtl92ce_stop_tx_beacon(hw); +		_rtl92ce_enable_bcn_sub_func(hw); +	} else if (mode == MSR_ADHOC || mode == MSR_AP) { +		_rtl92ce_resume_tx_beacon(hw); +		_rtl92ce_disable_bcn_sub_func(hw); +	} else { +		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, +			 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n", +			 mode); +	} +	rtl_write_byte(rtlpriv, MSR, bt_msr | mode); +  	rtlpriv->cfg->ops->led_control(hw, ledaction); -	if ((bt_msr & MSR_MASK) == MSR_AP) +	if (mode == MSR_AP)  		rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);  	else  		rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66); @@ -1833,7 +1849,6 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,  	u32 ratr_value;  	u8 ratr_index = 0;  	u8 nmode = mac->ht_enable; -	u8 mimo_ps = IEEE80211_SMPS_OFF;  	u16 shortgi_rate;  	u32 tmp_ratr_value;  	u8 curtxbw_40mhz = mac->bw_40; @@ -1842,6 +1857,7 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,  	u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?  			       1 : 0;  	enum wireless_mode wirelessmode = mac->mode; +	u32 ratr_mask;  	if (rtlhal->current_bandtype == BAND_ON_5G)  		ratr_value = sta->supp_rates[1] << 4; @@ -1865,19 +1881,13 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,  	case WIRELESS_MODE_N_24G:  	case WIRELESS_MODE_N_5G:  		nmode = 1; -		if (mimo_ps == IEEE80211_SMPS_STATIC) { -			ratr_value &= 0x0007F005; -		} else { -			u32 ratr_mask; - -			if (get_rf_type(rtlphy) == RF_1T2R || -			    get_rf_type(rtlphy) == RF_1T1R) -				ratr_mask = 0x000ff005; -			else -				ratr_mask = 0x0f0ff005; +		if (get_rf_type(rtlphy) == RF_1T2R || +		    get_rf_type(rtlphy) == RF_1T1R) +			ratr_mask = 0x000ff005; +		else +			ratr_mask = 0x0f0ff005; -			ratr_value &= ratr_mask; -		} +		ratr_value &= ratr_mask;  		break;  	default:  		if (rtlphy->rf_type == RF_1T2R) @@ -1930,17 +1940,16 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,  	struct rtl_sta_info *sta_entry = NULL;  	u32 ratr_bitmap;  	u8 ratr_index; -	u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0; -	u8 curshortgi_40mhz = curtxbw_40mhz && -			      (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? -				1 : 0; +	u8 curtxbw_40mhz = (sta->ht_cap.cap & +			    IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0; +	u8 curshortgi_40mhz = (sta->ht_cap.cap & +			       IEEE80211_HT_CAP_SGI_40) ?  1 : 0;  	u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?  				1 : 0;  	enum wireless_mode wirelessmode = 0;  	bool shortgi = false;  	u8 rate_mask[5];  	u8 macid = 0; -	u8 mimo_ps = IEEE80211_SMPS_OFF;  	sta_entry = (struct rtl_sta_info *) sta->drv_priv;  	wirelessmode = sta_entry->wireless_mode; @@ -1985,47 +1994,38 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,  	case WIRELESS_MODE_N_5G:  		ratr_index = RATR_INX_WIRELESS_NGB; -		if (mimo_ps == IEEE80211_SMPS_STATIC) { -			if (rssi_level == 1) -				ratr_bitmap &= 0x00070000; -			else if (rssi_level == 2) -				ratr_bitmap &= 0x0007f000; -			else -				ratr_bitmap &= 0x0007f005; +		if (rtlphy->rf_type == RF_1T2R || +		    rtlphy->rf_type == RF_1T1R) { +			if (curtxbw_40mhz) { +				if (rssi_level == 1) +					ratr_bitmap &= 0x000f0000; +				else if (rssi_level == 2) +					ratr_bitmap &= 0x000ff000; +				else +					ratr_bitmap &= 0x000ff015; +			} else { +				if (rssi_level == 1) +					ratr_bitmap &= 0x000f0000; +				else if (rssi_level == 2) +					ratr_bitmap &= 0x000ff000; +				else +					ratr_bitmap &= 0x000ff005; +			}  		} else { -			if (rtlphy->rf_type == RF_1T2R || -			    rtlphy->rf_type == RF_1T1R) { -				if (curtxbw_40mhz) { -					if (rssi_level == 1) -						ratr_bitmap &= 0x000f0000; -					else if (rssi_level == 2) -						ratr_bitmap &= 0x000ff000; -					else -						ratr_bitmap &= 0x000ff015; -				} else { -					if (rssi_level == 1) -						ratr_bitmap &= 0x000f0000; -					else if (rssi_level == 2) -						ratr_bitmap &= 0x000ff000; -					else -						ratr_bitmap &= 0x000ff005; -				} +			if (curtxbw_40mhz) { +				if (rssi_level == 1) +					ratr_bitmap &= 0x0f0f0000; +				else if (rssi_level == 2) +					ratr_bitmap &= 0x0f0ff000; +				else +					ratr_bitmap &= 0x0f0ff015;  			} else { -				if (curtxbw_40mhz) { -					if (rssi_level == 1) -						ratr_bitmap &= 0x0f0f0000; -					else if (rssi_level == 2) -						ratr_bitmap &= 0x0f0ff000; -					else -						ratr_bitmap &= 0x0f0ff015; -				} else { -					if (rssi_level == 1) -						ratr_bitmap &= 0x0f0f0000; -					else if (rssi_level == 2) -						ratr_bitmap &= 0x0f0ff000; -					else -						ratr_bitmap &= 0x0f0ff005; -				} +				if (rssi_level == 1) +					ratr_bitmap &= 0x0f0f0000; +				else if (rssi_level == 2) +					ratr_bitmap &= 0x0f0ff000; +				else +					ratr_bitmap &= 0x0f0ff005;  			}  		} @@ -2058,9 +2058,6 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,  		 "Rate_index:%x, ratr_val:%x, %5phC\n",  		 ratr_index, ratr_bitmap, rate_mask);  	rtl92c_fill_h2c_cmd(hw, H2C_RA_MASK, 5, rate_mask); - -	if (macid != 0) -		sta_entry->ratr_index = ratr_index;  }  void rtl92ce_update_hal_rate_tbl(struct ieee80211_hw *hw,  | 

