summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/man/man4/altq.43
-rw-r--r--sys/dev/re/if_re.c20
2 files changed, 16 insertions, 7 deletions
diff --git a/share/man/man4/altq.4 b/share/man/man4/altq.4
index 023d949..e242d58 100644
--- a/share/man/man4/altq.4
+++ b/share/man/man4/altq.4
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 7, 2005
+.Dd March 12, 2005
.Dt ALTQ 4
.Os
.Sh NAME
@@ -127,6 +127,7 @@ They have been applied to the following hardware drivers:
.Xr fxp 4 ,
.Xr hme 4 ,
.Xr lnc 4 ,
+.Xr re 4 ,
.Xr rl 4 ,
.Xr sf 4 ,
.Xr sis 4 ,
diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c
index 77f2942..d458aa7 100644
--- a/sys/dev/re/if_re.c
+++ b/sys/dev/re/if_re.c
@@ -717,6 +717,7 @@ re_diag(sc)
CSR_WRITE_2(sc, RL_ISR, 0xFFFF);
RL_UNLOCK(sc);
+ /* XXX: re_diag must not be called when in ALTQ mode */
IF_HANDOFF(&ifp->if_snd, m0, ifp);
RL_LOCK(sc);
m0 = NULL;
@@ -1206,7 +1207,9 @@ re_attach(dev)
ifp->if_baudrate = 1000000000;
else
ifp->if_baudrate = 100000000;
- ifp->if_snd.ifq_maxlen = RL_IFQ_MAXLEN;
+ IFQ_SET_MAXLEN(&ifp->if_snd, RL_IFQ_MAXLEN);
+ ifp->if_snd.ifq_drv_maxlen = RL_IFQ_MAXLEN;
+ IFQ_SET_READY(&ifp->if_snd);
ifp->if_capenable = ifp->if_capabilities & ~IFCAP_HWCSUM;
callout_handle_init(&sc->rl_stat_ch);
@@ -1788,7 +1791,7 @@ re_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
re_rxeof(sc);
re_txeof(sc);
- if (ifp->if_snd.ifq_head != NULL)
+ if (!IFQ_DRV_IS_EMPTY(ifp->if_snd))
re_start_locked(ifp);
if (cmd == POLL_AND_CHECK_STATUS) { /* also check status register */
@@ -1872,7 +1875,7 @@ re_intr(arg)
}
}
- if (ifp->if_snd.ifq_head != NULL)
+ if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
re_start_locked(ifp);
done_locked:
@@ -2009,7 +2012,7 @@ re_start_locked(ifp)
{
struct rl_softc *sc;
struct mbuf *m_head = NULL;
- int idx;
+ int idx, queued = 0;
sc = ifp->if_softc;
@@ -2018,12 +2021,12 @@ re_start_locked(ifp)
idx = sc->rl_ldata.rl_tx_prodidx;
while (sc->rl_ldata.rl_tx_mbuf[idx] == NULL) {
- IF_DEQUEUE(&ifp->if_snd, m_head);
+ IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
if (m_head == NULL)
break;
if (re_encap(sc, &m_head, &idx)) {
- IF_PREPEND(&ifp->if_snd, m_head);
+ IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
ifp->if_flags |= IFF_OACTIVE;
break;
}
@@ -2033,8 +2036,13 @@ re_start_locked(ifp)
* to him.
*/
BPF_MTAP(ifp, m_head);
+
+ queued++;
}
+ if (queued == 0)
+ return;
+
/* Flush the TX descriptors */
bus_dmamap_sync(sc->rl_ldata.rl_tx_list_tag,
OpenPOWER on IntegriCloud