PERFORCE change 81810 for review

Sam Leffler sam at FreeBSD.org
Wed Aug 10 22:47:23 GMT 2005


http://perforce.freebsd.org/chv.cgi?CH=81810

Change 81810 by sam at sam_ebb on 2005/08/10 22:40:35

	o clear m_nextpkt in ath_tx_start to be safe
	o add comments about how frags are handled

Affected files ...

.. //depot/projects/wifi/sys/dev/ath/if_ath.c#101 edit

Differences ...

==== //depot/projects/wifi/sys/dev/ath/if_ath.c#101 (text+ko) ====

@@ -1595,6 +1595,18 @@
 		}
 
 	nextfrag:
+		/*
+		 * Pass the frame to the h/w for transmission.
+		 * Fragmented frames have each frag chained together
+		 * with m_nextpkt.  We know there are sufficient ath_buf's
+		 * to send all the frags because of work done by
+		 * ath_txfrag_setup.  We leave m_nextpkt set while
+		 * calling ath_tx_start so it can use it to extend the
+		 * the tx duration to cover the subsequent frag and
+		 * so it can reclaim all the mbufs in case of an error;
+		 * ath_tx_start clears m_nextpkt once it commits to
+		 * handing the frame to the hardware.
+		 */
 		next = m->m_nextpkt;
 		if (ath_tx_start(sc, ni, bf, m)) {
 	bad:
@@ -3598,6 +3610,10 @@
 	return 0;		/* NB: lowest rate */
 }
 
+/*
+ * Reclaim mbuf resources.  For fragmented frames we
+ * need to claim each frag chained with m_nextpkt.
+ */
 static void
 ath_freetx(struct mbuf *m)
 {
@@ -3990,6 +4006,13 @@
 	} else
 		ctsrate = 0;
 
+	/*
+	 * At this point we are committed to sending the frame
+	 * and we don't need to look at m_nextpkt; clear it in
+	 * case this frame is part of frag chain.
+	 */
+	m0->m_nextpkt = NULL;
+
 	if (IFF_DUMPPKTS(sc, ATH_DEBUG_XMIT))
 		ieee80211_dump_pkt(ic, mtod(m0, caddr_t), m0->m_len,
 			sc->sc_hwmap[txrate].ieeerate, -1);


More information about the p4-projects mailing list