Johannes Berg a écrit :
On Sun, 2010-02-28 at 23:08 +0100, Benoit Papillault wrote:
- u64 tsf = ath5k_hw_reg_read(ah, AR5K_TSF_U32);
+ u32 tsf_lower, tsf_upper;
+
+ /*
+ * While reading TSF upper and then lower part, the clock is still
+ * counting so the lower part can rollover just after reading the
+ * upper part. In this case, we expect the lower part to be quite
+ * small (let's say less than 100us) and we would just need to read
+ * the upper part again to get the correct value.
+ *
+ * Tested on AR2425 (AR5001)
+ */
+
+ tsf_upper = ath5k_hw_reg_read(ah, AR5K_TSF_U32);
+ tsf_lower = ath5k_hw_reg_read(ah, AR5K_TSF_L32);
+
+ if (tsf_lower < 100)
+ tsf_upper = ath5k_hw_reg_read(ah, AR5K_TSF_U32);
You would typically do
do {
read upper 1
read lower
read upper 2
} while (upper 1 != upper 2)
or so but that obviously incurs another read in most cases.
johannes
Indeed. I'll redo the patch. Derek has convinced me that accuracy is
sometimes more important than few register reads. So forget this patch.
Regards,
Benoit
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html