aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKalle Valo <kvalo@qca.qualcomm.com>2011-09-19 14:38:44 -0400
committerKalle Valo <kvalo@qca.qualcomm.com>2011-09-23 03:44:11 -0400
commit5694f962964c5162f6b49ddb5d517180bd7d1d98 (patch)
tree090f289d490c89a14c7b7017deb2a5d1b488c4a0
parent865121361f0be55555c540c3df444ed06e090b33 (diff)
ath6kl: pass only unicast frames for aggregation
When pinging form ar6003 to the AP RTT was high even when power save was disabled: 100 packets transmitted, 97 received, 3% packet loss, time 99125ms rtt min/avg/max/mdev = 1.875/46.733/795.506/139.181 ms After some investigation one reason for this was that received multicast traffic confused the aggrecation logic and caused 400 ms timeouts when receiving multicast frames from AP. A simple way to fix is to pass only unicast frames for aggregation. This improves RTT: 100 packets transmitted, 99 received, 1% packet loss, time 99144ms rtt min/avg/max/mdev = 2.083/13.084/403.390/56.794 ms Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
-rw-r--r--drivers/net/wireless/ath/ath6kl/txrx.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c
index fffd92920d35..348c6463fe00 100644
--- a/drivers/net/wireless/ath/ath6kl/txrx.c
+++ b/drivers/net/wireless/ath/ath6kl/txrx.c
@@ -1230,9 +1230,15 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
1230 ath6kl_data_tx(skb1, ar->net_dev); 1230 ath6kl_data_tx(skb1, ar->net_dev);
1231 } 1231 }
1232 1232
1233 if (!aggr_process_recv_frm(ar->aggr_cntxt, tid, seq_no, 1233 datap = (struct ethhdr *) skb->data;
1234 is_amsdu, skb)) 1234
1235 ath6kl_deliver_frames_to_nw_stack(ar->net_dev, skb); 1235 if (is_unicast_ether_addr(datap->h_dest) &&
1236 aggr_process_recv_frm(ar->aggr_cntxt, tid, seq_no,
1237 is_amsdu, skb))
1238 /* aggregation code will handle the skb */
1239 return;
1240
1241 ath6kl_deliver_frames_to_nw_stack(ar->net_dev, skb);
1236} 1242}
1237 1243
1238static void aggr_timeout(unsigned long arg) 1244static void aggr_timeout(unsigned long arg)
@@ -1249,10 +1255,6 @@ static void aggr_timeout(unsigned long arg)
1249 if (!rxtid->aggr || !rxtid->timer_mon || rxtid->progress) 1255 if (!rxtid->aggr || !rxtid->timer_mon || rxtid->progress)
1250 continue; 1256 continue;
1251 1257
1252 /*
1253 * FIXME: these timeouts happen quite fruently, something
1254 * line once within 60 seconds. Investigate why.
1255 */
1256 stats->num_timeouts++; 1258 stats->num_timeouts++;
1257 ath6kl_dbg(ATH6KL_DBG_AGGR, 1259 ath6kl_dbg(ATH6KL_DBG_AGGR,
1258 "aggr timeout (st %d end %d)\n", 1260 "aggr timeout (st %d end %d)\n",