This patch fixes the baud rate in the mct_u232 driver when
used with the Sitecom device. 

I only have the Sitecom device available so I've corrected the
baud rate calculation only for this model. Someone with a 
real MCT or DLINK device should verify the original baud rate
calculation, because I suspect it to be wrong for all models
this driver supports (the same Windows driver is used for all
this models, so I suppose there is a unique baud rate calculation...).

Anyway, this enables me to use my Siemens S25 cell modem (working
only at a fixed baud rate of 19200) with this adapter, so it may
be useful for some other people.

Please note that I'm not subscribed to linux-usb-devel, only to
linux-kernel...

Stelian.

diff -uNr linux-2.4.4.orig/drivers/usb/serial/mct_u232.c 
linux-2.4.4/drivers/usb/serial/mct_u232.c
--- linux-2.4.4.orig/drivers/usb/serial/mct_u232.c      Wed May  2 15:07:45 2001
+++ linux-2.4.4/drivers/usb/serial/mct_u232.c   Wed May  2 14:49:15 2001
@@ -24,6 +24,9 @@
  *   Basic tests have been performed with minicom/zmodem transfers and
  *   modem dialing under Linux 2.4.0-test10 (for me it works fine).
  *
+ * 02-May-2001 Stelian Pop
+ *   - Fixed the baud calculation for Sitecom U232-P25 model
+ *
  * 06-Jan-2001 Cornel Ciocirlan 
  *   - Added support for Sitecom U232-P25 model (Product Id 0x0230)
  *   - Added support for D-Link DU-H3SP USB BAY (Product Id 0x0200)
@@ -218,11 +221,31 @@
 
 #define WDR_TIMEOUT (HZ * 5 ) /* default urb timeout */
 
+static int mct_u232_calculate_baud_rate(struct usb_serial *serial, int value) {
+       if (serial->dev->descriptor.idProduct == MCT_U232_SITECOM_PID) {
+               switch (value) {
+                       case    300: return 0x01;
+                       case    600: return 0x02; /* this one not tested */
+                       case   1200: return 0x03;
+                       case   2400: return 0x04;
+                       case   4800: return 0x06;
+                       case   9600: return 0x08;
+                       case  19200: return 0x09;
+                       case  38400: return 0x0a;
+                       case  57600: return 0x0b;
+                       case 115200: return 0x0c;
+                       default:     return -1; /* normally not reached */
+               }
+       }
+       else
+               return MCT_U232_BAUD_RATE(value);
+}
+
 static int mct_u232_set_baud_rate(struct usb_serial *serial, int value)
 {
        unsigned int divisor;
         int rc;
-       divisor = MCT_U232_BAUD_RATE(value);
+       divisor = mct_u232_calculate_baud_rate(serial, value);
         rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
                              MCT_U232_SET_BAUD_RATE_REQUEST,
                             MCT_U232_SET_REQUEST_TYPE,
@@ -230,7 +253,7 @@
                             WDR_TIMEOUT);
        if (rc < 0)
                err("Set BAUD RATE %d failed (error = %d)", value, rc);
-       dbg("set_baud_rate: 0x%x", divisor);
+       dbg("set_baud_rate: value: %d, divisor: 0x%x", value, divisor);
         return rc;
 } /* mct_u232_set_baud_rate */
 
-- 
Stelian Pop <[EMAIL PROTECTED]>
|------------- Ingénieur Informatique Libre --------------|
| Alcôve - http://www.alcove.com - Tel: +33 1 49 22 68 00 |
|----------- Alcôve, l'informatique est libre ------------|
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to