mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-16 13:34:30 +00:00
wifi: ath9k: simplify internal time management
Prefer 'ktime_t' over 'struct timespec64' for 'struct ath_chanctx' and 'struct ath_softc' timestamps, choose standard kernel time API over an ad-hoc math in 'chanctx_event_delta()' and 'ath9k_hw_get_tsf_offset()', adjust related users. Compile tested only. Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> Acked-by: Toke Høiland-Jørgensen <toke@toke.dk> Link: https://patch.msgid.link/20241209155027.636400-3-dmantipov@yandex.ru Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
parent
d19ac7ef6e
commit
0cc6510ca4
@ -338,7 +338,7 @@ struct ath_chanctx {
|
||||
|
||||
struct ath_beacon_config beacon;
|
||||
struct ath9k_hw_cal_data caldata;
|
||||
struct timespec64 tsf_ts;
|
||||
ktime_t tsf_ts;
|
||||
u64 tsf_val;
|
||||
u32 last_beacon;
|
||||
|
||||
@ -1011,7 +1011,7 @@ struct ath_softc {
|
||||
struct ath_offchannel offchannel;
|
||||
struct ath_chanctx *next_chan;
|
||||
struct completion go_beacon;
|
||||
struct timespec64 last_event_time;
|
||||
ktime_t last_event_time;
|
||||
#endif
|
||||
|
||||
unsigned long driver_data;
|
||||
|
@ -293,7 +293,7 @@ void ath9k_beacon_ensure_primary_slot(struct ath_softc *sc)
|
||||
/* Modify TSF as required and update the HW. */
|
||||
avp->chanctx->tsf_val += tsfadjust;
|
||||
if (sc->cur_chan == avp->chanctx) {
|
||||
offset = ath9k_hw_get_tsf_offset(&avp->chanctx->tsf_ts, NULL);
|
||||
offset = ath9k_hw_get_tsf_offset(avp->chanctx->tsf_ts, 0);
|
||||
ath9k_hw_settsf64(sc->sc_ah, avp->chanctx->tsf_val + offset);
|
||||
}
|
||||
|
||||
|
@ -232,16 +232,11 @@ static const char *chanctx_state_string(enum ath_chanctx_state state)
|
||||
|
||||
static u32 chanctx_event_delta(struct ath_softc *sc)
|
||||
{
|
||||
u64 ms;
|
||||
struct timespec64 ts, *old;
|
||||
ktime_t ts = ktime_get_raw();
|
||||
s64 ms = ktime_ms_delta(ts, sc->last_event_time);
|
||||
|
||||
ktime_get_raw_ts64(&ts);
|
||||
old = &sc->last_event_time;
|
||||
ms = ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
|
||||
ms -= old->tv_sec * 1000 + old->tv_nsec / 1000000;
|
||||
sc->last_event_time = ts;
|
||||
|
||||
return (u32)ms;
|
||||
return ms;
|
||||
}
|
||||
|
||||
void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx)
|
||||
@ -334,8 +329,8 @@ ath_chanctx_get_next(struct ath_softc *sc, struct ath_chanctx *ctx)
|
||||
static void ath_chanctx_adjust_tbtt_delta(struct ath_softc *sc)
|
||||
{
|
||||
struct ath_chanctx *prev, *cur;
|
||||
struct timespec64 ts;
|
||||
u32 cur_tsf, prev_tsf, beacon_int;
|
||||
ktime_t ts;
|
||||
s32 offset;
|
||||
|
||||
beacon_int = TU_TO_USEC(sc->cur_chan->beacon.beacon_interval);
|
||||
@ -346,12 +341,12 @@ static void ath_chanctx_adjust_tbtt_delta(struct ath_softc *sc)
|
||||
if (!prev->switch_after_beacon)
|
||||
return;
|
||||
|
||||
ktime_get_raw_ts64(&ts);
|
||||
ts = ktime_get_raw();
|
||||
cur_tsf = (u32) cur->tsf_val +
|
||||
ath9k_hw_get_tsf_offset(&cur->tsf_ts, &ts);
|
||||
ath9k_hw_get_tsf_offset(cur->tsf_ts, ts);
|
||||
|
||||
prev_tsf = prev->last_beacon - (u32) prev->tsf_val + cur_tsf;
|
||||
prev_tsf -= ath9k_hw_get_tsf_offset(&prev->tsf_ts, &ts);
|
||||
prev_tsf -= ath9k_hw_get_tsf_offset(prev->tsf_ts, ts);
|
||||
|
||||
/* Adjust the TSF time of the AP chanctx to keep its beacons
|
||||
* at half beacon interval offset relative to the STA chanctx.
|
||||
@ -691,7 +686,7 @@ void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif,
|
||||
*/
|
||||
tsf_time = sc->sched.switch_start_time;
|
||||
tsf_time -= (u32) sc->cur_chan->tsf_val +
|
||||
ath9k_hw_get_tsf_offset(&sc->cur_chan->tsf_ts, NULL);
|
||||
ath9k_hw_get_tsf_offset(sc->cur_chan->tsf_ts, 0);
|
||||
tsf_time += ath9k_hw_gettsf32(ah);
|
||||
|
||||
sc->sched.beacon_adjust = false;
|
||||
@ -1230,10 +1225,10 @@ void ath_chanctx_set_next(struct ath_softc *sc, bool force)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
struct ath_chanctx *old_ctx;
|
||||
struct timespec64 ts;
|
||||
bool measure_time = false;
|
||||
bool send_ps = false;
|
||||
bool queues_stopped = false;
|
||||
ktime_t ts;
|
||||
|
||||
spin_lock_bh(&sc->chan_lock);
|
||||
if (!sc->next_chan) {
|
||||
@ -1260,7 +1255,7 @@ void ath_chanctx_set_next(struct ath_softc *sc, bool force)
|
||||
spin_unlock_bh(&sc->chan_lock);
|
||||
|
||||
if (sc->next_chan == &sc->offchannel.chan) {
|
||||
ktime_get_raw_ts64(&ts);
|
||||
ts = ktime_get_raw();
|
||||
measure_time = true;
|
||||
}
|
||||
|
||||
@ -1277,7 +1272,7 @@ void ath_chanctx_set_next(struct ath_softc *sc, bool force)
|
||||
spin_lock_bh(&sc->chan_lock);
|
||||
|
||||
if (sc->cur_chan != &sc->offchannel.chan) {
|
||||
ktime_get_raw_ts64(&sc->cur_chan->tsf_ts);
|
||||
sc->cur_chan->tsf_ts = ktime_get_raw();
|
||||
sc->cur_chan->tsf_val = ath9k_hw_gettsf64(sc->sc_ah);
|
||||
}
|
||||
}
|
||||
@ -1303,7 +1298,7 @@ void ath_chanctx_set_next(struct ath_softc *sc, bool force)
|
||||
ath_set_channel(sc);
|
||||
if (measure_time)
|
||||
sc->sched.channel_switch_time =
|
||||
ath9k_hw_get_tsf_offset(&ts, NULL);
|
||||
ath9k_hw_get_tsf_offset(ts, 0);
|
||||
/*
|
||||
* A reset will ensure that all queues are woken up,
|
||||
* so there is no need to awaken them again.
|
||||
|
@ -1847,20 +1847,11 @@ fail:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
u32 ath9k_hw_get_tsf_offset(struct timespec64 *last, struct timespec64 *cur)
|
||||
u32 ath9k_hw_get_tsf_offset(ktime_t last, ktime_t cur)
|
||||
{
|
||||
struct timespec64 ts;
|
||||
s64 usec;
|
||||
|
||||
if (!cur) {
|
||||
ktime_get_raw_ts64(&ts);
|
||||
cur = &ts;
|
||||
}
|
||||
|
||||
usec = cur->tv_sec * 1000000ULL + cur->tv_nsec / 1000;
|
||||
usec -= last->tv_sec * 1000000ULL + last->tv_nsec / 1000;
|
||||
|
||||
return (u32) usec;
|
||||
if (cur == 0)
|
||||
cur = ktime_get_raw();
|
||||
return ktime_us_delta(cur, last);
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_get_tsf_offset);
|
||||
|
||||
@ -1871,7 +1862,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
u32 saveLedState;
|
||||
u32 saveDefAntenna;
|
||||
u32 macStaId1;
|
||||
struct timespec64 tsf_ts;
|
||||
ktime_t tsf_ts;
|
||||
u32 tsf_offset;
|
||||
u64 tsf = 0;
|
||||
int r;
|
||||
@ -1917,7 +1908,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
macStaId1 = REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_BASE_RATE_11B;
|
||||
|
||||
/* Save TSF before chip reset, a cold reset clears it */
|
||||
ktime_get_raw_ts64(&tsf_ts);
|
||||
tsf_ts = ktime_get_raw();
|
||||
tsf = ath9k_hw_gettsf64(ah);
|
||||
|
||||
saveLedState = REG_READ(ah, AR_CFG_LED) &
|
||||
@ -1951,7 +1942,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
}
|
||||
|
||||
/* Restore TSF */
|
||||
tsf_offset = ath9k_hw_get_tsf_offset(&tsf_ts, NULL);
|
||||
tsf_offset = ath9k_hw_get_tsf_offset(tsf_ts, 0);
|
||||
ath9k_hw_settsf64(ah, tsf + tsf_offset);
|
||||
|
||||
if (AR_SREV_9280_20_OR_LATER(ah))
|
||||
@ -1975,7 +1966,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
* value after the initvals have been applied.
|
||||
*/
|
||||
if (AR_SREV_9100(ah) && (ath9k_hw_gettsf64(ah) < tsf)) {
|
||||
tsf_offset = ath9k_hw_get_tsf_offset(&tsf_ts, NULL);
|
||||
tsf_offset = ath9k_hw_get_tsf_offset(tsf_ts, 0);
|
||||
ath9k_hw_settsf64(ah, tsf + tsf_offset);
|
||||
}
|
||||
|
||||
|
@ -1066,7 +1066,7 @@ u32 ath9k_hw_gettsf32(struct ath_hw *ah);
|
||||
u64 ath9k_hw_gettsf64(struct ath_hw *ah);
|
||||
void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64);
|
||||
void ath9k_hw_reset_tsf(struct ath_hw *ah);
|
||||
u32 ath9k_hw_get_tsf_offset(struct timespec64 *last, struct timespec64 *cur);
|
||||
u32 ath9k_hw_get_tsf_offset(ktime_t last, ktime_t cur);
|
||||
void ath9k_hw_set_tsfadjust(struct ath_hw *ah, bool set);
|
||||
void ath9k_hw_init_global_settings(struct ath_hw *ah);
|
||||
u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah);
|
||||
|
@ -249,8 +249,7 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)
|
||||
if (sc->cur_chan->tsf_val) {
|
||||
u32 offset;
|
||||
|
||||
offset = ath9k_hw_get_tsf_offset(&sc->cur_chan->tsf_ts,
|
||||
NULL);
|
||||
offset = ath9k_hw_get_tsf_offset(sc->cur_chan->tsf_ts, 0);
|
||||
ath9k_hw_settsf64(ah, sc->cur_chan->tsf_val + offset);
|
||||
}
|
||||
|
||||
@ -1956,7 +1955,7 @@ static u64 ath9k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||
tsf = ath9k_hw_gettsf64(sc->sc_ah);
|
||||
} else {
|
||||
tsf = sc->cur_chan->tsf_val +
|
||||
ath9k_hw_get_tsf_offset(&sc->cur_chan->tsf_ts, NULL);
|
||||
ath9k_hw_get_tsf_offset(sc->cur_chan->tsf_ts, 0);
|
||||
}
|
||||
tsf += le64_to_cpu(avp->tsf_adjust);
|
||||
ath9k_ps_restore(sc);
|
||||
@ -1975,7 +1974,7 @@ static void ath9k_set_tsf(struct ieee80211_hw *hw,
|
||||
mutex_lock(&sc->mutex);
|
||||
ath9k_ps_wakeup(sc);
|
||||
tsf -= le64_to_cpu(avp->tsf_adjust);
|
||||
ktime_get_raw_ts64(&avp->chanctx->tsf_ts);
|
||||
avp->chanctx->tsf_ts = ktime_get_raw();
|
||||
if (sc->cur_chan == avp->chanctx)
|
||||
ath9k_hw_settsf64(sc->sc_ah, tsf);
|
||||
avp->chanctx->tsf_val = tsf;
|
||||
@ -1991,7 +1990,7 @@ static void ath9k_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||
mutex_lock(&sc->mutex);
|
||||
|
||||
ath9k_ps_wakeup(sc);
|
||||
ktime_get_raw_ts64(&avp->chanctx->tsf_ts);
|
||||
avp->chanctx->tsf_ts = ktime_get_raw();
|
||||
if (sc->cur_chan == avp->chanctx)
|
||||
ath9k_hw_reset_tsf(sc->sc_ah);
|
||||
avp->chanctx->tsf_val = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user