Seems to work fine with my Novatel V740 (EVDO from Verizon)
Expresscard.  I'm using the latest version with the bufsize
patch and I'm glad I no longer have to hack in a patch to
get relatively fast speeds through it (just got 140kB/sec
in a test which is just over 1Mbit/sec). 

On Thu, Oct 09, 2008 at 11:44:09PM +0200, Nick Hibma wrote:

  Just now I have committed a driver for Option and Huawei cards previously 
  supported by the ubsa driver. More information is in the commit message.
  
  I am looking for people who would be able to provide more information after 
  testing with the 3G cards branded by:
  
  OEM:
        Merlin
        Huawei
        Option
        Sierra
        Novatel
        Qualcomm
  
  Rebranded:
        Dell
        Vodafone
  
  Note: The driver can be copied across to FreeBSD 7-STABLE if you copy the 
  sys/modules/u3g directory and sys/dev/usb/u3g.c and sys/dev/usb/usbdevs 
  files from HEAD and _move_ the ID from ubsa to u3g.
  
  More information can be found on
  
        http://people.freebsd.org/~n_hibma/u3g.html
  
  Thanks,
  
  Nick
  ----------  Forwarded Message  ----------
  Subject: svn commit: r183735 - in head: share/man/man4 sys/conf sys/dev/usb 
  sys/i386/conf sys/modules sys/modules/u3g
  Date: Thu October 9 2008
  From: Nick Hibma <[EMAIL PROTECTED]>
  To: [EMAIL PROTECTED], [EMAIL PROTECTED], 
  [EMAIL PROTECTED]
  
  Author: n_hibma
  Date: Thu Oct  9 21:25:01 2008
  New Revision: 183735
  URL: http://svn.freebsd.org/changeset/base/183735
  
  Log:
    Say hello to the u3g driver, implementing support for 3G modems.
    
    This was located in the ubsa driver, but should be moved into a separate
    driver:
    
    - 3G modems provide multiple serial ports to allow AT commands while the 
  PPP
      connection is up.
    - 3G modems do not provide baud rate or other serial port settings.
    - Huawei cards need specific initialisation.
    - ubsa is for Belkin adapters, an Linuxy choice for another device like 
  3G.
    
    Speeds achieved here with a weak signal at best is ~40kb/s (UMTS). No 
  spooky
    STALLED messages as well.
    
    Next: Move over all entries for Sierra and Novatel cards once I have found
    testers, and implemented serial port enumeration for Sierra (or rather 
  have
    Andrea Guzzo do it). They list all endpoints in 1 iface instead of 4 
  ifaces.
    
    Submitted by:       [EMAIL PROTECTED]
    MFC after:  3 weeks
  
  Added:
    head/share/man/man4/u3g.4   (contents, props changed)
    head/sys/dev/usb/u3g.c   (contents, props changed)
    head/sys/modules/u3g/
    head/sys/modules/u3g/Makefile   (contents, props changed)
  Modified:
    head/share/man/man4/Makefile
    head/sys/conf/NOTES
    head/sys/conf/files
    head/sys/dev/usb/ubsa.c
    head/sys/dev/usb/usbdevs
    head/sys/i386/conf/GENERIC
    head/sys/modules/Makefile
  
  Modified: head/share/man/man4/Makefile
  ==============================================================================
  --- head/share/man/man4/Makefile      Thu Oct  9 20:51:25 2008        
(r183734)
  +++ head/share/man/man4/Makefile      Thu Oct  9 21:25:01 2008        
