diff options
author | ticso <ticso@FreeBSD.org> | 2005-03-17 22:47:18 +0000 |
---|---|---|
committer | ticso <ticso@FreeBSD.org> | 2005-03-17 22:47:18 +0000 |
commit | 691cfe03b0fed3d2740cc54e4c470b81134041f7 (patch) | |
tree | dc0e6552c9ead5536895e0fc1515f6830bf383ee | |
parent | 4e0061357a3e770220c7fb5da320e3a0940d0248 (diff) | |
download | FreeBSD-src-691cfe03b0fed3d2740cc54e4c470b81134041f7.zip FreeBSD-src-691cfe03b0fed3d2740cc54e4c470b81134041f7.tar.gz |
initialize pp->p_sc so it can be referenced later.
dynamicaly allocate the per port array.
allow up to 32 serials per USB device.
ask the device for correct pipe sizes.
-rw-r--r-- | sys/dev/usb/ubser.c | 52 | ||||
-rw-r--r-- | sys/dev/usb/ubser.h | 2 |
2 files changed, 34 insertions, 20 deletions
diff --git a/sys/dev/usb/ubser.c b/sys/dev/usb/ubser.c index ab2017b..8158f47 100644 --- a/sys/dev/usb/ubser.c +++ b/sys/dev/usb/ubser.c @@ -161,8 +161,7 @@ struct ubser_softc { u_int sc_opkthdrlen; /* header length of output packet */ - struct ubser_port sc_port[8]; - + struct ubser_port *sc_port; }; Static int ubserparam(struct tty *, struct termios *); @@ -242,6 +241,8 @@ USB_ATTACH(ubser) sc->sc_udev = udev = uaa->device; sc->sc_iface = uaa->iface; + sc->sc_numser = 0; + sc->sc_port = NULL; /* get interface index */ id = usbd_get_interface_descriptor(uaa->iface); @@ -260,7 +261,7 @@ USB_ATTACH(ubser) err = usbd_do_request_flags(udev, &req, &sc->sc_numser, USBD_SHORT_XFER_OK, &alen, USBD_DEFAULT_TIMEOUT); if (err) { - printf("%s: cannot get number of serials\n", + printf("%s: failed to get number of serials\n", USBDEVNAME(sc->sc_dev)); goto bad; } else if (alen != 1) { @@ -268,14 +269,12 @@ USB_ATTACH(ubser) USBDEVNAME(sc->sc_dev)); goto bad; } - if (sc->sc_numser > 8) - sc->sc_numser = 8; + if (sc->sc_numser > MAX_SER) + sc->sc_numser = MAX_SER; printf("%s: found %i serials\n", USBDEVNAME(sc->sc_dev), sc->sc_numser); - sc->sc_ibufsize = 7; - sc->sc_ibufsizepad = 8; - sc->sc_obufsize = 7; - sc->sc_opkthdrlen = 1; + sc->sc_port = malloc(sizeof(*sc->sc_port) * sc->sc_numser, + M_USBDEV, M_WAITOK); /* find our bulk endpoints */ epcount = 0; @@ -292,16 +291,20 @@ USB_ATTACH(ubser) if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { sc->sc_bulkin_no = ed->bEndpointAddress; + sc->sc_ibufsizepad = UGETW(ed->wMaxPacketSize); + sc->sc_ibufsizepad = UGETW(ed->wMaxPacketSize) - 1; } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT && UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { sc->sc_bulkout_no = ed->bEndpointAddress; + sc->sc_obufsize = UGETW(ed->wMaxPacketSize) - 1; + sc->sc_opkthdrlen = 1; } } if (sc->sc_bulkin_no == -1 || sc->sc_bulkout_no == -1) { printf("%s: could not find bulk in/out endpoint\n", USBDEVNAME(sc->sc_dev)); sc->sc_dying = 1; - USB_ATTACH_ERROR_RETURN; + goto bad; } /* Open the bulk pipes */ @@ -324,7 +327,7 @@ USB_ATTACH(ubser) goto fail_1; } - /* Allocate a request and an input buffer and start reading. */ + /* Allocate a request and an input buffer */ sc->sc_ixfer = usbd_alloc_xfer(sc->sc_udev); if (sc->sc_ixfer == NULL) { goto fail_2; @@ -339,6 +342,7 @@ USB_ATTACH(ubser) for (i = 0; i < sc->sc_numser; i++) { pp = &sc->sc_port[i]; pp->p_port = i; + pp->p_sc = sc; tp = pp->p_tty = ttyalloc(); tp->t_sc = pp; DPRINTF(("ubser_attach: tty_attach tp = %p\n", tp)); @@ -353,7 +357,7 @@ USB_ATTACH(ubser) } - for (i = 0; i < 8; i++) { + for (i = 0; i < sc->sc_numser; i++) { sc->sc_port[i].p_oxfer = NULL; sc->sc_port[i].p_obuf = NULL; } @@ -398,10 +402,14 @@ fail_0: bad: ubser_cleanup(sc); - for (i = 0; i < 8; i++) { - pp = &sc->sc_port[i]; - if (pp->p_tty != NULL) - ttyfree(pp->p_tty); + if (sc->sc_port != NULL) { + for (i = 0; i < sc->sc_numser; i++) { + pp = &sc->sc_port[i]; + if (pp->p_tty != NULL) + ttyfree(pp->p_tty); + } + free(sc->sc_port, M_USBDEV); + sc->sc_port = NULL; } DPRINTF(("ubser_attach: ATTACH ERROR\n")); @@ -430,10 +438,14 @@ USB_DETACH(ubser) if (sc->sc_bulkout_pipe != NULL) usbd_abort_pipe(sc->sc_bulkout_pipe); - for (i = 0; i < sc->sc_numser; i++) { - pp = &sc->sc_port[i]; - if (pp->p_tty != NULL) - ttyfree(pp->p_tty); + if (sc->sc_port != NULL) { + for (i = 0; i < sc->sc_numser; i++) { + pp = &sc->sc_port[i]; + if (pp->p_tty != NULL) + ttyfree(pp->p_tty); + } + free(sc->sc_port, M_USBDEV); + sc->sc_port = NULL; } s = splusb(); diff --git a/sys/dev/usb/ubser.h b/sys/dev/usb/ubser.h index 45c7ec5..f256d4a 100644 --- a/sys/dev/usb/ubser.h +++ b/sys/dev/usb/ubser.h @@ -33,6 +33,8 @@ #ifndef UBSER_H #define UBSER_H +#define MAX_SER 32 + /* Vendor Interface Requests */ #define VENDOR_GET_NUMSER 0x01 #define VENDOR_SET_BREAK 0x02 |