aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/ath/ath9k/ath9k.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/init.c1
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c23
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c23
4 files changed, 25 insertions, 23 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index 5ebfc57c3110..0312aa091807 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -423,6 +423,7 @@ void ath9k_set_beaconing_status(struct ath_softc *sc, bool status);
423#define ATH_PAPRD_TIMEOUT 100 /* msecs */ 423#define ATH_PAPRD_TIMEOUT 100 /* msecs */
424 424
425void ath_hw_check(struct work_struct *work); 425void ath_hw_check(struct work_struct *work);
426void ath_hw_pll_work(struct work_struct *work);
426void ath_paprd_calibrate(struct work_struct *work); 427void ath_paprd_calibrate(struct work_struct *work);
427void ath_ani_calibrate(unsigned long data); 428void ath_ani_calibrate(unsigned long data);
428 429
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
index e78b6aefa108..b172d1509515 100644
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -801,6 +801,7 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
801 801
802 INIT_WORK(&sc->hw_check_work, ath_hw_check); 802 INIT_WORK(&sc->hw_check_work, ath_hw_check);
803 INIT_WORK(&sc->paprd_work, ath_paprd_calibrate); 803 INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
804 INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work);
804 sc->last_rssi = ATH_RSSI_DUMMY_MARKER; 805 sc->last_rssi = ATH_RSSI_DUMMY_MARKER;
805 806
806 ath_init_leds(sc); 807 ath_init_leds(sc);
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index dd2fffbbef2e..94d73c3f4458 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -624,6 +624,29 @@ out:
624 ath9k_ps_restore(sc); 624 ath9k_ps_restore(sc);
625} 625}
626 626
627void ath_hw_pll_work(struct work_struct *work)
628{
629 struct ath_softc *sc = container_of(work, struct ath_softc,
630 hw_pll_work.work);
631 static int count;
632
633 if (AR_SREV_9485(sc->sc_ah)) {
634 if (ar9003_get_pll_sqsum_dvc(sc->sc_ah) >= 0x40000) {
635 count++;
636
637 if (count == 3) {
638 /* Rx is hung for more than 500ms. Reset it */
639 ath_reset(sc, true);
640 count = 0;
641 }
642 } else
643 count = 0;
644
645 ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work, HZ/5);
646 }
647}
648
649
627void ath9k_tasklet(unsigned long data) 650void ath9k_tasklet(unsigned long data)
628{ 651{
629 struct ath_softc *sc = (struct ath_softc *)data; 652 struct ath_softc *sc = (struct ath_softc *)data;
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 65d46c6ebced..55960fa70dc6 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -2180,28 +2180,6 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
2180 } 2180 }
2181} 2181}
2182 2182
2183static void ath_hw_pll_work(struct work_struct *work)
2184{
2185 struct ath_softc *sc = container_of(work, struct ath_softc,
2186 hw_pll_work.work);
2187 static int count;
2188
2189 if (AR_SREV_9485(sc->sc_ah)) {
2190 if (ar9003_get_pll_sqsum_dvc(sc->sc_ah) >= 0x40000) {
2191 count++;
2192
2193 if (count == 3) {
2194 /* Rx is hung for more than 500ms. Reset it */
2195 ath_reset(sc, true);
2196 count = 0;
2197 }
2198 } else
2199 count = 0;
2200
2201 ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work, HZ/5);
2202 }
2203}
2204
2205static void ath_tx_complete_poll_work(struct work_struct *work) 2183static void ath_tx_complete_poll_work(struct work_struct *work)
2206{ 2184{
2207 struct ath_softc *sc = container_of(work, struct ath_softc, 2185 struct ath_softc *sc = container_of(work, struct ath_softc,
@@ -2396,7 +2374,6 @@ int ath_tx_init(struct ath_softc *sc, int nbufs)
2396 } 2374 }
2397 2375
2398 INIT_DELAYED_WORK(&sc->tx_complete_work, ath_tx_complete_poll_work); 2376 INIT_DELAYED_WORK(&sc->tx_complete_work, ath_tx_complete_poll_work);
2399 INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work);
2400 2377
2401 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { 2378 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
2402 error = ath_tx_edma_init(sc); 2379 error = ath_tx_edma_init(sc);