aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192ce/hw.c')
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/hw.c165
1 files changed, 81 insertions, 84 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
index 5c646d5f7bb8..303b299376c9 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
@@ -544,8 +544,13 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
544 (u8 *)(&fw_current_inps)); 544 (u8 *)(&fw_current_inps));
545 } 545 }
546 break; } 546 break; }
547 case HW_VAR_KEEP_ALIVE: 547 case HW_VAR_KEEP_ALIVE: {
548 break; 548 u8 array[2];
549
550 array[0] = 0xff;
551 array[1] = *((u8 *)val);
552 rtl92c_fill_h2c_cmd(hw, H2C_92C_KEEP_ALIVE_CTRL, 2, array);
553 break; }
549 default: 554 default:
550 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 555 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
551 "switch case %d not processed\n", variable); 556 "switch case %d not processed\n", variable);
@@ -1156,47 +1161,35 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
1156 struct rtl_priv *rtlpriv = rtl_priv(hw); 1161 struct rtl_priv *rtlpriv = rtl_priv(hw);
1157 u8 bt_msr = rtl_read_byte(rtlpriv, MSR); 1162 u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
1158 enum led_ctl_mode ledaction = LED_CTL_NO_LINK; 1163 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
1159 bt_msr &= 0xfc; 1164 u8 mode = MSR_NOLINK;
1160 1165
1161 if (type == NL80211_IFTYPE_UNSPECIFIED || 1166 bt_msr &= 0xfc;
1162 type == NL80211_IFTYPE_STATION) {
1163 _rtl92ce_stop_tx_beacon(hw);
1164 _rtl92ce_enable_bcn_sub_func(hw);
1165 } else if (type == NL80211_IFTYPE_ADHOC || type == NL80211_IFTYPE_AP ||
1166 type == NL80211_IFTYPE_MESH_POINT) {
1167 _rtl92ce_resume_tx_beacon(hw);
1168 _rtl92ce_disable_bcn_sub_func(hw);
1169 } else {
1170 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1171 "Set HW_VAR_MEDIA_STATUS: No such media status(%x)\n",
1172 type);
1173 }
1174 1167
1175 switch (type) { 1168 switch (type) {
1176 case NL80211_IFTYPE_UNSPECIFIED: 1169 case NL80211_IFTYPE_UNSPECIFIED:
1177 bt_msr |= MSR_NOLINK; 1170 mode = MSR_NOLINK;
1178 ledaction = LED_CTL_LINK;
1179 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1171 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1180 "Set Network type to NO LINK!\n"); 1172 "Set Network type to NO LINK!\n");
1181 break; 1173 break;
1182 case NL80211_IFTYPE_ADHOC: 1174 case NL80211_IFTYPE_ADHOC:
1183 bt_msr |= MSR_ADHOC; 1175 mode = MSR_ADHOC;
1184 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1176 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1185 "Set Network type to Ad Hoc!\n"); 1177 "Set Network type to Ad Hoc!\n");
1186 break; 1178 break;
1187 case NL80211_IFTYPE_STATION: 1179 case NL80211_IFTYPE_STATION:
1188 bt_msr |= MSR_INFRA; 1180 mode = MSR_INFRA;
1189 ledaction = LED_CTL_LINK; 1181 ledaction = LED_CTL_LINK;
1190 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1182 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1191 "Set Network type to STA!\n"); 1183 "Set Network type to STA!\n");
1192 break; 1184 break;
1193 case NL80211_IFTYPE_AP: 1185 case NL80211_IFTYPE_AP:
1194 bt_msr |= MSR_AP; 1186 mode = MSR_AP;
1187 ledaction = LED_CTL_LINK;
1195 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1188 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1196 "Set Network type to AP!\n"); 1189 "Set Network type to AP!\n");
1197 break; 1190 break;
1198 case NL80211_IFTYPE_MESH_POINT: 1191 case NL80211_IFTYPE_MESH_POINT:
1199 bt_msr |= MSR_ADHOC; 1192 mode = MSR_ADHOC;
1200 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1193 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1201 "Set Network type to Mesh Point!\n"); 1194 "Set Network type to Mesh Point!\n");
1202 break; 1195 break;
@@ -1207,9 +1200,32 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
1207 1200
1208 } 1201 }
1209 1202
1210 rtl_write_byte(rtlpriv, (MSR), bt_msr); 1203 /* MSR_INFRA == Link in infrastructure network;
1204 * MSR_ADHOC == Link in ad hoc network;
1205 * Therefore, check link state is necessary.
1206 *
1207 * MSR_AP == AP mode; link state does not matter here.
1208 */
1209 if (mode != MSR_AP &&
1210 rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1211 mode = MSR_NOLINK;
1212 ledaction = LED_CTL_NO_LINK;
1213 }
1214 if (mode == MSR_NOLINK || mode == MSR_INFRA) {
1215 _rtl92ce_stop_tx_beacon(hw);
1216 _rtl92ce_enable_bcn_sub_func(hw);
1217 } else if (mode == MSR_ADHOC || mode == MSR_AP) {
1218 _rtl92ce_resume_tx_beacon(hw);
1219 _rtl92ce_disable_bcn_sub_func(hw);
1220 } else {
1221 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1222 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1223 mode);
1224 }
1225 rtl_write_byte(rtlpriv, MSR, bt_msr | mode);
1226
1211 rtlpriv->cfg->ops->led_control(hw, ledaction); 1227 rtlpriv->cfg->ops->led_control(hw, ledaction);
1212 if ((bt_msr & MSR_MASK) == MSR_AP) 1228 if (mode == MSR_AP)
1213 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 1229 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
1214 else 1230 else
1215 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66); 1231 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
@@ -1833,7 +1849,6 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,
1833 u32 ratr_value; 1849 u32 ratr_value;
1834 u8 ratr_index = 0; 1850 u8 ratr_index = 0;
1835 u8 nmode = mac->ht_enable; 1851 u8 nmode = mac->ht_enable;
1836 u8 mimo_ps = IEEE80211_SMPS_OFF;
1837 u16 shortgi_rate; 1852 u16 shortgi_rate;
1838 u32 tmp_ratr_value; 1853 u32 tmp_ratr_value;
1839 u8 curtxbw_40mhz = mac->bw_40; 1854 u8 curtxbw_40mhz = mac->bw_40;
@@ -1842,6 +1857,7 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,
1842 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ? 1857 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
1843 1 : 0; 1858 1 : 0;
1844 enum wireless_mode wirelessmode = mac->mode; 1859 enum wireless_mode wirelessmode = mac->mode;
1860 u32 ratr_mask;
1845 1861
1846 if (rtlhal->current_bandtype == BAND_ON_5G) 1862 if (rtlhal->current_bandtype == BAND_ON_5G)
1847 ratr_value = sta->supp_rates[1] << 4; 1863 ratr_value = sta->supp_rates[1] << 4;
@@ -1865,19 +1881,13 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,
1865 case WIRELESS_MODE_N_24G: 1881 case WIRELESS_MODE_N_24G:
1866 case WIRELESS_MODE_N_5G: 1882 case WIRELESS_MODE_N_5G:
1867 nmode = 1; 1883 nmode = 1;
1868 if (mimo_ps == IEEE80211_SMPS_STATIC) { 1884 if (get_rf_type(rtlphy) == RF_1T2R ||
1869 ratr_value &= 0x0007F005; 1885 get_rf_type(rtlphy) == RF_1T1R)
1870 } else { 1886 ratr_mask = 0x000ff005;
1871 u32 ratr_mask; 1887 else
1872 1888 ratr_mask = 0x0f0ff005;
1873 if (get_rf_type(rtlphy) == RF_1T2R ||
1874 get_rf_type(rtlphy) == RF_1T1R)
1875 ratr_mask = 0x000ff005;
1876 else
1877 ratr_mask = 0x0f0ff005;
1878 1889
1879 ratr_value &= ratr_mask; 1890 ratr_value &= ratr_mask;
1880 }
1881 break; 1891 break;
1882 default: 1892 default:
1883 if (rtlphy->rf_type == RF_1T2R) 1893 if (rtlphy->rf_type == RF_1T2R)
@@ -1930,17 +1940,16 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
1930 struct rtl_sta_info *sta_entry = NULL; 1940 struct rtl_sta_info *sta_entry = NULL;
1931 u32 ratr_bitmap; 1941 u32 ratr_bitmap;
1932 u8 ratr_index; 1942 u8 ratr_index;
1933 u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0; 1943 u8 curtxbw_40mhz = (sta->ht_cap.cap &
1934 u8 curshortgi_40mhz = curtxbw_40mhz && 1944 IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
1935 (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? 1945 u8 curshortgi_40mhz = (sta->ht_cap.cap &
1936 1 : 0; 1946 IEEE80211_HT_CAP_SGI_40) ? 1 : 0;
1937 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ? 1947 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
1938 1 : 0; 1948 1 : 0;
1939 enum wireless_mode wirelessmode = 0; 1949 enum wireless_mode wirelessmode = 0;
1940 bool shortgi = false; 1950 bool shortgi = false;
1941 u8 rate_mask[5]; 1951 u8 rate_mask[5];
1942 u8 macid = 0; 1952 u8 macid = 0;
1943 u8 mimo_ps = IEEE80211_SMPS_OFF;
1944 1953
1945 sta_entry = (struct rtl_sta_info *) sta->drv_priv; 1954 sta_entry = (struct rtl_sta_info *) sta->drv_priv;
1946 wirelessmode = sta_entry->wireless_mode; 1955 wirelessmode = sta_entry->wireless_mode;
@@ -1985,47 +1994,38 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
1985 case WIRELESS_MODE_N_5G: 1994 case WIRELESS_MODE_N_5G:
1986 ratr_index = RATR_INX_WIRELESS_NGB; 1995 ratr_index = RATR_INX_WIRELESS_NGB;
1987 1996
1988 if (mimo_ps == IEEE80211_SMPS_STATIC) { 1997 if (rtlphy->rf_type == RF_1T2R ||
1989 if (rssi_level == 1) 1998 rtlphy->rf_type == RF_1T1R) {
1990 ratr_bitmap &= 0x00070000; 1999 if (curtxbw_40mhz) {
1991 else if (rssi_level == 2) 2000 if (rssi_level == 1)
1992 ratr_bitmap &= 0x0007f000; 2001 ratr_bitmap &= 0x000f0000;
1993 else 2002 else if (rssi_level == 2)
1994 ratr_bitmap &= 0x0007f005; 2003 ratr_bitmap &= 0x000ff000;
2004 else
2005 ratr_bitmap &= 0x000ff015;
2006 } else {
2007 if (rssi_level == 1)
2008 ratr_bitmap &= 0x000f0000;
2009 else if (rssi_level == 2)
2010 ratr_bitmap &= 0x000ff000;
2011 else
2012 ratr_bitmap &= 0x000ff005;
2013 }
1995 } else { 2014 } else {
1996 if (rtlphy->rf_type == RF_1T2R || 2015 if (curtxbw_40mhz) {
1997 rtlphy->rf_type == RF_1T1R) { 2016 if (rssi_level == 1)
1998 if (curtxbw_40mhz) { 2017 ratr_bitmap &= 0x0f0f0000;
1999 if (rssi_level == 1) 2018 else if (rssi_level == 2)
2000 ratr_bitmap &= 0x000f0000; 2019 ratr_bitmap &= 0x0f0ff000;
2001 else if (rssi_level == 2) 2020 else
2002 ratr_bitmap &= 0x000ff000; 2021 ratr_bitmap &= 0x0f0ff015;
2003 else
2004 ratr_bitmap &= 0x000ff015;
2005 } else {
2006 if (rssi_level == 1)
2007 ratr_bitmap &= 0x000f0000;
2008 else if (rssi_level == 2)
2009 ratr_bitmap &= 0x000ff000;
2010 else
2011 ratr_bitmap &= 0x000ff005;
2012 }
2013 } else { 2022 } else {
2014 if (curtxbw_40mhz) { 2023 if (rssi_level == 1)
2015 if (rssi_level == 1) 2024 ratr_bitmap &= 0x0f0f0000;
2016 ratr_bitmap &= 0x0f0f0000; 2025 else if (rssi_level == 2)
2017 else if (rssi_level == 2) 2026 ratr_bitmap &= 0x0f0ff000;
2018 ratr_bitmap &= 0x0f0ff000; 2027 else
2019 else 2028 ratr_bitmap &= 0x0f0ff005;
2020 ratr_bitmap &= 0x0f0ff015;
2021 } else {
2022 if (rssi_level == 1)
2023 ratr_bitmap &= 0x0f0f0000;
2024 else if (rssi_level == 2)
2025 ratr_bitmap &= 0x0f0ff000;
2026 else
2027 ratr_bitmap &= 0x0f0ff005;
2028 }
2029 } 2029 }
2030 } 2030 }
2031 2031
@@ -2058,9 +2058,6 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
2058 "Rate_index:%x, ratr_val:%x, %5phC\n", 2058 "Rate_index:%x, ratr_val:%x, %5phC\n",
2059 ratr_index, ratr_bitmap, rate_mask); 2059 ratr_index, ratr_bitmap, rate_mask);
2060 rtl92c_fill_h2c_cmd(hw, H2C_RA_MASK, 5, rate_mask); 2060 rtl92c_fill_h2c_cmd(hw, H2C_RA_MASK, 5, rate_mask);
2061
2062 if (macid != 0)
2063 sta_entry->ratr_index = ratr_index;
2064} 2061}
2065 2062
2066void rtl92ce_update_hal_rate_tbl(struct ieee80211_hw *hw, 2063void rtl92ce_update_hal_rate_tbl(struct ieee80211_hw *hw,