diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi')
21 files changed, 436 insertions, 217 deletions
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c index ff784072fb42..93bb384eb001 100644 --- a/drivers/net/wireless/rtlwifi/base.c +++ b/drivers/net/wireless/rtlwifi/base.c | |||
@@ -353,7 +353,6 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw) | |||
353 | 353 | ||
354 | /* TODO: Correct this value for our hw */ | 354 | /* TODO: Correct this value for our hw */ |
355 | /* TODO: define these hard code value */ | 355 | /* TODO: define these hard code value */ |
356 | hw->channel_change_time = 100; | ||
357 | hw->max_listen_interval = 10; | 356 | hw->max_listen_interval = 10; |
358 | hw->max_rate_tries = 4; | 357 | hw->max_rate_tries = 4; |
359 | /* hw->max_rates = 1; */ | 358 | /* hw->max_rates = 1; */ |
@@ -1293,7 +1292,7 @@ void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
1293 | return; | 1292 | return; |
1294 | 1293 | ||
1295 | /* and only beacons from the associated BSSID, please */ | 1294 | /* and only beacons from the associated BSSID, please */ |
1296 | if (!ether_addr_equal(hdr->addr3, rtlpriv->mac80211.bssid)) | 1295 | if (!ether_addr_equal_64bits(hdr->addr3, rtlpriv->mac80211.bssid)) |
1297 | return; | 1296 | return; |
1298 | 1297 | ||
1299 | rtlpriv->link_info.bcn_rx_inperiod++; | 1298 | rtlpriv->link_info.bcn_rx_inperiod++; |
@@ -1437,7 +1436,8 @@ void rtl_watchdog_wq_callback(void *data) | |||
1437 | /* if we can't recv beacon for 6s, we should | 1436 | /* if we can't recv beacon for 6s, we should |
1438 | * reconnect this AP | 1437 | * reconnect this AP |
1439 | */ | 1438 | */ |
1440 | if (rtlpriv->link_info.roam_times >= 3) { | 1439 | if ((rtlpriv->link_info.roam_times >= 3) && |
1440 | !is_zero_ether_addr(rtlpriv->mac80211.bssid)) { | ||
1441 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | 1441 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, |
1442 | "AP off, try to reconnect now\n"); | 1442 | "AP off, try to reconnect now\n"); |
1443 | rtlpriv->link_info.roam_times = 0; | 1443 | rtlpriv->link_info.roam_times = 0; |
@@ -1780,7 +1780,7 @@ void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len) | |||
1780 | return; | 1780 | return; |
1781 | 1781 | ||
1782 | /* and only beacons from the associated BSSID, please */ | 1782 | /* and only beacons from the associated BSSID, please */ |
1783 | if (!ether_addr_equal(hdr->addr3, rtlpriv->mac80211.bssid)) | 1783 | if (!ether_addr_equal_64bits(hdr->addr3, rtlpriv->mac80211.bssid)) |
1784 | return; | 1784 | return; |
1785 | 1785 | ||
1786 | if (rtl_find_221_ie(hw, data, len)) | 1786 | if (rtl_find_221_ie(hw, data, len)) |
diff --git a/drivers/net/wireless/rtlwifi/cam.c b/drivers/net/wireless/rtlwifi/cam.c index 0e510f73041a..0276153c72cc 100644 --- a/drivers/net/wireless/rtlwifi/cam.c +++ b/drivers/net/wireless/rtlwifi/cam.c | |||
@@ -295,7 +295,7 @@ u8 rtl_cam_get_free_entry(struct ieee80211_hw *hw, u8 *sta_addr) | |||
295 | /* Does STA already exist? */ | 295 | /* Does STA already exist? */ |
296 | for (i = 4; i < TOTAL_CAM_ENTRY; i++) { | 296 | for (i = 4; i < TOTAL_CAM_ENTRY; i++) { |
297 | addr = rtlpriv->sec.hwsec_cam_sta_addr[i]; | 297 | addr = rtlpriv->sec.hwsec_cam_sta_addr[i]; |
298 | if (memcmp(addr, sta_addr, ETH_ALEN) == 0) | 298 | if (ether_addr_equal_unaligned(addr, sta_addr)) |
299 | return i; | 299 | return i; |
300 | } | 300 | } |
301 | /* Get a free CAM entry. */ | 301 | /* Get a free CAM entry. */ |
@@ -335,7 +335,7 @@ void rtl_cam_del_entry(struct ieee80211_hw *hw, u8 *sta_addr) | |||
335 | addr = rtlpriv->sec.hwsec_cam_sta_addr[i]; | 335 | addr = rtlpriv->sec.hwsec_cam_sta_addr[i]; |
336 | bitmap = (rtlpriv->sec.hwsec_cam_bitmap) >> i; | 336 | bitmap = (rtlpriv->sec.hwsec_cam_bitmap) >> i; |
337 | if (((bitmap & BIT(0)) == BIT(0)) && | 337 | if (((bitmap & BIT(0)) == BIT(0)) && |
338 | (memcmp(addr, sta_addr, ETH_ALEN) == 0)) { | 338 | (ether_addr_equal_unaligned(addr, sta_addr))) { |
339 | /* Remove from HW Security CAM */ | 339 | /* Remove from HW Security CAM */ |
340 | eth_zero_addr(rtlpriv->sec.hwsec_cam_sta_addr[i]); | 340 | eth_zero_addr(rtlpriv->sec.hwsec_cam_sta_addr[i]); |
341 | rtlpriv->sec.hwsec_cam_bitmap &= ~(BIT(0) << i); | 341 | rtlpriv->sec.hwsec_cam_bitmap &= ~(BIT(0) << i); |
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c index 210ce7cd94d8..2d337a0c3df0 100644 --- a/drivers/net/wireless/rtlwifi/core.c +++ b/drivers/net/wireless/rtlwifi/core.c | |||
@@ -46,10 +46,20 @@ void rtl_fw_cb(const struct firmware *firmware, void *context) | |||
46 | "Firmware callback routine entered!\n"); | 46 | "Firmware callback routine entered!\n"); |
47 | complete(&rtlpriv->firmware_loading_complete); | 47 | complete(&rtlpriv->firmware_loading_complete); |
48 | if (!firmware) { | 48 | if (!firmware) { |
49 | if (rtlpriv->cfg->alt_fw_name) { | ||
50 | err = request_firmware(&firmware, | ||
51 | rtlpriv->cfg->alt_fw_name, | ||
52 | rtlpriv->io.dev); | ||
53 | pr_info("Loading alternative firmware %s\n", | ||
54 | rtlpriv->cfg->alt_fw_name); | ||
55 | if (!err) | ||
56 | goto found_alt; | ||
57 | } | ||
49 | pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name); | 58 | pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name); |
50 | rtlpriv->max_fw_size = 0; | 59 | rtlpriv->max_fw_size = 0; |
51 | return; | 60 | return; |
52 | } | 61 | } |
62 | found_alt: | ||
53 | if (firmware->size > rtlpriv->max_fw_size) { | 63 | if (firmware->size > rtlpriv->max_fw_size) { |
54 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | 64 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, |
55 | "Firmware is too big!\n"); | 65 | "Firmware is too big!\n"); |
@@ -184,6 +194,7 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw, | |||
184 | rtlpriv->cfg->maps | 194 | rtlpriv->cfg->maps |
185 | [RTL_IBSS_INT_MASKS]); | 195 | [RTL_IBSS_INT_MASKS]); |
186 | } | 196 | } |
197 | mac->link_state = MAC80211_LINKED; | ||
187 | break; | 198 | break; |
188 | case NL80211_IFTYPE_ADHOC: | 199 | case NL80211_IFTYPE_ADHOC: |
189 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, | 200 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 5a53195d016b..d7aa165fe677 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
@@ -688,8 +688,6 @@ static void _rtl_receive_one(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
688 | rtlpriv->stats.rxbytesunicast += skb->len; | 688 | rtlpriv->stats.rxbytesunicast += skb->len; |
689 | } | 689 | } |
690 | 690 | ||
691 | rtl_is_special_data(hw, skb, false); | ||
692 | |||
693 | if (ieee80211_is_data(fc)) { | 691 | if (ieee80211_is_data(fc)) { |
694 | rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX); | 692 | rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX); |
695 | 693 | ||
diff --git a/drivers/net/wireless/rtlwifi/ps.c b/drivers/net/wireless/rtlwifi/ps.c index 0d81f766fd0f..d1c0191a195b 100644 --- a/drivers/net/wireless/rtlwifi/ps.c +++ b/drivers/net/wireless/rtlwifi/ps.c | |||
@@ -48,7 +48,7 @@ bool rtl_ps_enable_nic(struct ieee80211_hw *hw) | |||
48 | 48 | ||
49 | /*<2> Enable Adapter */ | 49 | /*<2> Enable Adapter */ |
50 | if (rtlpriv->cfg->ops->hw_init(hw)) | 50 | if (rtlpriv->cfg->ops->hw_init(hw)) |
51 | return 1; | 51 | return false; |
52 | RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); | 52 | RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); |
53 | 53 | ||
54 | /*<3> Enable Interrupt */ | 54 | /*<3> Enable Interrupt */ |
@@ -478,7 +478,7 @@ void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len) | |||
478 | return; | 478 | return; |
479 | 479 | ||
480 | /* and only beacons from the associated BSSID, please */ | 480 | /* and only beacons from the associated BSSID, please */ |
481 | if (!ether_addr_equal(hdr->addr3, rtlpriv->mac80211.bssid)) | 481 | if (!ether_addr_equal_64bits(hdr->addr3, rtlpriv->mac80211.bssid)) |
482 | return; | 482 | return; |
483 | 483 | ||
484 | rtlpriv->psc.last_beacon = jiffies; | 484 | rtlpriv->psc.last_beacon = jiffies; |
@@ -923,7 +923,7 @@ void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len) | |||
923 | return; | 923 | return; |
924 | 924 | ||
925 | /* and only beacons from the associated BSSID, please */ | 925 | /* and only beacons from the associated BSSID, please */ |
926 | if (!ether_addr_equal(hdr->addr3, rtlpriv->mac80211.bssid)) | 926 | if (!ether_addr_equal_64bits(hdr->addr3, rtlpriv->mac80211.bssid)) |
927 | return; | 927 | return; |
928 | 928 | ||
929 | /* check if this really is a beacon */ | 929 | /* check if this really is a beacon */ |
diff --git a/drivers/net/wireless/rtlwifi/regd.c b/drivers/net/wireless/rtlwifi/regd.c index d7d0d4948b01..a4eb9b271438 100644 --- a/drivers/net/wireless/rtlwifi/regd.c +++ b/drivers/net/wireless/rtlwifi/regd.c | |||
@@ -59,30 +59,26 @@ static struct country_code_to_enum_rd allCountries[] = { | |||
59 | */ | 59 | */ |
60 | #define RTL819x_2GHZ_CH12_13 \ | 60 | #define RTL819x_2GHZ_CH12_13 \ |
61 | REG_RULE(2467-10, 2472+10, 40, 0, 20,\ | 61 | REG_RULE(2467-10, 2472+10, 40, 0, 20,\ |
62 | NL80211_RRF_PASSIVE_SCAN) | 62 | NL80211_RRF_NO_IR) |
63 | 63 | ||
64 | #define RTL819x_2GHZ_CH14 \ | 64 | #define RTL819x_2GHZ_CH14 \ |
65 | REG_RULE(2484-10, 2484+10, 40, 0, 20, \ | 65 | REG_RULE(2484-10, 2484+10, 40, 0, 20, \ |
66 | NL80211_RRF_PASSIVE_SCAN | \ | 66 | NL80211_RRF_NO_IR | NL80211_RRF_NO_OFDM) |
67 | NL80211_RRF_NO_OFDM) | ||
68 | 67 | ||
69 | /* 5G chan 36 - chan 64*/ | 68 | /* 5G chan 36 - chan 64*/ |
70 | #define RTL819x_5GHZ_5150_5350 \ | 69 | #define RTL819x_5GHZ_5150_5350 \ |
71 | REG_RULE(5150-10, 5350+10, 40, 0, 30, \ | 70 | REG_RULE(5150-10, 5350+10, 40, 0, 30, \ |
72 | NL80211_RRF_PASSIVE_SCAN | \ | 71 | NL80211_RRF_NO_IR) |
73 | NL80211_RRF_NO_IBSS) | ||
74 | 72 | ||
75 | /* 5G chan 100 - chan 165*/ | 73 | /* 5G chan 100 - chan 165*/ |
76 | #define RTL819x_5GHZ_5470_5850 \ | 74 | #define RTL819x_5GHZ_5470_5850 \ |
77 | REG_RULE(5470-10, 5850+10, 40, 0, 30, \ | 75 | REG_RULE(5470-10, 5850+10, 40, 0, 30, \ |
78 | NL80211_RRF_PASSIVE_SCAN | \ | 76 | NL80211_RRF_NO_IR) |
79 | NL80211_RRF_NO_IBSS) | ||
80 | 77 | ||
81 | /* 5G chan 149 - chan 165*/ | 78 | /* 5G chan 149 - chan 165*/ |
82 | #define RTL819x_5GHZ_5725_5850 \ | 79 | #define RTL819x_5GHZ_5725_5850 \ |
83 | REG_RULE(5725-10, 5850+10, 40, 0, 30, \ | 80 | REG_RULE(5725-10, 5850+10, 40, 0, 30, \ |
84 | NL80211_RRF_PASSIVE_SCAN | \ | 81 | NL80211_RRF_NO_IR) |
85 | NL80211_RRF_NO_IBSS) | ||
86 | 82 | ||
87 | #define RTL819x_5GHZ_ALL \ | 83 | #define RTL819x_5GHZ_ALL \ |
88 | (RTL819x_5GHZ_5150_5350, RTL819x_5GHZ_5470_5850) | 84 | (RTL819x_5GHZ_5150_5350, RTL819x_5GHZ_5470_5850) |
@@ -172,7 +168,8 @@ static void _rtl_reg_apply_beaconing_flags(struct wiphy *wiphy, | |||
172 | (ch->flags & IEEE80211_CHAN_RADAR)) | 168 | (ch->flags & IEEE80211_CHAN_RADAR)) |
173 | continue; | 169 | continue; |
174 | if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) { | 170 | if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) { |
175 | reg_rule = freq_reg_info(wiphy, ch->center_freq); | 171 | reg_rule = freq_reg_info(wiphy, |
172 | MHZ_TO_KHZ(ch->center_freq)); | ||
176 | if (IS_ERR(reg_rule)) | 173 | if (IS_ERR(reg_rule)) |
177 | continue; | 174 | continue; |
178 | 175 | ||
@@ -185,16 +182,11 @@ static void _rtl_reg_apply_beaconing_flags(struct wiphy *wiphy, | |||
185 | *regulatory_hint(). | 182 | *regulatory_hint(). |
186 | */ | 183 | */ |
187 | 184 | ||
188 | if (!(reg_rule->flags & NL80211_RRF_NO_IBSS)) | 185 | if (!(reg_rule->flags & NL80211_RRF_NO_IR)) |
189 | ch->flags &= ~IEEE80211_CHAN_NO_IBSS; | 186 | ch->flags &= ~IEEE80211_CHAN_NO_IR; |
190 | if (!(reg_rule-> | ||
191 | flags & NL80211_RRF_PASSIVE_SCAN)) | ||
192 | ch->flags &= | ||
193 | ~IEEE80211_CHAN_PASSIVE_SCAN; | ||
194 | } else { | 187 | } else { |
195 | if (ch->beacon_found) | 188 | if (ch->beacon_found) |
196 | ch->flags &= ~(IEEE80211_CHAN_NO_IBSS | | 189 | ch->flags &= ~IEEE80211_CHAN_NO_IR; |
197 | IEEE80211_CHAN_PASSIVE_SCAN); | ||
198 | } | 190 | } |
199 | } | 191 | } |
200 | } | 192 | } |
@@ -219,11 +211,11 @@ static void _rtl_reg_apply_active_scan_flags(struct wiphy *wiphy, | |||
219 | */ | 211 | */ |
220 | if (initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) { | 212 | if (initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) { |
221 | ch = &sband->channels[11]; /* CH 12 */ | 213 | ch = &sband->channels[11]; /* CH 12 */ |
222 | if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN) | 214 | if (ch->flags & IEEE80211_CHAN_NO_IR) |
223 | ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN; | 215 | ch->flags &= ~IEEE80211_CHAN_NO_IR; |
224 | ch = &sband->channels[12]; /* CH 13 */ | 216 | ch = &sband->channels[12]; /* CH 13 */ |
225 | if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN) | 217 | if (ch->flags & IEEE80211_CHAN_NO_IR) |
226 | ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN; | 218 | ch->flags &= ~IEEE80211_CHAN_NO_IR; |
227 | return; | 219 | return; |
228 | } | 220 | } |
229 | 221 | ||
@@ -235,19 +227,19 @@ static void _rtl_reg_apply_active_scan_flags(struct wiphy *wiphy, | |||
235 | */ | 227 | */ |
236 | 228 | ||
237 | ch = &sband->channels[11]; /* CH 12 */ | 229 | ch = &sband->channels[11]; /* CH 12 */ |
238 | reg_rule = freq_reg_info(wiphy, ch->center_freq); | 230 | reg_rule = freq_reg_info(wiphy, MHZ_TO_KHZ(ch->center_freq)); |
239 | if (!IS_ERR(reg_rule)) { | 231 | if (!IS_ERR(reg_rule)) { |
240 | if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN)) | 232 | if (!(reg_rule->flags & NL80211_RRF_NO_IR)) |
241 | if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN) | 233 | if (ch->flags & IEEE80211_CHAN_NO_IR) |
242 | ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN; | 234 | ch->flags &= ~IEEE80211_CHAN_NO_IR; |
243 | } | 235 | } |
244 | 236 | ||
245 | ch = &sband->channels[12]; /* CH 13 */ | 237 | ch = &sband->channels[12]; /* CH 13 */ |
246 | reg_rule = freq_reg_info(wiphy, ch->center_freq); | 238 | reg_rule = freq_reg_info(wiphy, MHZ_TO_KHZ(ch->center_freq)); |
247 | if (!IS_ERR(reg_rule)) { | 239 | if (!IS_ERR(reg_rule)) { |
248 | if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN)) | 240 | if (!(reg_rule->flags & NL80211_RRF_NO_IR)) |
249 | if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN) | 241 | if (ch->flags & IEEE80211_CHAN_NO_IR) |
250 | ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN; | 242 | ch->flags &= ~IEEE80211_CHAN_NO_IR; |
251 | } | 243 | } |
252 | } | 244 | } |
253 | 245 | ||
@@ -284,8 +276,7 @@ static void _rtl_reg_apply_radar_flags(struct wiphy *wiphy) | |||
284 | */ | 276 | */ |
285 | if (!(ch->flags & IEEE80211_CHAN_DISABLED)) | 277 | if (!(ch->flags & IEEE80211_CHAN_DISABLED)) |
286 | ch->flags |= IEEE80211_CHAN_RADAR | | 278 | ch->flags |= IEEE80211_CHAN_RADAR | |
287 | IEEE80211_CHAN_NO_IBSS | | 279 | IEEE80211_CHAN_NO_IR; |
288 | IEEE80211_CHAN_PASSIVE_SCAN; | ||
289 | } | 280 | } |
290 | } | 281 | } |
291 | 282 | ||
@@ -354,9 +345,9 @@ static int _rtl_regd_init_wiphy(struct rtl_regulatory *reg, | |||
354 | 345 | ||
355 | wiphy->reg_notifier = reg_notifier; | 346 | wiphy->reg_notifier = reg_notifier; |
356 | 347 | ||
357 | wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; | 348 | wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG; |
358 | wiphy->flags &= ~WIPHY_FLAG_STRICT_REGULATORY; | 349 | wiphy->regulatory_flags &= ~REGULATORY_STRICT_REG; |
359 | wiphy->flags &= ~WIPHY_FLAG_DISABLE_BEACON_HINTS; | 350 | wiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS; |
360 | 351 | ||
361 | regd = _rtl_regdomain_select(reg); | 352 | regd = _rtl_regdomain_select(reg); |
362 | wiphy_apply_custom_regulatory(wiphy, regd); | 353 | wiphy_apply_custom_regulatory(wiphy, regd); |
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c index 21a5cf060677..a6184b6e1d57 100644 --- a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c +++ b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c | |||
@@ -1078,7 +1078,7 @@ static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw | |||
1078 | rtldm->swing_flag_ofdm = true; | 1078 | rtldm->swing_flag_ofdm = true; |
1079 | } | 1079 | } |
1080 | 1080 | ||
1081 | if (rtldm->swing_idx_cck != rtldm->swing_idx_cck) { | 1081 | if (rtldm->swing_idx_cck_cur != rtldm->swing_idx_cck) { |
1082 | rtldm->swing_idx_cck_cur = rtldm->swing_idx_cck; | 1082 | rtldm->swing_idx_cck_cur = rtldm->swing_idx_cck; |
1083 | rtldm->swing_flag_cck = true; | 1083 | rtldm->swing_flag_cck = true; |
1084 | } | 1084 | } |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c index e9caa5d4cff0..eb78fd8607f7 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c +++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | |||
@@ -158,6 +158,42 @@ static const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = { | |||
158 | {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} | 158 | {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} |
159 | }; | 159 | }; |
160 | 160 | ||
161 | static u32 power_index_reg[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a}; | ||
162 | |||
163 | void dm_restorepowerindex(struct ieee80211_hw *hw) | ||
164 | { | ||
165 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
166 | u8 index; | ||
167 | |||
168 | for (index = 0; index < 6; index++) | ||
169 | rtl_write_byte(rtlpriv, power_index_reg[index], | ||
170 | rtlpriv->dm.powerindex_backup[index]); | ||
171 | } | ||
172 | EXPORT_SYMBOL_GPL(dm_restorepowerindex); | ||
173 | |||
174 | void dm_writepowerindex(struct ieee80211_hw *hw, u8 value) | ||
175 | { | ||
176 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
177 | u8 index; | ||
178 | |||
179 | for (index = 0; index < 6; index++) | ||
180 | rtl_write_byte(rtlpriv, power_index_reg[index], value); | ||
181 | } | ||
182 | EXPORT_SYMBOL_GPL(dm_writepowerindex); | ||
183 | |||
184 | void dm_savepowerindex(struct ieee80211_hw *hw) | ||
185 | { | ||
186 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
187 | u8 index; | ||
188 | u8 tmp; | ||
189 | |||
190 | for (index = 0; index < 6; index++) { | ||
191 | tmp = rtl_read_byte(rtlpriv, power_index_reg[index]); | ||
192 | rtlpriv->dm.powerindex_backup[index] = tmp; | ||
193 | } | ||
194 | } | ||
195 | EXPORT_SYMBOL_GPL(dm_savepowerindex); | ||
196 | |||
161 | static void rtl92c_dm_diginit(struct ieee80211_hw *hw) | 197 | static void rtl92c_dm_diginit(struct ieee80211_hw *hw) |
162 | { | 198 | { |
163 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 199 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
@@ -180,7 +216,12 @@ static void rtl92c_dm_diginit(struct ieee80211_hw *hw) | |||
180 | dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX; | 216 | dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX; |
181 | dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN; | 217 | dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN; |
182 | dm_digtable->pre_cck_pd_state = CCK_PD_STAGE_MAX; | 218 | dm_digtable->pre_cck_pd_state = CCK_PD_STAGE_MAX; |
183 | dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX; | 219 | dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_LowRssi; |
220 | |||
221 | dm_digtable->forbidden_igi = DM_DIG_MIN; | ||
222 | dm_digtable->large_fa_hit = 0; | ||
223 | dm_digtable->recover_cnt = 0; | ||
224 | dm_digtable->dig_dynamic_min = 0x25; | ||
184 | } | 225 | } |
185 | 226 | ||
186 | static u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw) | 227 | static u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw) |
@@ -206,7 +247,9 @@ static u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw) | |||
206 | rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb; | 247 | rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb; |
207 | } | 248 | } |
208 | 249 | ||
209 | return (u8) rssi_val_min; | 250 | if (rssi_val_min > 100) |
251 | rssi_val_min = 100; | ||
252 | return (u8)rssi_val_min; | ||
210 | } | 253 | } |
211 | 254 | ||
212 | static void rtl92c_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw) | 255 | static void rtl92c_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw) |
@@ -224,9 +267,17 @@ static void rtl92c_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw) | |||
224 | 267 | ||
225 | ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER3, MASKDWORD); | 268 | ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER3, MASKDWORD); |
226 | falsealm_cnt->cnt_mcs_fail = (ret_value & 0xffff); | 269 | falsealm_cnt->cnt_mcs_fail = (ret_value & 0xffff); |
270 | |||
271 | ret_value = rtl_get_bbreg(hw, ROFDM0_FRAMESYNC, MASKDWORD); | ||
272 | falsealm_cnt->cnt_fast_fsync_fail = (ret_value & 0xffff); | ||
273 | falsealm_cnt->cnt_sb_search_fail = ((ret_value & 0xffff0000) >> 16); | ||
274 | |||
227 | falsealm_cnt->cnt_ofdm_fail = falsealm_cnt->cnt_parity_fail + | 275 | falsealm_cnt->cnt_ofdm_fail = falsealm_cnt->cnt_parity_fail + |
228 | falsealm_cnt->cnt_rate_illegal + | 276 | falsealm_cnt->cnt_rate_illegal + |
229 | falsealm_cnt->cnt_crc8_fail + falsealm_cnt->cnt_mcs_fail; | 277 | falsealm_cnt->cnt_crc8_fail + |
278 | falsealm_cnt->cnt_mcs_fail + | ||
279 | falsealm_cnt->cnt_fast_fsync_fail + | ||
280 | falsealm_cnt->cnt_sb_search_fail; | ||
230 | 281 | ||
231 | rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(14), 1); | 282 | rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(14), 1); |
232 | ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERLOWER, MASKBYTE0); | 283 | ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERLOWER, MASKBYTE0); |
@@ -271,12 +322,14 @@ static void rtl92c_dm_ctrl_initgain_by_fa(struct ieee80211_hw *hw) | |||
271 | value_igi++; | 322 | value_igi++; |
272 | else if (rtlpriv->falsealm_cnt.cnt_all >= DM_DIG_FA_TH2) | 323 | else if (rtlpriv->falsealm_cnt.cnt_all >= DM_DIG_FA_TH2) |
273 | value_igi += 2; | 324 | value_igi += 2; |
325 | |||
274 | if (value_igi > DM_DIG_FA_UPPER) | 326 | if (value_igi > DM_DIG_FA_UPPER) |
275 | value_igi = DM_DIG_FA_UPPER; | 327 | value_igi = DM_DIG_FA_UPPER; |
276 | else if (value_igi < DM_DIG_FA_LOWER) | 328 | else if (value_igi < DM_DIG_FA_LOWER) |
277 | value_igi = DM_DIG_FA_LOWER; | 329 | value_igi = DM_DIG_FA_LOWER; |
330 | |||
278 | if (rtlpriv->falsealm_cnt.cnt_all > 10000) | 331 | if (rtlpriv->falsealm_cnt.cnt_all > 10000) |
279 | value_igi = 0x32; | 332 | value_igi = DM_DIG_FA_UPPER; |
280 | 333 | ||
281 | dm_digtable->cur_igvalue = value_igi; | 334 | dm_digtable->cur_igvalue = value_igi; |
282 | rtl92c_dm_write_dig(hw); | 335 | rtl92c_dm_write_dig(hw); |
@@ -286,32 +339,80 @@ static void rtl92c_dm_ctrl_initgain_by_rssi(struct ieee80211_hw *hw) | |||
286 | { | 339 | { |
287 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 340 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
288 | struct dig_t *digtable = &rtlpriv->dm_digtable; | 341 | struct dig_t *digtable = &rtlpriv->dm_digtable; |
342 | u32 isbt; | ||
343 | |||
344 | /* modify DIG lower bound, deal with abnorally large false alarm */ | ||
345 | if (rtlpriv->falsealm_cnt.cnt_all > 10000) { | ||
346 | digtable->large_fa_hit++; | ||
347 | if (digtable->forbidden_igi < digtable->cur_igvalue) { | ||
348 | digtable->forbidden_igi = digtable->cur_igvalue; | ||
349 | digtable->large_fa_hit = 1; | ||
350 | } | ||
289 | 351 | ||
290 | if (rtlpriv->falsealm_cnt.cnt_all > digtable->fa_highthresh) { | 352 | if (digtable->large_fa_hit >= 3) { |
291 | if ((digtable->back_val - 2) < digtable->back_range_min) | 353 | if ((digtable->forbidden_igi + 1) > |
292 | digtable->back_val = digtable->back_range_min; | 354 | digtable->rx_gain_max) |
293 | else | 355 | digtable->rx_gain_min = digtable->rx_gain_max; |
294 | digtable->back_val -= 2; | 356 | else |
295 | } else if (rtlpriv->falsealm_cnt.cnt_all < digtable->fa_lowthresh) { | 357 | digtable->rx_gain_min = (digtable->forbidden_igi + 1); |
296 | if ((digtable->back_val + 2) > digtable->back_range_max) | 358 | digtable->recover_cnt = 3600; /* 3600=2hr */ |
297 | digtable->back_val = digtable->back_range_max; | 359 | } |
298 | else | 360 | } else { |
299 | digtable->back_val += 2; | 361 | /* Recovery mechanism for IGI lower bound */ |
362 | if (digtable->recover_cnt != 0) { | ||
363 | digtable->recover_cnt--; | ||
364 | } else { | ||
365 | if (digtable->large_fa_hit == 0) { | ||
366 | if ((digtable->forbidden_igi-1) < DM_DIG_MIN) { | ||
367 | digtable->forbidden_igi = DM_DIG_MIN; | ||
368 | digtable->rx_gain_min = DM_DIG_MIN; | ||
369 | } else { | ||
370 | digtable->forbidden_igi--; | ||
371 | digtable->rx_gain_min = digtable->forbidden_igi + 1; | ||
372 | } | ||
373 | } else if (digtable->large_fa_hit == 3) { | ||
374 | digtable->large_fa_hit = 0; | ||
375 | } | ||
376 | } | ||
377 | } | ||
378 | if (rtlpriv->falsealm_cnt.cnt_all < 250) { | ||
379 | isbt = rtl_read_byte(rtlpriv, 0x4fd) & 0x01; | ||
380 | |||
381 | if (!isbt) { | ||
382 | if (rtlpriv->falsealm_cnt.cnt_all > | ||
383 | digtable->fa_lowthresh) { | ||
384 | if ((digtable->back_val - 2) < | ||
385 | digtable->back_range_min) | ||
386 | digtable->back_val = digtable->back_range_min; | ||
387 | else | ||
388 | digtable->back_val -= 2; | ||
389 | } else if (rtlpriv->falsealm_cnt.cnt_all < | ||
390 | digtable->fa_lowthresh) { | ||
391 | if ((digtable->back_val + 2) > | ||
392 | digtable->back_range_max) | ||
393 | digtable->back_val = digtable->back_range_max; | ||
394 | else | ||
395 | digtable->back_val += 2; | ||
396 | } | ||
397 | } else { | ||
398 | digtable->back_val = DM_DIG_BACKOFF_DEFAULT; | ||
399 | } | ||
400 | } else { | ||
401 | /* Adjust initial gain by false alarm */ | ||
402 | if (rtlpriv->falsealm_cnt.cnt_all > 1000) | ||
403 | digtable->cur_igvalue = digtable->pre_igvalue + 2; | ||
404 | else if (rtlpriv->falsealm_cnt.cnt_all > 750) | ||
405 | digtable->cur_igvalue = digtable->pre_igvalue + 1; | ||
406 | else if (rtlpriv->falsealm_cnt.cnt_all < 500) | ||
407 | digtable->cur_igvalue = digtable->pre_igvalue - 1; | ||
300 | } | 408 | } |
301 | 409 | ||
302 | if ((digtable->rssi_val_min + 10 - digtable->back_val) > | 410 | /* Check initial gain by upper/lower bound */ |
303 | digtable->rx_gain_max) | 411 | if (digtable->cur_igvalue > digtable->rx_gain_max) |
304 | digtable->cur_igvalue = digtable->rx_gain_max; | 412 | digtable->cur_igvalue = digtable->rx_gain_max; |
305 | else if ((digtable->rssi_val_min + 10 - | ||
306 | digtable->back_val) < digtable->rx_gain_min) | ||
307 | digtable->cur_igvalue = digtable->rx_gain_min; | ||
308 | else | ||
309 | digtable->cur_igvalue = digtable->rssi_val_min + 10 - | ||
310 | digtable->back_val; | ||
311 | 413 | ||
312 | RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, | 414 | if (digtable->cur_igvalue < digtable->rx_gain_min) |
313 | "rssi_val_min = %x back_val %x\n", | 415 | digtable->cur_igvalue = digtable->rx_gain_min; |
314 | digtable->rssi_val_min, digtable->back_val); | ||
315 | 416 | ||
316 | rtl92c_dm_write_dig(hw); | 417 | rtl92c_dm_write_dig(hw); |
317 | } | 418 | } |
@@ -329,7 +430,7 @@ static void rtl92c_dm_initial_gain_multi_sta(struct ieee80211_hw *hw) | |||
329 | multi_sta = true; | 430 | multi_sta = true; |
330 | 431 | ||
331 | if (!multi_sta || | 432 | if (!multi_sta || |
332 | dm_digtable->cursta_cstate != DIG_STA_DISCONNECT) { | 433 | dm_digtable->cursta_cstate == DIG_STA_DISCONNECT) { |
333 | initialized = false; | 434 | initialized = false; |
334 | dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX; | 435 | dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX; |
335 | return; | 436 | return; |
@@ -375,7 +476,6 @@ static void rtl92c_dm_initial_gain_sta(struct ieee80211_hw *hw) | |||
375 | RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, | 476 | RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, |
376 | "presta_cstate = %x, cursta_cstate = %x\n", | 477 | "presta_cstate = %x, cursta_cstate = %x\n", |
377 | dm_digtable->presta_cstate, dm_digtable->cursta_cstate); | 478 | dm_digtable->presta_cstate, dm_digtable->cursta_cstate); |
378 | |||
379 | if (dm_digtable->presta_cstate == dm_digtable->cursta_cstate || | 479 | if (dm_digtable->presta_cstate == dm_digtable->cursta_cstate || |
380 | dm_digtable->cursta_cstate == DIG_STA_BEFORE_CONNECT || | 480 | dm_digtable->cursta_cstate == DIG_STA_BEFORE_CONNECT || |
381 | dm_digtable->cursta_cstate == DIG_STA_CONNECT) { | 481 | dm_digtable->cursta_cstate == DIG_STA_CONNECT) { |
@@ -383,6 +483,8 @@ static void rtl92c_dm_initial_gain_sta(struct ieee80211_hw *hw) | |||
383 | if (dm_digtable->cursta_cstate != DIG_STA_DISCONNECT) { | 483 | if (dm_digtable->cursta_cstate != DIG_STA_DISCONNECT) { |
384 | dm_digtable->rssi_val_min = | 484 | dm_digtable->rssi_val_min = |
385 | rtl92c_dm_initial_gain_min_pwdb(hw); | 485 | rtl92c_dm_initial_gain_min_pwdb(hw); |
486 | if (dm_digtable->rssi_val_min > 100) | ||
487 | dm_digtable->rssi_val_min = 100; | ||
386 | rtl92c_dm_ctrl_initgain_by_rssi(hw); | 488 | rtl92c_dm_ctrl_initgain_by_rssi(hw); |
387 | } | 489 | } |
388 | } else { | 490 | } else { |
@@ -398,11 +500,12 @@ static void rtl92c_dm_initial_gain_sta(struct ieee80211_hw *hw) | |||
398 | static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw) | 500 | static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw) |
399 | { | 501 | { |
400 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 502 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
401 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); | ||
402 | struct dig_t *dm_digtable = &rtlpriv->dm_digtable; | 503 | struct dig_t *dm_digtable = &rtlpriv->dm_digtable; |
403 | 504 | ||
404 | if (dm_digtable->cursta_cstate == DIG_STA_CONNECT) { | 505 | if (dm_digtable->cursta_cstate == DIG_STA_CONNECT) { |
405 | dm_digtable->rssi_val_min = rtl92c_dm_initial_gain_min_pwdb(hw); | 506 | dm_digtable->rssi_val_min = rtl92c_dm_initial_gain_min_pwdb(hw); |
507 | if (dm_digtable->rssi_val_min > 100) | ||
508 | dm_digtable->rssi_val_min = 100; | ||
406 | 509 | ||
407 | if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LowRssi) { | 510 | if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LowRssi) { |
408 | if (dm_digtable->rssi_val_min <= 25) | 511 | if (dm_digtable->rssi_val_min <= 25) |
@@ -424,48 +527,14 @@ static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw) | |||
424 | } | 527 | } |
425 | 528 | ||
426 | if (dm_digtable->pre_cck_pd_state != dm_digtable->cur_cck_pd_state) { | 529 | if (dm_digtable->pre_cck_pd_state != dm_digtable->cur_cck_pd_state) { |
427 | if (dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_LowRssi) { | 530 | if ((dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_LowRssi) || |
428 | if (rtlpriv->falsealm_cnt.cnt_cck_fail > 800) | 531 | (dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_MAX)) |
429 | dm_digtable->cur_cck_fa_state = | 532 | rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 0x83); |
430 | CCK_FA_STAGE_High; | 533 | else |
431 | else | ||
432 | dm_digtable->cur_cck_fa_state = CCK_FA_STAGE_Low; | ||
433 | |||
434 | if (dm_digtable->pre_cck_fa_state != | ||
435 | dm_digtable->cur_cck_fa_state) { | ||
436 | if (dm_digtable->cur_cck_fa_state == | ||
437 | CCK_FA_STAGE_Low) | ||
438 | rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, | ||
439 | 0x83); | ||
440 | else | ||
441 | rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, | ||
442 | 0xcd); | ||
443 | |||
444 | dm_digtable->pre_cck_fa_state = | ||
445 | dm_digtable->cur_cck_fa_state; | ||
446 | } | ||
447 | |||
448 | rtl_set_bbreg(hw, RCCK0_SYSTEM, MASKBYTE1, 0x40); | ||
449 | |||
450 | if (IS_92C_SERIAL(rtlhal->version)) | ||
451 | rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, | ||
452 | MASKBYTE2, 0xd7); | ||
453 | } else { | ||
454 | rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 0xcd); | 534 | rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 0xcd); |
455 | rtl_set_bbreg(hw, RCCK0_SYSTEM, MASKBYTE1, 0x47); | ||
456 | 535 | ||
457 | if (IS_92C_SERIAL(rtlhal->version)) | ||
458 | rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, | ||
459 | MASKBYTE2, 0xd3); | ||
460 | } | ||
461 | dm_digtable->pre_cck_pd_state = dm_digtable->cur_cck_pd_state; | 536 | dm_digtable->pre_cck_pd_state = dm_digtable->cur_cck_pd_state; |
462 | } | 537 | } |
463 | |||
464 | RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, "CCKPDStage=%x\n", | ||
465 | dm_digtable->cur_cck_pd_state); | ||
466 | |||
467 | RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, "is92C=%x\n", | ||
468 | IS_92C_SERIAL(rtlhal->version)); | ||
469 | } | 538 | } |
470 | 539 | ||
471 | static void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw) | 540 | static void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw) |
@@ -482,6 +551,8 @@ static void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw) | |||
482 | else | 551 | else |
483 | dm_digtable->cursta_cstate = DIG_STA_DISCONNECT; | 552 | dm_digtable->cursta_cstate = DIG_STA_DISCONNECT; |
484 | 553 | ||
554 | dm_digtable->curmultista_cstate = DIG_MULTISTA_DISCONNECT; | ||
555 | |||
485 | rtl92c_dm_initial_gain_sta(hw); | 556 | rtl92c_dm_initial_gain_sta(hw); |
486 | rtl92c_dm_initial_gain_multi_sta(hw); | 557 | rtl92c_dm_initial_gain_multi_sta(hw); |
487 | rtl92c_dm_cck_packet_detection_thresh(hw); | 558 | rtl92c_dm_cck_packet_detection_thresh(hw); |
@@ -493,23 +564,26 @@ static void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw) | |||
493 | static void rtl92c_dm_dig(struct ieee80211_hw *hw) | 564 | static void rtl92c_dm_dig(struct ieee80211_hw *hw) |
494 | { | 565 | { |
495 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 566 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
496 | struct dig_t *dm_digtable = &rtlpriv->dm_digtable; | ||
497 | 567 | ||
498 | if (rtlpriv->dm.dm_initialgain_enable == false) | 568 | if (rtlpriv->dm.dm_initialgain_enable == false) |
499 | return; | 569 | return; |
500 | if (dm_digtable->dig_enable_flag == false) | 570 | if (!(rtlpriv->dm.dm_flag & DYNAMIC_FUNC_DIG)) |
501 | return; | 571 | return; |
502 | 572 | ||
503 | rtl92c_dm_ctrl_initgain_by_twoport(hw); | 573 | rtl92c_dm_ctrl_initgain_by_twoport(hw); |
504 | |||
505 | } | 574 | } |
506 | 575 | ||
507 | static void rtl92c_dm_init_dynamic_txpower(struct ieee80211_hw *hw) | 576 | static void rtl92c_dm_init_dynamic_txpower(struct ieee80211_hw *hw) |
508 | { | 577 | { |
509 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 578 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
510 | 579 | ||
511 | rtlpriv->dm.dynamic_txpower_enable = false; | 580 | if (rtlpriv->rtlhal.interface == INTF_USB && |
512 | 581 | rtlpriv->rtlhal.board_type & 0x1) { | |
582 | dm_savepowerindex(hw); | ||
583 | rtlpriv->dm.dynamic_txpower_enable = true; | ||
584 | } else { | ||
585 | rtlpriv->dm.dynamic_txpower_enable = false; | ||
586 | } | ||
513 | rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL; | 587 | rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL; |
514 | rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; | 588 | rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; |
515 | } | 589 | } |
@@ -524,9 +598,14 @@ void rtl92c_dm_write_dig(struct ieee80211_hw *hw) | |||
524 | dm_digtable->cur_igvalue, dm_digtable->pre_igvalue, | 598 | dm_digtable->cur_igvalue, dm_digtable->pre_igvalue, |
525 | dm_digtable->back_val); | 599 | dm_digtable->back_val); |
526 | 600 | ||
527 | dm_digtable->cur_igvalue += 2; | 601 | if (rtlpriv->rtlhal.interface == INTF_USB && |
528 | if (dm_digtable->cur_igvalue > 0x3f) | 602 | !dm_digtable->dig_enable_flag) { |
529 | dm_digtable->cur_igvalue = 0x3f; | 603 | dm_digtable->pre_igvalue = 0x17; |
604 | return; | ||
605 | } | ||
606 | dm_digtable->cur_igvalue -= 1; | ||
607 | if (dm_digtable->cur_igvalue < DM_DIG_MIN) | ||
608 | dm_digtable->cur_igvalue = DM_DIG_MIN; | ||
530 | 609 | ||
531 | if (dm_digtable->pre_igvalue != dm_digtable->cur_igvalue) { | 610 | if (dm_digtable->pre_igvalue != dm_digtable->cur_igvalue) { |
532 | rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f, | 611 | rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f, |
@@ -536,11 +615,47 @@ void rtl92c_dm_write_dig(struct ieee80211_hw *hw) | |||
536 | 615 | ||
537 | dm_digtable->pre_igvalue = dm_digtable->cur_igvalue; | 616 | dm_digtable->pre_igvalue = dm_digtable->cur_igvalue; |
538 | } | 617 | } |
618 | RT_TRACE(rtlpriv, COMP_DIG, DBG_WARNING, | ||
619 | "dig values 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", | ||
620 | dm_digtable->cur_igvalue, dm_digtable->pre_igvalue, | ||
621 | dm_digtable->rssi_val_min, dm_digtable->back_val, | ||
622 | dm_digtable->rx_gain_max, dm_digtable->rx_gain_min, | ||
623 | dm_digtable->large_fa_hit, dm_digtable->forbidden_igi); | ||
539 | } | 624 | } |
540 | EXPORT_SYMBOL(rtl92c_dm_write_dig); | 625 | EXPORT_SYMBOL(rtl92c_dm_write_dig); |
541 | 626 | ||
542 | static void rtl92c_dm_pwdb_monitor(struct ieee80211_hw *hw) | 627 | static void rtl92c_dm_pwdb_monitor(struct ieee80211_hw *hw) |
543 | { | 628 | { |
629 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
630 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); | ||
631 | long tmpentry_max_pwdb = 0, tmpentry_min_pwdb = 0xff; | ||
632 | |||
633 | if (mac->link_state != MAC80211_LINKED) | ||
634 | return; | ||
635 | |||
636 | if (mac->opmode == NL80211_IFTYPE_ADHOC || | ||
637 | mac->opmode == NL80211_IFTYPE_AP) { | ||
638 | /* TODO: Handle ADHOC and AP Mode */ | ||
639 | } | ||
640 | |||
641 | if (tmpentry_max_pwdb != 0) | ||
642 | rtlpriv->dm.entry_max_undec_sm_pwdb = tmpentry_max_pwdb; | ||
643 | else | ||
644 | rtlpriv->dm.entry_max_undec_sm_pwdb = 0; | ||
645 | |||
646 | if (tmpentry_min_pwdb != 0xff) | ||
647 | rtlpriv->dm.entry_min_undec_sm_pwdb = tmpentry_min_pwdb; | ||
648 | else | ||
649 | rtlpriv->dm.entry_min_undec_sm_pwdb = 0; | ||
650 | |||
651 | /* TODO: | ||
652 | * if (mac->opmode == NL80211_IFTYPE_STATION) { | ||
653 | * if (rtlpriv->rtlhal.fw_ready) { | ||
654 | * u32 param = (u32)(rtlpriv->dm.undec_sm_pwdb << 16); | ||
655 | * rtl8192c_set_rssi_cmd(hw, param); | ||
656 | * } | ||
657 | * } | ||
658 | */ | ||
544 | } | 659 | } |
545 | 660 | ||
546 | void rtl92c_dm_init_edca_turbo(struct ieee80211_hw *hw) | 661 | void rtl92c_dm_init_edca_turbo(struct ieee80211_hw *hw) |
@@ -750,6 +865,7 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw | |||
750 | rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i]; | 865 | rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i]; |
751 | rtlpriv->dm.cck_index = cck_index_old; | 866 | rtlpriv->dm.cck_index = cck_index_old; |
752 | } | 867 | } |
868 | /* Handle USB High PA boards */ | ||
753 | 869 | ||
754 | delta = (thermalvalue > rtlpriv->dm.thermalvalue) ? | 870 | delta = (thermalvalue > rtlpriv->dm.thermalvalue) ? |
755 | (thermalvalue - rtlpriv->dm.thermalvalue) : | 871 | (thermalvalue - rtlpriv->dm.thermalvalue) : |
@@ -1140,22 +1256,22 @@ void rtl92c_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal) | |||
1140 | { | 1256 | { |
1141 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 1257 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
1142 | struct ps_t *dm_pstable = &rtlpriv->dm_pstable; | 1258 | struct ps_t *dm_pstable = &rtlpriv->dm_pstable; |
1143 | static u8 initialize; | ||
1144 | static u32 reg_874, reg_c70, reg_85c, reg_a74; | ||
1145 | 1259 | ||
1146 | if (initialize == 0) { | 1260 | if (!rtlpriv->reg_init) { |
1147 | reg_874 = (rtl_get_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, | 1261 | rtlpriv->reg_874 = (rtl_get_bbreg(hw, |
1148 | MASKDWORD) & 0x1CC000) >> 14; | 1262 | RFPGA0_XCD_RFINTERFACESW, |
1263 | MASKDWORD) & 0x1CC000) >> 14; | ||
1149 | 1264 | ||
1150 | reg_c70 = (rtl_get_bbreg(hw, ROFDM0_AGCPARAMETER1, | 1265 | rtlpriv->reg_c70 = (rtl_get_bbreg(hw, ROFDM0_AGCPARAMETER1, |
1151 | MASKDWORD) & BIT(3)) >> 3; | 1266 | MASKDWORD) & BIT(3)) >> 3; |
1152 | 1267 | ||
1153 | reg_85c = (rtl_get_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL, | 1268 | rtlpriv->reg_85c = (rtl_get_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL, |
1154 | MASKDWORD) & 0xFF000000) >> 24; | 1269 | MASKDWORD) & 0xFF000000) >> 24; |
1155 | 1270 | ||
1156 | reg_a74 = (rtl_get_bbreg(hw, 0xa74, MASKDWORD) & 0xF000) >> 12; | 1271 | rtlpriv->reg_a74 = (rtl_get_bbreg(hw, 0xa74, MASKDWORD) & |
1272 | 0xF000) >> 12; | ||
1157 | 1273 | ||
1158 | initialize = 1; | 1274 | rtlpriv->reg_init = true; |
1159 | } | 1275 | } |
1160 | 1276 | ||
1161 | if (!bforce_in_normal) { | 1277 | if (!bforce_in_normal) { |
@@ -1192,12 +1308,12 @@ void rtl92c_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal) | |||
1192 | rtl_set_bbreg(hw, 0x818, BIT(28), 0x1); | 1308 | rtl_set_bbreg(hw, 0x818, BIT(28), 0x1); |
1193 | } else { | 1309 | } else { |
1194 | rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, | 1310 | rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, |
1195 | 0x1CC000, reg_874); | 1311 | 0x1CC000, rtlpriv->reg_874); |
1196 | rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, BIT(3), | 1312 | rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, BIT(3), |
1197 | reg_c70); | 1313 | rtlpriv->reg_c70); |
1198 | rtl_set_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL, 0xFF000000, | 1314 | rtl_set_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL, 0xFF000000, |
1199 | reg_85c); | 1315 | rtlpriv->reg_85c); |
1200 | rtl_set_bbreg(hw, 0xa74, 0xF000, reg_a74); | 1316 | rtl_set_bbreg(hw, 0xa74, 0xF000, rtlpriv->reg_a74); |
1201 | rtl_set_bbreg(hw, 0x818, BIT(28), 0x0); | 1317 | rtl_set_bbreg(hw, 0x818, BIT(28), 0x0); |
1202 | } | 1318 | } |
1203 | 1319 | ||
@@ -1213,6 +1329,7 @@ static void rtl92c_dm_dynamic_bb_powersaving(struct ieee80211_hw *hw) | |||
1213 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); | 1329 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); |
1214 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); | 1330 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); |
1215 | 1331 | ||
1332 | /* Determine the minimum RSSI */ | ||
1216 | if (((mac->link_state == MAC80211_NOLINK)) && | 1333 | if (((mac->link_state == MAC80211_NOLINK)) && |
1217 | (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) { | 1334 | (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) { |
1218 | dm_pstable->rssi_val_min = 0; | 1335 | dm_pstable->rssi_val_min = 0; |
@@ -1241,6 +1358,7 @@ static void rtl92c_dm_dynamic_bb_powersaving(struct ieee80211_hw *hw) | |||
1241 | dm_pstable->rssi_val_min); | 1358 | dm_pstable->rssi_val_min); |
1242 | } | 1359 | } |
1243 | 1360 | ||
1361 | /* Power Saving for 92C */ | ||
1244 | if (IS_92C_SERIAL(rtlhal->version)) | 1362 | if (IS_92C_SERIAL(rtlhal->version)) |
1245 | ;/* rtl92c_dm_1r_cca(hw); */ | 1363 | ;/* rtl92c_dm_1r_cca(hw); */ |
1246 | else | 1364 | else |
@@ -1252,12 +1370,23 @@ void rtl92c_dm_init(struct ieee80211_hw *hw) | |||
1252 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 1370 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
1253 | 1371 | ||
1254 | rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER; | 1372 | rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER; |
1373 | rtlpriv->dm.dm_flag = DYNAMIC_FUNC_DISABLE | DYNAMIC_FUNC_DIG; | ||
1374 | rtlpriv->dm.undec_sm_pwdb = -1; | ||
1375 | rtlpriv->dm.undec_sm_cck = -1; | ||
1376 | rtlpriv->dm.dm_initialgain_enable = true; | ||
1255 | rtl92c_dm_diginit(hw); | 1377 | rtl92c_dm_diginit(hw); |
1378 | |||
1379 | rtlpriv->dm.dm_flag |= HAL_DM_HIPWR_DISABLE; | ||
1256 | rtl92c_dm_init_dynamic_txpower(hw); | 1380 | rtl92c_dm_init_dynamic_txpower(hw); |
1381 | |||
1257 | rtl92c_dm_init_edca_turbo(hw); | 1382 | rtl92c_dm_init_edca_turbo(hw); |
1258 | rtl92c_dm_init_rate_adaptive_mask(hw); | 1383 | rtl92c_dm_init_rate_adaptive_mask(hw); |
1384 | rtlpriv->dm.dm_flag |= DYNAMIC_FUNC_SS; | ||
1259 | rtl92c_dm_initialize_txpower_tracking(hw); | 1385 | rtl92c_dm_initialize_txpower_tracking(hw); |
1260 | rtl92c_dm_init_dynamic_bb_powersaving(hw); | 1386 | rtl92c_dm_init_dynamic_bb_powersaving(hw); |
1387 | |||
1388 | rtlpriv->dm.ofdm_pkt_cnt = 0; | ||
1389 | rtlpriv->dm.dm_rssi_sel = RSSI_DEFAULT; | ||
1261 | } | 1390 | } |
1262 | EXPORT_SYMBOL(rtl92c_dm_init); | 1391 | EXPORT_SYMBOL(rtl92c_dm_init); |
1263 | 1392 | ||
@@ -1308,7 +1437,7 @@ void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw) | |||
1308 | } | 1437 | } |
1309 | 1438 | ||
1310 | if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) { | 1439 | if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) { |
1311 | rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1; | 1440 | rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL2; |
1312 | RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, | 1441 | RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, |
1313 | "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n"); | 1442 | "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n"); |
1314 | } else if ((undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) && | 1443 | } else if ((undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) && |
@@ -1328,8 +1457,16 @@ void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw) | |||
1328 | "PHY_SetTxPowerLevel8192S() Channel = %d\n", | 1457 | "PHY_SetTxPowerLevel8192S() Channel = %d\n", |
1329 | rtlphy->current_channel); | 1458 | rtlphy->current_channel); |
1330 | rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel); | 1459 | rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel); |
1460 | if (rtlpriv->dm.dynamic_txhighpower_lvl == | ||
1461 | TXHIGHPWRLEVEL_NORMAL) | ||
1462 | dm_restorepowerindex(hw); | ||
1463 | else if (rtlpriv->dm.dynamic_txhighpower_lvl == | ||
1464 | TXHIGHPWRLEVEL_LEVEL1) | ||
1465 | dm_writepowerindex(hw, 0x14); | ||
1466 | else if (rtlpriv->dm.dynamic_txhighpower_lvl == | ||
1467 | TXHIGHPWRLEVEL_LEVEL2) | ||
1468 | dm_writepowerindex(hw, 0x10); | ||
1331 | } | 1469 | } |
1332 | |||
1333 | rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl; | 1470 | rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl; |
1334 | } | 1471 | } |
1335 | 1472 | ||
@@ -1400,12 +1537,6 @@ u8 rtl92c_bt_rssi_state_change(struct ieee80211_hw *hw) | |||
1400 | else | 1537 | else |
1401 | curr_bt_rssi_state &= (~BT_RSSI_STATE_SPECIAL_LOW); | 1538 | curr_bt_rssi_state &= (~BT_RSSI_STATE_SPECIAL_LOW); |
1402 | 1539 | ||
1403 | /* Set Tx Power according to BT status. */ | ||
1404 | if (undec_sm_pwdb >= 30) | ||
1405 | curr_bt_rssi_state |= BT_RSSI_STATE_TXPOWER_LOW; | ||
1406 | else if (undec_sm_pwdb < 25) | ||
1407 | curr_bt_rssi_state &= (~BT_RSSI_STATE_TXPOWER_LOW); | ||
1408 | |||
1409 | /* Check BT state related to BT_Idle in B/G mode. */ | 1540 | /* Check BT state related to BT_Idle in B/G mode. */ |
1410 | if (undec_sm_pwdb < 15) | 1541 | if (undec_sm_pwdb < 15) |
1411 | curr_bt_rssi_state |= BT_RSSI_STATE_BG_EDCA_LOW; | 1542 | curr_bt_rssi_state |= BT_RSSI_STATE_BG_EDCA_LOW; |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h index 518e208c0180..4f232a063636 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h +++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h | |||
@@ -91,6 +91,17 @@ | |||
91 | #define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 | 91 | #define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 |
92 | #define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 | 92 | #define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 |
93 | 93 | ||
94 | #define DYNAMIC_FUNC_DISABLE 0x0 | ||
95 | #define DYNAMIC_FUNC_DIG BIT(0) | ||
96 | #define DYNAMIC_FUNC_HP BIT(1) | ||
97 | #define DYNAMIC_FUNC_SS BIT(2) /*Tx Power Tracking*/ | ||
98 | #define DYNAMIC_FUNC_BT BIT(3) | ||
99 | #define DYNAMIC_FUNC_ANT_DIV BIT(4) | ||
100 | |||
101 | #define RSSI_CCK 0 | ||
102 | #define RSSI_OFDM 1 | ||
103 | #define RSSI_DEFAULT 2 | ||
104 | |||
94 | struct swat_t { | 105 | struct swat_t { |
95 | u8 failure_cnt; | 106 | u8 failure_cnt; |
96 | u8 try_flag; | 107 | u8 try_flag; |
@@ -167,5 +178,8 @@ void rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw); | |||
167 | void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery); | 178 | void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery); |
168 | void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw); | 179 | void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw); |
169 | void rtl92c_dm_bt_coexist(struct ieee80211_hw *hw); | 180 | void rtl92c_dm_bt_coexist(struct ieee80211_hw *hw); |
181 | void dm_savepowerindex(struct ieee80211_hw *hw); | ||
182 | void dm_writepowerindex(struct ieee80211_hw *hw, u8 value); | ||
183 | void dm_restorepowerindex(struct ieee80211_hw *hw); | ||
170 | 184 | ||
171 | #endif | 185 | #endif |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c index 0c0e78263a66..9e32ac8a4425 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c +++ b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c | |||
@@ -1147,6 +1147,12 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, | |||
1147 | 0x522, 0x550, 0x551, 0x040 | 1147 | 0x522, 0x550, 0x551, 0x040 |
1148 | }; | 1148 | }; |
1149 | 1149 | ||
1150 | u32 iqk_bb_reg_92C[9] = { | ||
1151 | 0xc04, 0xc08, 0x874, 0xb68, | ||
1152 | 0xb6c, 0x870, 0x860, 0x864, | ||
1153 | 0x800 | ||
1154 | }; | ||
1155 | |||
1150 | const u32 retrycount = 2; | 1156 | const u32 retrycount = 2; |
1151 | 1157 | ||
1152 | if (t == 0) { | 1158 | if (t == 0) { |
@@ -1157,6 +1163,8 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, | |||
1157 | rtlphy->adda_backup, 16); | 1163 | rtlphy->adda_backup, 16); |
1158 | _rtl92c_phy_save_mac_registers(hw, iqk_mac_reg, | 1164 | _rtl92c_phy_save_mac_registers(hw, iqk_mac_reg, |
1159 | rtlphy->iqk_mac_backup); | 1165 | rtlphy->iqk_mac_backup); |
1166 | _rtl92c_phy_save_adda_registers(hw, iqk_bb_reg_92C, | ||
1167 | rtlphy->iqk_bb_backup, 9); | ||
1160 | } | 1168 | } |
1161 | _rtl92c_phy_path_adda_on(hw, adda_reg, true, is2t); | 1169 | _rtl92c_phy_path_adda_on(hw, adda_reg, true, is2t); |
1162 | if (t == 0) { | 1170 | if (t == 0) { |
@@ -1167,14 +1175,18 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, | |||
1167 | 1175 | ||
1168 | if (!rtlphy->rfpi_enable) | 1176 | if (!rtlphy->rfpi_enable) |
1169 | _rtl92c_phy_pi_mode_switch(hw, true); | 1177 | _rtl92c_phy_pi_mode_switch(hw, true); |
1170 | if (t == 0) { | 1178 | |
1171 | rtlphy->reg_c04 = rtl_get_bbreg(hw, 0xc04, MASKDWORD); | 1179 | rtl_set_bbreg(hw, 0x800, BIT(24), 0x0); |
1172 | rtlphy->reg_c08 = rtl_get_bbreg(hw, 0xc08, MASKDWORD); | 1180 | |
1173 | rtlphy->reg_874 = rtl_get_bbreg(hw, 0x874, MASKDWORD); | ||
1174 | } | ||
1175 | rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600); | 1181 | rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600); |
1176 | rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4); | 1182 | rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4); |
1177 | rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000); | 1183 | rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000); |
1184 | |||
1185 | rtl_set_bbreg(hw, 0x870, BIT(10), 0x1); | ||
1186 | rtl_set_bbreg(hw, 0x870, BIT(26), 0x1); | ||
1187 | rtl_set_bbreg(hw, 0x860, BIT(10), 0x0); | ||
1188 | rtl_set_bbreg(hw, 0x864, BIT(10), 0x0); | ||
1189 | |||
1178 | if (is2t) { | 1190 | if (is2t) { |
1179 | rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000); | 1191 | rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000); |
1180 | rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00010000); | 1192 | rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00010000); |
@@ -1239,13 +1251,9 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, | |||
1239 | 0x3FF0000) >> 16; | 1251 | 0x3FF0000) >> 16; |
1240 | } | 1252 | } |
1241 | } | 1253 | } |
1242 | rtl_set_bbreg(hw, 0xc04, MASKDWORD, rtlphy->reg_c04); | 1254 | |
1243 | rtl_set_bbreg(hw, 0x874, MASKDWORD, rtlphy->reg_874); | ||
1244 | rtl_set_bbreg(hw, 0xc08, MASKDWORD, rtlphy->reg_c08); | ||
1245 | rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0); | 1255 | rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0); |
1246 | rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3); | 1256 | |
1247 | if (is2t) | ||
1248 | rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00032ed3); | ||
1249 | if (t != 0) { | 1257 | if (t != 0) { |
1250 | if (!rtlphy->rfpi_enable) | 1258 | if (!rtlphy->rfpi_enable) |
1251 | _rtl92c_phy_pi_mode_switch(hw, false); | 1259 | _rtl92c_phy_pi_mode_switch(hw, false); |
@@ -1253,6 +1261,15 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, | |||
1253 | rtlphy->adda_backup, 16); | 1261 | rtlphy->adda_backup, 16); |
1254 | _rtl92c_phy_reload_mac_registers(hw, iqk_mac_reg, | 1262 | _rtl92c_phy_reload_mac_registers(hw, iqk_mac_reg, |
1255 | rtlphy->iqk_mac_backup); | 1263 | rtlphy->iqk_mac_backup); |
1264 | _rtl92c_phy_reload_adda_registers(hw, iqk_bb_reg_92C, | ||
1265 | rtlphy->iqk_bb_backup, 9); | ||
1266 | |||
1267 | rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3); | ||
1268 | if (is2t) | ||
1269 | rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00032ed3); | ||
1270 | |||
1271 | rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x01008c00); | ||
1272 | rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x01008c00); | ||
1256 | } | 1273 | } |
1257 | } | 1274 | } |
1258 | 1275 | ||
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c index a82b30a1996c..2eb0b38384dd 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | |||
@@ -937,14 +937,26 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw) | |||
937 | bool is92c; | 937 | bool is92c; |
938 | int err; | 938 | int err; |
939 | u8 tmp_u1b; | 939 | u8 tmp_u1b; |
940 | unsigned long flags; | ||
940 | 941 | ||
941 | rtlpci->being_init_adapter = true; | 942 | rtlpci->being_init_adapter = true; |
943 | |||
944 | /* Since this function can take a very long time (up to 350 ms) | ||
945 | * and can be called with irqs disabled, reenable the irqs | ||
946 | * to let the other devices continue being serviced. | ||
947 | * | ||
948 | * It is safe doing so since our own interrupts will only be enabled | ||
949 | * in a subsequent step. | ||
950 | */ | ||
951 | local_save_flags(flags); | ||
952 | local_irq_enable(); | ||
953 | |||
942 | rtlpriv->intf_ops->disable_aspm(hw); | 954 | rtlpriv->intf_ops->disable_aspm(hw); |
943 | rtstatus = _rtl92ce_init_mac(hw); | 955 | rtstatus = _rtl92ce_init_mac(hw); |
944 | if (!rtstatus) { | 956 | if (!rtstatus) { |
945 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n"); | 957 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n"); |
946 | err = 1; | 958 | err = 1; |
947 | return err; | 959 | goto exit; |
948 | } | 960 | } |
949 | 961 | ||
950 | err = rtl92c_download_fw(hw); | 962 | err = rtl92c_download_fw(hw); |
@@ -952,7 +964,7 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw) | |||
952 | RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, | 964 | RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, |
953 | "Failed to download FW. Init HW without FW now..\n"); | 965 | "Failed to download FW. Init HW without FW now..\n"); |
954 | err = 1; | 966 | err = 1; |
955 | return err; | 967 | goto exit; |
956 | } | 968 | } |
957 | 969 | ||
958 | rtlhal->last_hmeboxnum = 0; | 970 | rtlhal->last_hmeboxnum = 0; |
@@ -1032,6 +1044,8 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw) | |||
1032 | RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "under 1.5V\n"); | 1044 | RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "under 1.5V\n"); |
1033 | } | 1045 | } |
1034 | rtl92c_dm_init(hw); | 1046 | rtl92c_dm_init(hw); |
1047 | exit: | ||
1048 | local_irq_restore(flags); | ||
1035 | rtlpci->being_init_adapter = false; | 1049 | rtlpci->being_init_adapter = false; |
1036 | return err; | 1050 | return err; |
1037 | } | 1051 | } |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c b/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c index 16a0b9e59acf..c16209a336ea 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c | |||
@@ -101,6 +101,15 @@ void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw) | |||
101 | "PHY_SetTxPowerLevel8192S() Channel = %d\n", | 101 | "PHY_SetTxPowerLevel8192S() Channel = %d\n", |
102 | rtlphy->current_channel); | 102 | rtlphy->current_channel); |
103 | rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel); | 103 | rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel); |
104 | if (rtlpriv->dm.dynamic_txhighpower_lvl == | ||
105 | TXHIGHPWRLEVEL_NORMAL) | ||
106 | dm_restorepowerindex(hw); | ||
107 | else if (rtlpriv->dm.dynamic_txhighpower_lvl == | ||
108 | TXHIGHPWRLEVEL_LEVEL1) | ||
109 | dm_writepowerindex(hw, 0x14); | ||
110 | else if (rtlpriv->dm.dynamic_txhighpower_lvl == | ||
111 | TXHIGHPWRLEVEL_LEVEL2) | ||
112 | dm_writepowerindex(hw, 0x10); | ||
104 | } | 113 | } |
105 | 114 | ||
106 | rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl; | 115 | rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl; |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/dm.h b/drivers/net/wireless/rtlwifi/rtl8192cu/dm.h index d947e7d350bb..fafa6bac2a3f 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/dm.h +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/dm.h | |||
@@ -30,3 +30,6 @@ | |||
30 | #include "../rtl8192ce/dm.h" | 30 | #include "../rtl8192ce/dm.h" |
31 | 31 | ||
32 | void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw); | 32 | void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw); |
33 | void dm_savepowerindex(struct ieee80211_hw *hw); | ||
34 | void dm_writepowerindex(struct ieee80211_hw *hw, u8 value); | ||
35 | void dm_restorepowerindex(struct ieee80211_hw *hw); | ||
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c index 189ba124a8c6..468bf73cc883 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | |||
@@ -1022,7 +1022,7 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw) | |||
1022 | if (ppsc->rfpwr_state == ERFON) { | 1022 | if (ppsc->rfpwr_state == ERFON) { |
1023 | rtl92c_phy_set_rfpath_switch(hw, 1); | 1023 | rtl92c_phy_set_rfpath_switch(hw, 1); |
1024 | if (iqk_initialized) { | 1024 | if (iqk_initialized) { |
1025 | rtl92c_phy_iq_calibrate(hw, false); | 1025 | rtl92c_phy_iq_calibrate(hw, true); |
1026 | } else { | 1026 | } else { |
1027 | rtl92c_phy_iq_calibrate(hw, false); | 1027 | rtl92c_phy_iq_calibrate(hw, false); |
1028 | iqk_initialized = true; | 1028 | iqk_initialized = true; |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c index 34e56308301e..0c09240eadcc 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c | |||
@@ -120,6 +120,7 @@ bool rtl92cu_phy_bb_config(struct ieee80211_hw *hw) | |||
120 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 120 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
121 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); | 121 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); |
122 | u16 regval; | 122 | u16 regval; |
123 | u32 regval32; | ||
123 | u8 b_reg_hwparafile = 1; | 124 | u8 b_reg_hwparafile = 1; |
124 | 125 | ||
125 | _rtl92c_phy_init_bb_rf_register_definition(hw); | 126 | _rtl92c_phy_init_bb_rf_register_definition(hw); |
@@ -135,8 +136,11 @@ bool rtl92cu_phy_bb_config(struct ieee80211_hw *hw) | |||
135 | } else if (IS_HARDWARE_TYPE_8192CU(rtlhal)) { | 136 | } else if (IS_HARDWARE_TYPE_8192CU(rtlhal)) { |
136 | rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, FEN_USBA | FEN_USBD | | 137 | rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, FEN_USBA | FEN_USBD | |
137 | FEN_BB_GLB_RSTn | FEN_BBRSTB); | 138 | FEN_BB_GLB_RSTn | FEN_BBRSTB); |
138 | rtl_write_byte(rtlpriv, REG_LDOHCI12_CTRL, 0x0f); | ||
139 | } | 139 | } |
140 | regval32 = rtl_read_dword(rtlpriv, 0x87c); | ||
141 | rtl_write_dword(rtlpriv, 0x87c, regval32 & (~BIT(31))); | ||
142 | if (IS_HARDWARE_TYPE_8192CU(rtlhal)) | ||
143 | rtl_write_byte(rtlpriv, REG_LDOHCI12_CTRL, 0x0f); | ||
140 | rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80); | 144 | rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80); |
141 | if (b_reg_hwparafile == 1) | 145 | if (b_reg_hwparafile == 1) |
142 | rtstatus = _rtl92c_phy_bb8192c_config_parafile(hw); | 146 | rtstatus = _rtl92c_phy_bb8192c_config_parafile(hw); |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c index 2119313a737b..b878d56d2f4d 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c | |||
@@ -85,17 +85,15 @@ void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, | |||
85 | if (mac->act_scanning) { | 85 | if (mac->act_scanning) { |
86 | tx_agc[RF90_PATH_A] = 0x3f3f3f3f; | 86 | tx_agc[RF90_PATH_A] = 0x3f3f3f3f; |
87 | tx_agc[RF90_PATH_B] = 0x3f3f3f3f; | 87 | tx_agc[RF90_PATH_B] = 0x3f3f3f3f; |
88 | if (turbo_scanoff) { | 88 | for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { |
89 | for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { | 89 | tx_agc[idx1] = ppowerlevel[idx1] | |
90 | tx_agc[idx1] = ppowerlevel[idx1] | | 90 | (ppowerlevel[idx1] << 8) | |
91 | (ppowerlevel[idx1] << 8) | | 91 | (ppowerlevel[idx1] << 16) | |
92 | (ppowerlevel[idx1] << 16) | | 92 | (ppowerlevel[idx1] << 24); |
93 | (ppowerlevel[idx1] << 24); | 93 | if (rtlhal->interface == INTF_USB) { |
94 | if (rtlhal->interface == INTF_USB) { | 94 | if (tx_agc[idx1] > 0x20 && |
95 | if (tx_agc[idx1] > 0x20 && | 95 | rtlefuse->external_pa) |
96 | rtlefuse->external_pa) | 96 | tx_agc[idx1] = 0x20; |
97 | tx_agc[idx1] = 0x20; | ||
98 | } | ||
99 | } | 97 | } |
100 | } | 98 | } |
101 | } else { | 99 | } else { |
@@ -107,7 +105,7 @@ void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, | |||
107 | TXHIGHPWRLEVEL_LEVEL2) { | 105 | TXHIGHPWRLEVEL_LEVEL2) { |
108 | tx_agc[RF90_PATH_A] = 0x00000000; | 106 | tx_agc[RF90_PATH_A] = 0x00000000; |
109 | tx_agc[RF90_PATH_B] = 0x00000000; | 107 | tx_agc[RF90_PATH_B] = 0x00000000; |
110 | } else{ | 108 | } else { |
111 | for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { | 109 | for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { |
112 | tx_agc[idx1] = ppowerlevel[idx1] | | 110 | tx_agc[idx1] = ppowerlevel[idx1] | |
113 | (ppowerlevel[idx1] << 8) | | 111 | (ppowerlevel[idx1] << 8) | |
@@ -373,7 +371,12 @@ static void _rtl92c_write_ofdm_power_reg(struct ieee80211_hw *hw, | |||
373 | regoffset == RTXAGC_B_MCS07_MCS04) | 371 | regoffset == RTXAGC_B_MCS07_MCS04) |
374 | regoffset = 0xc98; | 372 | regoffset = 0xc98; |
375 | for (i = 0; i < 3; i++) { | 373 | for (i = 0; i < 3; i++) { |
376 | writeVal = (writeVal > 6) ? (writeVal - 6) : 0; | 374 | if (i != 2) |
375 | writeVal = (writeVal > 8) ? | ||
376 | (writeVal - 8) : 0; | ||
377 | else | ||
378 | writeVal = (writeVal > 6) ? | ||
379 | (writeVal - 6) : 0; | ||
377 | rtl_write_byte(rtlpriv, (u32)(regoffset + i), | 380 | rtl_write_byte(rtlpriv, (u32)(regoffset + i), |
378 | (u8)writeVal); | 381 | (u8)writeVal); |
379 | } | 382 | } |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c index 9936de716ad5..c61311084d7e 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | |||
@@ -50,6 +50,9 @@ MODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>"); | |||
50 | MODULE_LICENSE("GPL"); | 50 | MODULE_LICENSE("GPL"); |
51 | MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless"); | 51 | MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless"); |
52 | MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin"); | 52 | MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin"); |
53 | MODULE_FIRMWARE("rtlwifi/rtl8192cufw_A.bin"); | ||
54 | MODULE_FIRMWARE("rtlwifi/rtl8192cufw_B.bin"); | ||
55 | MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin"); | ||
53 | 56 | ||
54 | static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw) | 57 | static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw) |
55 | { | 58 | { |
@@ -69,14 +72,21 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw) | |||
69 | "Can't alloc buffer for fw\n"); | 72 | "Can't alloc buffer for fw\n"); |
70 | return 1; | 73 | return 1; |
71 | } | 74 | } |
72 | 75 | if (IS_VENDOR_UMC_A_CUT(rtlpriv->rtlhal.version) && | |
76 | !IS_92C_SERIAL(rtlpriv->rtlhal.version)) { | ||
77 | rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_A.bin"; | ||
78 | } else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlpriv->rtlhal.version)) { | ||
79 | rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_B.bin"; | ||
80 | } else { | ||
81 | rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_TMSC.bin"; | ||
82 | } | ||
83 | /* provide name of alternative file */ | ||
84 | rtlpriv->cfg->alt_fw_name = "rtlwifi/rtl8192cufw.bin"; | ||
73 | pr_info("Loading firmware %s\n", rtlpriv->cfg->fw_name); | 85 | pr_info("Loading firmware %s\n", rtlpriv->cfg->fw_name); |
74 | rtlpriv->max_fw_size = 0x4000; | 86 | rtlpriv->max_fw_size = 0x4000; |
75 | err = request_firmware_nowait(THIS_MODULE, 1, | 87 | err = request_firmware_nowait(THIS_MODULE, 1, |
76 | rtlpriv->cfg->fw_name, rtlpriv->io.dev, | 88 | rtlpriv->cfg->fw_name, rtlpriv->io.dev, |
77 | GFP_KERNEL, hw, rtl_fw_cb); | 89 | GFP_KERNEL, hw, rtl_fw_cb); |
78 | |||
79 | |||
80 | return err; | 90 | return err; |
81 | } | 91 | } |
82 | 92 | ||
@@ -307,6 +317,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = { | |||
307 | {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/ | 317 | {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/ |
308 | {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ | 318 | {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ |
309 | {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ | 319 | {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ |
320 | {RTL_USB_DEVICE(0x0df6, 0x0077, rtl92cu_hal_cfg)}, /*Sitecom-WLA2100V2*/ | ||
310 | {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/ | 321 | {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/ |
311 | {RTL_USB_DEVICE(0x4856, 0x0091, rtl92cu_hal_cfg)}, /*NetweeN - Feixun*/ | 322 | {RTL_USB_DEVICE(0x4856, 0x0091, rtl92cu_hal_cfg)}, /*NetweeN - Feixun*/ |
312 | /* HP - Lite-On ,8188CUS Slim Combo */ | 323 | /* HP - Lite-On ,8188CUS Slim Combo */ |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/table.c b/drivers/net/wireless/rtlwifi/rtl8192cu/table.c index 966be519edb8..7903c154de00 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/table.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/table.c | |||
@@ -36,7 +36,7 @@ u32 RTL8192CUPHY_REG_2TARRAY[RTL8192CUPHY_REG_2TARRAY_LENGTH] = { | |||
36 | 0x804, 0x00000003, | 36 | 0x804, 0x00000003, |
37 | 0x808, 0x0000fc00, | 37 | 0x808, 0x0000fc00, |
38 | 0x80c, 0x0000000a, | 38 | 0x80c, 0x0000000a, |
39 | 0x810, 0x10005388, | 39 | 0x810, 0x10000330, |
40 | 0x814, 0x020c3d10, | 40 | 0x814, 0x020c3d10, |
41 | 0x818, 0x02200385, | 41 | 0x818, 0x02200385, |
42 | 0x81c, 0x00000000, | 42 | 0x81c, 0x00000000, |
@@ -110,22 +110,22 @@ u32 RTL8192CUPHY_REG_2TARRAY[RTL8192CUPHY_REG_2TARRAY_LENGTH] = { | |||
110 | 0xc44, 0x000100b7, | 110 | 0xc44, 0x000100b7, |
111 | 0xc48, 0xec020107, | 111 | 0xc48, 0xec020107, |
112 | 0xc4c, 0x007f037f, | 112 | 0xc4c, 0x007f037f, |
113 | 0xc50, 0x6954341e, | 113 | 0xc50, 0x69543420, |
114 | 0xc54, 0x43bc0094, | 114 | 0xc54, 0x43bc0094, |
115 | 0xc58, 0x6954341e, | 115 | 0xc58, 0x69543420, |
116 | 0xc5c, 0x433c0094, | 116 | 0xc5c, 0x433c0094, |
117 | 0xc60, 0x00000000, | 117 | 0xc60, 0x00000000, |
118 | 0xc64, 0x5116848b, | 118 | 0xc64, 0x5116848b, |
119 | 0xc68, 0x47c00bff, | 119 | 0xc68, 0x47c00bff, |
120 | 0xc6c, 0x00000036, | 120 | 0xc6c, 0x00000036, |
121 | 0xc70, 0x2c7f000d, | 121 | 0xc70, 0x2c7f000d, |
122 | 0xc74, 0x0186115b, | 122 | 0xc74, 0x2186115b, |
123 | 0xc78, 0x0000001f, | 123 | 0xc78, 0x0000001f, |
124 | 0xc7c, 0x00b99612, | 124 | 0xc7c, 0x00b99612, |
125 | 0xc80, 0x40000100, | 125 | 0xc80, 0x40000100, |
126 | 0xc84, 0x20f60000, | 126 | 0xc84, 0x20f60000, |
127 | 0xc88, 0x40000100, | 127 | 0xc88, 0x40000100, |
128 | 0xc8c, 0x20200000, | 128 | 0xc8c, 0xa0e40000, |
129 | 0xc90, 0x00121820, | 129 | 0xc90, 0x00121820, |
130 | 0xc94, 0x00000000, | 130 | 0xc94, 0x00000000, |
131 | 0xc98, 0x00121820, | 131 | 0xc98, 0x00121820, |
@@ -226,7 +226,7 @@ u32 RTL8192CUPHY_REG_1TARRAY[RTL8192CUPHY_REG_1TARRAY_LENGTH] = { | |||
226 | 0x804, 0x00000001, | 226 | 0x804, 0x00000001, |
227 | 0x808, 0x0000fc00, | 227 | 0x808, 0x0000fc00, |
228 | 0x80c, 0x0000000a, | 228 | 0x80c, 0x0000000a, |
229 | 0x810, 0x10005388, | 229 | 0x810, 0x10000330, |
230 | 0x814, 0x020c3d10, | 230 | 0x814, 0x020c3d10, |
231 | 0x818, 0x02200385, | 231 | 0x818, 0x02200385, |
232 | 0x81c, 0x00000000, | 232 | 0x81c, 0x00000000, |
@@ -300,9 +300,9 @@ u32 RTL8192CUPHY_REG_1TARRAY[RTL8192CUPHY_REG_1TARRAY_LENGTH] = { | |||
300 | 0xc44, 0x000100b7, | 300 | 0xc44, 0x000100b7, |
301 | 0xc48, 0xec020107, | 301 | 0xc48, 0xec020107, |
302 | 0xc4c, 0x007f037f, | 302 | 0xc4c, 0x007f037f, |
303 | 0xc50, 0x6954341e, | 303 | 0xc50, 0x69543420, |
304 | 0xc54, 0x43bc0094, | 304 | 0xc54, 0x43bc0094, |
305 | 0xc58, 0x6954341e, | 305 | 0xc58, 0x69543420, |
306 | 0xc5c, 0x433c0094, | 306 | 0xc5c, 0x433c0094, |
307 | 0xc60, 0x00000000, | 307 | 0xc60, 0x00000000, |
308 | 0xc64, 0x5116848b, | 308 | 0xc64, 0x5116848b, |
@@ -340,7 +340,7 @@ u32 RTL8192CUPHY_REG_1TARRAY[RTL8192CUPHY_REG_1TARRAY_LENGTH] = { | |||
340 | 0xce4, 0x00000000, | 340 | 0xce4, 0x00000000, |
341 | 0xce8, 0x37644302, | 341 | 0xce8, 0x37644302, |
342 | 0xcec, 0x2f97d40c, | 342 | 0xcec, 0x2f97d40c, |
343 | 0xd00, 0x00080740, | 343 | 0xd00, 0x00000740, |
344 | 0xd04, 0x00020401, | 344 | 0xd04, 0x00020401, |
345 | 0xd08, 0x0000907f, | 345 | 0xd08, 0x0000907f, |
346 | 0xd0c, 0x20010201, | 346 | 0xd0c, 0x20010201, |
@@ -633,17 +633,17 @@ u32 RTL8192CURADIOA_2TARRAY[RTL8192CURADIOA_2TARRAYLENGTH] = { | |||
633 | 0x012, 0x00071000, | 633 | 0x012, 0x00071000, |
634 | 0x012, 0x000b0000, | 634 | 0x012, 0x000b0000, |
635 | 0x012, 0x000fc000, | 635 | 0x012, 0x000fc000, |
636 | 0x013, 0x000287af, | 636 | 0x013, 0x000287b3, |
637 | 0x013, 0x000244b7, | 637 | 0x013, 0x000244b7, |
638 | 0x013, 0x000204ab, | 638 | 0x013, 0x000204ab, |
639 | 0x013, 0x0001c49f, | 639 | 0x013, 0x0001c49f, |
640 | 0x013, 0x00018493, | 640 | 0x013, 0x00018493, |
641 | 0x013, 0x00014297, | 641 | 0x013, 0x0001429b, |
642 | 0x013, 0x00010295, | 642 | 0x013, 0x00010299, |
643 | 0x013, 0x0000c298, | 643 | 0x013, 0x0000c29c, |
644 | 0x013, 0x0000819c, | 644 | 0x013, 0x000081a0, |
645 | 0x013, 0x000040a8, | 645 | 0x013, 0x000040ac, |
646 | 0x013, 0x0000001c, | 646 | 0x013, 0x00000020, |
647 | 0x014, 0x0001944c, | 647 | 0x014, 0x0001944c, |
648 | 0x014, 0x00059444, | 648 | 0x014, 0x00059444, |
649 | 0x014, 0x0009944c, | 649 | 0x014, 0x0009944c, |
@@ -932,10 +932,10 @@ u32 RTL8192CUMAC_2T_ARRAY[RTL8192CUMAC_2T_ARRAYLENGTH] = { | |||
932 | 0x608, 0x0000000e, | 932 | 0x608, 0x0000000e, |
933 | 0x609, 0x0000002a, | 933 | 0x609, 0x0000002a, |
934 | 0x652, 0x00000020, | 934 | 0x652, 0x00000020, |
935 | 0x63c, 0x0000000a, | 935 | 0x63c, 0x00000008, |
936 | 0x63d, 0x0000000e, | 936 | 0x63d, 0x00000008, |
937 | 0x63e, 0x0000000a, | 937 | 0x63e, 0x0000000c, |
938 | 0x63f, 0x0000000e, | 938 | 0x63f, 0x0000000c, |
939 | 0x66e, 0x00000005, | 939 | 0x66e, 0x00000005, |
940 | 0x700, 0x00000021, | 940 | 0x700, 0x00000021, |
941 | 0x701, 0x00000043, | 941 | 0x701, 0x00000043, |
diff --git a/drivers/net/wireless/rtlwifi/stats.c b/drivers/net/wireless/rtlwifi/stats.c index 8ed31744a054..4f083fc1d360 100644 --- a/drivers/net/wireless/rtlwifi/stats.c +++ b/drivers/net/wireless/rtlwifi/stats.c | |||
@@ -176,6 +176,7 @@ static void rtl_process_pwdb(struct ieee80211_hw *hw, struct rtl_stats *pstatus) | |||
176 | struct rtl_sta_info *drv_priv = NULL; | 176 | struct rtl_sta_info *drv_priv = NULL; |
177 | struct ieee80211_sta *sta = NULL; | 177 | struct ieee80211_sta *sta = NULL; |
178 | long undec_sm_pwdb; | 178 | long undec_sm_pwdb; |
179 | long undec_sm_cck; | ||
179 | 180 | ||
180 | rcu_read_lock(); | 181 | rcu_read_lock(); |
181 | if (rtlpriv->mac80211.opmode != NL80211_IFTYPE_STATION) | 182 | if (rtlpriv->mac80211.opmode != NL80211_IFTYPE_STATION) |
@@ -185,12 +186,16 @@ static void rtl_process_pwdb(struct ieee80211_hw *hw, struct rtl_stats *pstatus) | |||
185 | if (sta) { | 186 | if (sta) { |
186 | drv_priv = (struct rtl_sta_info *) sta->drv_priv; | 187 | drv_priv = (struct rtl_sta_info *) sta->drv_priv; |
187 | undec_sm_pwdb = drv_priv->rssi_stat.undec_sm_pwdb; | 188 | undec_sm_pwdb = drv_priv->rssi_stat.undec_sm_pwdb; |
189 | undec_sm_cck = drv_priv->rssi_stat.undec_sm_cck; | ||
188 | } else { | 190 | } else { |
189 | undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb; | 191 | undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb; |
192 | undec_sm_cck = rtlpriv->dm.undec_sm_cck; | ||
190 | } | 193 | } |
191 | 194 | ||
192 | if (undec_sm_pwdb < 0) | 195 | if (undec_sm_pwdb < 0) |
193 | undec_sm_pwdb = pstatus->rx_pwdb_all; | 196 | undec_sm_pwdb = pstatus->rx_pwdb_all; |
197 | if (undec_sm_cck < 0) | ||
198 | undec_sm_cck = pstatus->rx_pwdb_all; | ||
194 | if (pstatus->rx_pwdb_all > (u32) undec_sm_pwdb) { | 199 | if (pstatus->rx_pwdb_all > (u32) undec_sm_pwdb) { |
195 | undec_sm_pwdb = (((undec_sm_pwdb) * | 200 | undec_sm_pwdb = (((undec_sm_pwdb) * |
196 | (RX_SMOOTH_FACTOR - 1)) + | 201 | (RX_SMOOTH_FACTOR - 1)) + |
@@ -200,6 +205,15 @@ static void rtl_process_pwdb(struct ieee80211_hw *hw, struct rtl_stats *pstatus) | |||
200 | undec_sm_pwdb = (((undec_sm_pwdb) * (RX_SMOOTH_FACTOR - 1)) + | 205 | undec_sm_pwdb = (((undec_sm_pwdb) * (RX_SMOOTH_FACTOR - 1)) + |
201 | (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR); | 206 | (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR); |
202 | } | 207 | } |
208 | if (pstatus->rx_pwdb_all > (u32) undec_sm_cck) { | ||
209 | undec_sm_cck = (((undec_sm_pwdb) * | ||
210 | (RX_SMOOTH_FACTOR - 1)) + | ||
211 | (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR); | ||
212 | undec_sm_cck = undec_sm_cck + 1; | ||
213 | } else { | ||
214 | undec_sm_pwdb = (((undec_sm_cck) * (RX_SMOOTH_FACTOR - 1)) + | ||
215 | (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR); | ||
216 | } | ||
203 | 217 | ||
204 | if (sta) { | 218 | if (sta) { |
205 | drv_priv->rssi_stat.undec_sm_pwdb = undec_sm_pwdb; | 219 | drv_priv->rssi_stat.undec_sm_pwdb = undec_sm_pwdb; |
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index 6e2b5c5c83c8..4933f02ce1d5 100644 --- a/drivers/net/wireless/rtlwifi/usb.c +++ b/drivers/net/wireless/rtlwifi/usb.c | |||
@@ -475,14 +475,14 @@ static void _rtl_usb_rx_process_agg(struct ieee80211_hw *hw, | |||
475 | rtlpriv->stats.rxbytesunicast += skb->len; | 475 | rtlpriv->stats.rxbytesunicast += skb->len; |
476 | } | 476 | } |
477 | 477 | ||
478 | rtl_is_special_data(hw, skb, false); | ||
479 | |||
480 | if (ieee80211_is_data(fc)) { | 478 | if (ieee80211_is_data(fc)) { |
481 | rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX); | 479 | rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX); |
482 | 480 | ||
483 | if (unicast) | 481 | if (unicast) |
484 | rtlpriv->link_info.num_rx_inperiod++; | 482 | rtlpriv->link_info.num_rx_inperiod++; |
485 | } | 483 | } |
484 | /* static bcn for roaming */ | ||
485 | rtl_beacon_statistic(hw, skb); | ||
486 | } | 486 | } |
487 | } | 487 | } |
488 | 488 | ||
@@ -517,8 +517,6 @@ static void _rtl_usb_rx_process_noagg(struct ieee80211_hw *hw, | |||
517 | rtlpriv->stats.rxbytesunicast += skb->len; | 517 | rtlpriv->stats.rxbytesunicast += skb->len; |
518 | } | 518 | } |
519 | 519 | ||
520 | rtl_is_special_data(hw, skb, false); | ||
521 | |||
522 | if (ieee80211_is_data(fc)) { | 520 | if (ieee80211_is_data(fc)) { |
523 | rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX); | 521 | rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX); |
524 | 522 | ||
@@ -553,7 +551,7 @@ static void _rtl_rx_pre_process(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
553 | } | 551 | } |
554 | } | 552 | } |
555 | 553 | ||
556 | #define __RX_SKB_MAX_QUEUED 32 | 554 | #define __RX_SKB_MAX_QUEUED 64 |
557 | 555 | ||
558 | static void _rtl_rx_work(unsigned long param) | 556 | static void _rtl_rx_work(unsigned long param) |
559 | { | 557 | { |
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h index 0c65386fa30d..8c647391bedf 100644 --- a/drivers/net/wireless/rtlwifi/wifi.h +++ b/drivers/net/wireless/rtlwifi/wifi.h | |||
@@ -1033,6 +1033,7 @@ struct rtl_ht_agg { | |||
1033 | 1033 | ||
1034 | struct rssi_sta { | 1034 | struct rssi_sta { |
1035 | long undec_sm_pwdb; | 1035 | long undec_sm_pwdb; |
1036 | long undec_sm_cck; | ||
1036 | }; | 1037 | }; |
1037 | 1038 | ||
1038 | struct rtl_tid_data { | 1039 | struct rtl_tid_data { |
@@ -1323,8 +1324,10 @@ struct fast_ant_training { | |||
1323 | struct rtl_dm { | 1324 | struct rtl_dm { |
1324 | /*PHY status for Dynamic Management */ | 1325 | /*PHY status for Dynamic Management */ |
1325 | long entry_min_undec_sm_pwdb; | 1326 | long entry_min_undec_sm_pwdb; |
1327 | long undec_sm_cck; | ||
1326 | long undec_sm_pwdb; /*out dm */ | 1328 | long undec_sm_pwdb; /*out dm */ |
1327 | long entry_max_undec_sm_pwdb; | 1329 | long entry_max_undec_sm_pwdb; |
1330 | s32 ofdm_pkt_cnt; | ||
1328 | bool dm_initialgain_enable; | 1331 | bool dm_initialgain_enable; |
1329 | bool dynamic_txpower_enable; | 1332 | bool dynamic_txpower_enable; |
1330 | bool current_turbo_edca; | 1333 | bool current_turbo_edca; |
@@ -1339,6 +1342,7 @@ struct rtl_dm { | |||
1339 | bool inform_fw_driverctrldm; | 1342 | bool inform_fw_driverctrldm; |
1340 | bool current_mrc_switch; | 1343 | bool current_mrc_switch; |
1341 | u8 txpowercount; | 1344 | u8 txpowercount; |
1345 | u8 powerindex_backup[6]; | ||
1342 | 1346 | ||
1343 | u8 thermalvalue_rxgain; | 1347 | u8 thermalvalue_rxgain; |
1344 | u8 thermalvalue_iqk; | 1348 | u8 thermalvalue_iqk; |
@@ -1350,7 +1354,9 @@ struct rtl_dm { | |||
1350 | bool done_txpower; | 1354 | bool done_txpower; |
1351 | u8 dynamic_txhighpower_lvl; /*Tx high power level */ | 1355 | u8 dynamic_txhighpower_lvl; /*Tx high power level */ |
1352 | u8 dm_flag; /*Indicate each dynamic mechanism's status. */ | 1356 | u8 dm_flag; /*Indicate each dynamic mechanism's status. */ |
1357 | u8 dm_flag_tmp; | ||
1353 | u8 dm_type; | 1358 | u8 dm_type; |
1359 | u8 dm_rssi_sel; | ||
1354 | u8 txpower_track_control; | 1360 | u8 txpower_track_control; |
1355 | bool interrupt_migration; | 1361 | bool interrupt_migration; |
1356 | bool disable_tx_int; | 1362 | bool disable_tx_int; |
@@ -1804,6 +1810,7 @@ struct rtl_hal_cfg { | |||
1804 | bool write_readback; | 1810 | bool write_readback; |
1805 | char *name; | 1811 | char *name; |
1806 | char *fw_name; | 1812 | char *fw_name; |
1813 | char *alt_fw_name; | ||
1807 | struct rtl_hal_ops *ops; | 1814 | struct rtl_hal_ops *ops; |
1808 | struct rtl_mod_params *mod_params; | 1815 | struct rtl_mod_params *mod_params; |
1809 | struct rtl_hal_usbint_cfg *usb_interface_cfg; | 1816 | struct rtl_hal_usbint_cfg *usb_interface_cfg; |
@@ -1948,6 +1955,7 @@ struct dig_t { | |||
1948 | u8 pre_ccastate; | 1955 | u8 pre_ccastate; |
1949 | u8 cur_ccasate; | 1956 | u8 cur_ccasate; |
1950 | u8 large_fa_hit; | 1957 | u8 large_fa_hit; |
1958 | u8 dig_dynamic_min; | ||
1951 | u8 forbidden_igi; | 1959 | u8 forbidden_igi; |
1952 | u8 dig_state; | 1960 | u8 dig_state; |
1953 | u8 dig_highpwrstate; | 1961 | u8 dig_highpwrstate; |
@@ -2028,22 +2036,15 @@ struct rtl_priv { | |||
2028 | struct dig_t dm_digtable; | 2036 | struct dig_t dm_digtable; |
2029 | struct ps_t dm_pstable; | 2037 | struct ps_t dm_pstable; |
2030 | 2038 | ||
2031 | /* section shared by individual drivers */ | 2039 | u32 reg_874; |
2032 | union { | 2040 | u32 reg_c70; |
2033 | struct { /* data buffer pointer for USB reads */ | 2041 | u32 reg_85c; |
2034 | __le32 *usb_data; | 2042 | u32 reg_a74; |
2035 | int usb_data_index; | 2043 | bool reg_init; /* true if regs saved */ |
2036 | bool initialized; | 2044 | bool bt_operation_on; |
2037 | }; | 2045 | __le32 *usb_data; |
2038 | struct { /* section for 8723ae */ | 2046 | int usb_data_index; |
2039 | bool reg_init; /* true if regs saved */ | 2047 | bool initialized; |
2040 | u32 reg_874; | ||
2041 | u32 reg_c70; | ||
2042 | u32 reg_85c; | ||
2043 | u32 reg_a74; | ||
2044 | bool bt_operation_on; | ||
2045 | }; | ||
2046 | }; | ||
2047 | bool enter_ps; /* true when entering PS */ | 2048 | bool enter_ps; /* true when entering PS */ |
2048 | u8 rate_mask[5]; | 2049 | u8 rate_mask[5]; |
2049 | 2050 | ||