summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
5003975)
Previously, if the HT peer sended "just" enough BARs so
ba_head_idx warps around and the ba_head_idx == ba_tail_idx
condition will be true, the already queued BAs would be
lost.
Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
/* BA(R) Request Handler */
struct carl9170_bar_ctx ba_cache[CONFIG_CARL9170FW_BACK_REQS_NUM];
unsigned int ba_tail_idx,
/* BA(R) Request Handler */
struct carl9170_bar_ctx ba_cache[CONFIG_CARL9170FW_BACK_REQS_NUM];
unsigned int ba_tail_idx,
+ ba_head_idx,
+ queued_ba;
struct ieee80211_ba *ba = (struct ieee80211_ba *) &baf->f.ba;
struct carl9170_bar_ctx *ctx;
struct ieee80211_ba *ba = (struct ieee80211_ba *) &baf->f.ba;
struct carl9170_bar_ctx *ctx;
- if (likely(fw.wlan.ba_head_idx == fw.wlan.ba_tail_idx))
+ if (likely(!fw.wlan.queued_ba))
return;
/* there's no point to continue when the ba_desc is not available. */
return;
/* there's no point to continue when the ba_desc is not available. */
ctx = &fw.wlan.ba_cache[fw.wlan.ba_head_idx];
fw.wlan.ba_head_idx++;
fw.wlan.ba_head_idx %= CONFIG_CARL9170FW_BACK_REQS_NUM;
ctx = &fw.wlan.ba_cache[fw.wlan.ba_head_idx];
fw.wlan.ba_head_idx++;
fw.wlan.ba_head_idx %= CONFIG_CARL9170FW_BACK_REQS_NUM;
baf->s.len = sizeof(struct carl9170_tx_superdesc) +
sizeof(struct ar9170_tx_hwdesc) +
baf->s.len = sizeof(struct carl9170_tx_superdesc) +
sizeof(struct ar9170_tx_hwdesc) +
tmp = &fw.wlan.ba_cache[fw.wlan.ba_tail_idx];
fw.wlan.ba_tail_idx++;
fw.wlan.ba_tail_idx %= CONFIG_CARL9170FW_BACK_REQS_NUM;
tmp = &fw.wlan.ba_cache[fw.wlan.ba_tail_idx];
fw.wlan.ba_tail_idx++;
fw.wlan.ba_tail_idx %= CONFIG_CARL9170FW_BACK_REQS_NUM;
+ if (fw.wlan.queued_ba < CONFIG_CARL9170FW_BACK_REQS_NUM)
+ fw.wlan.queued_ba++;