diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/init.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 23 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 23 |
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 | ||
425 | void ath_hw_check(struct work_struct *work); | 425 | void ath_hw_check(struct work_struct *work); |
426 | void ath_hw_pll_work(struct work_struct *work); | ||
426 | void ath_paprd_calibrate(struct work_struct *work); | 427 | void ath_paprd_calibrate(struct work_struct *work); |
427 | void ath_ani_calibrate(unsigned long data); | 428 | void 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 | ||
627 | void 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 | |||
627 | void ath9k_tasklet(unsigned long data) | 650 | void 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 | ||
2183 | static 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 | |||
2205 | static void ath_tx_complete_poll_work(struct work_struct *work) | 2183 | static 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); |