]> Pileus Git - ~andy/linux/blobdiff - drivers/net/wireless/ath/ath9k/gpio.c
ath9k_hw: use a software timer for btcoex no_stomp_timer
[~andy/linux] / drivers / net / wireless / ath / ath9k / gpio.c
index c34f21241da947e5297bc7ad18e6de9cc3430825..a85e220c8d9c2ef183e372b399b95223686b870d 100644 (file)
@@ -257,19 +257,9 @@ static void ath_btcoex_period_timer(unsigned long data)
 
        spin_unlock_bh(&btcoex->btcoex_lock);
 
-       /*
-        * btcoex_period is in msec while (btocex/btscan_)no_stomp are in usec,
-        * ensure that we properly convert btcoex_period to usec
-        * for any comparision with (btcoex/btscan_)no_stomp.
-        */
-       if (btcoex->btcoex_period * 1000 != btcoex->btcoex_no_stomp) {
-               if (btcoex->hw_timer_enabled)
-                       ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer);
-
-               ath9k_gen_timer_start(ah, btcoex->no_stomp_timer, timer_period,
-                                     timer_period * 10);
-               btcoex->hw_timer_enabled = true;
-       }
+       if (btcoex->btcoex_period != btcoex->btcoex_no_stomp)
+               mod_timer(&btcoex->no_stomp_timer,
+                        jiffies + msecs_to_jiffies(timer_period));
 
        ath9k_ps_restore(sc);
 
@@ -282,7 +272,7 @@ skip_hw_wakeup:
  * Generic tsf based hw timer which configures weight
  * registers to time slice between wlan and bt traffic
  */
-static void ath_btcoex_no_stomp_timer(void *arg)
+static void ath_btcoex_no_stomp_timer(unsigned long arg)
 {
        struct ath_softc *sc = (struct ath_softc *)arg;
        struct ath_hw *ah = sc->sc_ah;
@@ -311,24 +301,18 @@ static int ath_init_btcoex_timer(struct ath_softc *sc)
        struct ath_btcoex *btcoex = &sc->btcoex;
 
        btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD;
-       btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) * 1000 *
+       btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) *
                btcoex->btcoex_period / 100;
-       btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) * 1000 *
+       btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) *
                                   btcoex->btcoex_period / 100;
 
        setup_timer(&btcoex->period_timer, ath_btcoex_period_timer,
                        (unsigned long) sc);
+       setup_timer(&btcoex->no_stomp_timer, ath_btcoex_no_stomp_timer,
+                       (unsigned long) sc);
 
        spin_lock_init(&btcoex->btcoex_lock);
 
-       btcoex->no_stomp_timer = ath_gen_timer_alloc(sc->sc_ah,
-                       ath_btcoex_no_stomp_timer,
-                       ath_btcoex_no_stomp_timer,
-                       (void *) sc, AR_FIRST_NDP_TIMER);
-
-       if (!btcoex->no_stomp_timer)
-               return -ENOMEM;
-
        return 0;
 }
 
@@ -343,10 +327,7 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc)
        ath_dbg(ath9k_hw_common(ah), BTCOEX, "Starting btcoex timers\n");
 
        /* make sure duty cycle timer is also stopped when resuming */
-       if (btcoex->hw_timer_enabled) {
-               ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer);
-               btcoex->hw_timer_enabled = false;
-       }
+       del_timer_sync(&btcoex->no_stomp_timer);
 
        btcoex->bt_priority_cnt = 0;
        btcoex->bt_priority_time = jiffies;
@@ -363,24 +344,16 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc)
 void ath9k_btcoex_timer_pause(struct ath_softc *sc)
 {
        struct ath_btcoex *btcoex = &sc->btcoex;
-       struct ath_hw *ah = sc->sc_ah;
 
        del_timer_sync(&btcoex->period_timer);
-
-       if (btcoex->hw_timer_enabled) {
-               ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer);
-               btcoex->hw_timer_enabled = false;
-       }
+       del_timer_sync(&btcoex->no_stomp_timer);
 }
 
 void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc)
 {
        struct ath_btcoex *btcoex = &sc->btcoex;
 
-       if (btcoex->hw_timer_enabled) {
-               ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer);
-               btcoex->hw_timer_enabled = false;
-       }
+       del_timer_sync(&btcoex->no_stomp_timer);
 }
 
 u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen)
@@ -447,10 +420,6 @@ void ath9k_deinit_btcoex(struct ath_softc *sc)
 {
        struct ath_hw *ah = sc->sc_ah;
 
-        if ((sc->btcoex.no_stomp_timer) &&
-           ath9k_hw_get_btcoex_scheme(sc->sc_ah) == ATH_BTCOEX_CFG_3WIRE)
-               ath_gen_timer_free(sc->sc_ah, sc->btcoex.no_stomp_timer);
-
        if (ath9k_hw_mci_is_enabled(ah))
                ath_mci_cleanup(sc);
 }