summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorticso <ticso@FreeBSD.org>2005-03-17 22:47:18 +0000
committerticso <ticso@FreeBSD.org>2005-03-17 22:47:18 +0000
commit691cfe03b0fed3d2740cc54e4c470b81134041f7 (patch)
treedc0e6552c9ead5536895e0fc1515f6830bf383ee
parent4e0061357a3e770220c7fb5da320e3a0940d0248 (diff)
downloadFreeBSD-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.c52
-rw-r--r--sys/dev/usb/ubser.h2
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
OpenPOWER on IntegriCloud