aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k
diff options
context:
space:
mode:
authorSenthil Balasubramanian <senthilkumar@atheros.com>2011-04-22 02:02:11 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-04-25 14:50:18 -0400
commit9eab61c2bff2f769ee771a7a9301fb720cec9b56 (patch)
treeccc0f1062cc4bf00148a880256fe3fca18be2472 /drivers/net/wireless/ath/ath9k
parent515139066928da040d1482f201ef1b769bc29aa0 (diff)
ath9k: cleanup hw pll work handler
There is no reason why pll work handler should be part of xmit file. move it to main.c so that reading hw check routines are all in the same place. Signed-off-by: Senthil Balasubramanian <senthilkumar@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k')
-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);