Date: Wed, 26 Oct 2011 13:33:41 +0000 (UTC) From: Adrian Chadd <adrian@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r226788 - user/adrian/if_ath_tx/sys/dev/ath Message-ID: <201110261333.p9QDXf7A052040@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: adrian Date: Wed Oct 26 13:33:41 2011 New Revision: 226788 URL: http://svn.freebsd.org/changeset/base/226788 Log: Begin breaking out the "mark not-busy" ath_buf code so it can be eventually called from the aggregate completion code. The TDMA code currently fails because the assumption that one frame at a time is being handled in ath_tx_processq() is now broken when doing aggregation and software retransmit. The actual fix to this will come soon. Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath.c user/adrian/if_ath_tx/sys/dev/ath/if_ath_misc.h Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath.c ============================================================================== --- user/adrian/if_ath_tx/sys/dev/ath/if_ath.c Wed Oct 26 08:41:41 2011 (r226787) +++ user/adrian/if_ath_tx/sys/dev/ath/if_ath.c Wed Oct 26 13:33:41 2011 (r226788) @@ -4478,6 +4478,37 @@ ath_tx_update_ratectrl(struct ath_softc } /* + * Update the busy status of the last frame on the free list. + * When doing TDMA, the busy flag tracks whether the hardware + * currently points to this buffer or not, and thus gated DMA + * may restart by re-reading the last descriptor in this + * buffer. + * + * This should be called in the completion function once one + * of the buffers has been used. + */ +void +ath_tx_update_busy(struct ath_softc *sc, struct ath_txq *txq) +{ + struct ath_buf *last; + + /* + * Since the last frame may still be marked + * as ATH_BUF_BUSY, unmark it here before + * finishing the frame processing. + * Since we've completed a frame (aggregate + * or otherwise), the hardware has moved on + * and is no longer referencing the previous + * descriptor. + */ + ATH_TXBUF_LOCK(sc); + last = TAILQ_LAST(&sc->sc_txbuf, ath_bufhead_s); + if (last != NULL) + last->bf_flags &= ~ATH_BUF_BUSY; + ATH_TXBUF_UNLOCK(sc); +} + +/* * Process completed xmit descriptors from the specified queue. * Kick the packet scheduler if needed. This can occur from this * particular task. @@ -4486,7 +4517,7 @@ static int ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq, int dosched) { struct ath_hal *ah = sc->sc_ah; - struct ath_buf *bf, *last; + struct ath_buf *bf; struct ath_desc *ds; struct ath_tx_status *ts; struct ieee80211_node *ni; @@ -4563,19 +4594,11 @@ ath_tx_processq(struct ath_softc *sc, st } /* - * Since the last frame may still be marked - * as ATH_BUF_BUSY, unmark it here before - * finishing the frame processing. - * Since we've completed a frame (aggregate - * or otherwise), the hardware has moved on - * and is no longer referencing the previous - * descriptor. - */ - ATH_TXBUF_LOCK(sc); - last = TAILQ_LAST(&sc->sc_txbuf, ath_bufhead_s); - if (last != NULL) - last->bf_flags &= ~ATH_BUF_BUSY; - ATH_TXBUF_UNLOCK(sc); + * Mark the last frame on the buffer list as + * not busy, as the hardware has now moved past + * that "free" entry and onto the next one. + */ + ath_tx_update_busy(sc, txq); /* * Call the completion handler. Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_misc.h ============================================================================== --- user/adrian/if_ath_tx/sys/dev/ath/if_ath_misc.h Wed Oct 26 08:41:41 2011 (r226787) +++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_misc.h Wed Oct 26 13:33:41 2011 (r226788) @@ -63,6 +63,7 @@ extern void ath_tx_default_comp(struct a extern void ath_tx_update_ratectrl(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_rc_series *rc, struct ath_tx_status *ts, int frmlen, int nframes, int nbad); +extern void ath_tx_update_busy(struct ath_softc *sc, struct ath_txq *txq); extern void ath_tx_freebuf(struct ath_softc *sc, struct ath_buf *bf, int status);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201110261333.p9QDXf7A052040>