(r183735)
  @@ -384,6 +384,7 @@ MAN=      aac.4 \
        twe.4 \
        tx.4 \
        txp.4 \
  +     u3g.4 \
        uark.4 \
        uart.4 \
        ubsa.4 \
  
  Added: head/share/man/man4/u3g.4
  ==============================================================================
  --- /dev/null 00:00:00 1970   (empty, because file is newly added)
  +++ head/share/man/man4/u3g.4 Thu Oct  9 21:25:01 2008        (r183735)
  @@ -0,0 +1,100 @@
  +.\"
  +.\" Copyright (c) 2008 AnyWi Technologies
  +.\" All rights reserved.
  +.\"
  +.\" This code is derived from uark.c 
  +.\"
  +.\" Permission to use, copy, modify, and distribute this software for any
  +.\" purpose with or without fee is hereby granted, provided that the above
  +.\" copyright notice and this permission notice appear in all copies.
  +.\"
  +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 
  WARRANTIES
  +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  +.\"
  +.\" $FreeBSD$
  +.\"
  +.Dd October 7, 2008
  +.Dt U3G 4
  +.Os
  +.Sh NAME
  +.Nm u3g
  +.Nd USB support for 3G datacards
  +.Sh SYNOPSIS
  +To compile this driver into the kernel,
  +place the following lines in your
  +kernel configuration file:
  +.Bd -ragged -offset indent
  +.Cd "device u3g"
  +.Cd "device ucom"
  +.Ed
  +.Pp
  +Alternatively, to load the driver as a
  +module at boot time, place the following line in
  +.Xr loader.conf 5 :
  +.Bd -literal -offset indent
  +u3g_load="YES"
  +.Ed
  +.Sh DESCRIPTION
  +The
  +.Nm
  +driver provides support for the multiple USB-to-serial interfaces exposed 
  by
  +many 3G usb/pccard modems.
  +.Pp
  +The device is accessed through the
  +.Xr ucom 4
  +driver which makes it behave like a
  +.Xr tty 4 .
  +.Sh HARDWARE
  +The
  +.Nm
  +driver supports the following adapters:
  +.Pp
  +.Bl -bullet -compact
  +.It
  +Option Globetrotter 3G Fusion (only 3G part, not WLAN)
  +.It
  +Option Globetrotter 3G Fusion Quad (only 3G part, not WLAN)
  +.It
  +Option Globetrotter 3G Quad
  +.It
  +Option Globetrotter 3G
  +.It
  +Vodafone Mobile Connect Card 3G
  +.It
  +Huawei E220 (E270?)
  +.It
  +Huawei Mobile
  +.El
  +.Pp
  +The supported 3G cards provide the necessary modem port for ppp,
  +pppd, or mpd connections as well as extra ports (depending on the specific
  +device) to provide other functions (diagnostic port, SIM toolkit port)
  +.Sh SEE ALSO
  +.Xr tty 4 ,
  +.Xr ucom 4 ,
  +.Xr usb 4 ,
  +.Xr ubsa 4
  +.Sh HISTORY
  +The
  +.Nm
  +driver
  +appeared in
  +.Fx 7.0 .
  +The
  +.Xr ubsa 4
  +manual page was modified for
  +.Nm
  +by
  +.An Andrea Guzzo Aq [EMAIL PROTECTED]
  +in September 2008.
  +.Sh AUTHORS
  +The
  +.Nm
  +driver was written by
  +.An Andrea Guzzo Aq [EMAIL PROTECTED] .
  +Hardware for testing provided by AnyWi Technologies, Leiden, NL.
  
  Modified: head/sys/conf/NOTES
  ==============================================================================
  --- head/sys/conf/NOTES       Thu Oct  9 20:51:25 2008        (r183734)
  +++ head/sys/conf/NOTES       Thu Oct  9 21:25:01 2008        (r183735)
  @@ -2416,6 +2416,8 @@ device          uscanner
   #
   # USB serial support
   device               ucom
  +# USB support for 3G modem cards by Option, Huawei and Sierra
  +device               u3g
   # USB support for Technologies ARK3116 based serial adapters
   device               uark
   # USB support for Belkin F5U103 and compatible serial adapters
  @@ -2441,7 +2443,6 @@ device          aue
   
   # ASIX Electronics AX88172 USB 2.0 ethernet driver. Used in the
   # LinkSys USB200M and various other adapters.
  -
   device               axe
   
   #
  
  Modified: head/sys/conf/files
  ==============================================================================
  --- head/sys/conf/files       Thu Oct  9 20:51:25 2008        (r183734)
  +++ head/sys/conf/files       Thu Oct  9 21:25:01 2008        (r183735)
  @@ -1327,6 +1327,7 @@ dev/usb/ohci_pci.c              optional ohci pci
   dev/usb/sl811hs.c            optional slhci
   dev/usb/slhci_pccard.c               optional slhci pccard
   dev/usb/uark.c                       optional uark
  +dev/usb/u3g.c                        optional u3g
   dev/usb/ubsa.c                       optional ubsa
   dev/usb/ubser.c                      optional ubser
   dev/usb/ucom.c                       optional ucom
  
  Added: head/sys/dev/usb/u3g.c
  ==============================================================================
  --- /dev/null 00:00:00 1970   (empty, because file is newly added)
  +++ head/sys/dev/usb/u3g.c    Thu Oct  9 21:25:01 2008        (r183735)
  @@ -0,0 +1,330 @@
  +/*
  + * Copyright (c) 2008 AnyWi Technologies
  + *   Author: Andrea Guzzo <[EMAIL PROTECTED]>
  + *   * based on uark.c 1.1 2006/08/14 08:30:22 jsg *
  + *   * parts from ubsa.c 183348 2008-09-25 12:00:56Z phk *
  + *
  + * Permission to use, copy, modify, and distribute this software for any
  + * purpose with or without fee is hereby granted, provided that the above
  + * copyright notice and this permission notice appear in all copies.
  + *
  + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  + *
  + * $FreeBSD$
  + */
  +
  +#include <sys/param.h>
  +#include <sys/systm.h>
  +#include <sys/kernel.h>
  +#include <sys/malloc.h>
  +#include <sys/module.h>
  +#include <sys/bus.h>
  +#include <sys/ioccom.h>
  +#include <sys/fcntl.h>
  +#include <sys/conf.h>
  +#include <sys/tty.h>
  +#include <sys/file.h>
  +#include <sys/selinfo.h>
  +
  +#include <dev/usb/usb.h>
  +#include <dev/usb/usbdi.h>
  +#include <dev/usb/usbdi_util.h>
  +
  +#include <dev/usb/ucomvar.h>
  +
  +#include "usbdevs.h"
  +
  +#ifdef U3G_DEBUG
  +#define DPRINTFN(n, x)    do { if (u3gdebug > (n)) printf x; } while (0)
  +int    u3gtebug = 0;
  +#else
  +#define DPRINTFN(n, x)
  +#endif
  +#define DPRINTF(x) DPRINTFN(0, x)
  +
  +#define U3GBUFSZ        1024
  +#define U3G_MAXPORTS           4
  +
  +struct u3g_softc {
  +     struct ucom_softc           sc_ucom[U3G_MAXPORTS];;
  +     device_t                    sc_dev;
  +     usbd_device_handle          sc_udev;
  +     u_char                      sc_msr;
  +     u_char                      sc_lsr;
  +     u_char                      numports;
  +
  +     usbd_interface_handle       sc_intr_iface;   /* interrupt interface */
  +#ifdef U3G_DEBUG
  +     int                         sc_intr_number;  /* interrupt number */
  +     usbd_pipe_handle            sc_intr_pipe;    /* interrupt pipe */
  +     u_char                      *sc_intr_buf;    /* interrupt buffer */
  +#endif
  +     int                         sc_isize;
  +};
  +
  +struct ucom_callback u3g_callback = {
  +     NULL,
  +     NULL,
  +     NULL,
  +     NULL,
  +     NULL,
  +     NULL,
  +     NULL,
  +     NULL,
  +};
  +
  +static const struct usb_devno u3g_devs[] = {
  +     /* OEM: Option */
  +     { USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3G },
  +     { USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3GQUAD },
  +     { USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3GPLUS },
  +     { USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GTMAX36 },
  +     { USB_VENDOR_OPTION, USB_PRODUCT_OPTION_VODAFONEMC3G },
  +     /* OEM: Huawei */
  +     { USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_MOBILE },
  +     { USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E220 },
  +
  +     { 0, 0 }
  +};
  +
  +#ifdef U3G_DEBUG
  +static void
  +u3g_intr(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status 
  status)
  +{
  +     struct u3g_softc *sc = (struct u3g_softc *)priv;
  +     device_printf(sc->sc_dev, "INTERRUPT CALLBACK\n");
  +}
  +#endif
  +
  +static int
  +u3g_huawei_reinit(usbd_device_handle dev)
  +{
  +     /* The Huawei device presents itself as a umass device with Windows
  +      * drivers on it. After installation of the driver, it reinits into a
  +      * 3G serial device.
  +      */
  +     usb_device_request_t req;
  +     usb_config_descriptor_t *cdesc;
  +
  +     /* Get the config descriptor */
  +     cdesc = usbd_get_config_descriptor(dev);
  +     if (cdesc == NULL)
  +             return (UMATCH_NONE);
  +
  +     /* One iface means umass mode, more than 1 (4 usually) means 3G mode */
  +     if (cdesc->bNumInterface > 1)
  +             return (UMATCH_VENDOR_PRODUCT);
  +
  +     req.bmRequestType = UT_WRITE_DEVICE;
  +     req.bRequest = UR_SET_FEATURE;
  +     USETW(req.wValue, UF_DEVICE_REMOTE_WAKEUP);
  +     USETW(req.wIndex, UHF_PORT_SUSPEND);
  +     USETW(req.wLength, 0);
  +
  +     (void) usbd_do_request(dev, &req, 0);
  +
  +     return UMATCH_NONE;     /* mismatch; it will be gone and reappear */
  +}
  +
  +static int
  +u3g_match(device_t self)
  +{
  +     struct usb_attach_arg *uaa = device_get_ivars(self);
  +
  +     if (uaa->iface != NULL)
  +             return (UMATCH_NONE);
  +
  +     if (uaa->vendor == USB_VENDOR_HUAWEI)
  +             return u3g_huawei_reinit(uaa->device);
  +
  +     if (usb_lookup(u3g_devs, uaa->vendor, uaa->product))
  +             return UMATCH_VENDOR_PRODUCT;
  +     
  +     return UMATCH_NONE;
  +}
  +
  +static int
  +u3g_attach(device_t self)
  +{
  +     struct u3g_softc *sc = device_get_softc(self);
  +     struct usb_attach_arg *uaa = device_get_ivars(self);
  +     usbd_device_handle dev = uaa->device;
  +     usbd_interface_handle iface;
  +     usb_interface_descriptor_t *id;
  +     usb_endpoint_descriptor_t *ed;
  +     usbd_status error;
  +     int i, n; 
  +     usb_config_descriptor_t *cdesc;
  +     struct ucom_softc *ucom = NULL;
  +     char devnamefmt[32];
  +
  +     sc->sc_dev = self;
  +#ifdef DEBUG
  +     sc->sc_intr_number = -1;
  +     sc->sc_intr_pipe = NULL;
  +#endif
  +     /* Move the device into the configured state. */
  +     error = usbd_set_config_index(dev, 1, 1);
  +     if (error) {
  +             device_printf(self, "failed to set configuration: %s\n",
  +                           usbd_errstr(error));
  +             goto bad;
  +     }
  +
  +     /* get the config descriptor */
  +     cdesc = usbd_get_config_descriptor(dev);
  +
  +     if (cdesc == NULL) {
  +             device_printf(self, "failed to get configuration descriptor\n");
  +             goto bad;
  +     }
  +
  +     sc->sc_udev = dev;
  +     sc->numports = (cdesc->bNumInterface <= 
  U3G_MAXPORTS)?cdesc->bNumInterface:U3G_MAXPORTS;
  +     for ( i = 0; i < sc->numports; i++ ) {
  +             ucom = &sc->sc_ucom[i];
  +
  +             ucom->sc_dev = self;
  +             ucom->sc_udev = dev;
  +             error = usbd_device2interface_handle(dev, i, &iface);
  +             if (error) {
  +                     device_printf(ucom->sc_dev,
  +                             "failed to get interface, err=%s\n",
  +                     usbd_errstr(error));
  +                     ucom->sc_dying = 1;
  +                     goto bad;
  +             }
  +             id = usbd_get_interface_descriptor(iface);
  +             ucom->sc_iface = iface;
  +
  +             ucom->sc_bulkin_no = ucom->sc_bulkout_no = -1;
  +             for (n = 0; n < id->bNumEndpoints; n++) {
  +                     ed = usbd_interface2endpoint_descriptor(iface, n);
  +                     if (ed == NULL) {
  +                             device_printf(ucom->sc_dev,
  +                                     "could not read endpoint descriptor\n");
  +                             goto bad;
  +                     }
  +                     if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
  +                         UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK)
  +                             ucom->sc_bulkin_no = ed->bEndpointAddress;
  +                     else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT 
&&
  +                         UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK)
  +                             ucom->sc_bulkout_no = ed->bEndpointAddress;
  +             }
  +             if (ucom->sc_bulkin_no == -1 || ucom->sc_bulkout_no == -1) {
  +                     device_printf(ucom->sc_dev, "missing endpoint\n");
  +                     goto bad;
  +             }
  +             ucom->sc_parent = sc;
  +             ucom->sc_ibufsize = U3GBUFSZ;
  +             ucom->sc_obufsize = U3GBUFSZ;
  +             ucom->sc_ibufsizepad = U3GBUFSZ;
  +             ucom->sc_opkthdrlen = 0;
  +
  +             ucom->sc_callback = &u3g_callback;
  +
  +             sprintf(devnamefmt,"U%d.%%d", device_get_unit(self));
  +             DPRINTF(("u3g: in=0x%x out=0x%x, devname=%s\n",
  +                      ucom->sc_bulkin_no, ucom->sc_bulkout_no, devnamefmt));
  +#if __FreeBSD_version < 800000
  +             ucom_attach_tty(ucom, TS_CALLOUT, devnamefmt, i);
  +#else
  +             ucom_attach_tty(ucom, devnamefmt, i);
  +#endif
  +     }
  +#ifdef U3G_DEBUG
  +     if (sc->sc_intr_number != -1 && sc->sc_intr_pipe == NULL) {
  +             sc->sc_intr_buf = malloc(sc->sc_isize, M_USBDEV, M_WAITOK);
  +             error = usbd_open_pipe_intr(sc->sc_intr_iface,
  +                                         sc->sc_intr_number,
  +                                         USBD_SHORT_XFER_OK,
  +                                         &sc->sc_intr_pipe,
  +                                         sc,
  +                                         sc->sc_intr_buf,
  +                                         sc->sc_isize,
  +                                         u3g_intr,
  +                                         100);
  +             if (error) {
  +                 device_printf(self,
  +                         "cannot open interrupt pipe (addr %d)\n",
  +                         sc->sc_intr_number);
  +                 goto bad;
  +             }
  +     }
  +#endif
  +     device_printf(self, "configured %d serial ports (/dev/cuaU%d.X)",
  +                   sc->numports, device_get_unit(self));
  +
  +     return 0;
  +
  +bad:
  +     DPRINTF(("u3g_attach: ATTACH ERROR\n"));
  +     ucom->sc_dying = 1;
  +     return ENXIO;
  +}
  +
  +static int
  +u3g_detach(device_t self)
  +{
  +     struct u3g_softc *sc = device_get_softc(self);
  +     int rv = 0;
  +     int i;
  +
  +     DPRINTF(("u3g_detach: sc=%p\n", sc));
  +
  +     for (i = 0; i < sc->numports; i++) {
  +             if(sc->sc_ucom[i].sc_udev) {
  +                     sc->sc_ucom[i].sc_dying = 1;
  +                     rv = ucom_detach(&sc->sc_ucom[i]);
  +                     if(rv != 0) {
  +                             device_printf(self, "Can't deallocat port %d", 
i);
  +                             return rv;
  +                     }
  +             }
  +     }
  +
  +#ifdef U3G_DEBUG
  +     if (sc->sc_intr_pipe != NULL) {
  +             int err = usbd_abort_pipe(sc->sc_intr_pipe);
  +             if (err)
  +                     device_printf(self,
  +                             "abort interrupt pipe failed: %s\n",
  +                             usbd_errstr(err));
  +             err = usbd_close_pipe(sc->sc_intr_pipe);
  +             if (err)
  +                     device_printf(self,
  +                         "close interrupt pipe failed: %s\n",
  +                         usbd_errstr(err));
  +             free(sc->sc_intr_buf, M_USBDEV);
  +             sc->sc_intr_pipe = NULL;
  +     }
  +#endif
  +
  +     return 0;
  +}
  +
  +static device_method_t u3g_methods[] = {
  +     /* Device interface */
  +     DEVMETHOD(device_probe, u3g_match),
  +     DEVMETHOD(device_attach, u3g_attach),
  +     DEVMETHOD(device_detach, u3g_detach),
  +
  +     { 0, 0 }
  +};
  +
  +static driver_t u3g_driver = {
  +     "ucom",
  +     u3g_methods,
  +     sizeof (struct u3g_softc)
  +};
  +
  +DRIVER_MODULE(u3g, uhub, u3g_driver, ucom_devclass, usbd_driver_load, 0);
  +MODULE_DEPEND(u3g, usb, 1, 1, 1);
  +MODULE_DEPEND(u3g, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
  
  Modified: head/sys/dev/usb/ubsa.c
  ==============================================================================
  --- head/sys/dev/usb/ubsa.c   Thu Oct  9 20:51:25 2008        (r183734)
  +++ head/sys/dev/usb/ubsa.c   Thu Oct  9 21:25:01 2008        (r183735)
  @@ -161,8 +161,6 @@ SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, debug
   struct       ubsa_softc {
        struct ucom_softc       sc_ucom;
   
  -     int                     sc_huawei;
  -
        int                     sc_iface_number;        /* interface number */
   
        usbd_interface_handle   sc_intr_iface;  /* interrupt interface */
  @@ -228,24 +226,11 @@ static const struct ubsa_product {
        { USB_VENDOR_GOHUBS, USB_PRODUCT_GOHUBS_GOCOM232 },
        /* Peracom */
        { USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_SERIAL1 },
  -     /* Dell version of the Novatel 740 */
  -     { USB_VENDOR_DELL, USB_PRODUCT_DELL_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 },
  -     /* Option GlobeTrotter 3G+ */
  -     { USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3GPLUS },
  -     /* Option GlobeTrotter Max 3.6 */
  -     { USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GTMAX36 },
  -     /* Huawei Mobile */
  -     { USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_MOBILE },
  -     { USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E270 },
  +     /* Merlin */
        { USB_VENDOR_MERLIN, USB_PRODUCT_MERLIN_V620 },
        /* Qualcomm, Inc. ZTE CDMA */
        { USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_CDMA_MSM },
  +     /* Novatel */
        { USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_CDMA_MODEM },
        /* Novatel Wireless Merlin ES620 */
        { USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_ES620 },
  @@ -256,6 +241,8 @@ static const struct ubsa_product {
        /* Novatel Wireless Merlin U740 */
        { USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U740 },
        { USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U740_2 },
  +     /* Dell version of the Novatel 740 */
  +     { USB_VENDOR_DELL, USB_PRODUCT_DELL_U740 },
        /* Novatel Wireless Merlin U950D */
        { USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U950D },
        /* Novatel Wireless Merlin V620 */
  @@ -341,52 +328,6 @@ MODULE_DEPEND(ubsa, usb, 1, 1, 1);
   MODULE_DEPEND(ubsa, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
   MODULE_VERSION(ubsa, UBSA_MODVER);
   
  -/*
  - * Huawei Exxx radio devices have a built in flash disk which is their
  - * default power up configuration.  This allows the device to carry its
  - * own installation software.
  - *
  - * Instead of following the USB spec, and create multiple configuration
  - * descriptors for this, the devices expects the driver to send
  - * UF_DEVICE_REMOTE_WAKEUP to endpoint 2 to reset the device, so it
  - * reprobes, now with the radio exposed.
  - */
  -
  -static usbd_status
  -ubsa_huawei(device_t self, struct usb_attach_arg *uaa) {
  -     usb_device_request_t req; usbd_device_handle dev;
  -     usb_config_descriptor_t *cdesc;
  -
  -     if (self == NULL)
  -             return (UMATCH_NONE);
  -     if (uaa == NULL)
  -             return (UMATCH_NONE);
  -     dev = uaa->device;
  -     if (dev == NULL)
  -             return (UMATCH_NONE);
  -     /* get the config descriptor */
  -     cdesc = usbd_get_config_descriptor(dev);
  -     if (cdesc == NULL)
  -             return (UMATCH_NONE);
  -
  -     if (cdesc->bNumInterface > 1)
  -             return (0);
  -
  -     /* Bend it like Beckham */
  -     device_printf(self, "Kicking Huawei device into radio mode\n");
  -     memset(&req, 0, sizeof req);
  -     req.bmRequestType = UT_WRITE_DEVICE;
  -     req.bRequest = UR_SET_FEATURE;
  -     USETW(req.wValue, UF_DEVICE_REMOTE_WAKEUP);
  -     USETW(req.wIndex, 2);
  -     USETW(req.wLength, 0);
  -
  -     /* We get error return, but it works */
  -     (void)usbd_do_request(dev, &req, 0);
  -     return (UMATCH_NONE);
  -}
  -
  -
   static int
   ubsa_match(device_t self)
   {
  @@ -399,9 +340,6 @@ ubsa_match(device_t self)
        for (i = 0; ubsa_products[i].vendor != 0; i++) {
                if (ubsa_products[i].vendor == uaa->vendor &&
                    ubsa_products[i].product == uaa->product) {
  -                     if (uaa->vendor == USB_VENDOR_HUAWEI &&
  -                         ubsa_huawei(self, uaa))
  -                             break;
                        return (UMATCH_VENDOR_PRODUCT);
                }
        }
  @@ -424,9 +362,6 @@ ubsa_attach(device_t self)
        dev = uaa->device;
        ucom = &sc->sc_ucom;
   
  -     if (uaa->vendor == USB_VENDOR_HUAWEI)
  -             sc->sc_huawei = 1;
  -
        /*
         * initialize rts, dtr variables to something
         * different from boolean 0, 1
  @@ -575,8 +510,6 @@ ubsa_request(struct ubsa_softc *sc, u_in
        usbd_status err;
   
        /* The huawei Exxx devices support none of these tricks */
  -     if (sc->sc_huawei)
  -             return (0);
        req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
        req.bRequest = request;
        USETW(req.wValue, value);
  
  Modified: head/sys/dev/usb/usbdevs
  ==============================================================================
  --- head/sys/dev/usb/usbdevs  Thu Oct  9 20:51:25 2008        (r183734)
  +++ head/sys/dev/usb/usbdevs  Thu Oct  9 21:25:01 2008        (r183735)
  @@ -1434,7 +1434,7 @@ product HTC SMARTPHONE          0x0a51  SmartPhon
   
   /* HUAWEI products */
   product HUAWEI MOBILE                0x1001  Huawei Mobile
  -product HUAWEI E270          0x1003  Huawei HSPA modem
  +product HUAWEI E220          0x1003  Huawei HSDPA modem
   
   /* HUAWEI 3com products */
   product HUAWEI3COM WUB320G   0x0009  Aolynk WUB320g
  
  Modified: head/sys/i386/conf/GENERIC
  ==============================================================================
  --- head/sys/i386/conf/GENERIC        Thu Oct  9 20:51:25 2008        
(r183734)
  +++ head/sys/i386/conf/GENERIC        Thu Oct  9 21:25:01 2008        
(r183735)
  @@ -304,6 +304,7 @@ device            urio            # Diamond Rio 500 MP3 
play
   device               uscanner        # Scanners
   # USB Serial devices
   device               ucom            # Generic com ttys
  +device               u3g             # USB-based 3G modems (Option, Huawei, 
Sierra)
   device               uark            # Technologies ARK3116 based serial 
adapters
   device               ubsa            # Belkin F5U103 and compatible serial 
adapters
   device               uftdi           # For FTDI usb serial adapters
  
  Modified: head/sys/modules/Makefile
  ==============================================================================
  --- head/sys/modules/Makefile Thu Oct  9 20:51:25 2008        (r183734)
  +++ head/sys/modules/Makefile Thu Oct  9 21:25:01 2008        (r183735)
  @@ -269,6 +269,7 @@ SUBDIR=   ${_3dfx} \
        twe \
        tx \
        txp \
  +     u3g \
        uark \
        uart \
        ubsa \
  
  Added: head/sys/modules/u3g/Makefile
  ==============================================================================
  --- /dev/null 00:00:00 1970   (empty, because file is newly added)
  +++ head/sys/modules/u3g/Makefile     Thu Oct  9 21:25:01 2008        
(r183735)
  @@ -0,0 +1,8 @@
  +# $FreeBSD$
  +
  +.PATH: ${.CURDIR}/../../dev/usb
  +
  +KMOD=        u3g
  +SRCS=        u3g.c ucomvar.h opt_usb.h device_if.h bus_if.h usbdevs.h
  +
  +.include <bsd.kmod.mk>
  _______________________________________________
  [EMAIL PROTECTED] mailing list
  http://lists.freebsd.org/mailman/listinfo/svn-src-all
  To unsubscribe, send any mail to "[EMAIL PROTECTED]"
  
  -------------------------------------------------------
  _______________________________________________
  [EMAIL PROTECTED] mailing list
  http://lists.freebsd.org/mailman/listinfo/freebsd-current
  To unsubscribe, send any mail to "[EMAIL PROTECTED]"
  
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hardware
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to