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


                          10/10/05


CONTENTS

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


1. INTRODUCTION

   This tgz package contains a patch for the Linux kernel version 2.6.11
   and later to add support for MultiTech modems.  It also contains hotplug
   scripts and firmware images.

   The TI USB 3410/5052 driver should be included in the official Linux
   kernel in version 2.6.11 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.1 or later:
   ti_usb_2.6-1.1-1.src.rpm or or ti_usb_2.6-1.1.tgz.

   If you are running a 2.4 kernel, then you should get the standalone TI
   USB driver packages, version 1.1 or later: ti_usb-1.1-1.src.rpm or
   ti_usb-1.1.tgz.

   This packages have been tested on these Linux distributions:

   - Fedora Core 2

   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.brimson.com/downloads

   If you have questions or problems with this package please contact
   TI technical support, Al Borchers, alborchers@steinerpoint.com, or
   Peter Berger, pberger@brimson.com.


2. INSTALLATION

 Patching and Rebuilding the Kernel

   Apply the patch ti_usb_multitech_2.6.13.3.patch.  This patch should
   apply to 2.6.11 and later kernels.  Then rebuild and reinstall your
   kernel and/or kernel modules.  Be sure the TI USB driver is configured
   on.

   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.

 Installing the Firmware Images

   Copy ti_mts_fw_cdma, ti_mts_fw_edge, and ti_mts_fw_gsm to
   /usr/lib/hotplug/firmware/.  Be sure the files are owned by root:root
   and have permissions r--r--r--.

 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.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 0xF108, 0xF109,
   0xF110, 0xF111, and 0xF112 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[6+TI_EXTRA_VID_PID_COUNT+1] = {
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_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) },
};

...

static __devinitdata struct usb_device_id ti_id_table_combined[] = {
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_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_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[8+TI_EXTRA_VID_PID_COUNT+1] = {
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_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(0x1234, 0x1111) },
	{ USB_DEVICE(0x1234, 0x2222) },
};

...

static __devinitdata struct usb_device_id ti_id_table_combined[] = {
	{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_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_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 "6+TI_EXTRA_VID_PID_COUNT+1" to
     "8+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.
