ath5k: remove the use of SWI interrupt
authorBruno Randolf <br1@einfach.org>
Thu, 25 Mar 2010 05:49:09 +0000 (14:49 +0900)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 31 Mar 2010 18:39:08 +0000 (14:39 -0400)
We don't need to generate a software interrupt (SWI) just to schedule a tasklet
- we can just schedule the tasklet directly.

Rename constants, names, etc to reflect the fact that we don't use SWI any more.

Also move the flag handling into the tasklet and prepare it to behave correctly
when there are multiple flags present.

Signed-off-by: Bruno Randolf <br1@einfach.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath5k/ath5k.h
drivers/net/wireless/ath/ath5k/base.c
drivers/net/wireless/ath/ath5k/phy.c

index a3019ee4f2fa34958050929f584dc45fe8760839..d84ccde11171672f766f2413e47e95f7154e3513 100644 (file)
@@ -890,10 +890,10 @@ enum ath5k_int {
        AR5K_INT_NOCARD = 0xffffffff
 };
 
-/* Software interrupts used for calibration */
-enum ath5k_software_interrupt {
-       AR5K_SWI_FULL_CALIBRATION = 0x01,
-       AR5K_SWI_SHORT_CALIBRATION = 0x02,
+/* mask which calibration is active at the moment */
+enum ath5k_calibration_mask {
+       AR5K_CALIBRATION_FULL = 0x01,
+       AR5K_CALIBRATION_SHORT = 0x02,
 };
 
 /*
@@ -1102,8 +1102,8 @@ struct ath5k_hw {
        /* Calibration timestamp */
        unsigned long           ah_cal_tstamp;
 
-       /* Software interrupt mask */
-       u8                      ah_swi_mask;
+       /* Calibration mask */
+       u8                      ah_cal_mask;
 
        /*
         * Function pointers
index 39d58001725991dfdf18b766b9d3cd7b6b7217eb..539a6d5415fdc725b03295a05d77567ee6a48b96 100644 (file)
@@ -2507,7 +2507,7 @@ ath5k_init(struct ath5k_softc *sc)
        sc->curband = &sc->sbands[sc->curchan->band];
        sc->imask = AR5K_INT_RXOK | AR5K_INT_RXERR | AR5K_INT_RXEOL |
                AR5K_INT_RXORN | AR5K_INT_TXDESC | AR5K_INT_TXEOL |
-               AR5K_INT_FATAL | AR5K_INT_GLOBAL | AR5K_INT_SWI;
+               AR5K_INT_FATAL | AR5K_INT_GLOBAL;
        ret = ath5k_reset(sc, NULL);
        if (ret)
                goto done;
@@ -2673,9 +2673,6 @@ ath5k_intr(int irq, void *dev_id)
                        if (status & AR5K_INT_BMISS) {
                                /* TODO */
                        }
-                       if (status & AR5K_INT_SWI) {
-                               tasklet_schedule(&sc->calib);
-                       }
                        if (status & AR5K_INT_MIB) {
                                /*
                                 * These stats are also used for ANI i think
@@ -2716,8 +2713,7 @@ ath5k_tasklet_calibrate(unsigned long data)
        struct ath5k_hw *ah = sc->ah;
 
        /* Only full calibration for now */
-       if (ah->ah_swi_mask != AR5K_SWI_FULL_CALIBRATION)
-               return;
+       ah->ah_cal_mask |= AR5K_CALIBRATION_FULL;
 
        /* Stop queues so that calibration
         * doesn't interfere with tx */
@@ -2740,11 +2736,10 @@ ath5k_tasklet_calibrate(unsigned long data)
                        ieee80211_frequency_to_channel(
                                sc->curchan->center_freq));
 
-       ah->ah_swi_mask = 0;
-
        /* Wake queues */
        ieee80211_wake_queues(sc->hw);
 
+       ah->ah_cal_mask &= ~AR5K_CALIBRATION_FULL;
 }
 
 
index 01b3f29ec13d0f11ac3357fc4488bf5485a5b552..075873f9842881e22f4b58a321c8e1c4a6a6f94e 100644 (file)
@@ -1119,8 +1119,7 @@ ath5k_hw_calibration_poll(struct ath5k_hw *ah)
         * interrupt (bit gets auto-cleared) */
        if (time_is_before_eq_jiffies(ah->ah_cal_tstamp + cal_intval)) {
                ah->ah_cal_tstamp = jiffies;
-               ah->ah_swi_mask = AR5K_SWI_FULL_CALIBRATION;
-               AR5K_REG_ENABLE_BITS(ah, AR5K_CR, AR5K_CR_SWI);
+               tasklet_schedule(&ah->ah_sc->calib);
        }
 }