Deleted Added
full compact
if_ath.c (155991) if_ath.c (156073)
1/*-
2 * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 21 unchanged lines hidden (view full) ---

30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
32 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
34 * THE POSSIBILITY OF SUCH DAMAGES.
35 */
36
37#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 21 unchanged lines hidden (view full) ---

30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
32 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
34 * THE POSSIBILITY OF SUCH DAMAGES.
35 */
36
37#include <sys/cdefs.h>
38__FBSDID("$FreeBSD: head/sys/dev/ath/if_ath.c 155991 2006-02-24 23:10:08Z sam $");
38__FBSDID("$FreeBSD: head/sys/dev/ath/if_ath.c 156073 2006-02-27 17:20:23Z sam $");
39
40/*
41 * Driver for the Atheros Wireless LAN controller.
42 *
43 * This software is derived from work of Atsushi Onoe; his contribution
44 * is greatly appreciated.
45 */
46

--- 1103 unchanged lines hidden (view full) ---

1150 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || sc->sc_invalid)
1151 return;
1152 for (;;) {
1153 /*
1154 * Grab a TX buffer and associated resources.
1155 */
1156 ATH_TXBUF_LOCK(sc);
1157 bf = STAILQ_FIRST(&sc->sc_txbuf);
39
40/*
41 * Driver for the Atheros Wireless LAN controller.
42 *
43 * This software is derived from work of Atsushi Onoe; his contribution
44 * is greatly appreciated.
45 */
46

--- 1103 unchanged lines hidden (view full) ---

1150 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || sc->sc_invalid)
1151 return;
1152 for (;;) {
1153 /*
1154 * Grab a TX buffer and associated resources.
1155 */
1156 ATH_TXBUF_LOCK(sc);
1157 bf = STAILQ_FIRST(&sc->sc_txbuf);
1158 if (bf != NULL) {
1159 if (bf->bf_flags & ATH_FLAG_BUSY)
1160 bf = NULL;
1161 else
1162 STAILQ_REMOVE_HEAD(&sc->sc_txbuf, bf_list);
1163 }
1158 if (bf != NULL)
1159 STAILQ_REMOVE_HEAD(&sc->sc_txbuf, bf_list);
1164 ATH_TXBUF_UNLOCK(sc);
1165 if (bf == NULL) {
1160 ATH_TXBUF_UNLOCK(sc);
1161 if (bf == NULL) {
1166 DPRINTF(sc, ATH_DEBUG_XMIT,
1167 "%s: no available xmit buffers\n", __func__);
1162 DPRINTF(sc, ATH_DEBUG_XMIT, "%s: out of xmit buffers\n",
1163 __func__);
1168 sc->sc_stats.ast_tx_qstop++;
1169 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1170 break;
1171 }
1172 /*
1173 * Poll the management queue for frames; they
1174 * have priority over normal data frames.
1175 */

--- 4 unchanged lines hidden (view full) ---

1180 */
1181 if (ic->ic_state != IEEE80211_S_RUN) {
1182 DPRINTF(sc, ATH_DEBUG_XMIT,
1183 "%s: discard data packet, state %s\n",
1184 __func__,
1185 ieee80211_state_name[ic->ic_state]);
1186 sc->sc_stats.ast_tx_discard++;
1187 ATH_TXBUF_LOCK(sc);
1164 sc->sc_stats.ast_tx_qstop++;
1165 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1166 break;
1167 }
1168 /*
1169 * Poll the management queue for frames; they
1170 * have priority over normal data frames.
1171 */

--- 4 unchanged lines hidden (view full) ---

1176 */
1177 if (ic->ic_state != IEEE80211_S_RUN) {
1178 DPRINTF(sc, ATH_DEBUG_XMIT,
1179 "%s: discard data packet, state %s\n",
1180 __func__,
1181 ieee80211_state_name[ic->ic_state]);
1182 sc->sc_stats.ast_tx_discard++;
1183 ATH_TXBUF_LOCK(sc);
1188 STAILQ_INSERT_HEAD(&sc->sc_txbuf, bf, bf_list);
1184 STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list);
1189 ATH_TXBUF_UNLOCK(sc);
1190 break;
1191 }
1192 IFQ_DRV_DEQUEUE(&ifp->if_snd, m); /* XXX: LOCK */
1193 if (m == NULL) {
1194 ATH_TXBUF_LOCK(sc);
1185 ATH_TXBUF_UNLOCK(sc);
1186 break;
1187 }
1188 IFQ_DRV_DEQUEUE(&ifp->if_snd, m); /* XXX: LOCK */
1189 if (m == NULL) {
1190 ATH_TXBUF_LOCK(sc);
1195 STAILQ_INSERT_HEAD(&sc->sc_txbuf, bf, bf_list);
1191 STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list);
1196 ATH_TXBUF_UNLOCK(sc);
1197 break;
1198 }
1199 /*
1200 * Find the node for the destination so we can do
1201 * things like power save and fast frames aggregation.
1202 */
1203 if (m->m_len < sizeof(struct ether_header) &&

--- 70 unchanged lines hidden (view full) ---

1274 sc->sc_stats.ast_tx_mgmt++;
1275 }
1276
1277 if (ath_tx_start(sc, ni, bf, m)) {
1278 bad:
1279 ifp->if_oerrors++;
1280 reclaim:
1281 ATH_TXBUF_LOCK(sc);
1192 ATH_TXBUF_UNLOCK(sc);
1193 break;
1194 }
1195 /*
1196 * Find the node for the destination so we can do
1197 * things like power save and fast frames aggregation.
1198 */
1199 if (m->m_len < sizeof(struct ether_header) &&

--- 70 unchanged lines hidden (view full) ---

1270 sc->sc_stats.ast_tx_mgmt++;
1271 }
1272
1273 if (ath_tx_start(sc, ni, bf, m)) {
1274 bad:
1275 ifp->if_oerrors++;
1276 reclaim:
1277 ATH_TXBUF_LOCK(sc);
1282 STAILQ_INSERT_HEAD(&sc->sc_txbuf, bf, bf_list);
1278 STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list);
1283 ATH_TXBUF_UNLOCK(sc);
1284 if (ni != NULL)
1285 ieee80211_free_node(ni);
1286 continue;
1287 }
1288
1289 sc->sc_tx_timer = 5;
1290 ifp->if_timer = 1;

