Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/dev/usb/if_kue.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/dev/usb/if_kue.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.83 retrieving revision 1.84 diff -u -p -r1.83 -r1.84 --- src/sys/dev/usb/if_kue.c 2016/02/09 08:32:12 1.83 +++ src/sys/dev/usb/if_kue.c 2016/04/23 10:15:31 1.84 @@ -1,4 +1,4 @@ -/* $NetBSD: if_kue.c,v 1.83 2016/02/09 08:32:12 ozaki-r Exp $ */ +/* $NetBSD: if_kue.c,v 1.84 2016/04/23 10:15:31 skrll Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 @@ -71,7 +71,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.83 2016/02/09 08:32:12 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.84 2016/04/23 10:15:31 skrll Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -81,7 +81,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1 #include #include #include -#include +#include #include #include #include @@ -168,8 +168,8 @@ static int kue_tx_list_init(struct kue_s static int kue_rx_list_init(struct kue_softc *); static int kue_send(struct kue_softc *, struct mbuf *, int); static int kue_open_pipes(struct kue_softc *); -static void kue_rxeof(usbd_xfer_handle, usbd_private_handle, usbd_status); -static void kue_txeof(usbd_xfer_handle, usbd_private_handle, usbd_status); +static void kue_rxeof(struct usbd_xfer *, void *, usbd_status); +static void kue_txeof(struct usbd_xfer *, void *, usbd_status); static void kue_start(struct ifnet *); static int kue_ioctl(struct ifnet *, u_long, void *); static void kue_init(void *); @@ -197,7 +197,7 @@ kue_setword(struct kue_softc *sc, uint8_ USETW(req.wIndex, 0); USETW(req.wLength, 0); - return (usbd_do_request(sc->kue_udev, &req, NULL)); + return usbd_do_request(sc->kue_udev, &req, NULL); } static usbd_status @@ -219,7 +219,7 @@ kue_ctl(struct kue_softc *sc, int rw, ui USETW(req.wIndex, 0); USETW(req.wLength, len); - return (usbd_do_request(sc->kue_udev, &req, data)); + return usbd_do_request(sc->kue_udev, &req, data); } static int @@ -245,11 +245,11 @@ kue_load_fw(struct kue_softc *sc) * running. */ if (usbd_get_device_desc(sc->kue_udev, &dd)) - return (EIO); + return EIO; if (UGETW(dd.bcdDevice) == KUE_WARM_REV) { printf("%s: warm boot, no firmware download\n", device_xname(sc->kue_dev)); - return (0); + return 0; } printf("%s: cold boot, downloading firmware\n", @@ -264,7 +264,7 @@ kue_load_fw(struct kue_softc *sc) if (err) { printf("%s: failed to load code segment: %s\n", device_xname(sc->kue_dev), usbd_errstr(err)); - return (EIO); + return EIO; } /* Load fixup segment */ @@ -276,7 +276,7 @@ kue_load_fw(struct kue_softc *sc) if (err) { printf("%s: failed to load fixup segment: %s\n", device_xname(sc->kue_dev), usbd_errstr(err)); - return (EIO); + return EIO; } /* Send trigger command. */ @@ -288,7 +288,7 @@ kue_load_fw(struct kue_softc *sc) if (err) { printf("%s: failed to load trigger segment: %s\n", device_xname(sc->kue_dev), usbd_errstr(err)); - return (EIO); + return EIO; } usbd_delay_ms(sc->kue_udev, 10); @@ -308,7 +308,7 @@ kue_load_fw(struct kue_softc *sc) /* Reset the adapter. */ kue_reset(sc); - return (0); + return 0; } static void @@ -383,8 +383,8 @@ kue_match(device_t parent, cfdata_t matc DPRINTFN(25,("kue_match: enter\n")); - return (kue_lookup(uaa->vendor, uaa->product) != NULL ? - UMATCH_VENDOR_PRODUCT : UMATCH_NONE); + return kue_lookup(uaa->uaa_vendor, uaa->uaa_product) != NULL ? + UMATCH_VENDOR_PRODUCT : UMATCH_NONE; } /* @@ -399,8 +399,8 @@ kue_attach(device_t parent, device_t sel char *devinfop; int s; struct ifnet *ifp; - usbd_device_handle dev = uaa->device; - usbd_interface_handle iface; + struct usbd_device * dev = uaa->uaa_device; + struct usbd_interface * iface; usbd_status err; usb_interface_descriptor_t *id; usb_endpoint_descriptor_t *ed; @@ -425,8 +425,8 @@ kue_attach(device_t parent, device_t sel } sc->kue_udev = dev; - sc->kue_product = uaa->product; - sc->kue_vendor = uaa->vendor; + sc->kue_product = uaa->uaa_product; + sc->kue_vendor = uaa->uaa_vendor; /* Load the firmware into the NIC. */ if (kue_load_fw(sc)) { @@ -475,8 +475,8 @@ kue_attach(device_t parent, device_t sel return; } - sc->kue_mcfilters = malloc(KUE_MCFILTCNT(sc) * ETHER_ADDR_LEN, - M_USBDEV, M_NOWAIT); + sc->kue_mcfilters = kmem_alloc(KUE_MCFILTCNT(sc) * ETHER_ADDR_LEN, + KM_SLEEP); if (sc->kue_mcfilters == NULL) { aprint_error_dev(self, "no memory for multicast filter buffer\n"); @@ -528,14 +528,15 @@ kue_detach(device_t self, int flags) s = splusb(); /* XXX why? */ if (sc->kue_mcfilters != NULL) { - free(sc->kue_mcfilters, M_USBDEV); + kmem_free(sc->kue_mcfilters, + KUE_MCFILTCNT(sc) * ETHER_ADDR_LEN); sc->kue_mcfilters = NULL; } if (!sc->kue_attached) { /* Detached before attached finished, so just bail out. */ splx(s); - return (0); + return 0; } if (ifp->if_flags & IFF_RUNNING) @@ -556,7 +557,7 @@ kue_detach(device_t self, int flags) sc->kue_attached = false; splx(s); - return (0); + return 0; } int @@ -592,16 +593,15 @@ kue_rx_list_init(struct kue_softc *sc) c->kue_sc = sc; c->kue_idx = i; if (c->kue_xfer == NULL) { - c->kue_xfer = usbd_alloc_xfer(sc->kue_udev); - if (c->kue_xfer == NULL) - return (ENOBUFS); - c->kue_buf = usbd_alloc_buffer(c->kue_xfer, KUE_BUFSZ); - if (c->kue_buf == NULL) - return (ENOBUFS); /* XXX free xfer */ + int error = usbd_create_xfer(sc->kue_ep[KUE_ENDPT_RX], + KUE_BUFSZ, USBD_SHORT_XFER_OK, 0, &c->kue_xfer); + if (error) + return error; + c->kue_buf = usbd_get_buffer(c->kue_xfer); } } - return (0); + return 0; } static int @@ -619,16 +619,15 @@ kue_tx_list_init(struct kue_softc *sc) c->kue_sc = sc; c->kue_idx = i; if (c->kue_xfer == NULL) { - c->kue_xfer = usbd_alloc_xfer(sc->kue_udev); - if (c->kue_xfer == NULL) - return (ENOBUFS); - c->kue_buf = usbd_alloc_buffer(c->kue_xfer, KUE_BUFSZ); - if (c->kue_buf == NULL) - return (ENOBUFS); + int error = usbd_create_xfer(sc->kue_ep[KUE_ENDPT_TX], + KUE_BUFSZ, 0, 0, &c->kue_xfer); + if (error) + return error; + c->kue_buf = usbd_get_buffer(c->kue_xfer); } } - return (0); + return 0; } /* @@ -636,7 +635,7 @@ kue_tx_list_init(struct kue_softc *sc) * the higher level protocols. */ static void -kue_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) +kue_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status) { struct kue_chain *c = priv; struct kue_softc *sc = c->kue_sc; @@ -730,9 +729,8 @@ kue_rxeof(usbd_xfer_handle xfer, usbd_pr done: /* Setup new transfer. */ - usbd_setup_xfer(c->kue_xfer, sc->kue_ep[KUE_ENDPT_RX], - c, c->kue_buf, KUE_BUFSZ, USBD_SHORT_XFER_OK | USBD_NO_COPY, - USBD_NO_TIMEOUT, kue_rxeof); + usbd_setup_xfer(c->kue_xfer, c, c->kue_buf, KUE_BUFSZ, + USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, kue_rxeof); usbd_transfer(c->kue_xfer); DPRINTFN(10,("%s: %s: start rx\n", device_xname(sc->kue_dev), @@ -745,7 +743,7 @@ kue_rxeof(usbd_xfer_handle xfer, usbd_pr */ static void -kue_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, +kue_txeof(struct usbd_xfer *xfer, void *priv, usbd_status status) { struct kue_chain *c = priv; @@ -809,9 +807,8 @@ kue_send(struct kue_softc *sc, struct mb total_len = 2 + m->m_pkthdr.len; total_len = roundup2(total_len, 64); - usbd_setup_xfer(c->kue_xfer, sc->kue_ep[KUE_ENDPT_TX], - c, c->kue_buf, total_len, USBD_NO_COPY, USBD_DEFAULT_TIMEOUT, - kue_txeof); + usbd_setup_xfer(c->kue_xfer, c, c->kue_buf, total_len, 0, + USBD_DEFAULT_TIMEOUT, kue_txeof); /* Transmit */ err = usbd_transfer(c->kue_xfer); @@ -819,12 +816,12 @@ kue_send(struct kue_softc *sc, struct mb printf("%s: kue_send error=%s\n", device_xname(sc->kue_dev), usbd_errstr(err)); kue_stop(sc); - return (EIO); + return EIO; } sc->kue_cdata.kue_tx_cnt++; - return (0); + return 0; } static void @@ -904,28 +901,37 @@ kue_init(void *xsc) #endif kue_setword(sc, KUE_CMD_SET_URB_SIZE, 64); + /* Load the multicast filter. */ + kue_setmulti(sc); + + if (sc->kue_ep[KUE_ENDPT_RX] == NULL) { + if (kue_open_pipes(sc)) { + splx(s); + return; + } + } /* Init TX ring. */ - if (kue_tx_list_init(sc) == ENOBUFS) { + if (kue_tx_list_init(sc)) { printf("%s: tx list init failed\n", device_xname(sc->kue_dev)); splx(s); return; } /* Init RX ring. */ - if (kue_rx_list_init(sc) == ENOBUFS) { + if (kue_rx_list_init(sc)) { printf("%s: rx list init failed\n", device_xname(sc->kue_dev)); splx(s); return; } - /* Load the multicast filter. */ - kue_setmulti(sc); - - if (sc->kue_ep[KUE_ENDPT_RX] == NULL) { - if (kue_open_pipes(sc)) { - splx(s); - return; - } + /* Start up the receive pipe. */ + for (size_t i = 0; i < KUE_RX_LIST_CNT; i++) { + struct kue_chain *c = &sc->kue_cdata.kue_rx_chain[i]; + usbd_setup_xfer(c->kue_xfer, c, c->kue_buf, KUE_BUFSZ, + USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, kue_rxeof); + DPRINTFN(5,("%s: %s: start read\n", device_xname(sc->kue_dev), + __func__)); + usbd_transfer(c->kue_xfer); } ifp->if_flags |= IFF_RUNNING; @@ -938,8 +944,6 @@ static int kue_open_pipes(struct kue_softc *sc) { usbd_status err; - struct kue_chain *c; - int i; DPRINTFN(5,("%s: %s: enter\n", device_xname(sc->kue_dev),__func__)); @@ -949,7 +953,7 @@ kue_open_pipes(struct kue_softc *sc) if (err) { printf("%s: open rx pipe failed: %s\n", device_xname(sc->kue_dev), usbd_errstr(err)); - return (EIO); + return EIO; } err = usbd_open_pipe(sc->kue_iface, sc->kue_ed[KUE_ENDPT_TX], @@ -957,22 +961,10 @@ kue_open_pipes(struct kue_softc *sc) if (err) { printf("%s: open tx pipe failed: %s\n", device_xname(sc->kue_dev), usbd_errstr(err)); - return (EIO); + return EIO; } - /* Start up the receive pipe. */ - for (i = 0; i < KUE_RX_LIST_CNT; i++) { - c = &sc->kue_cdata.kue_rx_chain[i]; - usbd_setup_xfer(c->kue_xfer, sc->kue_ep[KUE_ENDPT_RX], - c, c->kue_buf, KUE_BUFSZ, - USBD_SHORT_XFER_OK | USBD_NO_COPY, USBD_NO_TIMEOUT, - kue_rxeof); - DPRINTFN(5,("%s: %s: start read\n", device_xname(sc->kue_dev), - __func__)); - usbd_transfer(c->kue_xfer); - } - - return (0); + return 0; } static int @@ -986,7 +978,7 @@ kue_ioctl(struct ifnet *ifp, u_long comm DPRINTFN(5,("%s: %s: enter\n", device_xname(sc->kue_dev),__func__)); if (sc->kue_dying) - return (EIO); + return EIO; s = splnet(); @@ -1052,7 +1044,7 @@ kue_ioctl(struct ifnet *ifp, u_long comm splx(s); - return (error); + return error; } static void @@ -1104,12 +1096,6 @@ kue_stop(struct kue_softc *sc) printf("%s: abort rx pipe failed: %s\n", device_xname(sc->kue_dev), usbd_errstr(err)); } - err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_RX]); - if (err) { - printf("%s: close rx pipe failed: %s\n", - device_xname(sc->kue_dev), usbd_errstr(err)); - } - sc->kue_ep[KUE_ENDPT_RX] = NULL; } if (sc->kue_ep[KUE_ENDPT_TX] != NULL) { @@ -1118,12 +1104,6 @@ kue_stop(struct kue_softc *sc) printf("%s: abort tx pipe failed: %s\n", device_xname(sc->kue_dev), usbd_errstr(err)); } - err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_TX]); - if (err) { - printf("%s: close tx pipe failed: %s\n", - device_xname(sc->kue_dev), usbd_errstr(err)); - } - sc->kue_ep[KUE_ENDPT_TX] = NULL; } if (sc->kue_ep[KUE_ENDPT_INTR] != NULL) { @@ -1132,18 +1112,12 @@ kue_stop(struct kue_softc *sc) printf("%s: abort intr pipe failed: %s\n", device_xname(sc->kue_dev), usbd_errstr(err)); } - err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_INTR]); - if (err) { - printf("%s: close intr pipe failed: %s\n", - device_xname(sc->kue_dev), usbd_errstr(err)); - } - sc->kue_ep[KUE_ENDPT_INTR] = NULL; } /* Free RX resources. */ for (i = 0; i < KUE_RX_LIST_CNT; i++) { if (sc->kue_cdata.kue_rx_chain[i].kue_xfer != NULL) { - usbd_free_xfer(sc->kue_cdata.kue_rx_chain[i].kue_xfer); + usbd_destroy_xfer(sc->kue_cdata.kue_rx_chain[i].kue_xfer); sc->kue_cdata.kue_rx_chain[i].kue_xfer = NULL; } } @@ -1151,10 +1125,38 @@ kue_stop(struct kue_softc *sc) /* Free TX resources. */ for (i = 0; i < KUE_TX_LIST_CNT; i++) { if (sc->kue_cdata.kue_tx_chain[i].kue_xfer != NULL) { - usbd_free_xfer(sc->kue_cdata.kue_tx_chain[i].kue_xfer); + usbd_destroy_xfer(sc->kue_cdata.kue_tx_chain[i].kue_xfer); sc->kue_cdata.kue_tx_chain[i].kue_xfer = NULL; } } + /* Close pipes. */ + if (sc->kue_ep[KUE_ENDPT_RX] != NULL) { + err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_RX]); + if (err) { + printf("%s: close rx pipe failed: %s\n", + device_xname(sc->kue_dev), usbd_errstr(err)); + } + sc->kue_ep[KUE_ENDPT_RX] = NULL; + } + + if (sc->kue_ep[KUE_ENDPT_TX] != NULL) { + err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_TX]); + if (err) { + printf("%s: close tx pipe failed: %s\n", + device_xname(sc->kue_dev), usbd_errstr(err)); + } + sc->kue_ep[KUE_ENDPT_TX] = NULL; + } + + if (sc->kue_ep[KUE_ENDPT_INTR] != NULL) { + err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_INTR]); + if (err) { + printf("%s: close intr pipe failed: %s\n", + device_xname(sc->kue_dev), usbd_errstr(err)); + } + sc->kue_ep[KUE_ENDPT_INTR] = NULL; + } + ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); }