Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Apr 2010 19:43:17 +0000 (UTC)
From:      Nick Hibma <n_hibma@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r206561 - stable/7/sys/dev/usb
Message-ID:  <201004131943.o3DJhHJm046058@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: n_hibma
Date: Tue Apr 13 19:43:16 2010
New Revision: 206561
URL: http://svn.freebsd.org/changeset/base/206561

Log:
  Make the list of allocated ports dynamic. The Option GTM382 has 10
  serial ports (yes, 10, it has a built in GPS and other stuff) and we
  need to access the last one for PPP access to the card. Other ports
  are HSO (Option specific protocol; see Linux driver).
  
  Reviewed by:	thompsa

Modified:
  stable/7/sys/dev/usb/u3g.c

Modified: stable/7/sys/dev/usb/u3g.c
==============================================================================
--- stable/7/sys/dev/usb/u3g.c	Tue Apr 13 18:53:39 2010	(r206560)
+++ stable/7/sys/dev/usb/u3g.c	Tue Apr 13 19:43:16 2010	(r206561)
@@ -58,10 +58,8 @@ SYSCTL_INT(_hw_usb_u3g, OID_AUTO, debug,
 	   &u3gdebug, 0, "u3g debug level");
 #define DPRINTF(x...)		if (u3gdebug) device_printf(sc->sc_dev, ##x)
 
-#define U3G_MAXPORTS		6
-
 struct u3g_softc {
-	struct ucom_softc	sc_ucom[U3G_MAXPORTS];
+	struct ucom_softc	*sc_ucom;
 	device_t		sc_dev;
 	usbd_device_handle	sc_udev;
 	u_int8_t		sc_speed;
@@ -254,9 +252,8 @@ u3g_attach(device_t self)
 	sc->sc_init = u3g_dev_type->init;
 	sc->sc_speed = u3g_dev_type->speed;
 
-	sprintf(devnamefmt,"U%d.%%d", device_get_unit(self));
 	int portno = 0;
-	for (i = 0; i < uaa->nifaces && portno < U3G_MAXPORTS; i++) {
+	for (i = 0; i < uaa->nifaces; i++) {
 		DPRINTF("Interface %d of %d, %sin use\n",
 			i, uaa->nifaces,
 			(uaa->ifaces[i]? "not ":""));
@@ -279,7 +276,7 @@ u3g_attach(device_t self)
 
 		int bulkin_no = -1, bulkout_no = -1;
 		int claim_iface = 0;
-		for (n = 0; n < id->bNumEndpoints && portno < U3G_MAXPORTS; n++) {
+		for (n = 0; n < id->bNumEndpoints; n++) {
 			ed = usbd_interface2endpoint_descriptor(uaa->ifaces[i], n);
 			DPRINTF(" Endpoint %d of %d%s\n",
 				n, id->bNumEndpoints,
@@ -298,6 +295,7 @@ u3g_attach(device_t self)
 			 * the bulk-in and bulk-out endpoints appear in pairs.
 			 */
 			if (bulkin_no != -1 && bulkout_no != -1) {
+				sc->sc_ucom = realloc(sc->sc_ucom, (portno+1)*sizeof(struct ucom_softc), M_USBDEV, M_WAITOK);
 				struct ucom_softc *ucom = &sc->sc_ucom[portno];
 
 				ucom->sc_dev = self;
@@ -318,13 +316,6 @@ u3g_attach(device_t self)
 					 portno, i,
 					 ucom->sc_bulkin_no,
 					 ucom->sc_bulkout_no);
-#if __FreeBSD_version < 700000
-				ucom_attach_tty(ucom, MINOR_CALLOUT, devnamefmt, portno);
-#elif __FreeBSD_version < 800000
-				ucom_attach_tty(ucom, TS_CALLOUT, devnamefmt, portno);
-#else
-				ucom_attach_tty(ucom, devnamefmt, portno);
-#endif
 
 				claim_iface = 1;
 				portno++;
@@ -336,6 +327,19 @@ u3g_attach(device_t self)
 	}
 	sc->sc_numports = portno;
 
+	sprintf(devnamefmt,"U%d.%%d", device_get_unit(self));
+	for (portno = 0; portno < sc->sc_numports; portno++) {
+	    struct ucom_softc *ucom = &sc->sc_ucom[portno];
+
+#if __FreeBSD_version < 700000
+	    ucom_attach_tty(ucom, MINOR_CALLOUT, devnamefmt, portno);
+#elif __FreeBSD_version < 800000
+	    ucom_attach_tty(ucom, TS_CALLOUT, devnamefmt, portno);
+#else
+	    ucom_attach_tty(ucom, devnamefmt, portno);
+#endif
+	}
+
 	device_printf(self, "configured %d serial ports (%s)\n",
 		      sc->sc_numports, devnamefmt);
 	return 0;
@@ -357,6 +361,9 @@ u3g_detach(device_t self)
 		}
 	}
 
+	if (sc->sc_ucom)
+	    free(sc->sc_ucom, M_USBDEV);
+
 	return 0;
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004131943.o3DJhHJm046058>