Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 194453
b: refs/heads/master
c: 1c0fc65
h: refs/heads/master
i:
  194451: 3ca8620
v: v3
  • Loading branch information
Benoit Papillault authored and John W. Linville committed Apr 16, 2010
1 parent f37306f commit c0c5325
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 733f0ea4498a24db5b8ac048ef99983600f1eff9
refs/heads/master: 1c0fc65e6de4e941ff483df445e721d6edb1f84b
31 changes: 29 additions & 2 deletions trunk/drivers/net/wireless/ath/ath5k/pcu.c
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,8 @@ void ath5k_hw_set_rx_filter(struct ath5k_hw *ah, u32 filter)
* Beacon control *
\****************/

#define ATH5K_MAX_TSF_READ 10

/**
* ath5k_hw_get_tsf64 - Get the full 64bit TSF
*
Expand All @@ -505,10 +507,35 @@ void ath5k_hw_set_rx_filter(struct ath5k_hw *ah, u32 filter)
*/
u64 ath5k_hw_get_tsf64(struct ath5k_hw *ah)
{
u64 tsf = ath5k_hw_reg_read(ah, AR5K_TSF_U32);
u32 tsf_lower, tsf_upper1, tsf_upper2;
int i;

/*
* While reading TSF upper and then lower part, the clock is still
* counting (or jumping in case of IBSS merge) so we might get
* inconsistent values. To avoid this, we read the upper part again
* and check it has not been changed. We make the hypothesis that a
* maximum of 3 changes can happens in a row (we use 10 as a safe
* value).
*
* Impact on performance is pretty small, since in most cases, only
* 3 register reads are needed.
*/

tsf_upper1 = ath5k_hw_reg_read(ah, AR5K_TSF_U32);
for (i = 0; i < ATH5K_MAX_TSF_READ; i++) {
tsf_lower = ath5k_hw_reg_read(ah, AR5K_TSF_L32);
tsf_upper2 = ath5k_hw_reg_read(ah, AR5K_TSF_U32);
if (tsf_upper2 == tsf_upper1)
break;
tsf_upper1 = tsf_upper2;
}

WARN_ON( i == ATH5K_MAX_TSF_READ );

ATH5K_TRACE(ah->ah_sc);

return ath5k_hw_reg_read(ah, AR5K_TSF_L32) | (tsf << 32);
return (((u64)tsf_upper1 << 32) | tsf_lower);
}

/**
Expand Down
19 changes: 15 additions & 4 deletions trunk/drivers/net/wireless/ath/ath9k/hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -2420,14 +2420,25 @@ void ath9k_hw_write_associd(struct ath_hw *ah)
}
EXPORT_SYMBOL(ath9k_hw_write_associd);

#define ATH9K_MAX_TSF_READ 10

u64 ath9k_hw_gettsf64(struct ath_hw *ah)
{
u64 tsf;
u32 tsf_lower, tsf_upper1, tsf_upper2;
int i;

tsf_upper1 = REG_READ(ah, AR_TSF_U32);
for (i = 0; i < ATH9K_MAX_TSF_READ; i++) {
tsf_lower = REG_READ(ah, AR_TSF_L32);
tsf_upper2 = REG_READ(ah, AR_TSF_U32);
if (tsf_upper2 == tsf_upper1)
break;
tsf_upper1 = tsf_upper2;
}

tsf = REG_READ(ah, AR_TSF_U32);
tsf = (tsf << 32) | REG_READ(ah, AR_TSF_L32);
WARN_ON( i == ATH9K_MAX_TSF_READ );

return tsf;
return (((u64)tsf_upper1 << 32) | tsf_lower);
}
EXPORT_SYMBOL(ath9k_hw_gettsf64);

Expand Down

0 comments on commit c0c5325

Please sign in to comment.