diff options
author | Kalle Valo <kvalo@qca.qualcomm.com> | 2011-09-19 14:38:44 -0400 |
---|---|---|
committer | Kalle Valo <kvalo@qca.qualcomm.com> | 2011-09-23 03:44:11 -0400 |
commit | 5694f962964c5162f6b49ddb5d517180bd7d1d98 (patch) | |
tree | 090f289d490c89a14c7b7017deb2a5d1b488c4a0 | |
parent | 865121361f0be55555c540c3df444ed06e090b33 (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.c | 16 |
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 | ||
1238 | static void aggr_timeout(unsigned long arg) | 1244 | static 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", |