aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorVincent Fann <vincent_fann@realtek.com>2015-05-15 22:29:27 -0400
committerKalle Valo <kvalo@codeaurora.org>2015-05-26 06:58:47 -0400
commit1277fa2ab2f9a624a4b0177119ca13b5fd65edd0 (patch)
tree085dcdc05711424e3725fa34ae3af7eb988324eb /drivers/net
parentd10101a603727474eb7ee16c1b46dcb4931a2dac (diff)
rtlwifi: Remove the clear interrupt routine from all drivers
Several of these drivers have there TX randomly blocked for 3~5 seconds while measuring tx throughput (iperf). The root couse happens in rtl_pci_flush(). The function uses a while-loop to wait for TX queue length to decrease to 0. The TX queue length counts the number of packets that are queued in the driver. The driver relys on the TX OK interrupt to return skb and reduce TX queue length. The interrupt subroutine disables interupts, reads the interrupt registers, and then clears the registers in the beginning of _rtl_pci_interrupt(). After all interupts process are finished, the driver invokes enable_interrupt() to enable interupts. This behavior is normal for an interrupt subroutine. But enable_interrupt() invokes clear_interrupt() again. This unexpected interrupt clearing may cleari me fresh TX OK interrupts. These missing interrupts cause TX queue length to never reduce to 0i, which causes rtl_pci_flush() to be stuck in unterminated while-loop. This patch removes clear_interrupt() in enable_interrupt() to avoid this behavior. Signed-off-by: Vincent Fann <vincent_fann@realtek.com> Signed-off-by: Shao Fu <shaofu@realtek.com> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Cc: Stable <stable@vger.kernel.org> [3.18+] Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/hw.c16
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/hw.c17
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/hw.c13
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/hw.c17
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/hw.c20
5 files changed, 0 insertions, 83 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c b/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
index 40c65b742b61..8ee83b093c0d 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
@@ -1354,27 +1354,11 @@ void rtl88ee_set_qos(struct ieee80211_hw *hw, int aci)
1354 } 1354 }
1355} 1355}
1356 1356
1357static void rtl88ee_clear_interrupt(struct ieee80211_hw *hw)
1358{
1359 struct rtl_priv *rtlpriv = rtl_priv(hw);
1360 u32 tmp;
1361
1362 tmp = rtl_read_dword(rtlpriv, REG_HISR);
1363 rtl_write_dword(rtlpriv, REG_HISR, tmp);
1364
1365 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
1366 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
1367
1368 tmp = rtl_read_dword(rtlpriv, REG_HSISR);
1369 rtl_write_dword(rtlpriv, REG_HSISR, tmp);
1370}
1371
1372void rtl88ee_enable_interrupt(struct ieee80211_hw *hw) 1357void rtl88ee_enable_interrupt(struct ieee80211_hw *hw)
1373{ 1358{
1374 struct rtl_priv *rtlpriv = rtl_priv(hw); 1359 struct rtl_priv *rtlpriv = rtl_priv(hw);
1375 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1360 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1376 1361
1377 rtl88ee_clear_interrupt(hw);/*clear it here first*/
1378 rtl_write_dword(rtlpriv, REG_HIMR, 1362 rtl_write_dword(rtlpriv, REG_HIMR,
1379 rtlpci->irq_mask[0] & 0xFFFFFFFF); 1363 rtlpci->irq_mask[0] & 0xFFFFFFFF);
1380 rtl_write_dword(rtlpriv, REG_HIMRE, 1364 rtl_write_dword(rtlpriv, REG_HIMRE,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c
index 0705e7e3def0..5f14308e8eb3 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c
@@ -1584,28 +1584,11 @@ void rtl92ee_set_qos(struct ieee80211_hw *hw, int aci)
1584 } 1584 }
1585} 1585}
1586 1586
1587static void rtl92ee_clear_interrupt(struct ieee80211_hw *hw)
1588{
1589 struct rtl_priv *rtlpriv = rtl_priv(hw);
1590 u32 tmp;
1591
1592 tmp = rtl_read_dword(rtlpriv, REG_HISR);
1593 rtl_write_dword(rtlpriv, REG_HISR, tmp);
1594
1595 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
1596 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
1597
1598 tmp = rtl_read_dword(rtlpriv, REG_HSISR);
1599 rtl_write_dword(rtlpriv, REG_HSISR, tmp);
1600}
1601
1602void rtl92ee_enable_interrupt(struct ieee80211_hw *hw) 1587void rtl92ee_enable_interrupt(struct ieee80211_hw *hw)
1603{ 1588{
1604 struct rtl_priv *rtlpriv = rtl_priv(hw); 1589 struct rtl_priv *rtlpriv = rtl_priv(hw);
1605 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1590 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1606 1591
1607 rtl92ee_clear_interrupt(hw);/*clear it here first*/
1608
1609 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); 1592 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
1610 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); 1593 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
1611 rtlpci->irq_enabled = true; 1594 rtlpci->irq_enabled = true;
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
index 67bb47d77b68..a4b7eac6856f 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
@@ -1258,18 +1258,6 @@ void rtl8723e_set_qos(struct ieee80211_hw *hw, int aci)
1258 } 1258 }
1259} 1259}
1260 1260
1261static void rtl8723e_clear_interrupt(struct ieee80211_hw *hw)
1262{
1263 struct rtl_priv *rtlpriv = rtl_priv(hw);
1264 u32 tmp;
1265
1266 tmp = rtl_read_dword(rtlpriv, REG_HISR);
1267 rtl_write_dword(rtlpriv, REG_HISR, tmp);
1268
1269 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
1270 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
1271}
1272
1273void rtl8723e_enable_interrupt(struct ieee80211_hw *hw) 1261void rtl8723e_enable_interrupt(struct ieee80211_hw *hw)
1274{ 1262{
1275 struct rtl_priv *rtlpriv = rtl_priv(hw); 1263 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -1284,7 +1272,6 @@ void rtl8723e_disable_interrupt(struct ieee80211_hw *hw)
1284{ 1272{
1285 struct rtl_priv *rtlpriv = rtl_priv(hw); 1273 struct rtl_priv *rtlpriv = rtl_priv(hw);
1286 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1274 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1287 rtl8723e_clear_interrupt(hw);/*clear it here first*/
1288 rtl_write_dword(rtlpriv, 0x3a8, IMR8190_DISABLED); 1275 rtl_write_dword(rtlpriv, 0x3a8, IMR8190_DISABLED);
1289 rtl_write_dword(rtlpriv, 0x3ac, IMR8190_DISABLED); 1276 rtl_write_dword(rtlpriv, 0x3ac, IMR8190_DISABLED);
1290 rtlpci->irq_enabled = false; 1277 rtlpci->irq_enabled = false;
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/hw.c b/drivers/net/wireless/rtlwifi/rtl8723be/hw.c
index e0f679bbcdaf..c983d2fe147f 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/hw.c
@@ -1634,28 +1634,11 @@ void rtl8723be_set_qos(struct ieee80211_hw *hw, int aci)
1634 } 1634 }
1635} 1635}
1636 1636
1637static void rtl8723be_clear_interrupt(struct ieee80211_hw *hw)
1638{
1639 struct rtl_priv *rtlpriv = rtl_priv(hw);
1640 u32 tmp;
1641
1642 tmp = rtl_read_dword(rtlpriv, REG_HISR);
1643 rtl_write_dword(rtlpriv, REG_HISR, tmp);
1644
1645 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
1646 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
1647
1648 tmp = rtl_read_dword(rtlpriv, REG_HSISR);
1649 rtl_write_dword(rtlpriv, REG_HSISR, tmp);
1650}
1651
1652void rtl8723be_enable_interrupt(struct ieee80211_hw *hw) 1637void rtl8723be_enable_interrupt(struct ieee80211_hw *hw)
1653{ 1638{
1654 struct rtl_priv *rtlpriv = rtl_priv(hw); 1639 struct rtl_priv *rtlpriv = rtl_priv(hw);
1655 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1640 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1656 1641
1657 rtl8723be_clear_interrupt(hw);/*clear it here first*/
1658
1659 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); 1642 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
1660 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); 1643 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
1661 rtlpci->irq_enabled = true; 1644 rtlpci->irq_enabled = true;
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
index 450bd4d743d0..3236d44b459d 100644
--- a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
@@ -2253,31 +2253,11 @@ void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci)
2253 } 2253 }
2254} 2254}
2255 2255
2256static void rtl8821ae_clear_interrupt(struct ieee80211_hw *hw)
2257{
2258 struct rtl_priv *rtlpriv = rtl_priv(hw);
2259 u32 tmp;
2260 tmp = rtl_read_dword(rtlpriv, REG_HISR);
2261 /*printk("clear interrupt first:\n");
2262 printk("0x%x = 0x%08x\n",REG_HISR, tmp);*/
2263 rtl_write_dword(rtlpriv, REG_HISR, tmp);
2264
2265 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
2266 /*printk("0x%x = 0x%08x\n",REG_HISRE, tmp);*/
2267 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
2268
2269 tmp = rtl_read_dword(rtlpriv, REG_HSISR);
2270 /*printk("0x%x = 0x%08x\n",REG_HSISR, tmp);*/
2271 rtl_write_dword(rtlpriv, REG_HSISR, tmp);
2272}
2273
2274void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw) 2256void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw)
2275{ 2257{
2276 struct rtl_priv *rtlpriv = rtl_priv(hw); 2258 struct rtl_priv *rtlpriv = rtl_priv(hw);
2277 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 2259 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2278 2260
2279 rtl8821ae_clear_interrupt(hw);/*clear it here first*/
2280
2281 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); 2261 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
2282 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); 2262 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
2283 rtlpci->irq_enabled = true; 2263 rtlpci->irq_enabled = true;