PERFORCE change 157145 for review

Hans Petter Selasky hselasky at FreeBSD.org
Wed Feb 4 09:29:40 PST 2009


http://perforce.freebsd.org/chv.cgi?CH=157145

Change 157145 by hselasky at hselasky_laptop001 on 2009/02/04 17:28:49

	
	USB serial patches.
	
	Fix multiport modem naming scheme, so that modems
	are named /dev/cuaU%u.%u when there is more than
	one port.
	
	Update U3G driver to put all modems into the same
	interface, and make the other interfaces slave
	interfaces. This affects the naming scheme.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb2/serial/u3g2.c#11 edit
.. //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.c#26 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb2/serial/u3g2.c#11 (text+ko) ====

@@ -98,11 +98,8 @@
 	struct usb2_xfer *sc_xfer[U3G_MAXPORTS][U3G_N_TRANSFER];
 	struct usb2_device *sc_udev;
 
-	uint8_t	sc_iface_no;		/* interface number */
-	uint8_t	sc_iface_index;		/* interface index */
 	uint8_t	sc_lsr;			/* local status register */
 	uint8_t	sc_msr;			/* U3G status register */
-	struct u3g_speeds_s sc_speed;
 	uint8_t	sc_numports;
 };
 
@@ -148,6 +145,7 @@
 	.usb2_com_stop_write = &u3g_stop_write,
 };
 
+#if 0
 static const struct u3g_speeds_s u3g_speeds[U3GSP_MAX] = {
 	[U3GSP_GPRS] = {64000, 64000},
 	[U3GSP_EDGE] = {384000, 64000},
@@ -157,6 +155,7 @@
 	[U3GSP_HSUPA] = {1200000, 384000},
 	[U3GSP_HSPA] = {7200000, 384000},
 };
+#endif
 
 static device_method_t u3g_methods[] = {
 	DEVMETHOD(device_probe, u3g_probe),
@@ -385,8 +384,12 @@
 	struct usb2_config u3g_config_tmp[U3G_N_TRANSFER];
 	struct usb2_attach_arg *uaa = device_get_ivars(dev);
 	struct u3g_softc *sc = device_get_softc(dev);
+	struct usb2_interface *iface;
+	struct usb2_interface_descriptor *id;
+	uint8_t m;
 	uint8_t n;
-	uint8_t m;
+	uint8_t i;
+	uint8_t x;
 	int error;
 
 	DPRINTF("sc=%p\n", sc);
@@ -398,30 +401,56 @@
 	device_set_usb2_desc(dev);
 
 	sc->sc_udev = uaa->device;
-	sc->sc_iface_no = uaa->info.bIfaceNum;
-	sc->sc_iface_index = uaa->info.bIfaceIndex;
-	sc->sc_speed = u3g_speeds[U3G_GET_SPEED(uaa)];
+
+	x = 0;		/* interface index */
+	i = 0;		/* endpoint index */
+	m = 0;		/* number of ports */
 
-	for (m = 0; m != U3G_MAXPORTS; m++) {
+	while (m != U3G_MAXPORTS) {
 
 		/* update BULK endpoint index */
 		for (n = 0; n != U3G_N_TRANSFER; n++) 
-			u3g_config_tmp[n].ep_index = m;
+			u3g_config_tmp[n].ep_index = i;
+
+		iface = usb2_get_iface(uaa->device, x);
+		if (iface == NULL) {
+			if (m != 0)
+				break;	/* end of interfaces */
+			DPRINTF("did not find any modem endpoints\n");
+			goto detach;
+		}
+
+		id = usb2_get_interface_descriptor(iface);
+		if ((id == NULL) || 
+		    (id->bInterfaceClass != UICLASS_VENDOR)) {
+			/* next interface */
+			x++;
+			i = 0;
+			continue;
+		}
 
 		/* try to allocate a set of BULK endpoints */
-		error = usb2_transfer_setup(uaa->device, &sc->sc_iface_index,
+		error = usb2_transfer_setup(uaa->device, &x,
 		    sc->sc_xfer[m], u3g_config_tmp, U3G_N_TRANSFER, 
 		    &sc->sc_ucom[m], &Giant);
-
 		if (error) {
-			if (m != 0)
-				break;	/* end of endpoints */
-			DPRINTF("could not allocate all pipes\n");
-			goto detach;
+			/* next interface */
+			x++;
+			i = 0;
+			continue;
 		}
+
+		/* grab other interface, if any */
+                if (x != uaa->info.bIfaceIndex)
+                        usb2_set_parent_iface(uaa->device, x,
+                            uaa->info.bIfaceIndex);
+
 		/* set stall by default */
 		usb2_transfer_set_stall(sc->sc_xfer[m][U3G_BULK_WR]);
 		usb2_transfer_set_stall(sc->sc_xfer[m][U3G_BULK_RD]);
+
+		m++;	/* found one port */
+		i++;	/* next endpoint index */
 	}
 
 	sc->sc_numports = m;

==== //depot/projects/usb/src/sys/dev/usb2/serial/usb2_serial.c#26 (text+ko) ====

@@ -101,7 +101,7 @@
 
 static uint8_t	usb2_com_units_alloc(uint32_t, uint32_t *);
 static void	usb2_com_units_free(uint32_t, uint32_t);
-static int	usb2_com_attach_tty(struct usb2_com_softc *);
+static int	usb2_com_attach_tty(struct usb2_com_softc *, uint32_t);
 static void	usb2_com_detach_tty(struct usb2_com_softc *);
 static void	usb2_com_queue_command(struct usb2_com_softc *,
 		    usb2_proc_callback_t *, struct termios *pt,
@@ -249,7 +249,7 @@
 		sc->sc_parent = parent;
 		sc->sc_callback = callback;
 
-		error = usb2_com_attach_tty(sc);
+		error = usb2_com_attach_tty(sc, sub_units);
 		if (error) {
 			usb2_com_detach(ssc, sc - n, n);
 			usb2_com_units_free(root_unit + n, sub_units - n);
@@ -287,7 +287,7 @@
 }
 
 static int
-usb2_com_attach_tty(struct usb2_com_softc *sc)
+usb2_com_attach_tty(struct usb2_com_softc *sc, uint32_t sub_units)
 {
 	struct tty *tp;
 	int error = 0;
@@ -309,8 +309,18 @@
 	}
 	if (buf[0] == 0) {
 		/* Use default TTY name */
-		if (snprintf(buf, sizeof(buf), "U%u", sc->sc_unit)) {
-			/* ignore */
+		if (sub_units > 1) {
+			/* multiple modems in one */
+			if (snprintf(buf, sizeof(buf), "U%u.%u",
+			    sc->sc_unit - sc->sc_local_unit,
+			    sc->sc_local_unit)) {
+				/* ignore */
+			}
+		} else {
+			/* single modem */
+			if (snprintf(buf, sizeof(buf), "U%u", sc->sc_unit)) {
+				/* ignore */
+			}
 		}
 	}
 	tty_makedev(tp, NULL, "%s", buf);


More information about the p4-projects mailing list