void cdcef_txeof(struct usbf_xfer *xfer, void *priv, usbf_status err) { struct cdcef_softc *sc = priv; struct ifnet *ifp = GET_IFP(sc); int s; s = splnet(); #if 0 printf("cdcef_txeof: xfer=%p, priv=%p, %s\n", xfer, priv, usbf_errstr(err)); #endif ifp->if_timer = 0; ifp->if_flags &= ~IFF_OACTIVE; if (sc->sc_xmit_mbuf != NULL) { m_freem(sc->sc_xmit_mbuf); sc->sc_xmit_mbuf = NULL; } if (err) ifp->if_oerrors++; else ifp->if_opackets++; if (IFQ_IS_EMPTY(&ifp->if_snd) == 0) timeout_add(&sc->start_to, 1); /* XXX */ splx(s); }
void usbf_attach(struct device *parent, struct device *self, void *aux) { struct usbf_softc *sc = (struct usbf_softc *)self; int usbrev; int speed; usbf_status err; /* Continue to set up the bus struct. */ sc->sc_bus = aux; sc->sc_bus->usbfctl = sc; usbrev = sc->sc_bus->usbrev; printf(": USB revision %s", usbrev_str[usbrev]); switch (usbrev) { case USBREV_2_0: speed = USB_SPEED_HIGH; break; case USBREV_1_1: case USBREV_1_0: speed = USB_SPEED_FULL; break; default: printf(", not supported\n"); sc->sc_dying = 1; return; } printf("\n"); /* Initialize the usbf struct. */ TAILQ_INIT(&sc->sc_tskq); /* Establish the software interrupt. */ if (usbf_softintr_establish(sc->sc_bus)) { printf("%s: can't establish softintr\n", DEVNAME(sc)); sc->sc_dying = 1; return; } /* Attach the function driver. */ err = usbf_new_device(self, sc->sc_bus, 0, speed, 0, &sc->sc_port); if (err) { printf("%s: usbf_new_device failed, %s\n", DEVNAME(sc), usbf_errstr(err)); sc->sc_dying = 1; return; } /* Create a process context for asynchronous tasks. */ config_pending_incr(); kthread_create_deferred(usbf_create_thread, sc); }
void cdcef_rxeof(struct usbf_xfer *xfer, void *priv, usbf_status status) { struct cdcef_softc *sc = priv; int total_len = 0; struct ifnet *ifp = GET_IFP(sc); struct mbuf_list ml = MBUF_LIST_INITIALIZER(); struct mbuf *m = NULL; int s; #if 0 printf("cdcef_rxeof: xfer=%p, priv=%p, %s\n", xfer, priv, usbf_errstr(status)); #endif if (status != USBF_NORMAL_COMPLETION) { if (status == USBF_NOT_STARTED || status == USBF_CANCELLED) return; if (sc->sc_rxeof_errors == 0) printf("%s: usb error on rx: %s\n", DEVNAME(sc), usbf_errstr(status)); /* XXX - no stalls on client */ if (sc->sc_rxeof_errors++ > 10) { printf("%s: too many errors, disabling\n", DEVNAME(sc)); } goto done; } sc->sc_rxeof_errors = 0; /* upon first incoming packet we know the host is listening */ if (sc->sc_listening == 0) { sc->sc_listening = 1; } usbf_get_xfer_status(xfer, NULL, NULL, &total_len, NULL); /* total_len -= 4; Strip off CRC added for Zaurus - XXX*/ if (total_len <= 1) goto done; if (total_len < sizeof(struct ether_header)) { ifp->if_ierrors++; goto done; } if (ifp->if_flags & IFF_RUNNING) { m = cdcef_newbuf(); if (m == NULL) { /* message? */ ifp->if_ierrors++; goto done; } m->m_pkthdr.len = m->m_len = total_len; bcopy(sc->sc_buffer_out, mtod(m, char *), total_len); ml_enqueue(&ml, m); }
void cdcef_rxeof(usbf_xfer_handle xfer, usbf_private_handle priv, usbf_status status) { struct cdcef_softc *sc = priv; int total_len = 0; struct ifnet *ifp = GET_IFP(sc); struct mbuf *m = NULL; int s; #if 0 printf("cdcef_rxeof: xfer=%p, priv=%p, %s\n", xfer, priv, usbf_errstr(status)); #endif if (status != USBF_NORMAL_COMPLETION) { if (status == USBF_NOT_STARTED || status == USBF_CANCELLED) return; if (sc->sc_rxeof_errors == 0) printf("%s: usb error on rx: %s\n", DEVNAME(sc), usbf_errstr(status)); /* XXX - no stalls on client */ if (sc->sc_rxeof_errors++ > 10) { printf("%s: too many errors, disabling\n", DEVNAME(sc)); /* sc->sc_dying = 1; */ // return; } goto done; } sc->sc_rxeof_errors = 0; /* upon first incoming packet we know the host is listening */ if (sc->sc_listening == 0) { sc->sc_listening = 1; } usbf_get_xfer_status(xfer, NULL, NULL, &total_len, NULL); /* total_len -= 4; Strip off CRC added for Zaurus - XXX*/ if (total_len <= 1) goto done; if (total_len < sizeof(struct ether_header)) { ifp->if_ierrors++; goto done; } s = splnet(); if (ifp->if_flags & IFF_RUNNING) { m = cdcef_newbuf(); if (m == NULL) { /* message? */ ifp->if_ierrors++; goto done1; } m->m_pkthdr.len = m->m_len = total_len; bcopy(sc->sc_buffer_out, mtod(m, char *), total_len); m->m_pkthdr.rcvif = ifp; ifp->if_ipackets++; #if NBPFILTER > 0 if (ifp->if_bpf) bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN); #endif ether_input_mbuf(ifp, m); }