aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rtlwifi')
-rw-r--r--drivers/net/wireless/rtlwifi/base.c8
-rw-r--r--drivers/net/wireless/rtlwifi/cam.c4
-rw-r--r--drivers/net/wireless/rtlwifi/core.c11
-rw-r--r--drivers/net/wireless/rtlwifi/pci.c2
-rw-r--r--drivers/net/wireless/rtlwifi/ps.c6
-rw-r--r--drivers/net/wireless/rtlwifi/regd.c61
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/dm.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c327
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h14
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c39
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/hw.c18
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/dm.c9
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/dm.h3
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/hw.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/phy.c6
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/rf.c29
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/sw.c17
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/table.c40
-rw-r--r--drivers/net/wireless/rtlwifi/stats.c14
-rw-r--r--drivers/net/wireless/rtlwifi/usb.c8
-rw-r--r--drivers/net/wireless/rtlwifi/wifi.h33
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 }
62found_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
161static u32 power_index_reg[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
162
163void 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}
172EXPORT_SYMBOL_GPL(dm_restorepowerindex);
173
174void 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}
182EXPORT_SYMBOL_GPL(dm_writepowerindex);
183
184void 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}
195EXPORT_SYMBOL_GPL(dm_savepowerindex);
196
161static void rtl92c_dm_diginit(struct ieee80211_hw *hw) 197static 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
186static u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw) 227static 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
212static void rtl92c_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw) 255static 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)
398static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw) 500static 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
471static void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw) 540static 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)
493static void rtl92c_dm_dig(struct ieee80211_hw *hw) 564static 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
507static void rtl92c_dm_init_dynamic_txpower(struct ieee80211_hw *hw) 576static 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}
540EXPORT_SYMBOL(rtl92c_dm_write_dig); 625EXPORT_SYMBOL(rtl92c_dm_write_dig);
541 626
542static void rtl92c_dm_pwdb_monitor(struct ieee80211_hw *hw) 627static 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
546void rtl92c_dm_init_edca_turbo(struct ieee80211_hw *hw) 661void 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}
1262EXPORT_SYMBOL(rtl92c_dm_init); 1391EXPORT_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
94struct swat_t { 105struct 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);
167void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery); 178void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery);
168void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw); 179void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw);
169void rtl92c_dm_bt_coexist(struct ieee80211_hw *hw); 180void rtl92c_dm_bt_coexist(struct ieee80211_hw *hw);
181void dm_savepowerindex(struct ieee80211_hw *hw);
182void dm_writepowerindex(struct ieee80211_hw *hw, u8 value);
183void 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);
1047exit:
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
32void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw); 32void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw);
33void dm_savepowerindex(struct ieee80211_hw *hw);
34void dm_writepowerindex(struct ieee80211_hw *hw, u8 value);
35void 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>");
50MODULE_LICENSE("GPL"); 50MODULE_LICENSE("GPL");
51MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless"); 51MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless");
52MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin"); 52MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin");
53MODULE_FIRMWARE("rtlwifi/rtl8192cufw_A.bin");
54MODULE_FIRMWARE("rtlwifi/rtl8192cufw_B.bin");
55MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin");
53 56
54static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw) 57static 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
558static void _rtl_rx_work(unsigned long param) 556static 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
1034struct rssi_sta { 1034struct rssi_sta {
1035 long undec_sm_pwdb; 1035 long undec_sm_pwdb;
1036 long undec_sm_cck;
1036}; 1037};
1037 1038
1038struct rtl_tid_data { 1039struct rtl_tid_data {
@@ -1323,8 +1324,10 @@ struct fast_ant_training {
1323struct rtl_dm { 1324struct 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