-
Bill Marr authored
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
53f87a8f