--- 1119 unchanged lines hidden (view full) ---

2410 goto fail2;
2411 }
2412
2413 ds = dd->dd_desc;
2414 DPRINTF(sc, ATH_DEBUG_RESET, "%s: %s DMA map: %p (%lu) -> %p (%lu)\n",
2415 __func__, dd->dd_name, ds, (u_long) dd->dd_desc_len,
2416 (caddr_t) dd->dd_desc_paddr, /*XXX*/ (u_long) dd->dd_desc_len);
2417
1279 ATH_TXBUF_UNLOCK(sc);
1280 if (ni != NULL)
1281 ieee80211_free_node(ni);
1282 continue;
1283 }
1284
1285 sc->sc_tx_timer = 5;
1286 ifp->if_timer = 1;

--- 1119 unchanged lines hidden (view full) ---

2406 goto fail2;
2407 }
2408
2409 ds = dd->dd_desc;
2410 DPRINTF(sc, ATH_DEBUG_RESET, "%s: %s DMA map: %p (%lu) -> %p (%lu)\n",
2411 __func__, dd->dd_name, ds, (u_long) dd->dd_desc_len,
2412 (caddr_t) dd->dd_desc_paddr, /*XXX*/ (u_long) dd->dd_desc_len);
2413
2418 /* allocate buffers */
2414 /* allocate rx buffers */
2419 bsize = sizeof(struct ath_buf) * nbuf;
2420 bf = malloc(bsize, M_ATHDEV, M_NOWAIT | M_ZERO);
2421 if (bf == NULL) {
2422 if_printf(ifp, "malloc of %s buffers failed, size %u\n",
2423 dd->dd_name, bsize);
2424 goto fail3;
2425 }
2426 dd->dd_bufptr = bf;

