usb/119227: ubsa buffer

Jindrich Fucik fulda at seznam.cz
Tue Jan 1 05:30:01 PST 2008


>Number:         119227
>Category:       usb
>Synopsis:       ubsa buffer
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-usb
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          update
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jan 01 13:30:00 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     Jindrich Fucik
>Release:        6.2-RELEASE*
>Organization:
home user
>Environment:
6.2-RELEASE* on i386 and amd64
>Description:
For some modems using qualcomm MSM chipset (tested on AnyDATA ADU-E100) need bigger input and output buffer for enabling full speed (<256kbps)

Following patch adding properties hw.usb.ubsa.ibufsize and hw.usb.ubsa.obufsize for tuning this buffers.


>How-To-Repeat:

>Fix:


Patch attached with submission follows:

--- ubsa.c.orig	Tue Oct 16 11:04:46 2007
+++ ubsa.c	Tue Oct 16 11:05:11 2007
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/usb/ubsa.c,v 1.17 2005/01/06 01:43:28 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/usb/ubsa.c,v 1.25 2007/06/09 06:39:43 imp Exp $");
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -93,11 +93,9 @@
 
 #include <dev/usb/ucomvar.h>
 
-#ifdef USB_DEBUG
-Static int	ubsadebug = 0;
 SYSCTL_NODE(_hw_usb, OID_AUTO, ubsa, CTLFLAG_RW, 0, "USB ubsa");
-SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, debug, CTLFLAG_RW,
-	   &ubsadebug, 0, "ubsa debug level");
+
+#ifdef USB_DEBUG
 
 #define	DPRINTFN(n, x)	do { \
 				if (ubsadebug > (n)) \
@@ -106,6 +104,19 @@
 #else
 #define	DPRINTFN(n, x)
 #endif
+Static int ubsadebug = 0;
+SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, debug, CTLFLAG_RW,
+   &ubsadebug, 0, "ubsa debug level");
+int ubsaibufsize = 4096;
+int ubsaobufsize = 256;
+TUNABLE_INT("hw.usb.ubsa.ibufsize", &ubsaibufsize);
+TUNABLE_INT("hw.usb.ubsa.obufsize", &ubsaobufsize);
+SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, ibufsize, CTLFLAG_RD,
+   &ubsaibufsize, 0, "ubsa input packet length");
+SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, obufsize, CTLFLAG_RD,
+   &ubsaobufsize, 0, "ubsa output packet length");
+#define UBSAIBUFSIZE (ubsaibufsize)
+#define UBSAOBUFSIZE (ubsaobufsize)
 #define	DPRINTF(x) DPRINTFN(0, x)
 
 #define	UBSA_MODVER		1	/* module version */
@@ -214,6 +225,8 @@
 	uint16_t	vendor;
 	uint16_t	product;
 } ubsa_products [] = {
+/* AnyData ADU-E100A/H */
+{ USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_E100X },
 	/* BELKIN F5U103 */
 	{ USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U103 },
 	/* BELKIN F5U120 */
@@ -224,8 +237,16 @@
 	{ USB_VENDOR_GOHUBS, USB_PRODUCT_GOHUBS_GOCOM232 },
 	/* Peracom */
 	{ USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_SERIAL1 },
-	/* Vodafone */
-	{ USB_VENDOR_VODAFONE, USB_PRODUCT_VODAFONE_MC3G },
+/* Novatel Wireless Merlin cards */
+{ USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U740 },
+/* Option Vodafone MC3G */
+{ USB_VENDOR_OPTION, USB_PRODUCT_OPTION_VODAFONEMC3G },
+/* Option GlobeTrotter 3G */
+{ USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3G },
+/* Option GlobeTrotter 3G QUAD */
+{ USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3GQUAD },
+/* Huawei Mobile */
+{ USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_MOBILE },
 	{ 0, 0 }
 };
 
@@ -277,17 +298,13 @@
 	usb_config_descriptor_t *cdesc;
 	usb_interface_descriptor_t *id;
 	usb_endpoint_descriptor_t *ed;
-	char *devinfo;
 	const char *devname;
 	usbd_status err;
 	int i;
 
 	dev = uaa->device;
-	devinfo = malloc(1024, M_USBDEV, M_WAITOK);
 	ucom = &sc->sc_ucom;
 
-	bzero(sc, sizeof (struct ubsa_softc));
-
 	/*
 	 * initialize rts, dtr variables to something
 	 * different from boolean 0, 1
@@ -295,17 +312,12 @@
 	sc->sc_dtr = -1;
 	sc->sc_rts = -1;
 
-	usbd_devinfo(dev, 0, devinfo);
-	/* USB_ATTACH_SETUP; */
 	ucom->sc_dev = self;
