]> git.hungrycats.org Git - linux/commit
[PATCH] Status Query On My MCT-U232 Patch
authorBill Marr <marr@flex.com>
Fri, 19 Dec 2003 03:11:27 +0000 (19:11 -0800)
committerGreg Kroah-Hartman <greg@kroah.com>
Fri, 19 Dec 2003 03:11:27 +0000 (19:11 -0800)
commit53f87a8f8e88d69a961d79c1f15c1022cbac869d
tree554041ec411c5e5c804503e98a92fa3bcfd3728c
parent1a11f106e8e3b1070e9457090790840574ad9b63
[PATCH] Status Query On My MCT-U232 Patch

Brief Patch Description:

Fix a problem in the 'mct_u232' driver whereby output data gets held up in the
USB/RS-232 adapter for RS-232 devices which don't assert the 'CTS' signal.

Background:

The Belkin F5U109 is a 9-pin USB/RS-232 adapter that is supported by the
existing 'mct_u232' kernel module.  Recently, I've been testing it under the
2.4.22 (Slackware 9.1) kernel and the 2.6.0-test9 kernel.

I've connected a Garmin 'GPS35 TracPak' GPS receiver (RS-232 interface) and an
ordinary RS-232 external modem to my PC's USB port via the Belkin F5U109
adapter.

Problem:

Although _reads_ from either of the RS-232 devices mentioned above work fine
via the Belkin adapter, _writes_ to the GPS receiver are not being seen by
the GPS.  Writes to the modem, however, work perfectly.

Aside: The 'Linux USB Users' archives show that at least one other person
(circa May 2002) had the exact same problem I'm having, but it sounds like no
solution was ever determined because the person in question just bought a
different USB/RS-232 adapter.

Investigation:

Using the 'seyon' terminal emulator in Linux and a crude hardware RS-232
"breakout box" that I hacked together, I've determined that the problem is
related to the RTS/CTS RS-232 hardware handshaking.

After further investigation, I've concluded that RS-232 devices which do not
assert the 'Clear To Send' ('CTS') signal prevent the Belkin F5U109 adapter
from transmitting data to the RS-232 device when the current (version 1.1)
'mct_u232' module is used. The data gets "queued up" (up to a point -- 16
bytes, I think) in the adapter but never transmitted.

Since this GPS receiver works perfectly (reads and writes) when connected to a
PC running W98se using the same Belkin adapter and the Belkin-supplied
Windows driver, the Linux driver became suspect.

After some testing with SniffUSB, I found that the Windows driver sends a
couple of unique undocumented USB 'device requests' that the Linux driver
does not. As it turns out, the second of those 2 requests is critical in
making the adapter transmit data to a device which doesn't assert 'CTS'.

For completeness, the Windows driver in use was determined from the 'Device
Manager', 'Driver File Details' page:

   U2SPORT.VXD
   Provider: Magic Control Technology
   File version: 1.21P.0104 for Win98/Me

Solution:

My patch adds the 2 missing USB 'device request' commands right after a
baud-change command. This mimics the operation of the W98 driver.

Unfortunately, after much testing, I found no other operation (besides a
baud-change request) under Windows that triggers either of these 2 'device
request' commands. This makes it impossible to fully document the behavior of
these requests, but I've made entries for them alongside the others in the
'mct_u232.h' file.

Purely for clarity, the patch also modifies various comments in 'mct_u232.h',
mostly to reflect proper sizes of the various 'USB Device Request' fields per
the USB 1.1 specification.

The patch also updates the version number of the driver, corrects a minor
typographical error, and documents a difference in the length of the data in
a 'baud rate change' command for certain adapters which use a coded baud-rate
rather than the conventional RS-232 baud rate divisor.

I've provided (tested) patches for both the 2.4.22 and the 2.6.0-test9
kernels.

Please note that the changes to 'mct_u232.h' apply to both 2.4.22 and
2.6.0-test9 since that file has not changed between those kernel releases.
Nevertheless, I've included that (same) portion of the patch in both
attachments for simplicity.

Bill Marr
drivers/usb/serial/mct_u232.c
drivers/usb/serial/mct_u232.h