Saturday, October 4, 2008

Alltel UM175AL USB EVDO under Ubuntu Hardy Heron

(This post is the 3rd part of my Ubuntu Linux Router Upgrade Project.)

Note that all Linux commands here assume use of Ubuntu Linux 8.04 ("Hardy Heron"), with all updates installed as of 2008-09-30.

The device I purchased for Alltel's Wireless Internet service (3G 1xEV-DO) was a UTStarcom UM175, purchased for $100 before a $100 mail-in rebate on a 2-year contract.

Some specs as printed on the box and from Alltel's website:

  • USB modem with swivel connector
  • Compatible with Windows XP, Vista, Mac OS X
  • 1xRTT/EVDO Rev 0 and Rev A Ready
  • CDMA 800/1900MHz

Also Known As

The "Alltel Part#" listed on the box label is "UM175ALA". The P/N on the device label is "UM175AL". (I'm assuming the "AL"/"ALA" suffixes are specific to Alltel?) The FCC ID is PP4PX-700. Also listed on the device label: "Distributed by UTStarcom Personal Communications. Made in Korea by PANTECH. QUALCOMM 3G CDMA."

When connected to Windows before installing the drivers, the following "Hardware Ids" are listed in Device Manager where it is recognized as a "USB Mass Storage Device", with a vendor ID of 0x106c and a product ID of 0x3b03:

USB\Vid_106c&Pid_3b03&Rev_0100
USB\Vid_106c&Pid_3b03

And here is the output of "/usr/sbin/lsusb -l" under Linux:

Bus 001 Device 006: ID 106c:3b03 Curitel Communications, Inc.
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x106c Curitel Communications, Inc.
  idProduct          0x3b03
  bcdDevice            1.00
  iManufacturer           1 PANTECH
  iProduct                2 USB MMC Storage
  iSerial                 3 000000000002
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk (Zip)
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x05  EP 5 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
Device Status:     0x0001
  Self Powered

Note that the above shows a vendor ID of 0x106c ("Curitel Communications, Inc.") and a product ID of 0x3b03.

Should be Easy (or not)

Even before I made the purchase, I ran across a blog post by Jason Costomiris, "HOWTO: Verizon UM175 USB EVDO Card under Ubuntu Hardy". Reading it gave me a good vote of confidence that my plan should work. He had success using the "same" device under the same distribution of Linux that I was planning on. Verizon and Alltel use the same CDMA technology (and Verizon is buying Alltel). The instructions made it almost appear as simple as "plug & play".

Unfortunately, this is where things got tricky. The device is not even shipped with drivers, at least not on a CD. Instead, the device doubles as a USB mass storage device (USB MCS / UMS), and is recognized as an Autorun-enabled CD-Rom with drivers for Windows and Mac OS. Under Windows, after the drivers are installed, the device is listed as a "PANTECH UM175AL Composite Device", a "UM175AL CD-ROM USB Device", a "PANTECH UM175AL Diagnostic Port", and a "PANTECH UM175AL" modem.

By default, Linux only sees this device as a USB CD-Rom. As such, no serial port (e.g. /dev/ttyACM0) is ever created, leaving PPP nothing to connect to.

I need to thank Jason for responding to the comment I left on his post asking for help. Unfortunately, it appears that my "UM175AL" is a slightly different revision than what Jason used with so few issues.

As a sidenote, be aware of this CD-Rom emulation functionality while trying to boot from a real CD/DVD. At least under my Shuttle K-4500-N2, while my UM175 was connected, an external USB DVD-RW that was also connected wasn't given the chance to be used as a boot device. Instead, a boot attempt was made only on the UM175, which of course failed as there is nothing to boot from.

lsusb Note

Many pages I found while researching this issue referenced the output of "/proc/bus/usb/devices". This does not exist under recent versions of Ubuntu Linux. lsusb appears to be one of the preferred replacements. Some details are available in Ubuntu bug #156085 on launchpad.

USB_ModeSwitch

The closest I found to anyone having a similar issue was a post by "theosib" on the Ubuntu Forums with a post less than a month old, "Total disaster trying to set up Verizon EVDO device". I replied with some details of my issue, after which "theosib" replied with what would turn out to be my solution - USB_ModeSwitch.

Be sure to read the main content on USB_ModeSwitch's main page at http://www.draisberghof.de/usb_modeswitch/, as it is a pretty good summary of the issue.

Note that in my response on the UbuntuForums, I stated that when the device is properly recognized by Windows, the Vendor ID was 0x3715, compared to the current 0x3b03. So the goal is getting this to "switch" to 0x3715, at which point it should be (and is) properly recognized as a USB modem by Linux.

The download of USB_ModeSwitch comes with a precompiled executable, but I'm guessing it was compiled for 32-bit, as it wasn't recognized on my system. I recompiled it from the included source without any issues. Just make sure the "build-essential" and "libusb-dev" packages are installed, as this isn't mentioned on the page. Following the notes on the USB_ModeSwitch page, I placed a copy of the output in "/sbin" as "/sbin/usb_modeswitch" using sudo.

Given the about output from "lsusb", I already had the "DefaultVendor" and "DefaultProduct" values needed to configure USB_ModeSwitch. Using these successfully detached the storage driver, but didn't have any effect on the Vendor ID or any apparent change on the output listed by lsusb. Following the documentation, this most likely meant that I still needed to send an additional special command to make the device "switch", using the "MessageEndpoint" and "MessageContent" parameters.

The preferred tool to use to find these parameters mentioned in the USB_ModeSwitch documentation is "SniffUSB". The link is for version 1.8. For me, it would constantly and uncontrollably refresh the screen, making it impossible to scroll the device list and pretty much making it unusable. Fortunately, I found an updated version 2.0, based on the same source, at http://www.pcausa.com/Utilities/UsbSnoop/default.htm. (Source code is readily available for both versions.)

To sniff the necessary commands from this device, I found the VID/PID with the "unswitched" ID's. Specifically, "USB\Vid_106c&Pid_3b03&Rev_0100" ("PANTECH UM175AL Composite Device"). I then installed the filter, then removed and reinserted the device. The following is my captured "UsbSnoop.log", with the necessary message portions highlighted:

[3 ms] UsbSnoop - FilterAddDevice(9a47f748) : DriverObject 89773a48, pdo 8992a9d8
[3 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_LEGACY_BUS_INFORMATION)
[3 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_LEGACY_BUS_INFORMATION)
[4 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
[4 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
[4 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_FILTER_RESOURCE_REQUIREMENTS)
[4 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_FILTER_RESOURCE_REQUIREMENTS)
[4 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_START_DEVICE)
[4 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_START_DEVICE)
[5 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_SYSTEM_CONTROL
[8 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES)
[8 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES)
[8 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[8 ms] UsbSnoop - FdoHookDispatchInternalIoctl(9a47b1ea) : fdo=8992a9d8, Irp=888c49d0, IRQL=0
[8 ms]  >>>  URB 1 going down  >>> 
-- URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
  TransferBufferLength = 00000012
  TransferBuffer       = 89a098f8
  TransferBufferMDL    = 00000000
  Index                = 00000000
  DescriptorType       = 00000001 (USB_DEVICE_DESCRIPTOR_TYPE)
  LanguageId           = 00000000
[11 ms] UsbSnoop - MyInternalIOCTLCompletion(9a47b126) : fido=00000000, Irp=888c49d0, Context=89951008, IRQL=2
[11 ms]  <<<  URB 1 coming back  <<< 
-- URB_FUNCTION_CONTROL_TRANSFER:
  PipeHandle           = 89673020
  TransferFlags        = 0000000b (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 00000012
  TransferBuffer       = 89a098f8
  TransferBufferMDL    = 8979e558
    00000000: 12 01 10 01 00 00 00 40 6c 10 03 3b 00 01 01 02
    00000010: 03 01
  UrbLink              = 00000000
  SetupPacket          =
    00000000: 80 06 00 01 00 00 12 00
[11 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[11 ms] UsbSnoop - FdoHookDispatchInternalIoctl(9a47b1ea) : fdo=8992a9d8, Irp=888c49d0, IRQL=0
[11 ms]  >>>  URB 2 going down  >>> 
-- URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
  TransferBufferLength = 00000009
  TransferBuffer       = 896cab78
  TransferBufferMDL    = 00000000
  Index                = 00000000
  DescriptorType       = 00000002 (USB_CONFIGURATION_DESCRIPTOR_TYPE)
  LanguageId           = 00000000
[15 ms] UsbSnoop - MyInternalIOCTLCompletion(9a47b126) : fido=00000000, Irp=888c49d0, Context=89951008, IRQL=2
[15 ms]  <<<  URB 2 coming back  <<< 
-- URB_FUNCTION_CONTROL_TRANSFER:
  PipeHandle           = 89673020
  TransferFlags        = 74f06e2f (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 00000009
  TransferBuffer       = 896cab78
  TransferBufferMDL    = 8898c160
    00000000: 09 02 20 00 01 01 00 c0 32
  UrbLink              = 00000000
  SetupPacket          =
    00000000: 80 06 00 02 00 00 09 00
[15 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[15 ms] UsbSnoop - FdoHookDispatchInternalIoctl(9a47b1ea) : fdo=8992a9d8, Irp=888c49d0, IRQL=0
[15 ms]  >>>  URB 3 going down  >>> 
-- URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
  TransferBufferLength = 00000020
  TransferBuffer       = 89873cc8
  TransferBufferMDL    = 00000000
  Index                = 00000000
  DescriptorType       = 00000002 (USB_CONFIGURATION_DESCRIPTOR_TYPE)
  LanguageId           = 00000000
[19 ms] UsbSnoop - MyInternalIOCTLCompletion(9a47b126) : fido=00000000, Irp=888c49d0, Context=89951008, IRQL=2
[19 ms]  <<<  URB 3 coming back  <<< 
-- URB_FUNCTION_CONTROL_TRANSFER:
  PipeHandle           = 89673020
  TransferFlags        = 74f06e2f (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 00000020
  TransferBuffer       = 89873cc8
  TransferBufferMDL    = 8898c160
    00000000: 09 02 20 00 01 01 00 c0 32 09 04 00 00 02 08 06
    00000010: 50 00 07 05 83 02 40 00 00 07 05 05 02 40 00 00
  UrbLink              = 00000000
  SetupPacket          =
    00000000: 80 06 00 02 00 00 20 00
[19 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[19 ms] UsbSnoop - FdoHookDispatchInternalIoctl(9a47b1ea) : fdo=8992a9d8, Irp=888c49d0, IRQL=0
[19 ms]  >>>  URB 4 going down  >>> 
-- URB_FUNCTION_SELECT_CONFIGURATION:
  ConfigurationDescriptor = 0x89873cc8 (configure)
  ConfigurationDescriptor : bLength             = 9
  ConfigurationDescriptor : bDescriptorType     = 0x00000002
  ConfigurationDescriptor : wTotalLength        = 0x00000020
  ConfigurationDescriptor : bNumInterfaces      = 0x00000001
  ConfigurationDescriptor : bConfigurationValue = 0x00000001
  ConfigurationDescriptor : iConfiguration      = 0x00000000
  ConfigurationDescriptor : bmAttributes        = 0x000000c0
  ConfigurationDescriptor : MaxPower            = 0x00000032
  ConfigurationHandle     = 0x00000000
  Interface[0]: Length            = 56
  Interface[0]: InterfaceNumber   = 0
  Interface[0]: AlternateSetting  = 0
[57 ms] UsbSnoop - MyInternalIOCTLCompletion(9a47b126) : fido=00000000, Irp=888c49d0, Context=89951008, IRQL=0
[57 ms]  <<<  URB 4 coming back  <<< 
-- URB_FUNCTION_SELECT_CONFIGURATION:
  ConfigurationDescriptor = 0x89873cc8 (configure)
  ConfigurationDescriptor : bLength             = 9
  ConfigurationDescriptor : bDescriptorType     = 0x00000002
  ConfigurationDescriptor : wTotalLength        = 0x00000020
  ConfigurationDescriptor : bNumInterfaces      = 0x00000001
  ConfigurationDescriptor : bConfigurationValue = 0x00000001
  ConfigurationDescriptor : iConfiguration      = 0x00000000
  ConfigurationDescriptor : bmAttributes        = 0x000000c0
  ConfigurationDescriptor : MaxPower            = 0x00000032
  ConfigurationHandle     = 0x888d14d0
  Interface[0]: Length            = 56
  Interface[0]: InterfaceNumber   = 0
  Interface[0]: AlternateSetting  = 0
  Interface[0]: Class             = 0x00000008
  Interface[0]: SubClass          = 0x00000006
  Interface[0]: Protocol          = 0x00000050
  Interface[0]: InterfaceHandle   = 0x88bcece0
  Interface[0]: NumberOfPipes     = 2
  Interface[0]: Pipes[0] : MaximumPacketSize = 0x00000040
  Interface[0]: Pipes[0] : EndpointAddress   = 0x00000083
  Interface[0]: Pipes[0] : Interval          = 0x00000000
  Interface[0]: Pipes[0] : PipeType          = 0x00000002 (UsbdPipeTypeBulk)
  Interface[0]: Pipes[0] : PipeHandle        = 0x88bcecfc
  Interface[0]: Pipes[0] : MaxTransferSize   = 0x00001000
  Interface[0]: Pipes[0] : PipeFlags         = 0x00000000
  Interface[0]: Pipes[1] : MaximumPacketSize = 0x00000040
  Interface[0]: Pipes[1] : EndpointAddress   = 0x00000005
  Interface[0]: Pipes[1] : Interval          = 0x00000000
  Interface[0]: Pipes[1] : PipeType          = 0x00000002 (UsbdPipeTypeBulk)
  Interface[0]: Pipes[1] : PipeHandle        = 0x88bced1c
  Interface[0]: Pipes[1] : MaxTransferSize   = 0x00001000
  Interface[0]: Pipes[1] : PipeFlags         = 0x00000000
[57 ms] UsbSnoop - FilterDispatchAny(9a47afd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[57 ms] UsbSnoop - FdoHookDispatchInternalIoctl(9a47b1ea) : fdo=8992a9d8, Irp=88da7770, IRQL=0
[57 ms]  >>>  URB 5 going down  >>> 
-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
  PipeHandle           = 88bced1c [endpoint 0x00000005]
  TransferFlags        = 00000000 (USBD_TRANSFER_DIRECTION_OUT, ~USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 0000001f
  TransferBuffer       = 88c4b790
  TransferBufferMDL    = 00000000
    00000000: 55 53 42 43 90 4e d6 8a 24 00 00 00 80 00 08 ff
    00000010: 02 44 45 56 43 48 47 00 00 00 00 00 00 00 00
  UrbLink              = 00000000
[57 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES)
[57 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES)
[58 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_PNP_DEVICE_STATE)
[58 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_PNP_DEVICE_STATE)
[58 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[58 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[58 ms] UsbSnoop - MyInternalIOCTLCompletion(9a47b126) : fido=00000000, Irp=88da7770, Context=89951008, IRQL=2
[58 ms]  <<<  URB 5 coming back  <<< 
-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
  PipeHandle           = 88bced1c [endpoint 0x00000005]
  TransferFlags        = 00000000 (USBD_TRANSFER_DIRECTION_OUT, ~USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 0000001f
  TransferBuffer       = 88c4b790
  TransferBufferMDL    = 8979e558
  UrbLink              = 00000000
[165 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[165 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[165 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[165 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[166 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_SURPRISE_REMOVAL)
[166 ms] UsbSnoop - FdoHookDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_SURPRISE_REMOVAL)
[240 ms] UsbSnoop - FilterDispatchPnp(9a47f45c) : IRP_MJ_PNP (IRP_MN_REMOVE_DEVICE)

Given the above information, I then saved the following as "/etc/usb_modeswitch.conf":

DefaultVendor = 0x106c
DefaultProduct = 0x3b03

MessageEndpoint = 0x05
MessageContent = "55534243904ed68a24000000800008ff024445564348470000000000000000"

The following command can then be used to "switch" the mode of the device so that it is recognized as a USB modem. Note that as documented on the USB_ModeSwitch page, most programs using libusb need to be run as root:

sudo /sbin/usb_modeswitch -c /etc/usb_modeswitch.conf

Here is the updated output of "/usr/sbin/lsusb -l":

Bus 001 Device 006: ID 106c:3715 Curitel Communications, Inc.
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            2 Communications
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x106c Curitel Communications, Inc.
  idProduct          0x3715
  bcdDevice            1.00
  iManufacturer           1 PANTECH
  iProduct                2 PANTECH USB MODEM
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength          113
    bNumInterfaces          4
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      1 AT-commands (v.25ter)
      iInterface              0
      CDC Header:
        bcdCDC               1.09
      CDC Call Management:
        bmCapabilities       0x03
          call management
          use DataInterface
        bDataInterface          1
      CDC ACM:
        bmCapabilities       0x0f
          connection notifications
          sends break
          line coding and serial state
          get/set/clear comm features
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0010  1x 16 bytes
        bInterval              32
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0
      iInterface              3 Data Interface
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      0
      bInterfaceProtocol      0
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk (Zip)
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x05  EP 5 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
Device Status:     0x0001
  Self Powered

At this point, I was finally able to establish a connection using PPP. This setting appears to even persist across reboots, as long as the USB device doesn't loose power. Following the examples on the USB_ModeSwitch page, I saved the following as "/etc/udev/rules.d/99-usb_modeswitch.rules" which will automatically run the above command whenever the device is detected:

SUBSYSTEM=="usb", ATTR{idProduct}=="3b03", ATTR{idVendor}=="106c", \
        RUN+="/sbin/usb_modeswitch -c /etc/usb_modeswitch.conf"

Note that there is a "README" file in the "/etc/udev/rules.d" directory. Additional information can be found in the man page for udev ("man udev").

Accessing the Modem

The "cdc_acm" kernel module should now detect a connected device, and connect it to "/dev/ttyACM0".

Before making the Internet connection with PPP, the modem can be communicated with as a serial device. I'm not sure what the preferred method is for doing this under Linux, but the "screen" command (located in "/usr/bin") worked for me:

/usr/bin/screen /dev/ttyACM0
AT
OK
AT+GMM
UM175AL

OK
ATI
Manufacturer: UTStarcom communication Inc.
Model: UM175AL
Revision: D0700ALM01_5.226  1  [Mar 21 2008 06:00:00] [Jul 29 2008 15:10:28]
ESN: 0x83AF77E
+GCAP: +CIS707-A, CIS-856, CIS-856-A

OK
AT+CSQ
31, 0

OK

(If you don't recognize the above, the Hayes command set on Wikipedia may be a good starting reference.)

Signal Strength

The "AT+CSQ" returns the current signal strength as a value between 0-31, with higher being better. According to Ken Kinder, this number indicates the signal strength above -109 dBm in 2 dBm increments.

I know the Windows client software displays a regularly updated signal strength indicator, even while the connection is active. It would be nice to have this functionality available under Linux, too, but it doesn't look easy, if even possible.

I found one forum thread with one response on the topic: http://fixunix.com/ppp/62263-commad-mode-gprs-same-time.html. Pretty much, it seems that the data stream would have to be paused, the modem dropped to command mode, the "AT+CSQ" command issued and the value retrieved, then sending "ATO" to go back online. The forum response suggested that a modified pppd would be needed. I'm wondering if a "wrapper" tty couldn't be written that would be passed to pppd, and query the signal strength whenever the connection is idle. Alternatively, I'd be curious if the "diagnostic port" as shown in Windows would provide similar functionality without having to interrupt the data line? Maybe this is available by one of the other interface descriptors shown in the lsusb output (above)? Maybe "bInterfaceClass 10 CDC Data"?

Update (2008-10-08): Sysinternal's Portmon shows that under Windows, the The Alltel "QuickLink Mobile" Wireless Connection Manager communicates with the "diagnostic port". Unfortunately, unlike the text-based "AT" commands used above, this communication looks completely binary. It also doesn't look to be easily decipherable, or to use any known standard. I've sent an email to UTStarcom, and can only hope for an unlikely helpful response.

Here's the output from about 5 seconds of communication with QuickLink Mobile and the "diagnostic port" using Portmon:

0  0.00000000  QuickLink Mobil  IRP_MJ_CREATE  PTDLserd0  Options: Open 
0  0.00584593  SUCCESS  
1  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_DTR  PTDLserd0  
1  0.00000206  SUCCESS  
2  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_PROPERTIES  PTDLserd0  
2  0.00000052  SUCCESS  
3  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
3  0.00000072  SUCCESS  
4  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
4  0.00000064  SUCCESS  
5  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
5  0.00000048  SUCCESS  
6  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
6  0.00000046  SUCCESS  
7  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_QUEUE_SIZE  PTDLserd0  InSize: 4096 OutSize: 4096
7  0.00000044  SUCCESS  
8  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_TIMEOUTS  PTDLserd0  RI:-1 RM:0 RC:0 WM:0 WC:0
8  0.00000109  SUCCESS  
9  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_MODEMSTATUS  PTDLserd0  
9  0.00000130  SUCCESS  
10  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_PROPERTIES  PTDLserd0  
10  0.00000053  SUCCESS  
11  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
11  0.00000093  SUCCESS  
12  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
12  0.00000112  SUCCESS  
13  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
13  0.00000051  SUCCESS  
14  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
14  0.00000045  SUCCESS  
15  0.00000000  QuickLink Mobil  IOCTL_SERIAL_PURGE  PTDLserd0  Purge: TXABORT TXCLEAR 
15  0.00000196  SUCCESS  
16  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_QUEUE_SIZE  PTDLserd0  InSize: 4096 OutSize: 4096
16  0.00000096  SUCCESS  
17  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_TIMEOUTS  PTDLserd0  RI:-1 RM:0 RC:0 WM:0 WC:0
17  0.00000124  SUCCESS  
18  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_MODEMSTATUS  PTDLserd0  
18  0.00000117  SUCCESS  
19  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_PROPERTIES  PTDLserd0  
19  0.00000065  SUCCESS  
20  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
20  0.00000109  SUCCESS  
21  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
21  0.00000061  SUCCESS  
22  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
22  0.00000050  SUCCESS  
23  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
23  0.00000045  SUCCESS  
24  0.00000000  QuickLink Mobil  IOCTL_SERIAL_PURGE  PTDLserd0  Purge: TXABORT TXCLEAR 
24  0.00000186  SUCCESS  
25  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_QUEUE_SIZE  PTDLserd0  InSize: 4096 OutSize: 4096
25  0.00000181  SUCCESS  
26  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
26  0.00000140  SUCCESS  
27  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
27  0.00000083  SUCCESS  
28  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
28  0.00000087  SUCCESS  
29  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
29  0.00000065  SUCCESS  
30  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_BAUD_RATE  PTDLserd0  Rate: 115200
30  0.00000137  SUCCESS  
31  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_DTR  PTDLserd0  
31  0.00000072  SUCCESS  
32  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_LINE_CONTROL  PTDLserd0  StopBits: 1 Parity: NONE WordLength: 8
32  0.00000115  SUCCESS  
33  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_CHAR  PTDLserd0  EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
33  0.00000053  SUCCESS  
34  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_HANDFLOW  PTDLserd0  Shake:9 Replace:80 XonLimit:8192 XoffLimit:51200
34  0.00000224  SUCCESS  
35  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_TIMEOUTS  PTDLserd0  RI:-1 RM:0 RC:0 WM:0 WC:0
35  0.00000049  SUCCESS  
36  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_MODEMSTATUS  PTDLserd0  
36  0.00000088  SUCCESS  
37  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_PROPERTIES  PTDLserd0  
37  0.00000040  SUCCESS  
38  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
38  0.00000070  SUCCESS  
39  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
39  0.00000048  SUCCESS  
40  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
40  0.00000045  SUCCESS  
41  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
41  0.00000044  SUCCESS  
42  0.00000000  QuickLink Mobil  IOCTL_SERIAL_PURGE  PTDLserd0  Purge: TXABORT TXCLEAR 
42  0.00000182  SUCCESS  
43  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_QUEUE_SIZE  PTDLserd0  InSize: 2048 OutSize: 2048
43  0.00000203  SUCCESS  
44  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_BAUD_RATE  PTDLserd0  
44  0.00000223  SUCCESS  
45  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_LINE_CONTROL  PTDLserd0  
45  0.00000106  SUCCESS  
46  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_CHARS  PTDLserd0  
46  0.00000066  SUCCESS  
47  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_HANDFLOW  PTDLserd0  
47  0.00000069  SUCCESS  
48  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_BAUD_RATE  PTDLserd0  Rate: 115200
48  0.00000098  SUCCESS  
49  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_DTR  PTDLserd0  
49  0.00000127  SUCCESS  
50  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_LINE_CONTROL  PTDLserd0  StopBits: 1 Parity: NONE WordLength: 8
50  0.00000107  SUCCESS  
51  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_CHAR  PTDLserd0  EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
51  0.00000052  SUCCESS  
52  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_HANDFLOW  PTDLserd0  Shake:9 Replace:80 XonLimit:8192 XoffLimit:51200
52  0.00000193  SUCCESS  
53  0.00000000  QuickLink Mobil  IOCTL_SERIAL_SET_TIMEOUTS  PTDLserd0  RI:-1 RM:0 RC:0 WM:0 WC:0
53  0.00000049  SUCCESS  
54  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_MODEMSTATUS  PTDLserd0  
54  0.00000090  SUCCESS  
55  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0D C8 D0 7E 
56  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
56  0.00000087  SUCCESS  
55  0.00074312  SUCCESS  
57  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
57  0.00000118  SUCCESS  
58  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
58  0.00000049  SUCCESS  
59  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
59  0.00000169  SUCCESS  Length 9: C8 0D 00 00 00 00 D0 AD 7E 
60  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
60  0.00000082  SUCCESS  
61  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
61  0.00000311  SUCCESS  
62  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
63  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
63  0.00000173  SUCCESS  
62  0.00034797  SUCCESS  
64  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
64  0.00000113  SUCCESS  
65  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
65  0.00000077  SUCCESS  
66  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
66  0.00000048  SUCCESS  
67  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
67  0.00000255  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
68  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
69  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
69  0.00000084  SUCCESS  
68  0.00111850  SUCCESS  
70  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
70  0.00000095  SUCCESS  
71  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
71  0.00000076  SUCCESS  
72  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
72  0.00000048  SUCCESS  
73  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
73  0.00000207  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
74  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
75  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
75  0.00000127  SUCCESS  
74  0.00036960  SUCCESS  
76  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
76  0.00000076  SUCCESS  
77  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
77  0.00000085  SUCCESS  
78  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
78  0.00000047  SUCCESS  
79  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
79  0.00000188  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
80  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
81  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
81  0.00000095  SUCCESS  
80  0.00067287  SUCCESS  
82  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
82  0.00000109  SUCCESS  
83  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
83  0.00000071  SUCCESS  
84  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
84  0.00000212  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
85  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0A 77 A4 7E 
86  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
86  0.00000263  SUCCESS  
85  0.00083082  SUCCESS  
87  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
87  0.00000139  SUCCESS  
88  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
88  0.00000059  SUCCESS  
89  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 25
89  0.00000212  SUCCESS  Length 25: C8 0A 60 8B 00 00 F1 83 00 00 0F 21 00 00 76 0B 00 00 04 C0 0B 00 01 A0 7E 
90  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0B FE B5 7E 
91  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
91  0.00000176  SUCCESS  
90  0.00071377  SUCCESS  
92  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
92  0.00000117  SUCCESS  
93  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
93  0.00000082  SUCCESS  
94  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 75
94  0.00000291  SUCCESS  Length 75: C8 0B 07 00 00 00 09 01 D8 07 0A 00 13 00 0D 00 0A 00 37 00 41 03 D4 FE FF FF 5D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 00 00 00 02 00 00 00 E4 3C 7E 
95  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
96  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
96  0.00000122  SUCCESS  
95  0.00088541  SUCCESS  
97  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
97  0.00000116  SUCCESS  
98  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
98  0.00000075  SUCCESS  
99  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
99  0.00000256  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
100  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 01 00 00 00 00 0F 8D 7E 
101  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
101  0.00000119  SUCCESS  
100  0.00042567  SUCCESS  
102  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
102  0.00000094  SUCCESS  
103  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
103  0.00000047  SUCCESS  
104  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
104  0.00000161  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
105  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 02 00 00 00 00 C3 90 7E 
106  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
106  0.00000114  SUCCESS  
105  0.00036322  SUCCESS  
107  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
107  0.00000118  SUCCESS  
108  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
108  0.00000067  SUCCESS  
109  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
109  0.00000213  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
110  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 03 00 00 00 00 87 9B 7E 
111  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
111  0.00000094  SUCCESS  
110  0.00046675  SUCCESS  
112  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
112  0.00000155  SUCCESS  
113  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
113  0.00000062  SUCCESS  
114  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
114  0.00000206  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
115  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 04 00 00 00 00 5B AB 7E 
116  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
116  0.00000120  SUCCESS  
115  0.00061533  SUCCESS  
117  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
117  0.00000103  SUCCESS  
118  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
118  0.00000078  SUCCESS  
119  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
119  0.00000175  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
120  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 05 00 00 00 00 1F A0 7E 
121  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
121  0.00000125  SUCCESS  
120  0.00081854  SUCCESS  
122  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
122  0.00000147  SUCCESS  
123  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
123  0.00000050  SUCCESS  
124  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
124  0.00000193  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
125  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 09 00 00 00 00 2F D7 7E 
126  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
126  0.00000104  SUCCESS  
125  0.00089310  SUCCESS  
127  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
127  0.00000126  SUCCESS  
128  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
128  0.00000069  SUCCESS  
129  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
129  0.00000203  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
130  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0B 00 00 00 00 A7 C1 7E 
131  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
131  0.00000117  SUCCESS  
130  0.00108786  SUCCESS  
132  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
132  0.00000096  SUCCESS  
133  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
133  0.00000047  SUCCESS  
134  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
134  0.00000125  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
135  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0D 00 00 00 00 3F FA 7E 
136  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
136  0.00000093  SUCCESS  
135  0.00020632  SUCCESS  
137  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
137  0.00000208  SUCCESS  
138  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
138  0.00000050  SUCCESS  
139  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
139  0.00000217  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
140  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0E 00 00 00 00 F3 E7 7E 
141  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
141  0.00000094  SUCCESS  
140  0.00032217  SUCCESS  
142  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
142  0.00000114  SUCCESS  
143  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
143  0.00000047  SUCCESS  
144  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
144  0.00000144  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
145  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0F 00 00 00 00 B7 EC 7E 
146  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
146  0.00000116  SUCCESS  
145  0.00047807  SUCCESS  
147  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
147  0.00000118  SUCCESS  
148  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
148  0.00000047  SUCCESS  
149  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
149  0.00000209  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
150  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0C 41 C1 7E 
151  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
151  0.00000103  SUCCESS  
150  0.00036696  SUCCESS  
152  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
152  0.00000161  SUCCESS  
153  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
153  0.00000049  SUCCESS  
154  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 10
154  0.00000218  SUCCESS  Length 10: C8 0C 02 00 00 00 00 FB 34 7E 
155  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 9: C8 11 01 00 00 00 1B 72 7E 
156  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
156  0.00000077  SUCCESS  
155  0.00070517  SUCCESS  
157  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
157  0.00000151  SUCCESS  
158  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
158  0.00000047  SUCCESS  
159  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
159  0.00000209  SUCCESS  Length 9: C8 11 00 00 00 00 A0 6E 7E 
160  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
161  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
161  0.00000263  SUCCESS  
160  0.00093037  SUCCESS  
162  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
162  0.00000083  SUCCESS  
163  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
163  0.00000048  SUCCESS  
164  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
164  0.00000199  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
165  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
165  0.00000216  SUCCESS  
166  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
166  0.00000051  SUCCESS  
167  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 150
167  0.00000215  SUCCESS  Length 150: C8 0B 01 00 00 00 09 01 D8 07 0A 00 13 00 0D 00 0A 00 38 00 04 03 D4 FE FF FF 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 00 00 00 02 00 00 00 9C 7C 7E C8 0B 01 00 00 00 09 01 D8 07 
168  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
168  0.00000056  SUCCESS  
169  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
169  0.00000154  SUCCESS  
170  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0A 77 A4 7E 
171  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
171  0.00000186  SUCCESS  
170  0.00085352  SUCCESS  
172  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
172  0.00000127  SUCCESS  
173  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
173  0.00000048  SUCCESS  
174  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 25
174  0.00000177  SUCCESS  Length 25: C8 0A D1 92 00 00 62 8B 00 00 3E 22 00 00 76 0B 00 00 04 C0 0B 00 21 42 7E 
175  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 06 1B 6E 7E 
176  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
176  0.00000227  SUCCESS  
175  0.00058334  SUCCESS  
177  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
177  0.00000230  SUCCESS  
178  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
178  0.00000237  SUCCESS  
179  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
179  0.00000075  SUCCESS  
180  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 533
180  0.00000325  SUCCESS  Length 533: C8 06 09 02 0A 08 05 0A 09 06 05 05 00 00 00 00 00 00 00 00 00 00 00 00 7D 5E F7 3A 08 01 55 54 53 74 61 72 63 6F 6D 20 49 6E 63 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
181  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
181  0.00000379  SUCCESS  
182  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
182  0.00000275  SUCCESS  
183  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0A 77 A4 7E 
184  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
184  0.00000208  SUCCESS  
185  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
185  0.00000094  SUCCESS  
186  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 101
186  0.00000292  SUCCESS  Length 101: C8 0B 07 00 00 00 09 01 D8 07 0A 00 13 00 0D 00 0A 00 39 00 7D 5E 01 D4 FE FF FF 5F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 66 00 00 00 02 00 00 00 A7 07 7E C8 0A 4D 9A 00 00 DE 92 00 
183  0.00095781  SUCCESS  
187  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
187  0.00000205  SUCCESS  
188  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
188  0.00000049  SUCCESS  
189  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 100
189  0.00000220  SUCCESS  Length 100: C8 0A 84 9A 00 00 15 93 00 00 AD 25 00 00 76 0B 00 00 04 C0 0B 00 35 18 7E C8 0B 07 00 00 00 09 01 D8 07 0A 00 13 00 0D 00 0A 00 3A 00 0C 00 D4 FE FF FF 5F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
190  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
190  0.00000074  SUCCESS  
191  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
191  0.00000094  SUCCESS  
192  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
192  0.00000077  SUCCESS  
193  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
193  0.00000217  SUCCESS  
194  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
194  0.00000090  SUCCESS  
195  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
195  0.00000060  SUCCESS  
196  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
196  0.00000264  SUCCESS  
197  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0A 77 A4 7E 
198  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
198  0.00000227  SUCCESS  
197  0.00051973  SUCCESS  
199  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
199  0.00000158  SUCCESS  
200  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
200  0.00000071  SUCCESS  
201  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 25
201  0.00000228  SUCCESS  Length 25: C8 0A 44 A6 00 00 D5 9E 00 00 AD 25 00 00 76 0B 00 00 04 C0 0B 00 A8 53 7E 
202  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
202  0.00000346  SUCCESS  
203  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
203  0.00000115  SUCCESS  
204  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
204  0.00000070  SUCCESS  
205  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
205  0.00000235  SUCCESS  
206  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 01 00 00 00 01 86 9C 7E 
207  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
207  0.00000220  SUCCESS  
206  0.00100681  SUCCESS  
208  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
208  0.00000202  SUCCESS  
209  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
209  0.00000049  SUCCESS  
210  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
210  0.00000179  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
211  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 02 00 00 00 01 4A 81 7E 
212  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
212  0.00000091  SUCCESS  
211  0.00057449  SUCCESS  
213  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
213  0.00000101  SUCCESS  
214  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
214  0.00000074  SUCCESS  
215  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
215  0.00000172  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
216  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
216  0.00000103  SUCCESS  
217  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 03 00 00 00 01 0E 8A 7E 
217  0.00063347  SUCCESS  
218  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
218  0.00000171  SUCCESS  
219  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
219  0.00000050  SUCCESS  
220  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
220  0.00000160  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
221  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 04 00 00 00 01 D2 BA 7E 
222  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
222  0.00000117  SUCCESS  
221  0.00093368  SUCCESS  
223  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
223  0.00000107  SUCCESS  
224  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
224  0.00000048  SUCCESS  
225  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
225  0.00000138  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
226  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 05 00 00 00 01 96 B1 7E 
227  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
227  0.00000096  SUCCESS  
226  0.00111167  SUCCESS  
228  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
228  0.00000141  SUCCESS  
229  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
229  0.00000048  SUCCESS  
230  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
230  0.00000194  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
231  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 09 00 00 00 01 A6 C6 7E 
232  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
232  0.00000139  SUCCESS  
231  0.00120009  SUCCESS  
233  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
233  0.00000169  SUCCESS  
234  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
234  0.00000048  SUCCESS  
235  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
235  0.00000194  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
236  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0B 00 00 00 01 2E D0 7E 
237  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
237  0.00000143  SUCCESS  
236  0.00095763  SUCCESS  
238  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
238  0.00000110  SUCCESS  
239  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
239  0.00000076  SUCCESS  
240  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
240  0.00000349  SUCCESS  Length 9: C8 24 00 00 00 00 25 9C 7E 
241  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0D 00 00 00 01 B6 EB 7E 
242  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
242  0.00000091  SUCCESS  
241  0.00039045  SUCCESS  
243  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
243  0.00000138  SUCCESS  
244  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
244  0.00000047  SUCCESS  
245  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
245  0.00000172  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
246  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0E 00 00 00 01 7A F6 7E 
247  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
247  0.00000095  SUCCESS  
246  0.00057285  SUCCESS  
248  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
248  0.00000123  SUCCESS  
249  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
249  0.00000048  SUCCESS  
250  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
250  0.00000158  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
251  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 10: C8 24 0F 00 00 00 01 3E FD 7E 
252  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
252  0.00000136  SUCCESS  
251  0.00070754  SUCCESS  
253  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
253  0.00000132  SUCCESS  
254  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
254  0.00000046  SUCCESS  
255  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
255  0.00000192  SUCCESS  Length 9: C8 24 01 00 00 00 9E 80 7E 
256  0.00000000  QuickLink Mobil  IRP_MJ_WRITE  PTDLserd0  Length 5: C8 0E 53 E2 7E 
257  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
257  0.00000095  SUCCESS  
256  0.00084635  SUCCESS  
258  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
258  0.00000123  SUCCESS  
259  0.00000000  QuickLink Mobil  IOCTL_SERIAL_GET_COMMSTATUS  PTDLserd0  
259  0.00000072  SUCCESS  
260  0.00000000  QuickLink Mobil  IRP_MJ_READ  PTDLserd0  Length 9
260  0.00000206  SUCCESS  Length 9: C8 0E 66 00 00 00 62 62 7E 
261  0.00000000  QuickLink Mobil  IOCTL_SERIAL_PURGE  PTDLserd0  Purge: TXABORT TXCLEAR 
261  0.00000271  SUCCESS  
262  0.00000000  QuickLink Mobil  IOCTL_SERIAL_CLR_DTR  PTDLserd0  
262  0.00000225  SUCCESS  
263  0.00000000  QuickLink Mobil  IRP_MJ_CLEANUP  PTDLserd0  
263  0.00265768  SUCCESS  
264  0.00000000  QuickLink Mobil  IRP_MJ_CLOSE  PTDLserd0  
264  0.00000111  SUCCESS  

To be continued...

Next up: Configuring Persistent PPP under Ubuntu.

19 comments:

Anonymous said...

I just wanted to say thanks so much for all this info. I have the exact same card through Alltel and have gotten it working under SLED 10 thanks to your post.

I've compiled all the configuration into a blog post for openSUSE Lizards here:

http://lizards.opensuse.org/2009/02/09/usb-evdo-alltel-um175al-under-sled-10/

Thanks again!!!

M Otis Beard said...

I periodically search Google for an answer to using Alltel's UM175AL under Linux, so I'm really happy to see your article! When I get a few days off, I'm going to attempt to reproduce what you've done here.

I'm a trucker, and I need Internet every single day when I'm on the road. It has really been vexing me hardcore that I am forced to use 32-bit Windows Vista on my new Toshiba laptop, just so I can get my Alltel aircard to work! 64-bit Ubuntu runs sweet on this machine, and even if I could run the 64-bit version of Vista, Vista is just plain ugly fugly crap no no no DO NOT WANT.

Thanks for documenting your solution!

Anonymous said...

Mark,
Thanks for the excellent instructions. I am trying to use my BlackBerry Storm as USB Modem with Ubuntu 8.10 and am having a hard time getting it to switch from “Mass Storage” to “Modem” using usb_modemswitch. Hope you can figure it out. Cheers! Karl

Link to file dumps:
http://www.kri.com/USB%20EVDO%20BlackBerry%20Storm%20Ubuntu.txt

Mark A. Ziesemer said...

Karl - the link to your file dump is broken. Did you get it working under Windows? If so, were you able to use UsbSnoop to capture the MessageContent? (Or is that what the file dump was supposed to be?)

Anonymous said...

Sorry about the broken link Mark.
Please try this one:
http://www.coachkarl.com/images/USB_EVDO_BlackBerry_Storm_Ubuntu.txt
Yes, Storm has been working with VZAccess Manager fine for the last few months. But I really want to lose Window$...smile.
Karl

Mark A. Ziesemer said...

Karl - in the version of usb_modeswitch.conf that you included in your dump file, I see there is already a section for "Option Verizon BlackBerry Storm 9530". The TargetVendor, TargetProduct, MessageEndpoint and MessageContent there all match the same bytes found in your output from UsbSnoop. However, I don't see that section in the latest available at http://www.draisberghof.de/usb_modeswitch. Did you add them? If so, I assume you tried using them by uncommenting them (removing the leading semi-colons)?

Otherwise, I see a few other sections in the UsbSnoop dump that might also be replacements for what you have. Just trial & error, I guess. I don't have access to a BlackBerry, so I don't know how much more I can help.

Anonymous said...

Thanks Mark,
I didn't know that I needed to remove the leading semicolons.
Let me try that and if it doesn't work I would love to hear which sections of the USBSnoop dump might work. I will be back in a while.
Karl

Anonymous said...

Great advice re. semicolons Mark. Now I am a step further. The error message is:

"karl@ubuntu:~$ sudo /sbin/usb_modeswitch -c /etc/usb_modeswitch.conf

* usb_modeswitch: tool for controlling "flip flop" mode USB devices
* Version 0.9.6 (C) Josua Dietze 2009
* Works with libusb 0.1.12 and probably other versions

Looking for target devices
Found target devices (1)
Looking for default devices
Found default devices (1)
Prepare switching, accessing latest device
Looking for active default driver to detach it
No driver found. Device probably not initialized. Trying to continue ...
Setting up communication with device
Error: MessageContent hex string has uneven length. Aborting"

Mark A. Ziesemer said...

Karl - see the 2nd paragraph commented at the top of usb_modeswitch.conf regarding the use of "comment signs". It's pretty typical for these types of config files, but it's nice that they also have it documented there.

Regarding the error message, my guess is that you need to remove all the spaces from within MessageContent.

Looking at the default usb_modeswitch.conf, your MessageContent appears to be significantly longer than the others. Start from the beginning, and look for any sets of data after "URB # going down". You should be able to ignore any "URB # coming back" sections. At this point, I think it's trial & error, though someone on the USB_ModeSwitch forums may be able to offer additional advice.

Anonymous said...

OK Mark,
thanks a bunch for your support. Once I figure it out I will let the guys from usb_modeswitch know what works for the storm, so they can update the conf file. Cheers! Karl

Anonymous said...
This comment has been removed by a blog administrator.
skippuff54 said...

The cdc_acm module is missing in the newest linux kernel. See my posts in ubuntuforums:

http://ubuntuforums.org/showthread.php?t=1163204

http://ubuntuforums.org/showthread.php?t=1162437

Doug Mayfield said...

Another choice on getting the signal strength would be using a CMUX driver. The serial connection in some modems can be multiplexed. The AT command is AT+CMUX=1. This causes a binary protocol to take ove r the serial port. The CMUX protocol supports the usual PPP channel along with at least one more control channel for AT command to be delivered during the session. If a CMUX driver for linux was developed it could simply be pointed at the /dev/ttyACM0 and it would create 2+ pseudoterminals /dev/pty[X,Y,Z] through which AT commands and PPP could co-exist.

Anonymous said...

Wold you, please, describe with more details, how to find correct command in usbsniff log?
I trying to use my Huawei E1750, and find one method, but this modem contains microSD card reader, but with method I found it lost all storage devices. Under windows all 2 storage (card reader and cdom with drivers) still accessible, and sd card can be replaced without disconnection.
I'd want to try more suitable command for my modem, but can't understand the principles.

JesperBlog said...

Thank you for the tutorial, I try it to instal my Bandluxe C170 modem in Ubuntu Hardy Heron, I feel hard with the result of UsbSnoop.log to find the messageContent value for usb_modeswitch.

there are many lines of the log for
TransferBufferMDL or USBD_TRANSFER_DIRECTION_OUT words, I hard to decide which one I copy as the value of messageContent

thanks again,
imam

Anonymous said...

How did you use the usbsnoop.log information to come up with the message to tell the device to switch? I cannot figure that out on my own.

Mark A. Ziesemer said...

iav, JesperBlog, Anonymous:

Look for the first output after the send/receive of the URB_FUNCTION_SELECT_CONFIGURATION messages. At least in my case, it was the first message with the USBD_TRANSFER_DIRECTION_OUT flag.

Be sure to look for the highlighted portions in my example above.

Anonymous said...

A hint: Your device's phone number shows up right after the C8 06 (substitute a "0" for 0xa) in the device responses. In practice there's a fair bit of info there not terribly well hidden.

įŽ‘哈哈 said...

Thanks for your tutorial.
But I meet a big problem.
I could not point out which message content is USB_ModeSwitch need.

My device is BandLuxe C170.
My lsusb log is
http://dl.dropbox.com/u/2495108/lsusb.log
My SniffUSB/XP log is
http://dl.dropbox.com/u/2495108/UsbSnoop.log

So the first output after the send/receive of the URB_FUNCTION_SELECT_CONFIGURATION messages is
in line 293 of SniffUSB log file.
"
PipeHandle = 88f2249c [endpoint 0x00000001]
TransferFlags = 00000000 (USBD_TRANSFER_DIRECTION_OUT, ~USBD_SHORT_TRANSFER_OK)
TransferBufferLength = 0000001f
TransferBuffer = 890f4598
TransferBufferMDL = 00000000
00000000: 55 53 42 43 18 18 c0 88 24 00 00 00 80 00 06 12
00000010: 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00
"
But when copy it as MessageContent, it failed.
(I modified MessageContent item of /etc/usb_modeswitch/1a8d:1000 whitch is config of C120)
the file modified is http://dl.dropbox.com/u/2495108/1a8d_1000

This is the log file after I excute : "sudo usb_modeswitch -W -c "/etc/usb_modeswitch.d/1a8d:1000""
http://dl.dropbox.com/u/2495108/modswitch.log
After this command, it still not change mode from 1a8d:1000 to 1a8d:1009.

Could you help me to set up it,please?