ath9k: Fix TX hang issue with Atheros chipsets
The hardware doesn't generate interrupts in some cases and so work around this by monitoring the TX status periodically and reset the chip if required. This behavior of the hardware not generating the TX interrupts can be noticed through ath9k debugfs interrupt statistics when heavy traffic is being sent from STA to AP. One can easily see this behavior when the STA is transmitting at a higher rates. The interrupt statistics in the debugfs interface clearly shows that only RX interrupts alone being generated and TX being stuck. TX should be monitored through a timer and reset the chip only when frames are queued to the hardware but TX interrupts are not generated for the same even after one second. Also, we shouldn't remove holding descriptor from AC queue if it happens to be the only descriptor and schedule TX aggregation regarless of queue depth as it improves scheduling of AMPDUs from software to hardware queue. Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com> Signed-off-by: Senthil Balasubramanian <senthilkumar@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
dd8b15b027
commit
164ace3853
@@ -1259,6 +1259,7 @@ void ath_detach(struct ath_softc *sc)
|
||||
ath_deinit_leds(sc);
|
||||
cancel_work_sync(&sc->chan_work);
|
||||
cancel_delayed_work_sync(&sc->wiphy_work);
|
||||
cancel_delayed_work_sync(&sc->tx_complete_work);
|
||||
|
||||
for (i = 0; i < sc->num_sec_wiphy; i++) {
|
||||
struct ath_wiphy *aphy = sc->sec_wiphy[i];
|
||||
@@ -1979,6 +1980,8 @@ static int ath9k_start(struct ieee80211_hw *hw)
|
||||
|
||||
ieee80211_wake_queues(hw);
|
||||
|
||||
queue_delayed_work(sc->hw->workqueue, &sc->tx_complete_work, 0);
|
||||
|
||||
mutex_unlock:
|
||||
mutex_unlock(&sc->mutex);
|
||||
|
||||
|
Reference in New Issue
Block a user