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