svn commit: r222807 - user/adrian/if_ath_tx/sys/dev/ath
Adrian Chadd
adrian at FreeBSD.org
Tue Jun 7 06:45:52 UTC 2011
Author: adrian
Date: Tue Jun 7 06:45:51 2011
New Revision: 222807
URL: http://svn.freebsd.org/changeset/base/222807
Log:
Break out ath_hx_handoff() into hardware and software varieties.
The only software path at the moment is the mcastq which is then
added to the CAB queue (HW) before the beacon is transmitted.
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 Tue Jun 7 06:42:29 2011 (r222806)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c Tue Jun 7 06:45:51 2011 (r222807)
@@ -258,7 +258,36 @@ ath_tx_chaindesclist(struct ath_softc *s
}
static void
-ath_tx_handoff(struct ath_softc *sc, struct ath_txq *txq, struct ath_buf *bf)
+ath_tx_handoff_mcast(struct ath_softc *sc, struct ath_txq *txq, struct ath_buf *bf)
+{
+ ATH_TXQ_LOCK(txq);
+ KASSERT((bf->bf_flags & ATH_BUF_BUSY) == 0,
+ ("busy status 0x%x", bf->bf_flags));
+ if (txq->axq_link != NULL) {
+ struct ath_buf *last = ATH_TXQ_LAST(txq);
+ struct ieee80211_frame *wh;
+
+ /* mark previous frame */
+ wh = mtod(last->bf_m, struct ieee80211_frame *);
+ wh->i_fc[1] |= IEEE80211_FC1_MORE_DATA;
+ bus_dmamap_sync(sc->sc_dmat, last->bf_dmamap,
+ BUS_DMASYNC_PREWRITE);
+
+ /* link descriptor */
+ *txq->axq_link = bf->bf_daddr;
+ }
+ ATH_TXQ_INSERT_TAIL(txq, bf, bf_list);
+ txq->axq_link = &bf->bf_desc[bf->bf_nseg - 1].ds_link;
+ ATH_TXQ_UNLOCK(txq);
+}
+
+
+
+/*
+ * Hand-off packet to a hardware queue.
+ */
+static void
+ath_tx_handoff_hw(struct ath_softc *sc, struct ath_txq *txq, struct ath_buf *bf)
{
struct ath_hal *ah = sc->sc_ah;
@@ -273,7 +302,11 @@ ath_tx_handoff(struct ath_softc *sc, str
ATH_TXQ_LOCK(txq);
KASSERT((bf->bf_flags & ATH_BUF_BUSY) == 0,
("busy status 0x%x", bf->bf_flags));
- if (txq->axq_qnum != ATH_TXQ_SWQ) {
+ KASSERT(txq->axq_qnum != ATH_TXQ_SWQ,
+ ("ath_tx_handoff_hw called for mcast queue"));
+
+ /* For now, so not to generate whitespace diffs */
+ if (1) {
#ifdef IEEE80211_SUPPORT_TDMA
int qbusy;
@@ -347,26 +380,19 @@ ath_tx_handoff(struct ath_softc *sc, str
#endif /* IEEE80211_SUPPORT_TDMA */
txq->axq_link = &bf->bf_desc[bf->bf_nseg - 1].ds_link;
ath_hal_txstart(ah, txq->axq_qnum);
- } else {
- if (txq->axq_link != NULL) {
- struct ath_buf *last = ATH_TXQ_LAST(txq);
- struct ieee80211_frame *wh;
-
- /* mark previous frame */
- wh = mtod(last->bf_m, struct ieee80211_frame *);
- wh->i_fc[1] |= IEEE80211_FC1_MORE_DATA;
- bus_dmamap_sync(sc->sc_dmat, last->bf_dmamap,
- BUS_DMASYNC_PREWRITE);
-
- /* link descriptor */
- *txq->axq_link = bf->bf_daddr;
- }
- ATH_TXQ_INSERT_TAIL(txq, bf, bf_list);
- txq->axq_link = &bf->bf_desc[bf->bf_nseg - 1].ds_link;
}
ATH_TXQ_UNLOCK(txq);
}
+static void
+ath_tx_handoff(struct ath_softc *sc, struct ath_txq *txq, struct ath_buf *bf)
+{
+ if (txq->axq_qnum == ATH_TXQ_SWQ)
+ ath_tx_handoff_mcast(sc, txq, bf);
+ else
+ ath_tx_handoff_hw(sc, txq, bf);
+}
+
static int
ath_tx_tag_crypto(struct ath_softc *sc, struct ieee80211_node *ni,
struct mbuf *m0, int iswep, int isfrag, int *hdrlen, int *pktlen, int *keyix)
@@ -915,7 +941,10 @@ ath_tx_start(struct ath_softc *sc, struc
* For now, since there's no software queue,
* direct-dispatch to the hardware.
*/
- ath_tx_handoff(sc, txq, bf);
+ if (ismcast)
+ ath_tx_handoff_mcast(sc, txq, bf);
+ else
+ ath_tx_handoff_hw(sc, txq, bf);
return 0;
}
More information about the svn-src-user
mailing list