diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2013-03-24 23:06:38 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-04-01 16:19:58 -0400 |
commit | 2455c92c318182deda2f9789fd60792402ebc089 (patch) | |
tree | bcd44ea342d7175deb24038940c7672a216821b0 /drivers/net/wireless/rtlwifi/rtl8192se/hw.c | |
parent | 26634c4b1868323f49f8cd24c3493b57819867fd (diff) |
rtlwifi: rtl8192se: Update driver to match vendor driver of 2013.02.07
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Cc: jcheung@suse.com
Cc: machen@suse.com
Cc: mmarek@suse.cz
Cc: zhiyuan_yang@realsil.com.cn
Cc: page_he@realsil.com.cn
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192se/hw.c')
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192se/hw.c | 124 |
1 files changed, 86 insertions, 38 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c index 084e7773bce2..a4f41b1eef52 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c | |||
@@ -400,6 +400,39 @@ void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) | |||
400 | 400 | ||
401 | break; | 401 | break; |
402 | } | 402 | } |
403 | case HW_VAR_FW_LPS_ACTION: { | ||
404 | bool enter_fwlps = *((bool *)val); | ||
405 | u8 rpwm_val, fw_pwrmode; | ||
406 | bool fw_current_inps; | ||
407 | |||
408 | if (enter_fwlps) { | ||
409 | rpwm_val = 0x02; /* RF off */ | ||
410 | fw_current_inps = true; | ||
411 | rtlpriv->cfg->ops->set_hw_reg(hw, | ||
412 | HW_VAR_FW_PSMODE_STATUS, | ||
413 | (u8 *)(&fw_current_inps)); | ||
414 | rtlpriv->cfg->ops->set_hw_reg(hw, | ||
415 | HW_VAR_H2C_FW_PWRMODE, | ||
416 | (u8 *)(&ppsc->fwctrl_psmode)); | ||
417 | |||
418 | rtlpriv->cfg->ops->set_hw_reg(hw, | ||
419 | HW_VAR_SET_RPWM, | ||
420 | (u8 *)(&rpwm_val)); | ||
421 | } else { | ||
422 | rpwm_val = 0x0C; /* RF on */ | ||
423 | fw_pwrmode = FW_PS_ACTIVE_MODE; | ||
424 | fw_current_inps = false; | ||
425 | rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, | ||
426 | (u8 *)(&rpwm_val)); | ||
427 | rtlpriv->cfg->ops->set_hw_reg(hw, | ||
428 | HW_VAR_H2C_FW_PWRMODE, | ||
429 | (u8 *)(&fw_pwrmode)); | ||
430 | |||
431 | rtlpriv->cfg->ops->set_hw_reg(hw, | ||
432 | HW_VAR_FW_PSMODE_STATUS, | ||
433 | (u8 *)(&fw_current_inps)); | ||
434 | } | ||
435 | break; } | ||
403 | default: | 436 | default: |
404 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | 437 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, |
405 | "switch case not processed\n"); | 438 | "switch case not processed\n"); |
@@ -438,7 +471,7 @@ void rtl92se_enable_hw_security_config(struct ieee80211_hw *hw) | |||
438 | 471 | ||
439 | } | 472 | } |
440 | 473 | ||
441 | static u8 _rtl92ce_halset_sysclk(struct ieee80211_hw *hw, u8 data) | 474 | static u8 _rtl92se_halset_sysclk(struct ieee80211_hw *hw, u8 data) |
442 | { | 475 | { |
443 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 476 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
444 | u8 waitcount = 100; | 477 | u8 waitcount = 100; |
@@ -547,7 +580,7 @@ static void _rtl92se_macconfig_before_fwdownload(struct ieee80211_hw *hw) | |||
547 | tmpu1b &= ~(BIT(6) | BIT(7)); | 580 | tmpu1b &= ~(BIT(6) | BIT(7)); |
548 | 581 | ||
549 | /* Set failed, return to prevent hang. */ | 582 | /* Set failed, return to prevent hang. */ |
550 | if (!_rtl92ce_halset_sysclk(hw, tmpu1b)) | 583 | if (!_rtl92se_halset_sysclk(hw, tmpu1b)) |
551 | return; | 584 | return; |
552 | } | 585 | } |
553 | 586 | ||
@@ -650,7 +683,7 @@ static void _rtl92se_macconfig_before_fwdownload(struct ieee80211_hw *hw) | |||
650 | 683 | ||
651 | tmpu1b = rtl_read_byte(rtlpriv, (SYS_CLKR + 1)); | 684 | tmpu1b = rtl_read_byte(rtlpriv, (SYS_CLKR + 1)); |
652 | tmpu1b = ((tmpu1b | BIT(7)) & (~BIT(6))); | 685 | tmpu1b = ((tmpu1b | BIT(7)) & (~BIT(6))); |
653 | if (!_rtl92ce_halset_sysclk(hw, tmpu1b)) | 686 | if (!_rtl92se_halset_sysclk(hw, tmpu1b)) |
654 | return; /* Set failed, return to prevent hang. */ | 687 | return; /* Set failed, return to prevent hang. */ |
655 | 688 | ||
656 | rtl_write_word(rtlpriv, CMDR, 0x07FC); | 689 | rtl_write_word(rtlpriv, CMDR, 0x07FC); |
@@ -967,6 +1000,15 @@ int rtl92se_hw_init(struct ieee80211_hw *hw) | |||
967 | return rtstatus; | 1000 | return rtstatus; |
968 | } | 1001 | } |
969 | 1002 | ||
1003 | /* because last function modify RCR, so we update | ||
1004 | * rcr var here, or TP will unstable for receive_config | ||
1005 | * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx | ||
1006 | * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252 | ||
1007 | */ | ||
1008 | rtlpci->receive_config = rtl_read_dword(rtlpriv, RCR); | ||
1009 | rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV); | ||
1010 | rtl_write_dword(rtlpriv, RCR, rtlpci->receive_config); | ||
1011 | |||
970 | /* Make sure BB/RF write OK. We should prevent enter IPS. radio off. */ | 1012 | /* Make sure BB/RF write OK. We should prevent enter IPS. radio off. */ |
971 | /* We must set flag avoid BB/RF config period later!! */ | 1013 | /* We must set flag avoid BB/RF config period later!! */ |
972 | rtl_write_dword(rtlpriv, CMDR, 0x37FC); | 1014 | rtl_write_dword(rtlpriv, CMDR, 0x37FC); |
@@ -982,25 +1024,6 @@ int rtl92se_hw_init(struct ieee80211_hw *hw) | |||
982 | 1024 | ||
983 | rtlphy->rf_mode = RF_OP_BY_SW_3WIRE; | 1025 | rtlphy->rf_mode = RF_OP_BY_SW_3WIRE; |
984 | 1026 | ||
985 | /* RF Power Save */ | ||
986 | #if 0 | ||
987 | /* H/W or S/W RF OFF before sleep. */ | ||
988 | if (rtlpriv->psc.rfoff_reason > RF_CHANGE_BY_PS) { | ||
989 | u32 rfoffreason = rtlpriv->psc.rfoff_reason; | ||
990 | |||
991 | rtlpriv->psc.rfoff_reason = RF_CHANGE_BY_INIT; | ||
992 | rtlpriv->psc.rfpwr_state = ERFON; | ||
993 | /* FIXME: check spinlocks if this block is uncommented */ | ||
994 | rtl_ps_set_rf_state(hw, ERFOFF, rfoffreason); | ||
995 | } else { | ||
996 | /* gpio radio on/off is out of adapter start */ | ||
997 | if (rtlpriv->psc.hwradiooff == false) { | ||
998 | rtlpriv->psc.rfpwr_state = ERFON; | ||
999 | rtlpriv->psc.rfoff_reason = 0; | ||
1000 | } | ||
1001 | } | ||
1002 | #endif | ||
1003 | |||
1004 | /* Before RF-R/W we must execute the IO from Scott's suggestion. */ | 1027 | /* Before RF-R/W we must execute the IO from Scott's suggestion. */ |
1005 | rtl_write_byte(rtlpriv, AFE_XTAL_CTRL + 1, 0xDB); | 1028 | rtl_write_byte(rtlpriv, AFE_XTAL_CTRL + 1, 0xDB); |
1006 | if (rtlhal->version == VERSION_8192S_ACUT) | 1029 | if (rtlhal->version == VERSION_8192S_ACUT) |
@@ -1058,7 +1081,22 @@ int rtl92se_hw_init(struct ieee80211_hw *hw) | |||
1058 | 1081 | ||
1059 | /* We enable high power and RA related mechanism after NIC | 1082 | /* We enable high power and RA related mechanism after NIC |
1060 | * initialized. */ | 1083 | * initialized. */ |
1061 | rtl92s_phy_set_fw_cmd(hw, FW_CMD_RA_INIT); | 1084 | if (hal_get_firmwareversion(rtlpriv) >= 0x35) { |
1085 | /* Fw v.53 and later. */ | ||
1086 | rtl92s_phy_set_fw_cmd(hw, FW_CMD_RA_INIT); | ||
1087 | } else if (hal_get_firmwareversion(rtlpriv) == 0x34) { | ||
1088 | /* Fw v.52. */ | ||
1089 | rtl_write_dword(rtlpriv, WFM5, FW_RA_INIT); | ||
1090 | rtl92s_phy_chk_fwcmd_iodone(hw); | ||
1091 | } else { | ||
1092 | /* Compatible earlier FW version. */ | ||
1093 | rtl_write_dword(rtlpriv, WFM5, FW_RA_RESET); | ||
1094 | rtl92s_phy_chk_fwcmd_iodone(hw); | ||
1095 | rtl_write_dword(rtlpriv, WFM5, FW_RA_ACTIVE); | ||
1096 | rtl92s_phy_chk_fwcmd_iodone(hw); | ||
1097 | rtl_write_dword(rtlpriv, WFM5, FW_RA_REFRESH); | ||
1098 | rtl92s_phy_chk_fwcmd_iodone(hw); | ||
1099 | } | ||
1062 | 1100 | ||
1063 | /* Add to prevent ASPM bug. */ | 1101 | /* Add to prevent ASPM bug. */ |
1064 | /* Always enable hst and NIC clock request. */ | 1102 | /* Always enable hst and NIC clock request. */ |
@@ -1229,7 +1267,6 @@ void rtl92se_disable_interrupt(struct ieee80211_hw *hw) | |||
1229 | synchronize_irq(rtlpci->pdev->irq); | 1267 | synchronize_irq(rtlpci->pdev->irq); |
1230 | } | 1268 | } |
1231 | 1269 | ||
1232 | |||
1233 | static u8 _rtl92s_set_sysclk(struct ieee80211_hw *hw, u8 data) | 1270 | static u8 _rtl92s_set_sysclk(struct ieee80211_hw *hw, u8 data) |
1234 | { | 1271 | { |
1235 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 1272 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
@@ -1999,6 +2036,8 @@ static void rtl92se_update_hal_rate_table(struct ieee80211_hw *hw, | |||
1999 | ratr_value = sta->supp_rates[1] << 4; | 2036 | ratr_value = sta->supp_rates[1] << 4; |
2000 | else | 2037 | else |
2001 | ratr_value = sta->supp_rates[0]; | 2038 | ratr_value = sta->supp_rates[0]; |
2039 | if (mac->opmode == NL80211_IFTYPE_ADHOC) | ||
2040 | ratr_value = 0xfff; | ||
2002 | ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 | | 2041 | ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 | |
2003 | sta->ht_cap.mcs.rx_mask[0] << 12); | 2042 | sta->ht_cap.mcs.rx_mask[0] << 12); |
2004 | switch (wirelessmode) { | 2043 | switch (wirelessmode) { |
@@ -2112,6 +2151,8 @@ static void rtl92se_update_hal_rate_mask(struct ieee80211_hw *hw, | |||
2112 | ratr_bitmap = sta->supp_rates[1] << 4; | 2151 | ratr_bitmap = sta->supp_rates[1] << 4; |
2113 | else | 2152 | else |
2114 | ratr_bitmap = sta->supp_rates[0]; | 2153 | ratr_bitmap = sta->supp_rates[0]; |
2154 | if (mac->opmode == NL80211_IFTYPE_ADHOC) | ||
2155 | ratr_bitmap = 0xfff; | ||
2115 | ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 | | 2156 | ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 | |
2116 | sta->ht_cap.mcs.rx_mask[0] << 12); | 2157 | sta->ht_cap.mcs.rx_mask[0] << 12); |
2117 | switch (wirelessmode) { | 2158 | switch (wirelessmode) { |
@@ -2200,6 +2241,7 @@ static void rtl92se_update_hal_rate_mask(struct ieee80211_hw *hw, | |||
2200 | ratr_bitmap &= 0x0f8ff0ff; | 2241 | ratr_bitmap &= 0x0f8ff0ff; |
2201 | break; | 2242 | break; |
2202 | } | 2243 | } |
2244 | sta_entry->ratr_index = ratr_index; | ||
2203 | 2245 | ||
2204 | if (rtlpriv->rtlhal.version >= VERSION_8192S_BCUT) | 2246 | if (rtlpriv->rtlhal.version >= VERSION_8192S_BCUT) |
2205 | ratr_bitmap &= 0x0FFFFFFF; | 2247 | ratr_bitmap &= 0x0FFFFFFF; |
@@ -2438,23 +2480,9 @@ void rtl92se_set_key(struct ieee80211_hw *hw, u32 key_index, u8 *p_macaddr, | |||
2438 | rtl_cam_del_entry(hw, p_macaddr); | 2480 | rtl_cam_del_entry(hw, p_macaddr); |
2439 | rtl_cam_delete_one_entry(hw, p_macaddr, entry_id); | 2481 | rtl_cam_delete_one_entry(hw, p_macaddr, entry_id); |
2440 | } else { | 2482 | } else { |
2441 | RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, | ||
2442 | "The insert KEY length is %d\n", | ||
2443 | rtlpriv->sec.key_len[PAIRWISE_KEYIDX]); | ||
2444 | RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, | ||
2445 | "The insert KEY is %x %x\n", | ||
2446 | rtlpriv->sec.key_buf[0][0], | ||
2447 | rtlpriv->sec.key_buf[0][1]); | ||
2448 | |||
2449 | RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, | 2483 | RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, |
2450 | "add one entry\n"); | 2484 | "add one entry\n"); |
2451 | if (is_pairwise) { | 2485 | if (is_pairwise) { |
2452 | RT_PRINT_DATA(rtlpriv, COMP_SEC, DBG_LOUD, | ||
2453 | "Pairwise Key content", | ||
2454 | rtlpriv->sec.pairwise_key, | ||
2455 | rtlpriv->sec. | ||
2456 | key_len[PAIRWISE_KEYIDX]); | ||
2457 | |||
2458 | RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, | 2486 | RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, |
2459 | "set Pairwise key\n"); | 2487 | "set Pairwise key\n"); |
2460 | 2488 | ||
@@ -2502,3 +2530,23 @@ void rtl92se_resume(struct ieee80211_hw *hw) | |||
2502 | pci_write_config_dword(rtlpci->pdev, 0x40, | 2530 | pci_write_config_dword(rtlpci->pdev, 0x40, |
2503 | val & 0xffff00ff); | 2531 | val & 0xffff00ff); |
2504 | } | 2532 | } |
2533 | |||
2534 | /* Turn on AAP (RCR:bit 0) for promicuous mode. */ | ||
2535 | void rtl92se_allow_all_destaddr(struct ieee80211_hw *hw, | ||
2536 | bool allow_all_da, bool write_into_reg) | ||
2537 | { | ||
2538 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
2539 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); | ||
2540 | |||
2541 | if (allow_all_da) /* Set BIT0 */ | ||
2542 | rtlpci->receive_config |= RCR_AAP; | ||
2543 | else /* Clear BIT0 */ | ||
2544 | rtlpci->receive_config &= ~RCR_AAP; | ||
2545 | |||
2546 | if (write_into_reg) | ||
2547 | rtl_write_dword(rtlpriv, RCR, rtlpci->receive_config); | ||
2548 | |||
2549 | RT_TRACE(rtlpriv, COMP_TURBO | COMP_INIT, DBG_LOUD, | ||
2550 | "receive_config=0x%08X, write_into_reg=%d\n", | ||
2551 | rtlpci->receive_config, write_into_reg); | ||
2552 | } | ||