carl9170 firmware: fix BAR->BA delivery
authorChristian Lamparter <chunkeey@googlemail.com>
Sat, 31 Mar 2012 22:04:35 +0000 (00:04 +0200)
committerChristian Lamparter <chunkeey@googlemail.com>
Sat, 31 Mar 2012 22:09:50 +0000 (00:09 +0200)
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>
carlfw/include/carl9170.h
carlfw/src/wlan.c

index a319b2a4cb65069fe4f53d936e347f6d55851a1c..6dfdf3e56df000087a3e7acdde93ebb49182be64 100644 (file)
@@ -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 {
index b83e672287c0e971469b878ec124d695bf4d363e..94ed62250d806ed262cdc86c316d2df4370fa35c 100644 (file)
@@ -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;
 }