svn commit: r224705 - user/adrian/if_ath_tx/sys/dev/ath

Adrian Chadd adrian at FreeBSD.org
Mon Aug 8 11:33:08 UTC 2011


Author: adrian
Date: Mon Aug  8 11:33:07 2011
New Revision: 224705
URL: http://svn.freebsd.org/changeset/base/224705

Log:
  Find another panic - this time, TID=16 traffic that occured with aggregation
  enabled
  
  * add some more debugging
  * absolutely, positively ensure that IEEE80211_NONQOS_TID TIDs never get
    assigned an aggregation session
  
  And to fix the actual issue:
  
  * recycling ath_buf's wasn't involving a bzero() to reset the state to blank;
    so a left-over completion handler from an aggregate packet. Blanking the
    handler fixes this behaviour.

Modified:
  user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c

Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c	Mon Aug  8 08:22:15 2011	(r224704)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c	Mon Aug  8 11:33:07 2011	(r224705)
@@ -1677,8 +1677,8 @@ ath_tx_swq(struct ath_softc *sc, struct 
 	tid = ath_tx_gettid(sc, m0);
 	atid = &an->an_tid[tid];
 
-	DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: pri=%d, tid=%d, qos=%d\n",
-	    __func__, pri, tid, IEEE80211_QOS_HAS_SEQ(wh));
+	DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p, pri=%d, tid=%d, qos=%d\n",
+	    __func__, bf, pri, tid, IEEE80211_QOS_HAS_SEQ(wh));
 
 	/* Set local packet state, used to queue packets to hardware */
 	bf->bf_state.bfs_tid = tid;
@@ -1925,6 +1925,10 @@ ath_tx_aggr_comp(struct ath_softc *sc, s
 	 *
 	 * Mark as retry, requeue at head of queue
 	 */
+	if (tid == IEEE80211_NONQOS_TID)
+		device_printf(sc->sc_dev, "%s: TID=16!\n", __func__);
+	DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p: tid=%d\n",
+	    __func__, bf, bf->bf_state.bfs_tid);
 
 	/*
 	 * Not success and out of retries?
@@ -1936,8 +1940,8 @@ ath_tx_aggr_comp(struct ath_softc *sc, s
 	 */
 
 	/* Success? Complete */
-	DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: seqno %d\n",
-	    __func__, SEQNO(bf->bf_state.bfs_seqno));
+	DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: TID=%d, seqno %d\n",
+	    __func__, tid, SEQNO(bf->bf_state.bfs_seqno));
 	ath_tx_update_baw(sc, an, atid, SEQNO(bf->bf_state.bfs_seqno));
 
 	ath_tx_default_comp(sc, bf);
@@ -1961,11 +1965,17 @@ ath_tx_tid_hw_queue_aggr(struct ath_soft
 
 	tap = ath_tx_get_tx_tid(an, tid);
 
+	if (tid == IEEE80211_NONQOS_TID)
+		device_printf(sc->sc_dev, "%s: called for TID=NONQOS_TID?\n",
+		    __func__);
+
 	for (;;) {
                 bf = STAILQ_FIRST(&atid->axq_q);
 		if (bf == NULL) {
 			break;
 		}
+		DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: bf=%p: tid=%d\n",
+		    __func__, bf, bf->bf_state.bfs_tid);
 		if (bf->bf_state.bfs_tid != tid)
 			device_printf(sc->sc_dev, "%s: TID: tid=%d, ac=%d, bf tid=%d\n",
 			    __func__, tid, atid->ac, bf->bf_state.bfs_tid);
@@ -2006,6 +2016,8 @@ ath_tx_tid_hw_queue_aggr(struct ath_soft
 
 		/* Set completion handler */
 		bf->bf_comp = ath_tx_aggr_comp;
+		if (bf->bf_state.bfs_tid == IEEE80211_NONQOS_TID)
+			device_printf(sc->sc_dev, "%s: TID=16?\n", __func__);
 
 		/* Punt to hardware or software txq */
 		ath_tx_handoff(sc, txq, bf);
@@ -2045,6 +2057,7 @@ ath_tx_tid_hw_queue_norm(struct ath_soft
 			    " tid %d\n",
 			    __func__, bf->bf_state.bfs_tid, tid);
 		}
+		bf->bf_comp = NULL;	/* XXX default handler */
 
 		/* Punt to hardware or software txq */
 		ath_tx_handoff(sc, txq, bf);
@@ -2076,6 +2089,8 @@ ath_txq_sched(struct ath_softc *sc, stru
 		 * Suspend paused queues here; they'll be resumed
 		 * once the addba completes or times out.
 		 */
+		DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: tid=%d, paused=%d\n",
+		    __func__, atid->tid, atid->paused);
 		if (atid->paused) {
 			ath_tx_tid_unsched(sc, atid->an, atid->tid);
 			continue;
@@ -2122,6 +2137,9 @@ ath_tx_ampdu_running(struct ath_softc *s
 {
 	struct ieee80211_tx_ampdu *tap;
 
+	if (tid == IEEE80211_NONQOS_TID)
+		return 0;
+
 	tap = ath_tx_get_tx_tid(an, tid);
 	if (tap == NULL)
 		return 0;	/* Not valid; default to not running */
@@ -2137,6 +2155,9 @@ ath_tx_ampdu_pending(struct ath_softc *s
 {
 	struct ieee80211_tx_ampdu *tap;
 
+	if (tid == IEEE80211_NONQOS_TID)
+		return 0;
+
 	tap = ath_tx_get_tx_tid(an, tid);
 	if (tap == NULL)
 		return 0;	/* Not valid; default to not pending */


More information about the svn-src-user mailing list