            TI USB 3410/5052 Linux Driver Package
                            with
                Support for MultiTech Modems


                          11/18/08


CONTENTS

   1. Introduction
   2. Installation
   3. Enhancements and Bug Fixes
   4. Known Limitations
   5. Vendor and Product Ids


1. INTRODUCTION

   This tar.bz2 package contains a patch for the Linux kernel version 2.6.18
   and later to add support for MultiTech modems. The patch was generated
   from the 2.6.18.4 kernel source. Additional support files like hotplug
   scripts, udev rules and firmware images are also included.

   The TI USB 3410/5052 driver should be included in the official Linux
   kernel in version 2.6.20 or later.  The official Linux kernel does not
   yet have support for the Multitech modems, however; to add that support
   you need this package.

   If you are running a 2.6 kernel earlier than 2.6.11, then you should get
   the standalone TI USB driver packages, version 1.2 or later:
   mts_ti_usb_2.6-1.3.0.src.rpm or or mts_ti_usb_2.6-1.3.0.tar.bz2.

   If you are running a 2.4 kernel, then you should get the standalone TI
   USB driver packages, version 1.2 or later: mts_ti_usb-1.3.1-1.src.rpm or
   mts_ti_usb-1.3.1.tar.bz2.

   This packages have been tested on these Linux distributions:

   - Fedora Core 6
   - CentOS 5

   Most likely this package will work on many other Linux distributions
   based on the 2.6 kernels, but this has not yet been tested.  Note
   that different distributions can make custom changes to the Linux
   kernel, and there is a small chance that these changes might be
   incompatible with this package.

   These packages are available from

     http://www.multitech.com

   If you have questions or problems with this package please contact
   Multi-Tech Systems technical support.


2. INSTALLATION

 Patching and Rebuilding the Kernel

   Apply the patch mts_ti_usb_3410-2.6.18.patch.  This patch should
   apply to 2.6.18 and later kernels through 2.6.26.  Then rebuild and reinstall your
   kernel and/or kernel modules.  Be sure the TI USB driver is configured
   on.

   There is also included mts_ti_usb_3410-2.6.27.patch.  This patch should be
   applied to the 2.6.27 and later kernels.  There is also a patch for 2.6.16
   kernels. It has not been tested on other kernels, besides the 2.6.16 kernel.

   Detailed instructions on patching and building a kernel can be found
   elsewhere.

 Installing the Hotplug Scripts

   The ti_usb_3410_5052 driver needs a hotplug script to work correctly.
   This hotplug script is used to change the device configuration.

   Copy ti_usb_3410_5052 to /etc/hotplug/usb/ti_usb_3410_5052.  Be sure
   the script is owned by root:root and has permissions r-xr-xr-x.

   If the device configuration is not being set properly, you might need a
   slightly different hotplug script, depending on your Linux distribution.
   If this does not work, remove /etc/hotplug/usb/ti_usb_3410_5052 and
   instead copy /etc/ti_usb/ti_usb_3410_5052.hotplug into /etc/hotplug.d/usb.

   Some distribution have deprecated hotplug scripts. If this is the case,
   you will most likely need a udev rule to perform this function.

 Installing udev Rules

   The ti_usb_3410_5052 driver needs a udev rule to work correctly. This
   udev rule is used to change the device configuration.

   Copy the *.rules to /etc/udev/rules.d. Be sure the rule is 
   owned by root:root and has permissions r-xr-xr-x.

   If the device configuration is not being set properly, you might need a
   slightly different udev rule, depending on your Linux distribution.
   
 Installing the Firmware Images

   Copy umpfcdma.i51, umpfedge.i51, umpfgsm.i51, umpfmt9234mu.i51, umpfmt9234zbausb.i51
   abd umpfmt9234zbausbavaya.i51 to /usr/lib/hotplug/firmware/ or /lib/firmware
   depending on your distribution.  Be sure the files are owned by root:root 
   and have permissions r--r--r--.

   Note: This is only needed if firmware is not built into the driver. 

 Load the TI USB 3410/5052 Driver

   The ti_usb_3410_5052 driver should be automatically loaded when you
   plug in the TI USB 3410/5052 devices, provided your device uses the
   default vendor and product ids.  If it does not, see the section
   below titled "VENDOR and PRODUCT IDS".

   The first TI USB 3410/5052 device plugged in will appear as
   /dev/ttyUSB0, then next as /dev/ttyUSB1, and so on.  These
   device names are shared with other USB serial devices.

   If TI USB devices had been in use before installing the new
   TI USB driver, old versions of the drivers will still be loaded.
   These old versions must be unloaded before the newly installed
   driver will be used.

   The simplest way to unload the old drivers and load the
   new is to reboot.

   Alternatively, you can close all open TI USB serial ports,
   disconnect the TI USB serial devices, and then unload the
   old TI USB serial driver with the command

     rmmod ti_usb_3410_5052

   Then reconnect the TI USB serial devices and the new driver
   will be loaded.


