aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2012-10-25 14:46:30 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-10-30 16:17:53 -0400
commit0bd899e76476e0134f7289a003090165adea2611 (patch)
tree44a1e853afa302a3ce885a51844db2730f97d31a
parentab3d59d265e772e734c36fe738809cb1a910f566 (diff)
rtlwifi: rtl8192c: rtl8192ce: Add support for B-CUT version of RTL8188CE
Realtek devices with designation RTL8188CE-VL have the so-called B-cut of the wireless chip. This patch adds the special programming needed by these devices. In addition, a variable that was static has been moved into the private data area as it is now needed in two different routines. This change also fixes a minor bug that would be present if a system had more than one RTL81{88,92}CE devices. Other drivers in the rtlwifi family had already made this change, thus the variable already exists in the private data structure. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Cc: Anisse Astier <anisse@astier.eu> Cc: Li Chaoming <chaoming_li@realsil.com.cn> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c21
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/def.h3
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/hw.c60
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/phy.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/sw.c6
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/trx.c4
6 files changed, 85 insertions, 11 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
index cdcad7d9f15e..6ae2268e0e54 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
@@ -724,6 +724,26 @@ u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw)
724} 724}
725EXPORT_SYMBOL(rtl92c_phy_sw_chnl); 725EXPORT_SYMBOL(rtl92c_phy_sw_chnl);
726 726
727static void _rtl92c_phy_sw_rf_setting(struct ieee80211_hw *hw, u8 channel)
728{
729 struct rtl_priv *rtlpriv = rtl_priv(hw);
730 struct rtl_phy *rtlphy = &(rtlpriv->phy);
731 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
732
733 if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) {
734 if (channel == 6 && rtlphy->current_chan_bw ==
735 HT_CHANNEL_WIDTH_20)
736 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD,
737 0x00255);
738 else{
739 u32 backupRF0x1A = (u32)rtl_get_rfreg(hw, RF90_PATH_A,
740 RF_RX_G1, RFREG_OFFSET_MASK);
741 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD,
742 backupRF0x1A);
743 }
744 }
745}
746
727static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable, 747static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
728 u32 cmdtableidx, u32 cmdtablesz, 748 u32 cmdtableidx, u32 cmdtablesz,
729 enum swchnlcmd_id cmdid, 749 enum swchnlcmd_id cmdid,
@@ -837,6 +857,7 @@ bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
837 currentcmd->para1, 857 currentcmd->para1,
838 RFREG_OFFSET_MASK, 858 RFREG_OFFSET_MASK,
839 rtlphy->rfreg_chnlval[rfpath]); 859 rtlphy->rfreg_chnlval[rfpath]);
860 _rtl92c_phy_sw_rf_setting(hw, channel);
840 } 861 }
841 break; 862 break;
842 default: 863 default:
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
index 2925094b2d91..3cfa1bb0f476 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
@@ -116,6 +116,9 @@
116 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12) 116 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12)
117 117
118#define CHIP_VER_B BIT(4) 118#define CHIP_VER_B BIT(4)
119#define CHIP_BONDING_IDENTIFIER(_value) (((_value) >> 22) & 0x3)
120#define CHIP_BONDING_92C_1T2R 0x1
121#define RF_TYPE_1T2R BIT(1)
119#define CHIP_92C_BITMASK BIT(0) 122#define CHIP_92C_BITMASK BIT(0)
120#define CHIP_UNKNOWN BIT(7) 123#define CHIP_UNKNOWN BIT(7)
121#define CHIP_92C_1T2R 0x03 124#define CHIP_92C_1T2R 0x03
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
index 038c02c9afed..7dc7ac8e32b8 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
@@ -896,7 +896,6 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw)
896 struct rtl_phy *rtlphy = &(rtlpriv->phy); 896 struct rtl_phy *rtlphy = &(rtlpriv->phy);
897 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 897 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
898 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 898 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
899 static bool iqk_initialized; /* initialized to false */
900 bool rtstatus = true; 899 bool rtstatus = true;
901 bool is92c; 900 bool is92c;
902 int err; 901 int err;
@@ -921,9 +920,28 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw)
921 920
922 rtlhal->last_hmeboxnum = 0; 921 rtlhal->last_hmeboxnum = 0;
923 rtl92c_phy_mac_config(hw); 922 rtl92c_phy_mac_config(hw);
923 /* because last function modify RCR, so we update
924 * rcr var here, or TP will unstable for receive_config
925 * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx
926 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252*/
927 rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR);
928 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
929 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
924 rtl92c_phy_bb_config(hw); 930 rtl92c_phy_bb_config(hw);
925 rtlphy->rf_mode = RF_OP_BY_SW_3WIRE; 931 rtlphy->rf_mode = RF_OP_BY_SW_3WIRE;
926 rtl92c_phy_rf_config(hw); 932 rtl92c_phy_rf_config(hw);
933 if (IS_VENDOR_UMC_A_CUT(rtlhal->version) &&
934 !IS_92C_SERIAL(rtlhal->version)) {
935 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD, 0x30255);
936 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G2, MASKDWORD, 0x50a00);
937 } else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) {
938 rtl_set_rfreg(hw, RF90_PATH_A, 0x0C, MASKDWORD, 0x894AE);
939 rtl_set_rfreg(hw, RF90_PATH_A, 0x0A, MASKDWORD, 0x1AF31);
940 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, MASKDWORD, 0x8F425);
941 rtl_set_rfreg(hw, RF90_PATH_A, RF_SYN_G2, MASKDWORD, 0x4F200);
942 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK1, MASKDWORD, 0x44053);
943 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK2, MASKDWORD, 0x80201);
944 }
927 rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, (enum radio_path)0, 945 rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, (enum radio_path)0,
928 RF_CHNLBW, RFREG_OFFSET_MASK); 946 RF_CHNLBW, RFREG_OFFSET_MASK);
929 rtlphy->rfreg_chnlval[1] = rtl_get_rfreg(hw, (enum radio_path)1, 947 rtlphy->rfreg_chnlval[1] = rtl_get_rfreg(hw, (enum radio_path)1,
@@ -945,11 +963,11 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw)
945 963
946 if (ppsc->rfpwr_state == ERFON) { 964 if (ppsc->rfpwr_state == ERFON) {
947 rtl92c_phy_set_rfpath_switch(hw, 1); 965 rtl92c_phy_set_rfpath_switch(hw, 1);
948 if (iqk_initialized) { 966 if (rtlphy->iqk_initialized) {
949 rtl92c_phy_iq_calibrate(hw, true); 967 rtl92c_phy_iq_calibrate(hw, true);
950 } else { 968 } else {
951 rtl92c_phy_iq_calibrate(hw, false); 969 rtl92c_phy_iq_calibrate(hw, false);
952 iqk_initialized = true; 970 rtlphy->iqk_initialized = true;
953 } 971 }
954 972
955 rtl92c_dm_check_txpower_tracking(hw); 973 rtl92c_dm_check_txpower_tracking(hw);
@@ -1004,6 +1022,13 @@ static enum version_8192c _rtl92ce_read_chip_version(struct ieee80211_hw *hw)
1004 ? CHIP_VENDOR_UMC_B_CUT : CHIP_UNKNOWN) | 1022 ? CHIP_VENDOR_UMC_B_CUT : CHIP_UNKNOWN) |
1005 CHIP_VENDOR_UMC)); 1023 CHIP_VENDOR_UMC));
1006 } 1024 }
1025 if (IS_92C_SERIAL(version)) {
1026 value32 = rtl_read_dword(rtlpriv, REG_HPON_FSM);
1027 version = (enum version_8192c)(version |
1028 ((CHIP_BONDING_IDENTIFIER(value32)
1029 == CHIP_BONDING_92C_1T2R) ?
1030 RF_TYPE_1T2R : 0));
1031 }
1007 } 1032 }
1008 1033
1009 switch (version) { 1034 switch (version) {
@@ -1019,12 +1044,30 @@ static enum version_8192c _rtl92ce_read_chip_version(struct ieee80211_hw *hw)
1019 case VERSION_A_CHIP_88C: 1044 case VERSION_A_CHIP_88C:
1020 versionid = "A_CHIP_88C"; 1045 versionid = "A_CHIP_88C";
1021 break; 1046 break;
1047 case VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT:
1048 versionid = "A_CUT_92C_1T2R";
1049 break;
1050 case VERSION_NORMAL_UMC_CHIP_92C_A_CUT:
1051 versionid = "A_CUT_92C";
1052 break;
1053 case VERSION_NORMAL_UMC_CHIP_88C_A_CUT:
1054 versionid = "A_CUT_88C";
1055 break;
1056 case VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT:
1057 versionid = "B_CUT_92C_1T2R";
1058 break;
1059 case VERSION_NORMAL_UMC_CHIP_92C_B_CUT:
1060 versionid = "B_CUT_92C";
1061 break;
1062 case VERSION_NORMAL_UMC_CHIP_88C_B_CUT:
1063 versionid = "B_CUT_88C";
1064 break;
1022 default: 1065 default:
1023 versionid = "Unknown. Bug?"; 1066 versionid = "Unknown. Bug?";
1024 break; 1067 break;
1025 } 1068 }
1026 1069
1027 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1070 RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
1028 "Chip Version ID: %s\n", versionid); 1071 "Chip Version ID: %s\n", versionid);
1029 1072
1030 switch (version & 0x3) { 1073 switch (version & 0x3) {
@@ -1197,6 +1240,7 @@ static void _rtl92ce_poweroff_adapter(struct ieee80211_hw *hw)
1197{ 1240{
1198 struct rtl_priv *rtlpriv = rtl_priv(hw); 1241 struct rtl_priv *rtlpriv = rtl_priv(hw);
1199 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); 1242 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1243 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1200 u8 u1b_tmp; 1244 u8 u1b_tmp;
1201 u32 u4b_tmp; 1245 u32 u4b_tmp;
1202 1246
@@ -1225,7 +1269,8 @@ static void _rtl92ce_poweroff_adapter(struct ieee80211_hw *hw)
1225 rtl_write_word(rtlpriv, REG_GPIO_IO_SEL, 0x0790); 1269 rtl_write_word(rtlpriv, REG_GPIO_IO_SEL, 0x0790);
1226 rtl_write_word(rtlpriv, REG_LEDCFG0, 0x8080); 1270 rtl_write_word(rtlpriv, REG_LEDCFG0, 0x8080);
1227 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x80); 1271 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x80);
1228 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x23); 1272 if (!IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version))
1273 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x23);
1229 if (rtlpcipriv->bt_coexist.bt_coexistence) { 1274 if (rtlpcipriv->bt_coexist.bt_coexistence) {
1230 u4b_tmp = rtl_read_dword(rtlpriv, REG_AFE_XTAL_CTRL); 1275 u4b_tmp = rtl_read_dword(rtlpriv, REG_AFE_XTAL_CTRL);
1231 u4b_tmp |= 0x03824800; 1276 u4b_tmp |= 0x03824800;
@@ -1254,6 +1299,9 @@ void rtl92ce_card_disable(struct ieee80211_hw *hw)
1254 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF); 1299 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
1255 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); 1300 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
1256 _rtl92ce_poweroff_adapter(hw); 1301 _rtl92ce_poweroff_adapter(hw);
1302
1303 /* after power off we should do iqk again */
1304 rtlpriv->phy.iqk_initialized = false;
1257} 1305}
1258 1306
1259void rtl92ce_interrupt_recognized(struct ieee80211_hw *hw, 1307void rtl92ce_interrupt_recognized(struct ieee80211_hw *hw,
@@ -1912,6 +1960,8 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
1912 ratr_bitmap &= 0x0f0ff0ff; 1960 ratr_bitmap &= 0x0f0ff0ff;
1913 break; 1961 break;
1914 } 1962 }
1963 sta_entry->ratr_index = ratr_index;
1964
1915 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, 1965 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
1916 "ratr_bitmap :%x\n", ratr_bitmap); 1966 "ratr_bitmap :%x\n", ratr_bitmap);
1917 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) | 1967 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
index 88deae67cc14..73262ca3864b 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
@@ -82,6 +82,8 @@ bool rtl92c_phy_mac_config(struct ieee80211_hw *hw)
82 82
83 if (is92c) 83 if (is92c)
84 rtl_write_byte(rtlpriv, 0x14, 0x71); 84 rtl_write_byte(rtlpriv, 0x14, 0x71);
85 else
86 rtl_write_byte(rtlpriv, 0x04CA, 0x0A);
85 return rtstatus; 87 return rtstatus;
86} 88}
87 89
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
index ea2e1bd847c8..60451eea4d82 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
@@ -162,12 +162,10 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
162 162
163 /* request fw */ 163 /* request fw */
164 if (IS_VENDOR_UMC_A_CUT(rtlhal->version) && 164 if (IS_VENDOR_UMC_A_CUT(rtlhal->version) &&
165 !IS_92C_SERIAL(rtlhal->version)) { 165 !IS_92C_SERIAL(rtlhal->version))
166 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin"; 166 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin";
167 } else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) { 167 else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version))
168 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin"; 168 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin";
169 pr_info("****** This B_CUT device may not work with kernels 3.6 and earlier\n");
170 }
171 169
172 rtlpriv->max_fw_size = 0x4000; 170 rtlpriv->max_fw_size = 0x4000;
173 pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name); 171 pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
index 390d6d4fcaa0..b8a3c035a889 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
@@ -127,11 +127,11 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
127{ 127{
128 struct rtl_priv *rtlpriv = rtl_priv(hw); 128 struct rtl_priv *rtlpriv = rtl_priv(hw);
129 struct phy_sts_cck_8192s_t *cck_buf; 129 struct phy_sts_cck_8192s_t *cck_buf;
130 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
130 s8 rx_pwr_all = 0, rx_pwr[4]; 131 s8 rx_pwr_all = 0, rx_pwr[4];
131 u8 evm, pwdb_all, rf_rx_num = 0; 132 u8 evm, pwdb_all, rf_rx_num = 0;
132 u8 i, max_spatial_stream; 133 u8 i, max_spatial_stream;
133 u32 rssi, total_rssi = 0; 134 u32 rssi, total_rssi = 0;
134 bool in_powersavemode = false;
135 bool is_cck_rate; 135 bool is_cck_rate;
136 136
137 is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc); 137 is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc);
@@ -147,7 +147,7 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
147 u8 report, cck_highpwr; 147 u8 report, cck_highpwr;
148 cck_buf = (struct phy_sts_cck_8192s_t *)p_drvinfo; 148 cck_buf = (struct phy_sts_cck_8192s_t *)p_drvinfo;
149 149
150 if (!in_powersavemode) 150 if (ppsc->rfpwr_state == ERFON)
151 cck_highpwr = (u8) rtl_get_bbreg(hw, 151 cck_highpwr = (u8) rtl_get_bbreg(hw,
152 RFPGA0_XA_HSSIPARAMETER2, 152 RFPGA0_XA_HSSIPARAMETER2,
153 BIT(9)); 153 BIT(9));