diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2011-05-14 11:15:17 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-05-16 14:25:30 -0400 |
commit | 099fb8ab1e57e5d609ac686cc0ab6d1835a79155 (patch) | |
tree | dcb80d490ddf93f67f3bf829d53fa7854bf9f213 /drivers | |
parent | 349eb8cf45aadd35836fdfde75b3265a01b2aaa1 (diff) |
rtlwifi: rtl8192c-common: rtl8192ce: Fix for HT40 regression
The changes that were made to rtl8192ce when rtl8192cu was added broke
HT40. The errors included a typo in rtlwifi, a missing routine in
rtl8192ce and a missing callback of that routine in rtl8192c-common.
This patch fixes the regression reported in Bug #35082.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Cc: stable@kernel.org
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-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 2bb71195e976..39b0297ce925 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) | |||
190 | 190 | ||
191 | ppsc->swrf_processing = true; | 191 | ppsc->swrf_processing = true; |
192 | 192 | ||
193 | if (ppsc->inactive_pwrstate == ERFOFF && | 193 | if (ppsc->inactive_pwrstate == ERFON && |
194 | rtlhal->interface == INTF_PCI) { | 194 | rtlhal->interface == INTF_PCI) { |
195 | if ((ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM) && | 195 | if ((ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM) && |
196 | RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM) && | 196 | 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 c5424cad43cb..d2cc81586a6a 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, | |||
728 | return; | 728 | return; |
729 | rtlphy->set_bwmode_inprogress = true; | 729 | rtlphy->set_bwmode_inprogress = true; |
730 | if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) { | 730 | if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) { |
731 | rtlphy->set_bwmode_inprogress = false; | 731 | rtlpriv->cfg->ops->phy_set_bw_mode_callback(hw); |
732 | } else { | 732 | } else { |
733 | RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, | 733 | RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, |
734 | ("FALSE driver sleep or unload\n")); | 734 | ("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 73ae8a431848..abe0fcc75368 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, | |||
366 | return true; | 366 | return true; |
367 | } | 367 | } |
368 | 368 | ||
369 | void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw) | ||
370 | { | ||
371 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
372 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); | ||
373 | struct rtl_phy *rtlphy = &(rtlpriv->phy); | ||
374 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); | ||
375 | u8 reg_bw_opmode; | ||
376 | u8 reg_prsr_rsc; | ||
377 | |||
378 | RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, | ||
379 | ("Switch to %s bandwidth\n", | ||
380 | rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ? | ||
381 | "20MHz" : "40MHz")) | ||
382 | |||
383 | if (is_hal_stop(rtlhal)) { | ||
384 | rtlphy->set_bwmode_inprogress = false; | ||
385 | return; | ||
386 | } | ||
387 | |||
388 | reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE); | ||
389 | reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2); | ||
390 | |||
391 | switch (rtlphy->current_chan_bw) { | ||
392 | case HT_CHANNEL_WIDTH_20: | ||
393 | reg_bw_opmode |= BW_OPMODE_20MHZ; | ||
394 | rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode); | ||
395 | break; | ||
396 | case HT_CHANNEL_WIDTH_20_40: | ||
397 | reg_bw_opmode &= ~BW_OPMODE_20MHZ; | ||
398 | rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode); | ||
399 | reg_prsr_rsc = | ||
400 | (reg_prsr_rsc & 0x90) | (mac->cur_40_prime_sc << 5); | ||
401 | rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc); | ||
402 | break; | ||
403 | default: | ||
404 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | ||
405 | ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw)); | ||
406 | break; | ||
407 | } | ||
408 | |||
409 | switch (rtlphy->current_chan_bw) { | ||
410 | case HT_CHANNEL_WIDTH_20: | ||
411 | rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0); | ||
412 | rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0); | ||
413 | rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1); | ||
414 | break; | ||
415 | case HT_CHANNEL_WIDTH_20_40: | ||
416 | rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1); | ||
417 | rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1); | ||
418 | |||
419 | rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND, | ||
420 | (mac->cur_40_prime_sc >> 1)); | ||
421 | rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc); | ||
422 | rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 0); | ||
423 | |||
424 | rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)), | ||
425 | (mac->cur_40_prime_sc == | ||
426 | HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1); | ||
427 | break; | ||
428 | default: | ||
429 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | ||
430 | ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw)); | ||
431 | break; | ||
432 | } | ||
433 | rtl92ce_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw); | ||
434 | rtlphy->set_bwmode_inprogress = false; | ||
435 | RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n")); | ||
436 | } | ||
437 | |||
369 | void _rtl92ce_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t) | 438 | void _rtl92ce_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t) |
370 | { | 439 | { |
371 | u8 tmpreg; | 440 | u8 tmpreg; |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h index ad580852cc76..be2c92adef33 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, | |||
257 | u8 configtype); | 257 | u8 configtype); |
258 | bool _rtl92ce_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw, | 258 | bool _rtl92ce_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw, |
259 | u8 configtype); | 259 | u8 configtype); |
260 | void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw); | ||
260 | 261 | ||
261 | #endif | 262 | #endif |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c index 390bbb5ee11d..373dc78af1dc 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 = { | |||
232 | .config_bb_with_headerfile = _rtl92ce_phy_config_bb_with_headerfile, | 232 | .config_bb_with_headerfile = _rtl92ce_phy_config_bb_with_headerfile, |
233 | .config_bb_with_pgheaderfile = _rtl92ce_phy_config_bb_with_pgheaderfile, | 233 | .config_bb_with_pgheaderfile = _rtl92ce_phy_config_bb_with_pgheaderfile, |
234 | .phy_lc_calibrate = _rtl92ce_phy_lc_calibrate, | 234 | .phy_lc_calibrate = _rtl92ce_phy_lc_calibrate, |
235 | .phy_set_bw_mode_callback = rtl92ce_phy_set_bw_mode_callback, | ||
235 | .dm_dynamic_txpower = rtl92ce_dm_dynamic_txpower, | 236 | .dm_dynamic_txpower = rtl92ce_dm_dynamic_txpower, |
236 | }; | 237 | }; |
237 | 238 | ||