-	device_set_desc_copy(self, devinfo);
-	/* USB_ATTACH_SETUP; */
 
 	ucom->sc_udev = dev;
 	ucom->sc_iface = uaa->iface;
 
-	devname = USBDEVNAME(ucom->sc_dev);
-	printf("%s: %s\n", devname, devinfo);
+devname = device_get_nameunit(ucom->sc_dev);
 
 	DPRINTF(("ubsa attach: sc = %p\n", sc));
 
@@ -328,7 +340,7 @@
 
 	if (cdesc == NULL) {
 		printf("%s: failed to get configuration descriptor\n",
-		    USBDEVNAME(ucom->sc_dev));
+    device_get_nameunit(ucom->sc_dev));
 		ucom->sc_dying = 1;
 		goto error;
 	}
@@ -352,7 +364,7 @@
 		ed = usbd_interface2endpoint_descriptor(ucom->sc_iface, i);
 		if (ed == NULL) {
 			printf("%s: no endpoint descriptor for %d\n",
-			    USBDEVNAME(ucom->sc_dev), i);
+    device_get_nameunit(ucom->sc_dev), i);
 			ucom->sc_dying = 1;
 			goto error;
 		}
@@ -364,17 +376,23 @@
 		} else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
 		    UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) {
 			ucom->sc_bulkin_no = ed->bEndpointAddress;
+if (uaa->product == USB_PRODUCT_ANYDATA_ADU_E100X)
+ucom->sc_ibufsize = UBSAIBUFSIZE; //UGETW(ed->wMaxPacketSize);
+else
 			ucom->sc_ibufsize = UGETW(ed->wMaxPacketSize);
 		} else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT &&
 		    UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) {
 			ucom->sc_bulkout_no = ed->bEndpointAddress;
+if (uaa->product == USB_PRODUCT_ANYDATA_ADU_E100X)
+ucom->sc_obufsize = UBSAOBUFSIZE; //UGETW(ed->wMaxPacketSize);
+else
 			ucom->sc_obufsize = UGETW(ed->wMaxPacketSize);
 		}
 	}
 
 	if (sc->sc_intr_number == -1) {
 		printf("%s: Could not find interrupt in\n",
-		    USBDEVNAME(ucom->sc_dev));
+    device_get_nameunit(ucom->sc_dev));
 		ucom->sc_dying = 1;
 		goto error;
 	}
@@ -384,14 +402,14 @@
 
 	if (ucom->sc_bulkin_no == -1) {
 		printf("%s: Could not find data bulk in\n",
-		    USBDEVNAME(ucom->sc_dev));
+    device_get_nameunit(ucom->sc_dev));
 		ucom->sc_dying = 1;
 		goto error;
 	}
 
 	if (ucom->sc_bulkout_no == -1) {
 		printf("%s: Could not find data bulk out\n",
-		    USBDEVNAME(ucom->sc_dev));
+    device_get_nameunit(ucom->sc_dev));
 		ucom->sc_dying = 1;
 		goto error;
 	}
@@ -408,12 +426,9 @@
 
 	TASK_INIT(&sc->sc_task, 0, ubsa_notify, sc); 
 	ucom_attach(ucom);
-
-	free(devinfo, M_USBDEV);
 	USB_ATTACH_SUCCESS_RETURN;
 
 error:
-	free(devinfo, M_USBDEV);
 	USB_ATTACH_ERROR_RETURN;
 }
 
@@ -456,7 +471,7 @@
 	err = usbd_do_request(sc->sc_ucom.sc_udev, &req, 0);
 	if (err)
 		printf("%s: ubsa_request: %s\n",
-		    USBDEVNAME(sc->sc_ucom.sc_dev), usbd_errstr(err));
+    device_get_nameunit(sc->sc_ucom.sc_dev), usbd_errstr(err));
 	return (err);
 }
 
@@ -542,7 +557,7 @@
 	default:
 		printf("%s: ubsa_param: unsupported baudrate, "
 		    "forcing default of 9600\n",
-		    USBDEVNAME(sc->sc_ucom.sc_dev));
+    device_get_nameunit(sc->sc_ucom.sc_dev));
 		value = B230400 / B9600;
 		break;
 	};
@@ -585,7 +600,7 @@
 	default:
 		printf("%s: ubsa_param: unsupported databits requested, "
 		    "forcing default of 8\n",
-		    USBDEVNAME(sc->sc_ucom.sc_dev));
+    device_get_nameunit(sc->sc_ucom.sc_dev));
 		value = 3;
 	}
 
