diff options
author | wpaul <wpaul@FreeBSD.org> | 2000-01-13 20:13:58 +0000 |
---|---|---|
committer | wpaul <wpaul@FreeBSD.org> | 2000-01-13 20:13:58 +0000 |
commit | 499ef83f97171db96e76e3da1c46fc6950ab90d9 (patch) | |
tree | 097e5fbfde43d66cb433ca9c42ec2cc1866f3ada /sys/dev/usb/if_kue.c | |
parent | 7eac0e762afc8308262687ae9f51e41336831d8d (diff) | |
download | FreeBSD-src-499ef83f97171db96e76e3da1c46fc6950ab90d9.zip FreeBSD-src-499ef83f97171db96e76e3da1c46fc6950ab90d9.tar.gz |
Bunch of updates:
- Add vendor/device ID for Corega USB-T ethernet adapter to necessary
places so that it will work with the kue driver.
- Add vendor/device ID for CATC Netmate devices for driver to be added
soon.
- Get really crazy about netisr stuff: avoid doing any mbuf allocations
or deallocations at splbio/splusb.
- Fix if_aue driver so that it works with LinkSys USB100TX: you need
to flip the GPIO bits just the right way to put the PHY in the right
mode.
Diffstat (limited to 'sys/dev/usb/if_kue.c')
-rw-r--r-- | sys/dev/usb/if_kue.c | 70 |
1 files changed, 39 insertions, 31 deletions
diff --git a/sys/dev/usb/if_kue.c b/sys/dev/usb/if_kue.c index b1888e4..81fc45d 100644 --- a/sys/dev/usb/if_kue.c +++ b/sys/dev/usb/if_kue.c @@ -119,6 +119,8 @@ static struct kue_type kue_devs[] = { "KLSI USB ethernet" }, { USB_VENDOR_3COM, USB_PRODUCT_3COM_3C19250, "KLSI USB ethernet" }, + { USB_VENDOR_COREGA, USB_PRODUCT_COREGA_USB_T, + "KLSI USB ethernet" }, { USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DSB650C, "KLSI USB ethernet" }, { USB_VENDOR_SMC, USB_PRODUCT_SMC_2102USB, @@ -126,6 +128,8 @@ static struct kue_type kue_devs[] = { { 0, 0, NULL } }; +static struct usb_qdat kue_qdat; + static int kue_match __P((device_t)); static int kue_attach __P((device_t)); static int kue_detach __P((device_t)); @@ -140,6 +144,7 @@ static void kue_rxeof __P((usbd_xfer_handle, static void kue_txeof __P((usbd_xfer_handle, usbd_private_handle, usbd_status)); static void kue_start __P((struct ifnet *)); +static void kue_rxstart __P((struct ifnet *)); static int kue_ioctl __P((struct ifnet *, u_long, caddr_t)); static void kue_init __P((void *)); static void kue_stop __P((struct kue_softc *)); @@ -503,6 +508,9 @@ USB_ATTACH(kue) ifp->if_baudrate = 10000000; ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; + kue_qdat.ifp = ifp; + kue_qdat.if_rxstart = kue_rxstart; + /* * Call MI attach routines. */ @@ -632,6 +640,29 @@ static int kue_tx_list_init(sc) return(0); } +static void kue_rxstart(ifp) + struct ifnet *ifp; +{ + struct kue_softc *sc; + struct kue_chain *c; + + sc = ifp->if_softc; + c = &sc->kue_cdata.kue_rx_chain[sc->kue_cdata.kue_rx_prod]; + + if (kue_newbuf(sc, c, NULL) == ENOBUFS) { + ifp->if_ierrors++; + return; + } + + /* 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; +} + /* * A frame has been uploaded: pass the resulting mbuf chain up to * the higher level protocols. @@ -643,7 +674,6 @@ static void kue_rxeof(xfer, priv, status) { struct kue_softc *sc; struct kue_chain *c; - struct ether_header *eh; struct mbuf *m; struct ifnet *ifp; int total_len = 0; @@ -668,51 +698,29 @@ 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) - goto done; + 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; + } len = *mtod(m, u_int16_t *); m_adj(m, sizeof(u_int16_t)); /* No errors; receive the packet. */ total_len = len; - if (kue_newbuf(sc, c, NULL) == ENOBUFS) { - ifp->if_ierrors++; - goto done; - } ifp->if_ipackets++; - eh = mtod(m, struct ether_header *); - m->m_pkthdr.rcvif = ifp; + m->m_pkthdr.rcvif = (struct ifnet *)&kue_qdat; m->m_pkthdr.len = m->m_len = total_len; - /* - * Handle BPF listeners. Let the BPF user see the packet, but - * don't pass it up to the ether_input() layer unless it's - * a broadcast packet, multicast packet, matches our ethernet - * address or the interface is in promiscuous mode. - */ - if (ifp->if_bpf) { - bpf_mtap(ifp, m); - if (ifp->if_flags & IFF_PROMISC && - (bcmp(eh->ether_dhost, sc->arpcom.ac_enaddr, - ETHER_ADDR_LEN) && !(eh->ether_dhost[0] & 1))) { - m_freem(m); - goto done; - } - } - /* Put the packet on the special USB input queue. */ usb_ether_input(m); done: - /* Setup new transfer. */ - usbd_setup_xfer(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(xfer); - return; } |