Author: adrian
Date: Tue Jun 26 07:56:15 2012
New Revision: 237593
URL: http://svn.freebsd.org/changeset/base/237593

Log:
  Make sure the BAR TX session pause is correctly unpaused when a node
  is reassociating.
  
  PR:           kern/169432

Modified:
  head/sys/dev/ath/if_ath_tx.c

Modified: head/sys/dev/ath/if_ath_tx.c
==============================================================================
--- head/sys/dev/ath/if_ath_tx.c        Tue Jun 26 06:02:43 2012        
(r237592)
+++ head/sys/dev/ath/if_ath_tx.c        Tue Jun 26 07:56:15 2012        
(r237593)
@@ -4330,6 +4330,9 @@ ath_addba_response(struct ieee80211_node
 
 /*
  * Stop ADDBA on a queue.
+ *
+ * This can be called whilst BAR TX is currently active on the queue,
+ * so make sure this is unblocked before continuing.
  */
 void
 ath_addba_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap)
@@ -4341,9 +4344,21 @@ ath_addba_stop(struct ieee80211_node *ni
 
        DPRINTF(sc, ATH_DEBUG_SW_TX_CTRL, "%s: called\n", __func__);
 
-       /* Pause TID traffic early, so there aren't any races */
+       /*
+        * Pause TID traffic early, so there aren't any races
+        * Unblock the pending BAR held traffic, if it's currently paused.
+        */
        ATH_TXQ_LOCK(sc->sc_ac2q[atid->ac]);
        ath_tx_tid_pause(sc, atid);
+       if (atid->bar_wait) {
+               /*
+                * bar_unsuspend() expects bar_tx == 1, as it should be
+                * called from the TX completion path.  This quietens
+                * the warning.  It's cleared for us anyway.
+                */
+               atid->bar_tx = 1;
+               ath_tx_tid_bar_unsuspend(sc, atid);
+       }
        ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->ac]);
 
        /* There's no need to hold the TXQ lock here */
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to