--- 1259 unchanged lines hidden (view full) ---

3686 , ni->ni_txpower /* txpower */
3687 , txrate, try0 /* series 0 rate/tries */
3688 , keyix /* key cache index */
3689 , sc->sc_txantenna /* antenna mode */
3690 , flags /* flags */
3691 , ctsrate /* rts/cts rate */
3692 , ctsduration /* rts/cts duration */
3693 );
2415 bsize = sizeof(struct ath_buf) * nbuf;
2416 bf = malloc(bsize, M_ATHDEV, M_NOWAIT | M_ZERO);
2417 if (bf == NULL) {
2418 if_printf(ifp, "malloc of %s buffers failed, size %u\n",
2419 dd->dd_name, bsize);
2420 goto fail3;
2421 }
2422 dd->dd_bufptr = bf;

--- 1259 unchanged lines hidden (view full) ---

3682 , ni->ni_txpower /* txpower */
3683 , txrate, try0 /* series 0 rate/tries */
3684 , keyix /* key cache index */
3685 , sc->sc_txantenna /* antenna mode */
3686 , flags /* flags */
3687 , ctsrate /* rts/cts rate */
3688 , ctsduration /* rts/cts duration */
3689 );
3694 bf->bf_txflags = flags;
3690 bf->bf_flags = flags;
3695 /*
3696 * Setup the multi-rate retry state only when we're
3697 * going to use it. This assumes ath_hal_setuptxdesc
3698 * initializes the descriptors (so we don't have to)
3699 * when the hardware supports multi-rate retry and
3700 * we don't use it.
3701 */
3702 if (ismrr)

--- 54 unchanged lines hidden (view full) ---

