Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Larry Finger and committed by
John W. Linville
099fb8ab 349eb8cf

+73 -2
+1 -1
drivers/net/wireless/rtlwifi/ps.c
··· 190 190 191 191 ppsc->swrf_processing = true; 192 192 193 - if (ppsc->inactive_pwrstate == ERFOFF && 193 + if (ppsc->inactive_pwrstate == ERFON && 194 194 rtlhal->interface == INTF_PCI) { 195 195 if ((ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM) && 196 196 RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM) &&
+1 -1
drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
··· 728 728 return; 729 729 rtlphy->set_bwmode_inprogress = true; 730 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 732 } else { 733 733 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 734 734 ("FALSE driver sleep or unload\n"));
+69
drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
··· 366 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 438 void _rtl92ce_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t) 370 439 { 371 440 u8 tmpreg;
+1
drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
··· 257 257 u8 configtype); 258 258 bool _rtl92ce_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw, 259 259 u8 configtype); 260 + void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw); 260 261 261 262 #endif
+1
drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
··· 232 232 .config_bb_with_headerfile = _rtl92ce_phy_config_bb_with_headerfile, 233 233 .config_bb_with_pgheaderfile = _rtl92ce_phy_config_bb_with_pgheaderfile, 234 234 .phy_lc_calibrate = _rtl92ce_phy_lc_calibrate, 235 + .phy_set_bw_mode_callback = rtl92ce_phy_set_bw_mode_callback, 235 236 .dm_dynamic_txpower = rtl92ce_dm_dynamic_txpower, 236 237 }; 237 238