|
@@ -2192,22 +2192,30 @@ static u64 ar9170_op_get_tsf(struct ieee80211_hw *hw)
|
|
|
{
|
|
|
struct ar9170 *ar = hw->priv;
|
|
|
int err;
|
|
|
- u32 tsf_low;
|
|
|
- u32 tsf_high;
|
|
|
u64 tsf;
|
|
|
+#define NR 3
|
|
|
+ static const u32 addr[NR] = { AR9170_MAC_REG_TSF_H,
|
|
|
+ AR9170_MAC_REG_TSF_L,
|
|
|
+ AR9170_MAC_REG_TSF_H };
|
|
|
+ u32 val[NR];
|
|
|
+ int loops = 0;
|
|
|
|
|
|
mutex_lock(&ar->mutex);
|
|
|
- err = ar9170_read_reg(ar, AR9170_MAC_REG_TSF_L, &tsf_low);
|
|
|
- if (!err)
|
|
|
- err = ar9170_read_reg(ar, AR9170_MAC_REG_TSF_H, &tsf_high);
|
|
|
+
|
|
|
+ while (loops++ < 10) {
|
|
|
+ err = ar9170_read_mreg(ar, NR, addr, val);
|
|
|
+ if (err || val[0] == val[2])
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
mutex_unlock(&ar->mutex);
|
|
|
|
|
|
if (WARN_ON(err))
|
|
|
return 0;
|
|
|
-
|
|
|
- tsf = tsf_high;
|
|
|
- tsf = (tsf << 32) | tsf_low;
|
|
|
+ tsf = val[0];
|
|
|
+ tsf = (tsf << 32) | val[1];
|
|
|
return tsf;
|
|
|
+#undef NR
|
|
|
}
|
|
|
|
|
|
static int ar9170_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|