3757/*
3758 * Process completed xmit descriptors from the specified queue.
3759 */
3760static int
3761ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
3762{
3763 struct ath_hal *ah = sc->sc_ah;
3764 struct ieee80211com *ic = &sc->sc_ic;
3691 /*
3692 * Setup the multi-rate retry state only when we're
3693 * going to use it. This assumes ath_hal_setuptxdesc
3694 * initializes the descriptors (so we don't have to)
3695 * when the hardware supports multi-rate retry and
3696 * we don't use it.
3697 */
3698 if (ismrr)

--- 54 unchanged lines hidden (view full) ---

3753/*
3754 * Process completed xmit descriptors from the specified queue.
3755 */
3756static int
3757ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
3758{
3759 struct ath_hal *ah = sc->sc_ah;
3760 struct ieee80211com *ic = &sc->sc_ic;
3765 struct ath_buf *bf, *last;
3761 struct ath_buf *bf;
3766 struct ath_desc *ds, *ds0;
3767 struct ieee80211_node *ni;
3768 struct ath_node *an;
3769 int sr, lr, pri, nacked;
3770 HAL_STATUS status;
3771
3772 DPRINTF(sc, ATH_DEBUG_TX_PROC, "%s: tx queue %u head %p link %p\n",
3773 __func__, txq->axq_qnum,

--- 15 unchanged lines hidden (view full) ---

3789 if (sc->sc_debug & ATH_DEBUG_XMIT_DESC)
3790 ath_printtxbuf(bf, txq->axq_qnum, 0, status == HAL_OK);
3791#endif
3792 if (status == HAL_EINPROGRESS) {
3793 ATH_TXQ_UNLOCK(txq);
3794 break;
3795 }
3796 ATH_TXQ_REMOVE_HEAD(txq, bf_list);
3762 struct ath_desc *ds, *ds0;
3763 struct ieee80211_node *ni;
3764 struct ath_node *an;
3765 int sr, lr, pri, nacked;
3766 HAL_STATUS status;
3767
3768 DPRINTF(sc, ATH_DEBUG_TX_PROC, "%s: tx queue %u head %p link %p\n",
3769 __func__, txq->axq_qnum,

--- 15 unchanged lines hidden (view full) ---

3785 if (sc->sc_debug & ATH_DEBUG_XMIT_DESC)
3786 ath_printtxbuf(bf, txq->axq_qnum, 0, status == HAL_OK);
3787#endif
3788 if (status == HAL_EINPROGRESS) {
3789 ATH_TXQ_UNLOCK(txq);
3790 break;
3791 }
3792 ATH_TXQ_REMOVE_HEAD(txq, bf_list);
3797 if (txq->axq_depth > 0) {
3798 /*
3799 * More frames follow. Mark the buffer busy
3800 * so it's not re-used while the hardware may
3801 * still re-read the link field.
3802 */
3803 bf->bf_flags |= ATH_FLAG_BUSY;
3804 } else
3793 if (txq->axq_depth == 0)
3805 txq->axq_link = NULL;
3806 ATH_TXQ_UNLOCK(txq);
3807
3808 ni = bf->bf_node;
3809 if (ni != NULL) {
3810 an = ATH_NODE(ni);
3811 if (ds->ds_txstat.ts_status == 0) {
3812 u_int8_t txant = ds->ds_txstat.ts_antenna;

--- 20 unchanged lines hidden (view full) ---

3833 sr = ds->ds_txstat.ts_shortretry;
3834 lr = ds->ds_txstat.ts_longretry;
3835 sc->sc_stats.ast_tx_shortretry += sr;
3836 sc->sc_stats.ast_tx_longretry += lr;
3837 /*
3838 * Hand the descriptor to the rate control algorithm.
3839 */
3840 if ((ds->ds_txstat.ts_status & HAL_TXERR_FILT) == 0 &&
3794 txq->axq_link = NULL;
3795 ATH_TXQ_UNLOCK(txq);
3796
3797 ni = bf->bf_node;
3798 if (ni != NULL) {
3799 an = ATH_NODE(ni);
3800 if (ds->ds_txstat.ts_status == 0) {
3801 u_int8_t txant = ds->ds_txstat.ts_antenna;

--- 20 unchanged lines hidden (view full) ---

3822 sr = ds->ds_txstat.ts_shortretry;
3823 lr = ds->ds_txstat.ts_longretry;
3824 sc->sc_stats.ast_tx_shortretry += sr;
3825 sc->sc_stats.ast_tx_longretry += lr;
3826 /*
3827 * Hand the descriptor to the rate control algorithm.
3828 */
3829 if ((ds->ds_txstat.ts_status & HAL_TXERR_FILT) == 0 &&
3841 (bf->bf_txflags & HAL_TXDESC_NOACK) == 0) {
3830 (bf->bf_flags & HAL_TXDESC_NOACK) == 0) {
3842 /*
3843 * If frame was ack'd update the last rx time
3844 * used to workaround phantom bmiss interrupts.
3845 */
3846 if (ds->ds_txstat.ts_status == 0)
3847 nacked++;
3848 ath_rate_tx_complete(sc, an, ds, ds0);
3849 }

--- 9 unchanged lines hidden (view full) ---

3859 bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap,
3860 BUS_DMASYNC_POSTWRITE);
3861 bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap);
3862 m_freem(bf->bf_m);
3863 bf->bf_m = NULL;
3864 bf->bf_node = NULL;
3865
3866 ATH_TXBUF_LOCK(sc);
3831 /*
3832 * If frame was ack'd update the last rx time
3833 * used to workaround phantom bmiss interrupts.
3834 */
3835 if (ds->ds_txstat.ts_status == 0)
3836 nacked++;
3837 ath_rate_tx_complete(sc, an, ds, ds0);
3838 }

--- 9 unchanged lines hidden (view full) ---

3848 bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap,
3849 BUS_DMASYNC_POSTWRITE);
3850 bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap);
3851 m_freem(bf->bf_m);
3852 bf->bf_m = NULL;
3853 bf->bf_node = NULL;
3854
3855 ATH_TXBUF_LOCK(sc);
3867 last = STAILQ_LAST(&sc->sc_txbuf, ath_buf, bf_list);
3868 if (last != NULL)
3869 last->bf_flags &= ~ATH_FLAG_BUSY;
3870 STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list);
3871 ATH_TXBUF_UNLOCK(sc);
3872 }
3873 return nacked;
3874}
3875
3876static __inline int
3877txqactive(struct ath_hal *ah, int qnum)

--- 99 unchanged lines hidden (view full) ---

3977 struct ath_hal *ah = sc->sc_ah;
3978#endif
3979 struct ieee80211_node *ni;
3980 struct ath_buf *bf;
3981 u_int ix;
3982
3983 /*
3984 * NB: this assumes output has been stopped and
3856 STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list);
3857 ATH_TXBUF_UNLOCK(sc);
3858 }
3859 return nacked;
3860}
3861
3862static __inline int
3863txqactive(struct ath_hal *ah, int qnum)

--- 99 unchanged lines hidden (view full) ---

3963 struct ath_hal *ah = sc->sc_ah;
3964#endif
3965 struct ieee80211_node *ni;
3966 struct ath_buf *bf;
3967 u_int ix;
3968
3969 /*
3970 * NB: this assumes output has been stopped and
3985 * we do not need to block ath_tx_proc
3971 * we do not need to block ath_tx_tasklet
3986 */
3987 for (ix = 0;; ix++) {
3988 ATH_TXQ_LOCK(txq);
3989 bf = STAILQ_FIRST(&txq->axq_q);
3990 if (bf == NULL) {
3972 */
3973 for (ix = 0;; ix++) {
3974 ATH_TXQ_LOCK(txq);
3975 bf = STAILQ_FIRST(&txq->axq_q);
3976 if (bf == NULL) {
3977 txq->axq_link = NULL;
3991 ATH_TXQ_UNLOCK(txq);
3992 break;
3993 }
3994 ATH_TXQ_REMOVE_HEAD(txq, bf_list);
3978 ATH_TXQ_UNLOCK(txq);
3979 break;
3980 }
3981 ATH_TXQ_REMOVE_HEAD(txq, bf_list);
3995 if (txq->axq_depth == 0)
3996 txq->axq_link = NULL;
3997 ATH_TXQ_UNLOCK(txq);
3998#ifdef AR_DEBUG
3999 if (sc->sc_debug & ATH_DEBUG_RESET)
4000 ath_printtxbuf(bf, txq->axq_qnum, ix,
4001 ath_hal_txprocdesc(ah, bf->bf_desc) == HAL_OK);
4002#endif /* AR_DEBUG */
4003 bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap);
4004 m_freem(bf->bf_m);
4005 bf->bf_m = NULL;
4006 ni = bf->bf_node;
4007 bf->bf_node = NULL;
4008 if (ni != NULL) {
4009 /*
4010 * Reclaim node reference.
4011 */
4012 ieee80211_free_node(ni);
4013 }
3982 ATH_TXQ_UNLOCK(txq);
3983#ifdef AR_DEBUG
3984 if (sc->sc_debug & ATH_DEBUG_RESET)
3985 ath_printtxbuf(bf, txq->axq_qnum, ix,
3986 ath_hal_txprocdesc(ah, bf->bf_desc) == HAL_OK);
3987#endif /* AR_DEBUG */
3988 bus_dmamap_unload(sc->sc_dmat, bf->bf_dmamap);
3989 m_freem(bf->bf_m);
3990 bf->bf_m = NULL;
3991 ni = bf->bf_node;
3992 bf->bf_node = NULL;
3993 if (ni != NULL) {
3994 /*
3995 * Reclaim node reference.
3996 */
3997 ieee80211_free_node(ni);
3998 }
4014 bf->bf_flags &= ~ATH_FLAG_BUSY;
4015 ATH_TXBUF_LOCK(sc);
4016 STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list);
4017 ATH_TXBUF_UNLOCK(sc);
4018 }
3999 ATH_TXBUF_LOCK(sc);
4000 STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list);
4001 ATH_TXBUF_UNLOCK(sc);
4002 }
4019 ATH_TXBUF_LOCK(sc);
4020 bf = STAILQ_FIRST(&sc->sc_txbuf);
4021 if (bf != NULL)
4022 bf->bf_flags &= ~ATH_FLAG_BUSY;
4023 ATH_TXBUF_UNLOCK(sc);
4024}
4025
4026static void
4027ath_tx_stopdma(struct ath_softc *sc, struct ath_txq *txq)
4028{
4029 struct ath_hal *ah = sc->sc_ah;
4030
4031 (void) ath_hal_stoptxdma(ah, txq->axq_qnum);

--- 861 unchanged lines hidden (view full) ---

4893static void
4894ath_printtxbuf(struct ath_buf *bf, u_int qnum, u_int ix, int done)
4895{
4896 struct ath_desc *ds;
4897 int i;
4898
4899 printf("Q%u[%3u]", qnum, ix);
4900 for (i = 0, ds = bf->bf_desc; i < bf->bf_nseg; i++, ds++) {
4003}
4004
4005static void
4006ath_tx_stopdma(struct ath_softc *sc, struct ath_txq *txq)
4007{
4008 struct ath_hal *ah = sc->sc_ah;
4009
4010 (void) ath_hal_stoptxdma(ah, txq->axq_qnum);

--- 861 unchanged lines hidden (view full) ---

4872static void
4873ath_printtxbuf(struct ath_buf *bf, u_int qnum, u_int ix, int done)
4874{
4875 struct ath_desc *ds;
4876 int i;
4877
4878 printf("Q%u[%3u]", qnum, ix);
4879 for (i = 0, ds = bf->bf_desc; i < bf->bf_nseg; i++, ds++) {
4901 printf(" (DS.V:%p DS.P:%p) L:%08x D:%08x F:%x TF:%04x%s\n"
4880 printf(" (DS.V:%p DS.P:%p) L:%08x D:%08x F:04%x%s\n"
4902 " %08x %08x %08x %08x %08x %08x\n",
4903 ds, (struct ath_desc *)bf->bf_daddr + i,
4881 " %08x %08x %08x %08x %08x %08x\n",
4882 ds, (struct ath_desc *)bf->bf_daddr + i,
4904 ds->ds_link, ds->ds_data, bf->bf_flags, bf->bf_txflags,
4883 ds->ds_link, ds->ds_data, bf->bf_flags,
4905 !done ? "" : (ds->ds_txstat.ts_status == 0) ? " *" : " !",
4906 ds->ds_ctl0, ds->ds_ctl1,
4907 ds->ds_hw[0], ds->ds_hw[1], ds->ds_hw[2], ds->ds_hw[3]);
4908 }
4909}
4910#endif /* AR_DEBUG */
4911
4912static void

--- 540 unchanged lines hidden ---
4884 !done ? "" : (ds->ds_txstat.ts_status == 0) ? " *" : " !",
4885 ds->ds_ctl0, ds->ds_ctl1,
4886 ds->ds_hw[0], ds->ds_hw[1], ds->ds_hw[2], ds->ds_hw[3]);
4887 }
4888}
4889#endif /* AR_DEBUG */
4890
4891static void

--- 540 unchanged lines hidden ---