3. ENHANCEMENTS and BUG FIXES

  Version 1.3.1
  - Added code to handle DCD transistions from high to low.

  Version 1.3.0
  - Added a new product ID.

  Version 1.2.1
  - A change was made to the MT9234ZBA-USB USB interface code. It used to 
    report class: FF, sub-class: 00 and protocol: 00. This has been changed
    to report class: 02, sub-class: 00 and protocol: 00.

  Version 1.2
  - Added option to configuation to build driver with firmware compiled in
    or have firmware requested and loaded from user-space.
  - Added support for Multitech MT9234MU and MT9234ZBA-USB.
  - Added udev rule to support systems which have deprecated hotplug scripts.

  Version 1.1

  - Added support for Multitech GSM. CDMA, and EDGE modems.  Thanks
    to Dale Martenson of Multitech.


4. KNOWN LIMITATIONS
 
  - A 3410 without firmware in EEPROM will only work correctly
    in Linux kernels 2.6.8 and later.  Earlier kernels are unable
    to reset the 3410 after downloading firmware.

  - In kernels before 2.6.6, vendor and product ids given as
    module parameters are limited to values between 0x0000 and
    0x7FFF.  This is a problem in the Linux module parameter
    feature.

  - EEPROMS with firmware already programmed will only work
    with Linux if the firmware is from 9/8/04 or later for
    the 3410 and from 9/18/04 or later for the 5052.

  - If the port is software flow controlled when it is closed,
    it will remain flow controlled when it is re-opened.  The
    port must be re-opened, re-configured for software flow
    control, and a control-Q must be sent to the port to restart
    output.  This is a firmware problem.

  - The TI USB devices always drop DTR on close.  This behavior
    cannot be changed by turning off hang-up on close (HUPCL);
    HUPCL is always in effect and cannot be turned off.


5. VENDOR and PRODUCT IDS

   The ti_usb_3410_5052 driver is built to use the default vendor id
   0x0451 and product ids 0x3410, 0x5052, 0x5152, 0x505A, and 0x505F
   for TI devices and vendor id 0x06E0 and product ids 0x0319, 0xF108, 
   0xF109, 0xF110, 0xF111, 0xF112, 0xF114 and 0xF115 for MultiTech devices.

   If your device uses different product ids you must either specify
   the vendor and product ids when you load the ti_usb_3410_5052 module
   or compile the vendor and product ids into the module.  The second
   solution is a bit more work, but allows the ti_usb_3410_5052 driver
   to be loaded automatically when you plug in your device.

   Suppose you have a 3410 based device with vendor id 0x1234 and
   with a product id before firmware download of 0x1111 and after
   firmware download of 0x2222.

   Specifying the Vendor and Product Ids When Loading ti_usb_3410_5052

     You would load the ti_usb_3410_5052 module with this command, either
     entered by hand or in a startup script,

       modprobe ti_usb_3410_5052 vendor_3410=0x1234,0x1234 product_3410=0x1111,0x2222

     Note that you must have the same number of vendor and product
     ids.  Even if the vendor id is the same, you must list it once
     for each product id.

     Alternatively, you could add this line to /etc/modules.conf

       add options ti_usb_3410_5052 vendor_3410=0x1234,0x1234 product_3410=0x1111,0x2222

     But you would still need to load the ti_usb_3410_5052 module by hand
     or in a startup script with the command

       modprobe ti_usb_3410_5052

     Specifying the vendor and product ids when loading the module
     requires that you explicitly load the module by hand or in a
     startup script.  The module cannot be loaded automatically by
     Linux when you plug in the device, because Linux does not know
     what vendor and product ids are used by the device.

     If you have a 5052 based device, then the module parameters are
     "vendor_5052" and "product_5052".

   Compiling the Vendor and Product Ids into ti_usb_3410_5052

     In the Linux source directory drivers/usb/serial, edit the file
     ti_usb_3410_5052.c.  Find these lines near the top of the file

static struct usb_device_id ti_id_table_3410[9+TI_EXTRA_VID_PID_COUNT+1] = {
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_NO_FW_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_NO_FW_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_EDGE_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_MT9234MU_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_MT9234ZBAUSB_PRODUCT_ID) },
};

...

static struct usb_device_id ti_id_table_combined[] = {
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_NO_FW_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_NO_FW_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_EDGE_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_MT9234MU_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_MT9234ZBAUSB_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
	{ }
};

    and change them to be

static struct usb_device_id ti_id_table_3410[11+TI_EXTRA_VID_PID_COUNT+1] = {
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_NO_FW_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_NO_FW_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_EDGE_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_MT9234MU_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_MT9234ZBAUSB_PRODUCT_ID) },
	{ USB_DEVICE(0x1234, 0x1111) },
	{ USB_DEVICE(0x1234, 0x2222) },
};

...

static struct usb_device_id ti_id_table_combined[] = {
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_NO_FW_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_NO_FW_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_EDGE_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_MT9234MU_PRODUCT_ID) },
	{ USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_MT9234ZBAUSB_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
	{ USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
	{ USB_DEVICE(0x1234, 0x1111) },
	{ USB_DEVICE(0x1234, 0x2222) },
	{ }
};


     Notice that the array dimension on the ti_id_table_3410
     array has been changed from "9+TI_EXTRA_VID_PID_COUNT+1" to
     "11+TI_EXTRA_VID_PID_COUNT+1" to make room for the two new
     vendor/product ids.

     Rebuild your kernel and/or modules.

     Once your vendor and product ids are compiled in, Linux will
     automatically load the ti_usb_3410_5052 driver when your device
     is connected.

     If you have a 5052 based device, then edit the ti_id_table_5052
     instead of the ti_id_table_3410.  Otherwise, the changes are
     similar.
