void kue_watchdog(struct ifnet *ifp) { struct kue_softc *sc = ifp->if_softc; struct kue_chain *c; usbd_status stat; int s; DPRINTFN(5,("%s: %s: enter\n", sc->kue_dev.dv_xname,__func__)); if (sc->kue_dying) return; ifp->if_oerrors++; printf("%s: watchdog timeout\n", sc->kue_dev.dv_xname); s = splusb(); c = &sc->kue_cdata.kue_tx_chain[0]; usbd_get_xfer_status(c->kue_xfer, NULL, NULL, NULL, &stat); kue_txeof(c->kue_xfer, c, stat); if (IFQ_IS_EMPTY(&ifp->if_snd) == 0) kue_start(ifp); splx(s); }
Static void kue_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) { struct kue_chain *c = priv; struct kue_softc *sc = c->kue_sc; struct ifnet *ifp = GET_IFP(sc); int s; if (sc->kue_dying) return; s = splnet(); DPRINTFN(10,("%s: %s: enter status=%d\n", USBDEVNAME(sc->kue_dev), __func__, status)); ifp->if_timer = 0; ifp->if_flags &= ~IFF_OACTIVE; if (status != USBD_NORMAL_COMPLETION) { if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) { splx(s); return; } ifp->if_oerrors++; printf("%s: usb error on tx: %s\n", USBDEVNAME(sc->kue_dev), usbd_errstr(status)); if (status == USBD_STALLED) usbd_clear_endpoint_stall_async(sc->kue_ep[KUE_ENDPT_TX]); splx(s); return; } ifp->if_opackets++; m_freem(c->kue_mbuf); c->kue_mbuf = NULL; if (IFQ_IS_EMPTY(&ifp->if_snd) == 0) kue_start(ifp); splx(s); }