forked from Minki/linux
ath9k: fix extending the rx timestamp with the hardware TSF
AR5416 and all newer chipsets use a 32 bit rx timestamp, so there is no need to keep the 15 bit timestamp extending logic around. This patch removes ath9k_hw_extend_tsf (replaced by a call to ath9k_hw_gettsf64), and reduces the frequency of TSF reads, which can improve performance in some cases. This change also has the side effect of making rx timestamps more accurate. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
ebe297c35d
commit
a6d2055b02
@ -2616,21 +2616,6 @@ void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ath9k_hw_set_tsfadjust);
|
EXPORT_SYMBOL(ath9k_hw_set_tsfadjust);
|
||||||
|
|
||||||
/*
|
|
||||||
* Extend 15-bit time stamp from rx descriptor to
|
|
||||||
* a full 64-bit TSF using the current h/w TSF.
|
|
||||||
*/
|
|
||||||
u64 ath9k_hw_extend_tsf(struct ath_hw *ah, u32 rstamp)
|
|
||||||
{
|
|
||||||
u64 tsf;
|
|
||||||
|
|
||||||
tsf = ath9k_hw_gettsf64(ah);
|
|
||||||
if ((tsf & 0x7fff) < rstamp)
|
|
||||||
tsf -= 0x8000;
|
|
||||||
return (tsf & ~0x7fff) | rstamp;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(ath9k_hw_extend_tsf);
|
|
||||||
|
|
||||||
void ath9k_hw_set11nmac2040(struct ath_hw *ah)
|
void ath9k_hw_set11nmac2040(struct ath_hw *ah)
|
||||||
{
|
{
|
||||||
struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
|
struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
|
||||||
|
@ -894,7 +894,6 @@ u64 ath9k_hw_gettsf64(struct ath_hw *ah);
|
|||||||
void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64);
|
void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64);
|
||||||
void ath9k_hw_reset_tsf(struct ath_hw *ah);
|
void ath9k_hw_reset_tsf(struct ath_hw *ah);
|
||||||
void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting);
|
void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting);
|
||||||
u64 ath9k_hw_extend_tsf(struct ath_hw *ah, u32 rstamp);
|
|
||||||
void ath9k_hw_init_global_settings(struct ath_hw *ah);
|
void ath9k_hw_init_global_settings(struct ath_hw *ah);
|
||||||
void ath9k_hw_set11nmac2040(struct ath_hw *ah);
|
void ath9k_hw_set11nmac2040(struct ath_hw *ah);
|
||||||
void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period);
|
void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period);
|
||||||
|
@ -1002,8 +1002,6 @@ static int ath9k_rx_skb_preprocess(struct ath_common *common,
|
|||||||
struct ieee80211_rx_status *rx_status,
|
struct ieee80211_rx_status *rx_status,
|
||||||
bool *decrypt_error)
|
bool *decrypt_error)
|
||||||
{
|
{
|
||||||
struct ath_hw *ah = common->ah;
|
|
||||||
|
|
||||||
memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
|
memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1018,7 +1016,6 @@ static int ath9k_rx_skb_preprocess(struct ath_common *common,
|
|||||||
if (ath9k_process_rate(common, hw, rx_stats, rx_status))
|
if (ath9k_process_rate(common, hw, rx_stats, rx_status))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
rx_status->mactime = ath9k_hw_extend_tsf(ah, rx_stats->rs_tstamp);
|
|
||||||
rx_status->band = hw->conf.channel->band;
|
rx_status->band = hw->conf.channel->band;
|
||||||
rx_status->freq = hw->conf.channel->center_freq;
|
rx_status->freq = hw->conf.channel->center_freq;
|
||||||
rx_status->signal = ATH_DEFAULT_NOISE_FLOOR + rx_stats->rs_rssi;
|
rx_status->signal = ATH_DEFAULT_NOISE_FLOOR + rx_stats->rs_rssi;
|
||||||
@ -1100,6 +1097,8 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
|
|||||||
bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
|
bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
|
||||||
int dma_type;
|
int dma_type;
|
||||||
u8 rx_status_len = ah->caps.rx_status_len;
|
u8 rx_status_len = ah->caps.rx_status_len;
|
||||||
|
u64 tsf = 0;
|
||||||
|
u32 tsf_lower = 0;
|
||||||
|
|
||||||
if (edma)
|
if (edma)
|
||||||
dma_type = DMA_BIDIRECTIONAL;
|
dma_type = DMA_BIDIRECTIONAL;
|
||||||
@ -1109,6 +1108,9 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
|
|||||||
qtype = hp ? ATH9K_RX_QUEUE_HP : ATH9K_RX_QUEUE_LP;
|
qtype = hp ? ATH9K_RX_QUEUE_HP : ATH9K_RX_QUEUE_LP;
|
||||||
spin_lock_bh(&sc->rx.rxbuflock);
|
spin_lock_bh(&sc->rx.rxbuflock);
|
||||||
|
|
||||||
|
tsf = ath9k_hw_gettsf64(ah);
|
||||||
|
tsf_lower = tsf & 0xffffffff;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
/* If handling rx interrupt and flush is in progress => exit */
|
/* If handling rx interrupt and flush is in progress => exit */
|
||||||
if ((sc->sc_flags & SC_OP_RXFLUSH) && (flush == 0))
|
if ((sc->sc_flags & SC_OP_RXFLUSH) && (flush == 0))
|
||||||
@ -1141,6 +1143,15 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
|
|||||||
if (flush)
|
if (flush)
|
||||||
goto requeue;
|
goto requeue;
|
||||||
|
|
||||||
|
rxs->mactime = (tsf & ~0xffffffffULL) | rs.rs_tstamp;
|
||||||
|
if (rs.rs_tstamp > tsf_lower &&
|
||||||
|
unlikely(rs.rs_tstamp - tsf_lower > 0x10000000))
|
||||||
|
rxs->mactime -= 0x100000000ULL;
|
||||||
|
|
||||||
|
if (rs.rs_tstamp < tsf_lower &&
|
||||||
|
unlikely(tsf_lower - rs.rs_tstamp > 0x10000000))
|
||||||
|
rxs->mactime += 0x100000000ULL;
|
||||||
|
|
||||||
retval = ath9k_rx_skb_preprocess(common, hw, hdr, &rs,
|
retval = ath9k_rx_skb_preprocess(common, hw, hdr, &rs,
|
||||||
rxs, &decrypt_error);
|
rxs, &decrypt_error);
|
||||||
if (retval)
|
if (retval)
|
||||||
|
Loading…
Reference in New Issue
Block a user