ath6kl: handle background(BK) stream properly on htc mbox layer
authorKevin Fang <chienf@qca.qualcomm.com>
Fri, 27 Apr 2012 01:18:01 +0000 (09:18 +0800)
committerKalle Valo <kvalo@qca.qualcomm.com>
Fri, 27 Apr 2012 06:49:12 +0000 (09:49 +0300)
When a STA sends huge BK QoS data frame first and then sends BE/VI/VO
QoS data frame, the corresponding throughput becomes much lower than
that without sends BK QoS data frame before.

The root cause is that when station send BK stream, the tx credits of
BK stream don't return back to higher priority QoS stream such as BE,
VI, and VO stream. This patch will handle BK stream properly, when
there is higher priority QoS stream, it will seek tx credits from BK
stream properly.

Signed-off-by: Kevin Fang <kevin.fang@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath6kl/htc_mbox.c

index 65310d5ae46aa0b62e748a8a95aa4993c54ab0cc..89eccadd53862455b93c864b6caa495f36965878 100644 (file)
@@ -83,10 +83,7 @@ static void ath6kl_credit_init(struct ath6kl_htc_credit_info *cred_info,
                         * never goes inactive EVER.
                         */
                        cur_ep_dist->dist_flags |= HTC_EP_ACTIVE;
-               } else if (cur_ep_dist->svc_id == WMI_DATA_BK_SVC)
-                       /* this is the lowest priority data endpoint */
-                       /* FIXME: this looks fishy, check */
-                       cred_info->lowestpri_ep_dist = cur_ep_dist->list;
+               }
 
                /*
                 * Streams have to be created (explicit | implicit) for all
@@ -100,6 +97,13 @@ static void ath6kl_credit_init(struct ath6kl_htc_credit_info *cred_info,
                 */
        }
 
+       /*
+        * For ath6kl_credit_seek function,
+        * it use list_for_each_entry_reverse to walk around the whole ep list.
+        * Therefore assign this lowestpri_ep_dist after walk around the ep_list
+        */
+       cred_info->lowestpri_ep_dist = cur_ep_dist->list;
+
        WARN_ON(cred_info->cur_free_credits <= 0);
 
        list_for_each_entry(cur_ep_dist, ep_list, list) {