summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/dev/usb/net/usb_ethernet.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/dev/usb/net/usb_ethernet.c')
-rw-r--r--freebsd/sys/dev/usb/net/usb_ethernet.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/freebsd/sys/dev/usb/net/usb_ethernet.c b/freebsd/sys/dev/usb/net/usb_ethernet.c
index 9ce60eff..2bbcdedc 100644
--- a/freebsd/sys/dev/usb/net/usb_ethernet.c
+++ b/freebsd/sys/dev/usb/net/usb_ethernet.c
@@ -221,6 +221,7 @@ ue_attach_post_task(struct usb_proc_msg *_task)
ue->ue_unit = alloc_unr(ueunit);
usb_callout_init_mtx(&ue->ue_watchdog, ue->ue_mtx, 0);
sysctl_ctx_init(&ue->ue_sysctl_ctx);
+ mbufq_init(&ue->ue_rxq, 0 /* unlimited length */);
error = 0;
CURVNET_SET_QUIET(vnet0);
@@ -286,6 +287,11 @@ ue_attach_post_task(struct usb_proc_msg *_task)
fail:
CURVNET_RESTORE();
+
+ /* drain mbuf queue */
+ mbufq_drain(&ue->ue_rxq);
+
+ /* free unit */
free_unr(ueunit, ue->ue_unit);
if (ue->ue_ifp != NULL) {
if_free(ue->ue_ifp);
@@ -332,6 +338,9 @@ uether_ifdetach(struct usb_ether *ue)
/* free sysctl */
sysctl_ctx_free(&ue->ue_sysctl_ctx);
+ /* drain mbuf queue */
+ mbufq_drain(&ue->ue_rxq);
+
/* free unit */
free_unr(ueunit, ue->ue_unit);
}
@@ -600,7 +609,7 @@ uether_rxmbuf(struct usb_ether *ue, struct mbuf *m,
m->m_pkthdr.len = m->m_len = len;
/* enqueue for later when the lock can be released */
- _IF_ENQUEUE(&ue->ue_rxq, m);
+ (void)mbufq_enqueue(&ue->ue_rxq, m);
return (0);
}
@@ -630,7 +639,7 @@ uether_rxbuf(struct usb_ether *ue, struct usb_page_cache *pc,
m->m_pkthdr.len = m->m_len = len;
/* enqueue for later when the lock can be released */
- _IF_ENQUEUE(&ue->ue_rxq, m);
+ (void)mbufq_enqueue(&ue->ue_rxq, m);
return (0);
}
@@ -643,7 +652,7 @@ uether_rxflush(struct usb_ether *ue)
UE_LOCK_ASSERT(ue, MA_OWNED);
for (;;) {
- _IF_DEQUEUE(&ue->ue_rxq, m);
+ m = mbufq_dequeue(&ue->ue_rxq);
if (m == NULL)
break;