diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192ce/hw.c')
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | 165 |
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 | ||
2066 | void rtl92ce_update_hal_rate_tbl(struct ieee80211_hw *hw, | 2063 | void rtl92ce_update_hal_rate_tbl(struct ieee80211_hw *hw, |