diff options
Diffstat (limited to 'sys/dev/usb/if_kue.c')
| -rw-r--r-- | sys/dev/usb/if_kue.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/sys/dev/usb/if_kue.c b/sys/dev/usb/if_kue.c index 81fc45def1c6..a42a7abc0af0 100644 --- a/sys/dev/usb/if_kue.c +++ b/sys/dev/usb/if_kue.c @@ -698,13 +698,8 @@ static void kue_rxeof(xfer, priv, status) usbd_get_xfer_status(xfer, NULL, NULL, &total_len, NULL); m = c->kue_mbuf; - if (total_len <= 1) { - usbd_setup_xfer(c->kue_xfer, sc->kue_ep[KUE_ENDPT_RX], - c, mtod(c->kue_mbuf, char *), KUE_BUFSZ, USBD_SHORT_XFER_OK, - USBD_NO_TIMEOUT, kue_rxeof); - usbd_transfer(c->kue_xfer); - return; - } + if (total_len <= 1) + goto done; len = *mtod(m, u_int16_t *); m_adj(m, sizeof(u_int16_t)); @@ -712,6 +707,11 @@ static void kue_rxeof(xfer, priv, status) /* No errors; receive the packet. */ total_len = len; + if (len < sizeof(struct ether_header)) { + ifp->if_ierrors++; + goto done; + } + ifp->if_ipackets++; m->m_pkthdr.rcvif = (struct ifnet *)&kue_qdat; m->m_pkthdr.len = m->m_len = total_len; @@ -719,8 +719,15 @@ static void kue_rxeof(xfer, priv, status) /* Put the packet on the special USB input queue. */ usb_ether_input(m); + return; done: + /* Setup new transfer. */ + usbd_setup_xfer(c->kue_xfer, sc->kue_ep[KUE_ENDPT_RX], + c, mtod(c->kue_mbuf, char *), KUE_BUFSZ, USBD_SHORT_XFER_OK, + USBD_NO_TIMEOUT, kue_rxeof); + usbd_transfer(c->kue_xfer); + return; } |
