txrx.c (8af123e8ee272ad175440891333602d8d4b8e63c) txrx.c (5694f962964c5162f6b49ddb5d517180bd7d1d98)
1/*
2 * Copyright (c) 2004-2011 Atheros Communications Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES

--- 1216 unchanged lines hidden (view full) ---

1225 dev_kfree_skb(skb);
1226 skb = NULL;
1227 }
1228 }
1229 if (skb1)
1230 ath6kl_data_tx(skb1, ar->net_dev);
1231 }
1232
1/*
2 * Copyright (c) 2004-2011 Atheros Communications Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES

--- 1216 unchanged lines hidden (view full) ---

1225 dev_kfree_skb(skb);
1226 skb = NULL;
1227 }
1228 }
1229 if (skb1)
1230 ath6kl_data_tx(skb1, ar->net_dev);
1231 }
1232
1233 if (!aggr_process_recv_frm(ar->aggr_cntxt, tid, seq_no,
1234 is_amsdu, skb))
1235 ath6kl_deliver_frames_to_nw_stack(ar->net_dev, skb);
1233 datap = (struct ethhdr *) skb->data;
1234
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}
1237
1238static void aggr_timeout(unsigned long arg)
1239{
1240 u8 i, j;
1241 struct aggr_info *p_aggr = (struct aggr_info *) arg;
1242 struct rxtid *rxtid;
1243 struct rxtid_stats *stats;
1244
1245 for (i = 0; i < NUM_OF_TIDS; i++) {
1246 rxtid = &p_aggr->rx_tid[i];
1247 stats = &p_aggr->stat[i];
1248
1249 if (!rxtid->aggr || !rxtid->timer_mon || rxtid->progress)
1250 continue;
1251
1242}
1243
1244static void aggr_timeout(unsigned long arg)
1245{
1246 u8 i, j;
1247 struct aggr_info *p_aggr = (struct aggr_info *) arg;
1248 struct rxtid *rxtid;
1249 struct rxtid_stats *stats;
1250
1251 for (i = 0; i < NUM_OF_TIDS; i++) {
1252 rxtid = &p_aggr->rx_tid[i];
1253 stats = &p_aggr->stat[i];
1254
1255 if (!rxtid->aggr || !rxtid->timer_mon || rxtid->progress)
1256 continue;
1257
1252 /*
1253 * FIXME: these timeouts happen quite fruently, something
1254 * line once within 60 seconds. Investigate why.
1255 */
1256 stats->num_timeouts++;
1257 ath6kl_dbg(ATH6KL_DBG_AGGR,
1258 "aggr timeout (st %d end %d)\n",
1259 rxtid->seq_next,
1260 ((rxtid->seq_next + rxtid->hold_q_sz-1) &
1261 ATH6KL_MAX_SEQ_NO));
1262 aggr_deque_frms(p_aggr, i, 0, 0);
1263 }

--- 193 unchanged lines hidden ---
1258 stats->num_timeouts++;
1259 ath6kl_dbg(ATH6KL_DBG_AGGR,
1260 "aggr timeout (st %d end %d)\n",
1261 rxtid->seq_next,
1262 ((rxtid->seq_next + rxtid->hold_q_sz-1) &
1263 ATH6KL_MAX_SEQ_NO));
1264 aggr_deque_frms(p_aggr, i, 0, 0);
1265 }

--- 193 unchanged lines hidden ---