On Thu, 2008-09-25 at 22:34 +0300, Tomas Winkler wrote: > IEEE80211_TX_CTL_LONG_RETRY_LIMIT = BIT(10), > IEEE80211_TX_CTL_SEND_AFTER_DTIM = BIT(12), > - IEEE80211_TX_CTL_AMPDU = BIT(13), > + IEEE80211_TX_CTL_AMPDU = BIT(13), whitespace change? > /* we have tried too many times, receiver does not want A-MPDU */ > if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_MAX_RETRIES) { > + printk(KERN_DEBUG "BA too many retries tid %u\n", tid); should probably be under #ifdef > +static void __ieee80211_run_ba_session(struct ieee80211_local *local) > +{ > + struct sta_info *sta; > + u8 *state; > + int tid; > + > + ASSERT_RTNL(); > + > + spin_lock_bh(&local->sta_ba_lock); > + while (!list_empty(&local->sta_ba_session_list)) { > + sta = list_first_entry(&local->sta_ba_session_list, > + struct sta_info, ba_list); > + list_del(&sta->ba_list); I think you should probably use list_for_each_entry_safe(). The only other thing I haven't quite understood yet is how this fixes the frame reordering issue, as pointed out by this comment: /* No need to requeue the packets in the agg queue, since we * held the tx lock: no packet could be enqueued to the newly * allocated queue */ which is of course no longer true. Nor does it fix, afaict, the whole queue teardown vs. requeue issue, does it? Oh and of course putting sta_info structs onto a list doesn't really work unless you take care to delete them when they're destroyed, there's nothing that guarantees they won't be freed in the meantime. johannes
Attachment:
signature.asc
Description: This is a digitally signed message part