From: Christian Lamparter Date: Sat, 31 Mar 2012 22:04:35 +0000 (+0200) Subject: carl9170 firmware: fix BAR->BA delivery X-Git-Tag: 1.9.6~18 X-Git-Url: https://jxself.org/git/?p=carl9170fw.git;a=commitdiff_plain;h=a9df280e9edf83ab1596a81c1bf47cd2e72f3d50 carl9170 firmware: fix BAR->BA delivery 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 --- diff --git a/carlfw/include/carl9170.h b/carlfw/include/carl9170.h index a319b2a..6dfdf3e 100644 --- a/carlfw/include/carl9170.h +++ b/carlfw/include/carl9170.h @@ -141,7 +141,8 @@ struct firmware_context_struct { /* BA(R) Request Handler */ struct carl9170_bar_ctx ba_cache[CONFIG_CARL9170FW_BACK_REQS_NUM]; unsigned int ba_tail_idx, - ba_head_idx; + ba_head_idx, + queued_ba; } wlan; struct { diff --git a/carlfw/src/wlan.c b/carlfw/src/wlan.c index b83e672..94ed622 100644 --- a/carlfw/src/wlan.c +++ b/carlfw/src/wlan.c @@ -526,7 +526,7 @@ static void wlan_send_buffered_ba(void) 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. */ @@ -536,6 +536,7 @@ static void wlan_send_buffered_ba(void) 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; + fw.wlan.queued_ba--; baf->s.len = sizeof(struct carl9170_tx_superdesc) + sizeof(struct ar9170_tx_hwdesc) + @@ -582,6 +583,8 @@ static struct carl9170_bar_ctx *wlan_get_bar_cache_buffer(void) 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++; return tmp; }