diff options
| -rw-r--r-- | drivers/net/wireless/rtlwifi/ps.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192ce/phy.c | 69 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192ce/phy.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192ce/sw.c | 1 | 
5 files changed, 73 insertions, 2 deletions
diff --git a/drivers/net/wireless/rtlwifi/ps.c b/drivers/net/wireless/rtlwifi/ps.c index 2bb71195e97..39b0297ce92 100644 --- a/drivers/net/wireless/rtlwifi/ps.c +++ b/drivers/net/wireless/rtlwifi/ps.c @@ -190,7 +190,7 @@ static void _rtl_ps_inactive_ps(struct ieee80211_hw *hw)  	ppsc->swrf_processing = true; -	if (ppsc->inactive_pwrstate == ERFOFF && +	if (ppsc->inactive_pwrstate == ERFON &&  	    rtlhal->interface == INTF_PCI) {  		if ((ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM) &&  		    RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM) && diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c index c5424cad43c..d2cc81586a6 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c +++ b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c @@ -728,7 +728,7 @@ void rtl92c_phy_set_bw_mode(struct ieee80211_hw *hw,  		return;  	rtlphy->set_bwmode_inprogress = true;  	if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) { -		rtlphy->set_bwmode_inprogress = false; +		rtlpriv->cfg->ops->phy_set_bw_mode_callback(hw);  	} else {  		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,  			 ("FALSE driver sleep or unload\n")); diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c index 73ae8a43184..abe0fcc7536 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c @@ -366,6 +366,75 @@ bool rtl92c_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,  	return true;  } +void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw) +{ +	struct rtl_priv *rtlpriv = rtl_priv(hw); +	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); +	struct rtl_phy *rtlphy = &(rtlpriv->phy); +	struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); +	u8 reg_bw_opmode; +	u8 reg_prsr_rsc; + +	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, +		 ("Switch to %s bandwidth\n", +		  rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ? +		  "20MHz" : "40MHz")) + +	if (is_hal_stop(rtlhal)) { +		rtlphy->set_bwmode_inprogress = false; +		return; +	} + +	reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE); +	reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2); + +	switch (rtlphy->current_chan_bw) { +	case HT_CHANNEL_WIDTH_20: +		reg_bw_opmode |= BW_OPMODE_20MHZ; +		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode); +		break; +	case HT_CHANNEL_WIDTH_20_40: +		reg_bw_opmode &= ~BW_OPMODE_20MHZ; +		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode); +		reg_prsr_rsc = +		    (reg_prsr_rsc & 0x90) | (mac->cur_40_prime_sc << 5); +		rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc); +		break; +	default: +		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, +			 ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw)); +		break; +	} + +	switch (rtlphy->current_chan_bw) { +	case HT_CHANNEL_WIDTH_20: +		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0); +		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0); +		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1); +		break; +	case HT_CHANNEL_WIDTH_20_40: +		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1); +		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1); + +		rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND, +			      (mac->cur_40_prime_sc >> 1)); +		rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc); +		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 0); + +		rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)), +			      (mac->cur_40_prime_sc == +			       HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1); +		break; +	default: +		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, +			 ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw)); +		break; +	} +	rtl92ce_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw); +	rtlphy->set_bwmode_inprogress = false; +	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n")); +} +  void _rtl92ce_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)  {  	u8 tmpreg; diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h index ad580852cc7..be2c92adef3 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h @@ -257,5 +257,6 @@ bool _rtl92ce_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,  					    u8 configtype);  bool _rtl92ce_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,  					      u8 configtype); +void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw);  #endif diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c index 390bbb5ee11..373dc78af1d 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c @@ -232,6 +232,7 @@ static struct rtl_hal_ops rtl8192ce_hal_ops = {  	.config_bb_with_headerfile = _rtl92ce_phy_config_bb_with_headerfile,  	.config_bb_with_pgheaderfile = _rtl92ce_phy_config_bb_with_pgheaderfile,  	.phy_lc_calibrate = _rtl92ce_phy_lc_calibrate, +	.phy_set_bw_mode_callback = rtl92ce_phy_set_bw_mode_callback,  	.dm_dynamic_txpower = rtl92ce_dm_dynamic_txpower,  };  |