Lines Matching +full:tx +full:- +full:ts +full:- +full:max

28  * ath_dynack_get_max_to - set max timeout according to channel width
34 const struct ath9k_channel *chan = ah->curchan; in ath_dynack_get_max_to()
49 * ath_dynack_ewma - EWMA (Exponentially Weighted Moving Average) calculation
54 return (new * (EWMA_DIV - EWMA_LEVEL) + in ath_dynack_ewma()
61 * ath_dynack_get_sifs - get sifs time based on phy used
71 if (IS_CHAN_QUARTER_RATE(ah->curchan)) in ath_dynack_get_sifs()
73 else if (IS_CHAN_HALF_RATE(ah->curchan)) in ath_dynack_get_sifs()
82 * ath_dynack_bssidmask - filter out ACK frames based on BSSID mask
92 if ((common->macaddr[i] & common->bssidmask[i]) != in ath_dynack_bssidmask()
93 (mac[i] & common->bssidmask[i])) in ath_dynack_bssidmask()
101 * ath_dynack_set_timeout - configure timeouts/slottime registers
109 int slottime = (to - 3) / 2; in ath_dynack_set_timeout()
119 * ath_dynack_compute_ackto - compute ACK timeout as the maximum STA timeout
126 struct ath_dynack *da = &ah->dynack; in ath_dynack_compute_ackto()
130 list_for_each_entry(an, &da->nodes, list) in ath_dynack_compute_ackto()
131 if (an->ackto > to) in ath_dynack_compute_ackto()
132 to = an->ackto; in ath_dynack_compute_ackto()
134 if (to && da->ackto != to) { in ath_dynack_compute_ackto()
136 da->ackto = to; in ath_dynack_compute_ackto()
141 * ath_dynack_compute_to - compute STA ACK timeout
148 struct ath_dynack *da = &ah->dynack; in ath_dynack_compute_to()
158 while (da->st_rbf.h_rb != da->st_rbf.t_rb && in ath_dynack_compute_to()
159 da->ack_rbf.h_rb != da->ack_rbf.t_rb) { in ath_dynack_compute_to()
160 ack_ts = da->ack_rbf.tstamp[da->ack_rbf.h_rb]; in ath_dynack_compute_to()
161 st_ts = &da->st_rbf.ts[da->st_rbf.h_rb]; in ath_dynack_compute_to()
162 dst = da->st_rbf.addr[da->st_rbf.h_rb].h_dest; in ath_dynack_compute_to()
163 src = da->st_rbf.addr[da->st_rbf.h_rb].h_src; in ath_dynack_compute_to()
166 "ack_ts %u st_ts %u st_dur %u [%u-%u]\n", in ath_dynack_compute_to()
167 ack_ts, st_ts->tstamp, st_ts->dur, in ath_dynack_compute_to()
168 da->ack_rbf.h_rb, da->st_rbf.h_rb); in ath_dynack_compute_to()
170 if (ack_ts > st_ts->tstamp + st_ts->dur) { in ath_dynack_compute_to()
171 ackto = ack_ts - st_ts->tstamp - st_ts->dur; in ath_dynack_compute_to()
174 sta = ieee80211_find_sta_by_ifaddr(ah->hw, dst, in ath_dynack_compute_to()
177 an = (struct ath_node *)sta->drv_priv; in ath_dynack_compute_to()
178 an->ackto = ath_dynack_ewma(an->ackto, in ath_dynack_compute_to()
182 an->ackto, ackto); in ath_dynack_compute_to()
183 if (time_is_before_jiffies(da->lto)) { in ath_dynack_compute_to()
185 da->lto = jiffies + COMPUTE_TO; in ath_dynack_compute_to()
188 INCR(da->ack_rbf.h_rb, ATH_DYN_BUF); in ath_dynack_compute_to()
190 INCR(da->st_rbf.h_rb, ATH_DYN_BUF); in ath_dynack_compute_to()
192 INCR(da->ack_rbf.h_rb, ATH_DYN_BUF); in ath_dynack_compute_to()
200 * ath_dynack_sample_tx_ts - status timestamp sampling method
203 * @ts: tx status info
208 struct ath_tx_status *ts, in ath_dynack_sample_tx_ts() argument
212 struct ath_dynack *da = &ah->dynack; in ath_dynack_sample_tx_ts()
215 u32 dur = ts->duration; in ath_dynack_sample_tx_ts()
218 if (!da->enabled || (info->flags & IEEE80211_TX_CTL_NO_ACK)) in ath_dynack_sample_tx_ts()
221 spin_lock_bh(&da->qlock); in ath_dynack_sample_tx_ts()
223 hdr = (struct ieee80211_hdr *)skb->data; in ath_dynack_sample_tx_ts()
226 if (ts->ts_status & ATH9K_TXERR_XRETRY) { in ath_dynack_sample_tx_ts()
227 if (ieee80211_is_assoc_req(hdr->frame_control) || in ath_dynack_sample_tx_ts()
228 ieee80211_is_assoc_resp(hdr->frame_control) || in ath_dynack_sample_tx_ts()
229 ieee80211_is_auth(hdr->frame_control)) { in ath_dynack_sample_tx_ts()
237 an = (struct ath_node *)sta->drv_priv; in ath_dynack_sample_tx_ts()
238 an->ackto = -1; in ath_dynack_sample_tx_ts()
240 da->lto = jiffies + LATEACK_DELAY; in ath_dynack_sample_tx_ts()
243 spin_unlock_bh(&da->qlock); in ath_dynack_sample_tx_ts()
247 ridx = ts->ts_rateindex; in ath_dynack_sample_tx_ts()
249 da->st_rbf.ts[da->st_rbf.t_rb].tstamp = ts->ts_tstamp; in ath_dynack_sample_tx_ts()
251 /* ether_addr_copy() gives a false warning on gcc-10 so use memcpy() in ath_dynack_sample_tx_ts()
254 memcpy(da->st_rbf.addr[da->st_rbf.t_rb].h_dest, hdr->addr1, ETH_ALEN); in ath_dynack_sample_tx_ts()
255 memcpy(da->st_rbf.addr[da->st_rbf.t_rb].h_src, hdr->addr2, ETH_ALEN); in ath_dynack_sample_tx_ts()
257 if (!(info->status.rates[ridx].flags & IEEE80211_TX_RC_MCS)) { in ath_dynack_sample_tx_ts()
259 struct ieee80211_tx_rate *rates = info->status.rates; in ath_dynack_sample_tx_ts()
262 rate = &common->sbands[info->band].bitrates[rates[ridx].idx]; in ath_dynack_sample_tx_ts()
263 if (info->band == NL80211_BAND_2GHZ && in ath_dynack_sample_tx_ts()
264 !(rate->flags & IEEE80211_RATE_ERP_G)) in ath_dynack_sample_tx_ts()
269 dur -= ath_dynack_get_sifs(ah, phy); in ath_dynack_sample_tx_ts()
271 da->st_rbf.ts[da->st_rbf.t_rb].dur = dur; in ath_dynack_sample_tx_ts()
273 INCR(da->st_rbf.t_rb, ATH_DYN_BUF); in ath_dynack_sample_tx_ts()
274 if (da->st_rbf.t_rb == da->st_rbf.h_rb) in ath_dynack_sample_tx_ts()
275 INCR(da->st_rbf.h_rb, ATH_DYN_BUF); in ath_dynack_sample_tx_ts()
277 ath_dbg(common, DYNACK, "{%pM} tx sample %u [dur %u][h %u-t %u]\n", in ath_dynack_sample_tx_ts()
278 hdr->addr1, ts->ts_tstamp, dur, da->st_rbf.h_rb, in ath_dynack_sample_tx_ts()
279 da->st_rbf.t_rb); in ath_dynack_sample_tx_ts()
283 spin_unlock_bh(&da->qlock); in ath_dynack_sample_tx_ts()
288 * ath_dynack_sample_ack_ts - ACK timestamp sampling method
291 * @ts: rx timestamp
295 u32 ts) in ath_dynack_sample_ack_ts() argument
297 struct ath_dynack *da = &ah->dynack; in ath_dynack_sample_ack_ts()
299 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ath_dynack_sample_ack_ts()
301 if (!da->enabled || !ath_dynack_bssidmask(ah, hdr->addr1)) in ath_dynack_sample_ack_ts()
304 spin_lock_bh(&da->qlock); in ath_dynack_sample_ack_ts()
305 da->ack_rbf.tstamp[da->ack_rbf.t_rb] = ts; in ath_dynack_sample_ack_ts()
307 INCR(da->ack_rbf.t_rb, ATH_DYN_BUF); in ath_dynack_sample_ack_ts()
308 if (da->ack_rbf.t_rb == da->ack_rbf.h_rb) in ath_dynack_sample_ack_ts()
309 INCR(da->ack_rbf.h_rb, ATH_DYN_BUF); in ath_dynack_sample_ack_ts()
311 ath_dbg(common, DYNACK, "rx sample %u [h %u-t %u]\n", in ath_dynack_sample_ack_ts()
312 ts, da->ack_rbf.h_rb, da->ack_rbf.t_rb); in ath_dynack_sample_ack_ts()
316 spin_unlock_bh(&da->qlock); in ath_dynack_sample_ack_ts()
321 * ath_dynack_node_init - init ath_node related info
328 struct ath_dynack *da = &ah->dynack; in ath_dynack_node_init()
330 an->ackto = da->ackto; in ath_dynack_node_init()
332 spin_lock_bh(&da->qlock); in ath_dynack_node_init()
333 list_add_tail(&an->list, &da->nodes); in ath_dynack_node_init()
334 spin_unlock_bh(&da->qlock); in ath_dynack_node_init()
339 * ath_dynack_node_deinit - deinit ath_node related info
346 struct ath_dynack *da = &ah->dynack; in ath_dynack_node_deinit()
348 spin_lock_bh(&da->qlock); in ath_dynack_node_deinit()
349 list_del(&an->list); in ath_dynack_node_deinit()
350 spin_unlock_bh(&da->qlock); in ath_dynack_node_deinit()
355 * ath_dynack_reset - reset dynack processing
361 struct ath_dynack *da = &ah->dynack; in ath_dynack_reset()
364 spin_lock_bh(&da->qlock); in ath_dynack_reset()
366 da->lto = jiffies + COMPUTE_TO; in ath_dynack_reset()
368 da->st_rbf.t_rb = 0; in ath_dynack_reset()
369 da->st_rbf.h_rb = 0; in ath_dynack_reset()
370 da->ack_rbf.t_rb = 0; in ath_dynack_reset()
371 da->ack_rbf.h_rb = 0; in ath_dynack_reset()
373 da->ackto = ath_dynack_get_max_to(ah); in ath_dynack_reset()
374 list_for_each_entry(an, &da->nodes, list) in ath_dynack_reset()
375 an->ackto = da->ackto; in ath_dynack_reset()
378 ath_dynack_set_timeout(ah, da->ackto); in ath_dynack_reset()
380 spin_unlock_bh(&da->qlock); in ath_dynack_reset()
385 * ath_dynack_init - init dynack data structure
391 struct ath_dynack *da = &ah->dynack; in ath_dynack_init()
395 spin_lock_init(&da->qlock); in ath_dynack_init()
396 INIT_LIST_HEAD(&da->nodes); in ath_dynack_init()
398 da->ackto = 9 + 16 + 64; in ath_dynack_init()
400 ah->hw->wiphy->features |= NL80211_FEATURE_ACKTO_ESTIMATION; in ath_dynack_init()