ath5k: Disable interrupts in ath5k_hw_get_tsf64
authorBruno Randolf <br1@einfach.org>
Mon, 27 Sep 2010 03:22:32 +0000 (12:22 +0900)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 28 Sep 2010 19:47:57 +0000 (15:47 -0400)
The code in ath5k_hw_get_tsf64() is time critical and will return wrong results
if we get interrupted, so disable local interrupts.

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

index 604114fb34b1441aa5b29e8bf82a08c9818d64d4..095d30b50ec7edbb5d82b77e188605d3a458d291 100644 (file)
@@ -495,6 +495,10 @@ u64 ath5k_hw_get_tsf64(struct ath5k_hw *ah)
 {
        u32 tsf_lower, tsf_upper1, tsf_upper2;
        int i;
+       unsigned long flags;
+
+       /* This code is time critical - we don't want to be interrupted here */
+       local_irq_save(flags);
 
        /*
         * While reading TSF upper and then lower part, the clock is still
@@ -517,6 +521,8 @@ u64 ath5k_hw_get_tsf64(struct ath5k_hw *ah)
                tsf_upper1 = tsf_upper2;
        }
 
+       local_irq_restore(flags);
+
        WARN_ON( i == ATH5K_MAX_TSF_READ );
 
        return (((u64)tsf_upper1 << 32) | tsf_lower);