|
@@ -1036,6 +1036,7 @@ static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,
|
|
|
rxtid = &agg_conn->rx_tid[tid];
|
|
|
stats = &agg_conn->stat[tid];
|
|
|
|
|
|
+ spin_lock_bh(&rxtid->lock);
|
|
|
idx = AGGR_WIN_IDX(rxtid->seq_next, rxtid->hold_q_sz);
|
|
|
|
|
|
/*
|
|
@@ -1054,8 +1055,6 @@ static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,
|
|
|
seq_end = seq_no ? seq_no : rxtid->seq_next;
|
|
|
idx_end = AGGR_WIN_IDX(seq_end, rxtid->hold_q_sz);
|
|
|
|
|
|
- spin_lock_bh(&rxtid->lock);
|
|
|
-
|
|
|
do {
|
|
|
node = &rxtid->hold_q[idx];
|
|
|
if ((order == 1) && (!node->skb))
|
|
@@ -1127,11 +1126,13 @@ static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
|
|
|
((end > extended_end) && (cur > extended_end) &&
|
|
|
(cur < end))) {
|
|
|
aggr_deque_frms(agg_conn, tid, 0, 0);
|
|
|
+ spin_lock_bh(&rxtid->lock);
|
|
|
if (cur >= rxtid->hold_q_sz - 1)
|
|
|
rxtid->seq_next = cur - (rxtid->hold_q_sz - 1);
|
|
|
else
|
|
|
rxtid->seq_next = ATH6KL_MAX_SEQ_NO -
|
|
|
(rxtid->hold_q_sz - 2 - cur);
|
|
|
+ spin_unlock_bh(&rxtid->lock);
|
|
|
} else {
|
|
|
/*
|
|
|
* Dequeue only those frames that are outside the
|
|
@@ -1186,7 +1187,8 @@ static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
|
|
|
|
|
|
if (agg_conn->timer_scheduled)
|
|
|
rxtid->progress = true;
|
|
|
- else
|
|
|
+ else {
|
|
|
+ spin_lock_bh(&rxtid->lock);
|
|
|
for (idx = 0 ; idx < rxtid->hold_q_sz; idx++) {
|
|
|
if (rxtid->hold_q[idx].skb) {
|
|
|
/*
|
|
@@ -1204,6 +1206,8 @@ static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ spin_unlock_bh(&rxtid->lock);
|
|
|
+ }
|
|
|
|
|
|
return is_queued;
|
|
|
}
|
|
@@ -1626,6 +1630,7 @@ static void aggr_timeout(unsigned long arg)
|
|
|
rxtid = &aggr_conn->rx_tid[i];
|
|
|
|
|
|
if (rxtid->aggr && rxtid->hold_q) {
|
|
|
+ spin_lock_bh(&rxtid->lock);
|
|
|
for (j = 0; j < rxtid->hold_q_sz; j++) {
|
|
|
if (rxtid->hold_q[j].skb) {
|
|
|
aggr_conn->timer_scheduled = true;
|
|
@@ -1634,6 +1639,7 @@ static void aggr_timeout(unsigned long arg)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ spin_unlock_bh(&rxtid->lock);
|
|
|
|
|
|
if (j >= rxtid->hold_q_sz)
|
|
|
rxtid->timer_mon = false;
|