Date: Wed, 2 Jul 2008 19:06:47 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 144502 for review Message-ID: <200807021906.m62J6l3H083820@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=144502 Change 144502 by hselasky@hselasky_laptop001 on 2008/07/02 19:05:48 Renaming symbols and fixing the device ID tables is complete for the new USB serial module. Some minor stuff has been fixed in "ulpt" driver. Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.c#8 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.h#4 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_generic.c#4 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uark2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ubsa2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ubser2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uchcom2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ucycom2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ufoma2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uftdi2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ugensa2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uipaq2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/ulpt2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/umct2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/umodem2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/umoscom2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uplcom2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.h#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uvisor2.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/serial/uvscom2.c#2 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.c#8 (text+ko) ==== @@ -1511,10 +1511,18 @@ usb2_fifo_opened(struct usb2_fifo *f) { uint8_t temp; + uint8_t do_unlock; - mtx_lock(f->priv_mtx); + if (mtx_owned(f->priv_mtx)) { + do_unlock = 0; + } else { + do_unlock = 1; + mtx_lock(f->priv_mtx); + } temp = f->curr_file ? 1 : 0; - mtx_unlock(f->priv_mtx); + if (do_unlock) { + mtx_unlock(f->priv_mtx); + } return (temp); } ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.h#4 (text+ko) ==== @@ -94,6 +94,7 @@ uint8_t iface_index; /* set to the interface we belong to */ uint8_t fifo_index; /* set to the FIFO index in "struct * usb2_device" */ + uint8_t fifo_zlp; /* zero length packet count */ uint8_t refcount; #define USB_FIFO_REF_MAX 0xFF }; ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_generic.c#4 (text+ko) ==== @@ -97,7 +97,7 @@ static int ugen_debug = 0; SYSCTL_NODE(_hw_usb2, OID_AUTO, ugen, CTLFLAG_RW, 0, "USB generic"); -SYSCTL_INT(_hw_usb2_ugen, OID_AUTO, ugen, CTLFLAG_RW, &ugen_debug, +SYSCTL_INT(_hw_usb2_ugen, OID_AUTO, debug, CTLFLAG_RW, &ugen_debug, 0, "Debug level"); #endif @@ -164,6 +164,7 @@ } f->timeout = USB_NO_TIMEOUT; f->flag_short = 0; + f->fifo_zlp = 0; mtx_unlock(f->priv_mtx); return (0); @@ -372,6 +373,21 @@ switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: + if (xfer->actlen == 0) { + if (f->fifo_zlp != 4) { + f->fifo_zlp++; + } else { + /* + * Throttle a little bit we have multiple ZLPs + * in a row! + */ + xfer->interval = 64; /* ms */ + } + } else { + /* clear throttle */ + xfer->interval = 0; + f->fifo_zlp = 0; + } usb2_fifo_put_data(f, xfer->frbuffers, 0, xfer->actlen, 1); @@ -390,6 +406,7 @@ default: /* Error */ if (xfer->error != USB_ERR_CANCELLED) { f->flag_stall = 1; + f->fifo_zlp = 0; usb2_transfer_start(f->xfer[1]); } break; ==== //depot/projects/usb/src/sys/dev/usb2/serial/uark2.c#2 (text+ko) ==== @@ -23,23 +23,24 @@ * be called from within the config thread function ! */ -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/termios.h> -#include <sys/serial.h> -#include <sys/malloc.h> +#include <dev/usb2/include/usb2_devid.h> +#include <dev/usb2/include/usb2_standard.h> +#include <dev/usb2/include/usb2_mfunc.h> +#include <dev/usb2/include/usb2_error.h> +#include <dev/usb2/include/usb2_cdc.h> -#include <dev/usb/usb_port.h> -#include <dev/usb/usb.h> -#include <dev/usb/usb_subr.h> +#define USB_DEBUG_VAR usb2_debug -#include <dev/usb/ucomvar.h> +#include <dev/usb2/core/usb2_core.h> +#include <dev/usb2/core/usb2_debug.h> +#include <dev/usb2/core/usb2_process.h> +#include <dev/usb2/core/usb2_config_td.h> +#include <dev/usb2/core/usb2_request.h> +#include <dev/usb2/core/usb2_lookup.h> +#include <dev/usb2/core/usb2_util.h> -#include "usbdevs.h" +#include <dev/usb2/serial/usb2_serial.h> -#define DPRINTF(...) do { } while (0) - #define UARK_BUF_SIZE 1024 /* bytes */ #define UARK_N_TRANSFER 4 /* units */ @@ -64,11 +65,11 @@ #define UARK_IFACE_INDEX 0 struct uark_softc { - struct ucom_super_softc sc_super_ucom; - struct ucom_softc sc_ucom; + struct usb2_com_super_softc sc_super_ucom; + struct usb2_com_softc sc_ucom; - struct usbd_xfer *sc_xfer[UARK_N_TRANSFER]; - struct usbd_device *sc_udev; + struct usb2_xfer *sc_xfer[UARK_N_TRANSFER]; + struct usb2_device *sc_udev; uint8_t sc_flags; #define UARK_FLAG_BULK_READ_STALL 0x01 @@ -83,23 +84,23 @@ static device_attach_t uark_attach; static device_detach_t uark_detach; -static usbd_callback_t uark_bulk_write_callback; -static usbd_callback_t uark_bulk_write_clear_stall_callback; -static usbd_callback_t uark_bulk_read_callback; -static usbd_callback_t uark_bulk_read_clear_stall_callback; +static usb2_callback_t uark_bulk_write_callback; +static usb2_callback_t uark_bulk_write_clear_stall_callback; +static usb2_callback_t uark_bulk_read_callback; +static usb2_callback_t uark_bulk_read_clear_stall_callback; -static void uark_start_read(struct ucom_softc *ucom); -static void uark_stop_read(struct ucom_softc *ucom); -static void uark_start_write(struct ucom_softc *ucom); -static void uark_stop_write(struct ucom_softc *ucom); +static void uark_start_read(struct usb2_com_softc *ucom); +static void uark_stop_read(struct usb2_com_softc *ucom); +static void uark_start_write(struct usb2_com_softc *ucom); +static void uark_stop_write(struct usb2_com_softc *ucom); -static int uark_pre_param(struct ucom_softc *ucom, struct termios *t); -static void uark_cfg_param(struct ucom_softc *ucom, struct termios *t); -static void uark_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr); -static void uark_cfg_set_break(struct ucom_softc *ucom, uint8_t onoff); +static int uark_pre_param(struct usb2_com_softc *ucom, struct termios *t); +static void uark_cfg_param(struct usb2_com_softc *ucom, struct termios *t); +static void uark_cfg_get_status(struct usb2_com_softc *ucom, uint8_t *lsr, uint8_t *msr); +static void uark_cfg_set_break(struct usb2_com_softc *ucom, uint8_t onoff); static void uark_cfg_write(struct uark_softc *sc, uint16_t index, uint16_t value); -static const struct usbd_config +static const struct usb2_config uark_xfer_config[UARK_N_TRANSFER] = { [0] = { @@ -124,7 +125,7 @@ .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, - .mh.bufsize = sizeof(usb_device_request_t), + .mh.bufsize = sizeof(struct usb2_device_request), .mh.flags = {}, .mh.callback = &uark_bulk_write_clear_stall_callback, .mh.timeout = 1000, /* 1 second */ @@ -135,7 +136,7 @@ .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, - .mh.bufsize = sizeof(usb_device_request_t), + .mh.bufsize = sizeof(struct usb2_device_request), .mh.flags = {}, .mh.callback = &uark_bulk_read_clear_stall_callback, .mh.timeout = 1000, /* 1 second */ @@ -143,15 +144,15 @@ }, }; -static const struct ucom_callback uark_callback = { - .ucom_cfg_get_status = &uark_cfg_get_status, - .ucom_cfg_set_break = &uark_cfg_set_break, - .ucom_cfg_param = &uark_cfg_param, - .ucom_pre_param = &uark_pre_param, - .ucom_start_read = &uark_start_read, - .ucom_stop_read = &uark_stop_read, - .ucom_start_write = &uark_start_write, - .ucom_stop_write = &uark_stop_write, +static const struct usb2_com_callback uark_callback = { + .usb2_com_cfg_get_status = &uark_cfg_get_status, + .usb2_com_cfg_set_break = &uark_cfg_set_break, + .usb2_com_cfg_param = &uark_cfg_param, + .usb2_com_pre_param = &uark_pre_param, + .usb2_com_start_read = &uark_start_read, + .usb2_com_stop_read = &uark_stop_read, + .usb2_com_start_write = &uark_start_write, + .usb2_com_stop_write = &uark_stop_write, }; static device_method_t uark_methods[] = { @@ -170,35 +171,35 @@ .size = sizeof(struct uark_softc), }; -DRIVER_MODULE(uark, uhub, uark_driver, uark_devclass, usbd_driver_load, 0); -MODULE_DEPEND(uark, usb, 1, 1, 1); +DRIVER_MODULE(uark, ushub, uark_driver, uark_devclass, NULL, 0); +MODULE_DEPEND(uark, usb2_core, 1, 1, 1); MODULE_DEPEND(uark, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER); -static const struct usb_devno uark_devs[] = { - {USB_VENDOR_ARKMICRO, USB_PRODUCT_ARKMICRO_ARK3116}, +static const struct usb2_device_id uark_devs[] = { + {USB_VPI(USB_VENDOR_ARKMICRO, USB_PRODUCT_ARKMICRO_ARK3116, 0)}, }; -#define uark_lookup(v, p) usb_lookup(uark_devs, v, p) - static int uark_probe(device_t dev) { - struct usb_attach_arg *uaa = device_get_ivars(dev); + struct usb2_attach_arg *uaa = device_get_ivars(dev); - if (uaa->usb_mode != USB_MODE_HOST) { - return (UMATCH_NONE); + if (uaa->usb2_mode != USB_MODE_HOST) { + return (ENXIO); + } + if (uaa->info.bConfigIndex != 0) { + return (ENXIO); } - if (uaa->iface) { - return (UMATCH_NONE); + if (uaa->info.bIfaceIndex != UARK_IFACE_INDEX) { + return (ENXIO); } - return (uark_lookup(uaa->vendor, uaa->product) ? - UMATCH_VENDOR_PRODUCT : UMATCH_NONE); + return (usb2_lookup_id_by_uaa(uark_devs, sizeof(uark_devs), uaa)); } static int uark_attach(device_t dev) { - struct usb_attach_arg *uaa = device_get_ivars(dev); + struct usb2_attach_arg *uaa = device_get_ivars(dev); struct uark_softc *sc = device_get_softc(dev); int32_t error; uint8_t iface_index; @@ -206,19 +207,12 @@ if (sc == NULL) { return (ENOMEM); } - usbd_set_device_desc(dev); + device_set_usb2_desc(dev); sc->sc_udev = uaa->device; - /* Move the device into the configured state */ - error = usbd_set_config_index(uaa->device, UARK_CONFIG_INDEX, 1); - if (error) { - device_printf(dev, "failed to set configuration, err=%s\n", - usbd_errstr(error)); - goto detach; - } iface_index = UARK_IFACE_INDEX; - error = usbd_transfer_setup + error = usb2_transfer_setup (uaa->device, &iface_index, sc->sc_xfer, uark_xfer_config, UARK_N_TRANSFER, sc, &Giant); @@ -231,10 +225,10 @@ sc->sc_flags |= (UARK_FLAG_BULK_WRITE_STALL | UARK_FLAG_BULK_READ_STALL); - error = ucom_attach(&(sc->sc_super_ucom), &(sc->sc_ucom), 1, sc, + error = usb2_com_attach(&(sc->sc_super_ucom), &(sc->sc_ucom), 1, sc, &uark_callback, &Giant); if (error) { - DPRINTF(sc, 0, "ucom_attach failed\n"); + DPRINTF(0, "usb2_com_attach failed\n"); goto detach; } return (0); /* success */ @@ -249,37 +243,37 @@ { struct uark_softc *sc = device_get_softc(dev); - ucom_detach(&(sc->sc_super_ucom), &(sc->sc_ucom), 1); + usb2_com_detach(&(sc->sc_super_ucom), &(sc->sc_ucom), 1); - usbd_transfer_unsetup(sc->sc_xfer, UARK_N_TRANSFER); + usb2_transfer_unsetup(sc->sc_xfer, UARK_N_TRANSFER); return (0); } static void -uark_bulk_write_callback(struct usbd_xfer *xfer) +uark_bulk_write_callback(struct usb2_xfer *xfer) { struct uark_softc *sc = xfer->priv_sc; uint32_t actlen; - switch (USBD_GET_STATE(xfer)) { - case USBD_ST_SETUP: - case USBD_ST_TRANSFERRED: + switch (USB_GET_STATE(xfer)) { + case USB_ST_SETUP: + case USB_ST_TRANSFERRED: if (sc->sc_flags & UARK_FLAG_BULK_WRITE_STALL) { - usbd_transfer_start(sc->sc_xfer[2]); + usb2_transfer_start(sc->sc_xfer[2]); return; } - if (ucom_get_data(&(sc->sc_ucom), xfer->frbuffers, 0, + if (usb2_com_get_data(&(sc->sc_ucom), xfer->frbuffers, 0, UARK_BUF_SIZE, &actlen)) { xfer->frlengths[0] = actlen; - usbd_start_hardware(xfer); + usb2_start_hardware(xfer); } return; default: /* Error */ - if (xfer->error != USBD_ERR_CANCELLED) { + if (xfer->error != USB_ERR_CANCELLED) { sc->sc_flags |= UARK_FLAG_BULK_WRITE_STALL; - usbd_transfer_start(sc->sc_xfer[2]); + usb2_transfer_start(sc->sc_xfer[2]); } return; @@ -287,42 +281,42 @@ } static void -uark_bulk_write_clear_stall_callback(struct usbd_xfer *xfer) +uark_bulk_write_clear_stall_callback(struct usb2_xfer *xfer) { struct uark_softc *sc = xfer->priv_sc; - struct usbd_xfer *xfer_other = sc->sc_xfer[0]; + struct usb2_xfer *xfer_other = sc->sc_xfer[0]; - if (usbd_clear_stall_callback(xfer, xfer_other)) { - DPRINTF(sc, 0, "stall cleared\n"); + if (usb2_clear_stall_callback(xfer, xfer_other)) { + DPRINTF(0, "stall cleared\n"); sc->sc_flags &= ~UARK_FLAG_BULK_WRITE_STALL; - usbd_transfer_start(xfer_other); + usb2_transfer_start(xfer_other); } return; } static void -uark_bulk_read_callback(struct usbd_xfer *xfer) +uark_bulk_read_callback(struct usb2_xfer *xfer) { struct uark_softc *sc = xfer->priv_sc; - switch (USBD_GET_STATE(xfer)) { - case USBD_ST_TRANSFERRED: - ucom_put_data(&(sc->sc_ucom), xfer->frbuffers, 0, + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + usb2_com_put_data(&(sc->sc_ucom), xfer->frbuffers, 0, xfer->actlen); - case USBD_ST_SETUP: + case USB_ST_SETUP: if (sc->sc_flags & UARK_FLAG_BULK_READ_STALL) { - usbd_transfer_start(sc->sc_xfer[3]); + usb2_transfer_start(sc->sc_xfer[3]); } else { xfer->frlengths[0] = xfer->max_data_length; - usbd_start_hardware(xfer); + usb2_start_hardware(xfer); } return; default: /* Error */ - if (xfer->error != USBD_ERR_CANCELLED) { + if (xfer->error != USB_ERR_CANCELLED) { sc->sc_flags |= UARK_FLAG_BULK_READ_STALL; - usbd_transfer_start(sc->sc_xfer[3]); + usb2_transfer_start(sc->sc_xfer[3]); } return; @@ -330,59 +324,59 @@ } static void -uark_bulk_read_clear_stall_callback(struct usbd_xfer *xfer) +uark_bulk_read_clear_stall_callback(struct usb2_xfer *xfer) { struct uark_softc *sc = xfer->priv_sc; - struct usbd_xfer *xfer_other = sc->sc_xfer[1]; + struct usb2_xfer *xfer_other = sc->sc_xfer[1]; - if (usbd_clear_stall_callback(xfer, xfer_other)) { - DPRINTF(sc, 0, "stall cleared\n"); + if (usb2_clear_stall_callback(xfer, xfer_other)) { + DPRINTF(0, "stall cleared\n"); sc->sc_flags &= ~UARK_FLAG_BULK_READ_STALL; - usbd_transfer_start(xfer_other); + usb2_transfer_start(xfer_other); } return; } static void -uark_start_read(struct ucom_softc *ucom) +uark_start_read(struct usb2_com_softc *ucom) { struct uark_softc *sc = ucom->sc_parent; - usbd_transfer_start(sc->sc_xfer[1]); + usb2_transfer_start(sc->sc_xfer[1]); return; } static void -uark_stop_read(struct ucom_softc *ucom) +uark_stop_read(struct usb2_com_softc *ucom) { struct uark_softc *sc = ucom->sc_parent; - usbd_transfer_stop(sc->sc_xfer[3]); - usbd_transfer_stop(sc->sc_xfer[1]); + usb2_transfer_stop(sc->sc_xfer[3]); + usb2_transfer_stop(sc->sc_xfer[1]); return; } static void -uark_start_write(struct ucom_softc *ucom) +uark_start_write(struct usb2_com_softc *ucom) { struct uark_softc *sc = ucom->sc_parent; - usbd_transfer_start(sc->sc_xfer[0]); + usb2_transfer_start(sc->sc_xfer[0]); return; } static void -uark_stop_write(struct ucom_softc *ucom) +uark_stop_write(struct usb2_com_softc *ucom) { struct uark_softc *sc = ucom->sc_parent; - usbd_transfer_stop(sc->sc_xfer[2]); - usbd_transfer_stop(sc->sc_xfer[0]); + usb2_transfer_stop(sc->sc_xfer[2]); + usb2_transfer_stop(sc->sc_xfer[0]); return; } static int -uark_pre_param(struct ucom_softc *ucom, struct termios *t) +uark_pre_param(struct usb2_com_softc *ucom, struct termios *t) { if ((t->c_ospeed < 300) || (t->c_ospeed > 115200)) return (EINVAL); @@ -390,7 +384,7 @@ } static void -uark_cfg_param(struct ucom_softc *ucom, struct termios *t) +uark_cfg_param(struct usb2_com_softc *ucom, struct termios *t) { struct uark_softc *sc = ucom->sc_parent; uint32_t speed = t->c_ospeed; @@ -441,7 +435,7 @@ } static void -uark_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr) +uark_cfg_get_status(struct usb2_com_softc *ucom, uint8_t *lsr, uint8_t *msr) { struct uark_softc *sc = ucom->sc_parent; @@ -451,11 +445,11 @@ } static void -uark_cfg_set_break(struct ucom_softc *ucom, uint8_t onoff) +uark_cfg_set_break(struct usb2_com_softc *ucom, uint8_t onoff) { struct uark_softc *sc = ucom->sc_parent; - DPRINTF(sc, 0, "onoff=%d\n", onoff); + DPRINTF(0, "onoff=%d\n", onoff); uark_cfg_write(sc, 4, onoff ? 0x01 : 0x00); return; @@ -464,10 +458,10 @@ static void uark_cfg_write(struct uark_softc *sc, uint16_t index, uint16_t value) { - usb_device_request_t req; - usbd_status_t err; + struct usb2_device_request req; + usb2_error_t err; - if (ucom_cfg_is_gone(&(sc->sc_ucom))) { + if (usb2_com_cfg_is_gone(&(sc->sc_ucom))) { return; } req.bmRequestType = UARK_WRITE; @@ -476,12 +470,12 @@ USETW(req.wIndex, index); USETW(req.wLength, 0); - err = usbd_do_request_flags + err = usb2_do_request_flags (sc->sc_udev, &Giant, &req, NULL, 0, NULL, 1000); if (err) { - DPRINTF(sc, -1, "device request failed, err=%s " - "(ignored)\n", usbd_errstr(err)); + DPRINTF(-1, "device request failed, err=%s " + "(ignored)\n", usb2_errstr(err)); } return; } ==== //depot/projects/usb/src/sys/dev/usb2/serial/ubsa2.c#2 (text+ko) ==== @@ -62,34 +62,31 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/termios.h> -#include <sys/serial.h> +#include <dev/usb2/include/usb2_devid.h> +#include <dev/usb2/include/usb2_standard.h> +#include <dev/usb2/include/usb2_mfunc.h> +#include <dev/usb2/include/usb2_error.h> +#include <dev/usb2/include/usb2_cdc.h> -#include <dev/usb/usb_port.h> -#include <dev/usb/usb.h> -#include <dev/usb/usb_subr.h> -#include <dev/usb/usb_quirks.h> -#include <dev/usb/usb_cdc.h> +#define USB_DEBUG_VAR ubsa_debug -#include <dev/usb/ucomvar.h> +#include <dev/usb2/core/usb2_core.h> +#include <dev/usb2/core/usb2_debug.h> +#include <dev/usb2/core/usb2_process.h> +#include <dev/usb2/core/usb2_config_td.h> +#include <dev/usb2/core/usb2_request.h> +#include <dev/usb2/core/usb2_lookup.h> +#include <dev/usb2/core/usb2_util.h> +#include <dev/usb2/core/usb2_busdma.h> -#include "usbdevs.h" +#include <dev/usb2/serial/usb2_serial.h> #ifdef USB_DEBUG -#define DPRINTF(n,fmt,...) \ - do { if (ubsa_debug > (n)) { \ - printf("%s: " fmt, __FUNCTION__,## __VA_ARGS__); } } while (0) - static int ubsa_debug = 0; -SYSCTL_NODE(_hw_usb, OID_AUTO, ubsa, CTLFLAG_RW, 0, "USB ubsa"); -SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, debug, CTLFLAG_RW, +SYSCTL_NODE(_hw_usb2, OID_AUTO, ubsa, CTLFLAG_RW, 0, "USB ubsa"); +SYSCTL_INT(_hw_usb2_ubsa, OID_AUTO, debug, CTLFLAG_RW, &ubsa_debug, 0, "ubsa debug level"); -#else -#define DPRINTF(...) do { } while (0) #endif #define UBSA_N_TRANSFER 6 /* units */ @@ -146,11 +143,11 @@ #define UBSA_MSR_DCTS 0x01 /* CTS has changed state */ struct ubsa_softc { - struct ucom_super_softc sc_super_ucom; - struct ucom_softc sc_ucom; + struct usb2_com_super_softc sc_super_ucom; + struct usb2_com_softc sc_ucom; - struct usbd_xfer *sc_xfer[UBSA_N_TRANSFER]; - struct usbd_device *sc_udev; + struct usb2_xfer *sc_xfer[UBSA_N_TRANSFER]; + struct usb2_device *sc_udev; uint16_t sc_flag; #define UBSA_FLAG_WRITE_STALL 0x0001 @@ -167,26 +164,26 @@ static device_attach_t ubsa_attach; static device_detach_t ubsa_detach; -static usbd_callback_t ubsa_write_callback; -static usbd_callback_t ubsa_write_clear_stall_callback; -static usbd_callback_t ubsa_read_callback; -static usbd_callback_t ubsa_read_clear_stall_callback; -static usbd_callback_t ubsa_intr_callback; -static usbd_callback_t ubsa_intr_clear_stall_callback; +static usb2_callback_t ubsa_write_callback; +static usb2_callback_t ubsa_write_clear_stall_callback; +static usb2_callback_t ubsa_read_callback; +static usb2_callback_t ubsa_read_clear_stall_callback; +static usb2_callback_t ubsa_intr_callback; +static usb2_callback_t ubsa_intr_clear_stall_callback; static void ubsa_cfg_request(struct ubsa_softc *sc, uint8_t index, uint16_t value); -static void ubsa_cfg_set_dtr(struct ucom_softc *ucom, uint8_t onoff); -static void ubsa_cfg_set_rts(struct ucom_softc *ucom, uint8_t onoff); -static void ubsa_cfg_set_break(struct ucom_softc *ucom, uint8_t onoff); -static int ubsa_pre_param(struct ucom_softc *ucom, struct termios *t); -static void ubsa_cfg_param(struct ucom_softc *ucom, struct termios *t); -static void ubsa_start_read(struct ucom_softc *ucom); -static void ubsa_stop_read(struct ucom_softc *ucom); -static void ubsa_start_write(struct ucom_softc *ucom); -static void ubsa_stop_write(struct ucom_softc *ucom); -static void ubsa_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr); +static void ubsa_cfg_set_dtr(struct usb2_com_softc *ucom, uint8_t onoff); +static void ubsa_cfg_set_rts(struct usb2_com_softc *ucom, uint8_t onoff); +static void ubsa_cfg_set_break(struct usb2_com_softc *ucom, uint8_t onoff); +static int ubsa_pre_param(struct usb2_com_softc *ucom, struct termios *t); +static void ubsa_cfg_param(struct usb2_com_softc *ucom, struct termios *t); +static void ubsa_start_read(struct usb2_com_softc *ucom); +static void ubsa_stop_read(struct usb2_com_softc *ucom); +static void ubsa_start_write(struct usb2_com_softc *ucom); +static void ubsa_stop_write(struct usb2_com_softc *ucom); +static void ubsa_cfg_get_status(struct usb2_com_softc *ucom, uint8_t *lsr, uint8_t *msr); -static const struct usbd_config ubsa_config[UBSA_N_TRANSFER] = { +static const struct usb2_config ubsa_config[UBSA_N_TRANSFER] = { [0] = { .type = UE_BULK, @@ -210,7 +207,7 @@ .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, - .mh.bufsize = sizeof(usb_device_request_t), + .mh.bufsize = sizeof(struct usb2_device_request), .mh.callback = &ubsa_write_clear_stall_callback, .mh.timeout = 1000, /* 1 second */ .mh.interval = 50, /* 50ms */ @@ -220,7 +217,7 @@ .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, - .mh.bufsize = sizeof(usb_device_request_t), + .mh.bufsize = sizeof(struct usb2_device_request), .mh.callback = &ubsa_read_clear_stall_callback, .mh.timeout = 1000, /* 1 second */ .mh.interval = 50, /* 50ms */ @@ -239,69 +236,63 @@ .type = UE_CONTROL, .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, - .mh.bufsize = sizeof(usb_device_request_t), + .mh.bufsize = sizeof(struct usb2_device_request), .mh.callback = &ubsa_intr_clear_stall_callback, .mh.timeout = 1000, /* 1 second */ .mh.interval = 50, /* 50ms */ }, }; -static const struct ucom_callback ubsa_callback = { - .ucom_cfg_get_status = &ubsa_cfg_get_status, - .ucom_cfg_set_dtr = &ubsa_cfg_set_dtr, - .ucom_cfg_set_rts = &ubsa_cfg_set_rts, - .ucom_cfg_set_break = &ubsa_cfg_set_break, - .ucom_cfg_param = &ubsa_cfg_param, - .ucom_pre_param = &ubsa_pre_param, - .ucom_start_read = &ubsa_start_read, - .ucom_stop_read = &ubsa_stop_read, - .ucom_start_write = &ubsa_start_write, - .ucom_stop_write = &ubsa_stop_write, +static const struct usb2_com_callback ubsa_callback = { + .usb2_com_cfg_get_status = &ubsa_cfg_get_status, + .usb2_com_cfg_set_dtr = &ubsa_cfg_set_dtr, + .usb2_com_cfg_set_rts = &ubsa_cfg_set_rts, + .usb2_com_cfg_set_break = &ubsa_cfg_set_break, + .usb2_com_cfg_param = &ubsa_cfg_param, + .usb2_com_pre_param = &ubsa_pre_param, + .usb2_com_start_read = &ubsa_start_read, + .usb2_com_stop_read = &ubsa_stop_read, + .usb2_com_start_write = &ubsa_start_write, + .usb2_com_stop_write = &ubsa_stop_write, }; -struct ubsa_product { - uint16_t vendor; - uint16_t product; -}; - -static const struct ubsa_product ubsa_products[] = { +static const struct usb2_device_id ubsa_devs[] = { /* AnyData ADU-500A */ - {USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_500A}, + {USB_VPI(USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_500A, 0)}, /* AnyData ADU-E100A/H */ - {USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_E100X}, + {USB_VPI(USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_E100X, 0)}, /* Axesstel MV100H */ - {USB_VENDOR_AXESSTEL, USB_PRODUCT_AXESSTEL_DATAMODEM}, + {USB_VPI(USB_VENDOR_AXESSTEL, USB_PRODUCT_AXESSTEL_DATAMODEM, 0)}, /* BELKIN F5U103 */ - {USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U103}, + {USB_VPI(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U103, 0)}, /* BELKIN F5U120 */ - {USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U120}, + {USB_VPI(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U120, 0)}, /* GoHubs GO-COM232 */ - {USB_VENDOR_ETEK, USB_PRODUCT_ETEK_1COM}, + {USB_VPI(USB_VENDOR_ETEK, USB_PRODUCT_ETEK_1COM, 0)}, /* GoHubs GO-COM232 */ - {USB_VENDOR_GOHUBS, USB_PRODUCT_GOHUBS_GOCOM232}, + {USB_VPI(USB_VENDOR_GOHUBS, USB_PRODUCT_GOHUBS_GOCOM232, 0)}, /* Peracom */ - {USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_SERIAL1}, + {USB_VPI(USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_SERIAL1, 0)}, /* Novatel Wireless Merlin cards */ - {USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U740}, + {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U740, 0)}, /* Dell version of the above */ - {USB_VENDOR_DELL, USB_PRODUCT_DELL_U740}, + {USB_VPI(USB_VENDOR_DELL, USB_PRODUCT_DELL_U740, 0)}, /* Novatel Wireless Merlin v740 */ - {USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_V740}, + {USB_VPI(USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_V740, 0)}, /* Option Vodafone MC3G */ - {USB_VENDOR_OPTION, USB_PRODUCT_OPTION_VODAFONEMC3G}, + {USB_VPI(USB_VENDOR_OPTION, USB_PRODUCT_OPTION_VODAFONEMC3G, 0)}, /* Option GlobeTrotter 3G */ - {USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3G}, + {USB_VPI(USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3G, 0)}, /* Option GlobeTrotter 3G+ */ - {USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3GPLUS}, + {USB_VPI(USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3GPLUS, 0)}, /* Option GlobeTrotter Max 3.6 */ - {USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GTMAX36}, + {USB_VPI(USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GTMAX36, 0)}, /* Option GlobeTrotter 3G QUAD */ - {USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3GQUAD}, + {USB_VPI(USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3GQUAD, 0)}, /* Huawei Mobile */ - {USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_MOBILE}, + {USB_VPI(USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_MOBILE, 0)}, /* Qualcomm, Inc. ZTE CDMA */ - {USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_CDMA_MSM}, - {0, 0} + {USB_VPI(USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_CDMA_MSM, 0)}, }; static device_method_t ubsa_methods[] = { @@ -319,39 +310,32 @@ .size = sizeof(struct ubsa_softc), }; -DRIVER_MODULE(ubsa, uhub, ubsa_driver, ubsa_devclass, usbd_driver_load, 0); -MODULE_DEPEND(ubsa, usb, 1, 1, 1); +DRIVER_MODULE(ubsa, ushub, ubsa_driver, ubsa_devclass, NULL, 0); +MODULE_DEPEND(ubsa, usb2_core, 1, 1, 1); MODULE_DEPEND(ubsa, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER); static int ubsa_probe(device_t dev) { - struct usb_attach_arg *uaa = device_get_ivars(dev); - const struct ubsa_product *up = ubsa_products; + struct usb2_attach_arg *uaa = device_get_ivars(dev); - if (uaa->usb_mode != USB_MODE_HOST) { - return (UMATCH_NONE); + if (uaa->usb2_mode != USB_MODE_HOST) { + return (ENXIO); } - if (uaa->iface) { - return (UMATCH_NONE); + if (uaa->info.bConfigIndex != UBSA_CONFIG_INDEX) { + return (ENXIO); } - while (up->vendor) { - if ((up->vendor == uaa->vendor) && - (up->product == uaa->product)) { - return (UMATCH_VENDOR_PRODUCT); - } - up++; + if (uaa->info.bIfaceIndex != UBSA_IFACE_INDEX) { + return (ENXIO); } - return (UMATCH_NONE); + return (usb2_lookup_id_by_uaa(ubsa_devs, sizeof(ubsa_devs), uaa)); } static int ubsa_attach(device_t dev) { - struct usb_attach_arg *uaa = device_get_ivars(dev); + struct usb2_attach_arg *uaa = device_get_ivars(dev); struct ubsa_softc *sc = device_get_softc(dev); - struct usbd_interface *iface; - usb_interface_descriptor_t *id; int error; DPRINTF(0, "sc=%p\n", sc); @@ -359,35 +343,13 @@ if (sc == NULL) { return (ENOMEM); } - usbd_set_device_desc(dev); + device_set_usb2_desc(dev); sc->sc_udev = uaa->device; - - /* configure the device */ - - error = usbd_set_config_index(uaa->device, UBSA_CONFIG_INDEX, 1); - - if (error) { - DPRINTF(0, "failed to set configuration, error=%s\n", - usbd_errstr(error)); - goto detach; - } - iface = usbd_get_iface(uaa->device, UBSA_IFACE_INDEX); - - if (iface == NULL) { - DPRINTF(0, "no interface\n"); - goto detach; - } - id = usbd_get_interface_descriptor(iface); - - if (id == NULL) { - DPRINTF(0, "no interface descriptor\n"); - goto detach; - } - sc->sc_iface_no = id->bInterfaceNumber; + sc->sc_iface_no = uaa->info.bIfaceNum; sc->sc_iface_index = UBSA_IFACE_INDEX; - error = usbd_transfer_setup(uaa->device, &(sc->sc_iface_index), + error = usb2_transfer_setup(uaa->device, &(sc->sc_iface_index), sc->sc_xfer, ubsa_config, UBSA_N_TRANSFER, sc, &Giant); if (error) { @@ -398,10 +360,10 @@ sc->sc_flag |= (UBSA_FLAG_WRITE_STALL | UBSA_FLAG_READ_STALL); - error = ucom_attach(&(sc->sc_super_ucom), &(sc->sc_ucom), 1, sc, + error = usb2_com_attach(&(sc->sc_super_ucom), &(sc->sc_ucom), 1, sc, &ubsa_callback, &Giant); if (error) { - DPRINTF(0, "ucom_attach failed\n"); + DPRINTF(0, "usb2_com_attach failed\n"); goto detach; } return (0); @@ -418,9 +380,9 @@ DPRINTF(0, "sc=%p\n", sc); - ucom_detach(&(sc->sc_super_ucom), &(sc->sc_ucom), 1); + usb2_com_detach(&(sc->sc_super_ucom), &(sc->sc_ucom), 1); - usbd_transfer_unsetup(sc->sc_xfer, UBSA_N_TRANSFER); + usb2_transfer_unsetup(sc->sc_xfer, UBSA_N_TRANSFER); return (0); } @@ -428,10 +390,10 @@ static void ubsa_cfg_request(struct ubsa_softc *sc, uint8_t index, uint16_t value) { - usb_device_request_t req; - usbd_status_t err; + struct usb2_device_request req; + usb2_error_t err; - if (ucom_cfg_is_gone(&(sc->sc_ucom))) { + if (usb2_com_cfg_is_gone(&(sc->sc_ucom))) { return; } req.bmRequestType = UT_WRITE_VENDOR_DEVICE; @@ -441,18 +403,18 @@ req.wIndex[1] = 0; USETW(req.wLength, 0); - err = usbd_do_request_flags + err = usb2_do_request_flags (sc->sc_udev, &Giant, &req, NULL, 0, NULL, 1000); if (err) { DPRINTF(-1, "device request failed, err=%s " - "(ignored)\n", usbd_errstr(err)); + "(ignored)\n", usb2_errstr(err)); } return; } static void -ubsa_cfg_set_dtr(struct ucom_softc *ucom, uint8_t onoff) +ubsa_cfg_set_dtr(struct usb2_com_softc *ucom, uint8_t onoff) { struct ubsa_softc *sc = ucom->sc_parent; @@ -463,7 +425,7 @@ } static void -ubsa_cfg_set_rts(struct ucom_softc *ucom, uint8_t onoff) +ubsa_cfg_set_rts(struct usb2_com_softc *ucom, uint8_t onoff) { struct ubsa_softc *sc = ucom->sc_parent; @@ -474,7 +436,7 @@ } static void -ubsa_cfg_set_break(struct ucom_softc *ucom, uint8_t onoff) +ubsa_cfg_set_break(struct usb2_com_softc *ucom, uint8_t onoff) { struct ubsa_softc *sc = ucom->sc_parent; @@ -485,7 +447,7 @@ } static int -ubsa_pre_param(struct ucom_softc *ucom, struct termios *t) +ubsa_pre_param(struct usb2_com_softc *ucom, struct termios *t) { struct ubsa_softc *sc = ucom->sc_parent; @@ -512,7 +474,7 @@ } static void >>> TRUNCATED FOR MAIL (1000 lines) <<<help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200807021906.m62J6l3H083820>