@@ -663,7 +678,7 @@
 		    UBSA_INTR_INTERVAL);
 		if (err) {
 			printf("%s: cannot open interrupt pipe (addr %d)\n",
-			    USBDEVNAME(sc->sc_ucom.sc_dev),
+    device_get_nameunit(sc->sc_ucom.sc_dev),
 			    sc->sc_intr_number);
 			return (EIO);
 		}
@@ -688,12 +703,12 @@
 		err = usbd_abort_pipe(sc->sc_intr_pipe);
 		if (err)
 			printf("%s: abort interrupt pipe failed: %s\n",
-			    USBDEVNAME(sc->sc_ucom.sc_dev),
+    device_get_nameunit(sc->sc_ucom.sc_dev),
 			    usbd_errstr(err));
 		err = usbd_close_pipe(sc->sc_intr_pipe);
 		if (err)
 			printf("%s: close interrupt pipe failed: %s\n",
-			    USBDEVNAME(sc->sc_ucom.sc_dev),
+    device_get_nameunit(sc->sc_ucom.sc_dev),
 			    usbd_errstr(err));
 		free(sc->sc_intr_buf, M_USBDEV);
 		sc->sc_intr_pipe = NULL;
@@ -716,7 +731,7 @@
 			return;
 
 		DPRINTF(("%s: ubsa_intr: abnormal status: %s\n",
-		    USBDEVNAME(sc->sc_ucom.sc_dev),
+    device_get_nameunit(sc->sc_ucom.sc_dev),
 		    usbd_errstr(status)));
 		usbd_clear_endpoint_stall_async(sc->sc_intr_pipe);
 		return;
@@ -727,7 +742,7 @@
 	sc->sc_msr = buf[3];
 
 	DPRINTF(("%s: ubsa lsr = 0x%02x, msr = 0x%02x\n",
-	    USBDEVNAME(sc->sc_ucom.sc_dev), sc->sc_lsr, sc->sc_msr));
+    device_get_nameunit(sc->sc_ucom.sc_dev), sc->sc_lsr, sc->sc_msr));
 
 	taskqueue_enqueue(taskqueue_swi_giant, &sc->sc_task);
 }
--- usb_quirks.c.orig	Tue Oct 16 11:04:46 2007
+++ usb_quirks.c	Tue Oct 16 11:08:30 2007
@@ -103,6 +103,8 @@
 	ANY, { UQ_ASSUME_CM_OVER_DATA }},
  { USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_AS64LX,
 	0x100, { UQ_ASSUME_CM_OVER_DATA }},
+ { USB_VENDOR_SIEMENSMOBILE, USB_PRODUCT_SIEMENSMOBILE_ES75,
+	ANY, { UQ_ASSUME_CM_OVER_DATA }},
  { USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_A41XV32X,
 	ANY, { UQ_ASSUME_CM_OVER_DATA }},
  /* Devices which should be ignored by uhid */
--- usbdevs.orig	Tue Oct 16 11:04:46 2007
+++ usbdevs	Tue Oct 16 11:10:24 2007
@@ -546,6 +546,11 @@
 vendor SITECOM		0x6189	Sitecom
 vendor INTEL		0x8086	Intel
 vendor HP2		0xf003	Hewlett Packard
+vendor SIEMENSMOBILE   0x0681  SiemensMobile
+vendor ANYDATA         0x16d5  AnyDATA Corporation
+vendor NOVATEL          0x1410  Novatel Wireless
+vendor OPTION           0x0af0  Option
+vendor HUAWEI           0x12d1  Huawei Technologies
 
 /*
  * List of known products.  Grouped by vendor.
@@ -1506,6 +1511,16 @@
 
 /* Siemens products */
 product SIEMENS SPEEDSTREAM	0x1001	SpeedStream USB
+product SIEMENSMOBILE   ES75    0x0034  GSM module MC35
+
+/* Option products */
+product NOVATEL U740            0x1400  Merlin U740
+product OPTION VODAFONEMC3G     0x5000  Vodafone Mobile Connect 3G datacard
+product OPTION GT3G             0x6000  GlobeTrotter 3G datacard
+product OPTION GT3GQUAD         0x6300  GlobeTrotter 3G QUAD datacard
+product ANYDATA ADU_E100X       0x6501  CDMA 2000 1xRTT/EV-DO USB Modem
+/* HUAWEI products */
+product HUAWEI MOBILE           0x1001  Huawei Mobile
 
 /* Sierra Wireless products */
 product SIERRA MC5720		0x0218	MC5720 Wireless Modem


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-usb mailing list