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