This patch updates the mctu232 driver.


diff -Nru a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
--- a/drivers/usb/serial/mct_u232.c     Thu Jan  3 21:41:53 2002
+++ b/drivers/usb/serial/mct_u232.c     Thu Jan  3 21:41:53 2002
@@ -24,6 +24,15 @@
  *   Basic tests have been performed with minicom/zmodem transfers and
  *   modem dialing under Linux 2.4.0-test10 (for me it works fine).
  *
+ * 10-Nov-2001 Wolfgang Grandegger
+ *   - Fixed an endianess problem with the baudrate selection for PowerPC.
+ *
+ * 06-Dec-2001 Martin Hamilton <[EMAIL PROTECTED]>
+ *     Added support for the Belkin F5U109 DB9 adaptor
+ *
+ * 30-May-2001 Greg Kroah-Hartman
+ *     switched from using spinlock to a semaphore, which fixes lots of problems.
+ *
  * 04-May-2001 Stelian Pop
  *   - Set the maximum bulk output size for Sitecom U232-P25 model to 16 bytes
  *     instead of the device reported 32 (using 32 bytes causes many data
@@ -79,7 +88,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v1.0.0"
+#define DRIVER_VERSION "v1.1"
 #define DRIVER_AUTHOR "Wolfgang Grandegger <[EMAIL PROTECTED]>"
 #define DRIVER_DESC "Magic Control Technology USB-RS232 converter driver"
 
@@ -91,7 +100,7 @@
  */
 #undef FIX_WRITE_RETURN_CODE_PROBLEM
 #ifdef FIX_WRITE_RETURN_CODE_PROBLEM
-static int write_blocking = 0; /* disabled by default */
+static int write_blocking; /* disabled by default */
 #endif
 
 /*
@@ -127,8 +136,10 @@
 static __u16   mct_u232_product_id     = MCT_U232_PID;
 static __u16   mct_u232_sitecom_id     = MCT_U232_SITECOM_PID;
 static __u16   mct_u232_du_h3sp_id     = MCT_U232_DU_H3SP_PID;
+static __u16   mct_u232_belkin_vendor_id       = MCT_U232_BELKIN_F5U109_VID;
+static __u16   mct_u232_belkin_product_id      = MCT_U232_BELKIN_F5U109_PID;
 
-struct usb_serial_device_type mct_u232_device = {
+static struct usb_serial_device_type mct_u232_device = {
        name:                "Magic Control Technology USB-RS232",
        idVendor:            &mct_u232_vendor_id,
        idProduct:           &mct_u232_product_id,
@@ -153,7 +164,7 @@
        shutdown:            mct_u232_shutdown,
 };
 
-struct usb_serial_device_type mct_u232_sitecom_device = {
+static struct usb_serial_device_type mct_u232_sitecom_device = {
        name:                "MCT/Sitecom USB-RS232",
        idVendor:            &mct_u232_vendor_id,
        idProduct:           &mct_u232_sitecom_id,
@@ -178,7 +189,7 @@
        shutdown:            mct_u232_shutdown,
 };
 
-struct usb_serial_device_type mct_u232_du_h3sp_device = {
+static struct usb_serial_device_type mct_u232_du_h3sp_device = {
         name:                "MCT/D-Link DU-H3SP USB BAY",
        idVendor:            &mct_u232_vendor_id,
        idProduct:           &mct_u232_du_h3sp_id,
@@ -203,6 +214,31 @@
         shutdown:            mct_u232_shutdown,
 };
 
+static struct usb_serial_device_type mct_u232_belkin_device = {
+        name:                "Belkin F5U109",
+       idVendor:            &mct_u232_belkin_vendor_id,
+       idProduct:           &mct_u232_belkin_product_id,
+        needs_interrupt_in:  MUST_HAVE,  /* 2 interrupt-in endpoints */
+        needs_bulk_in:       MUST_HAVE_NOT,   /* no bulk-in endpoint */
+        needs_bulk_out:      MUST_HAVE,       /* 1 bulk-out endpoint */
+        num_interrupt_in:    2,
+        num_bulk_in:         0,
+        num_bulk_out:        1,
+        num_ports:           1,
+        open:                mct_u232_open,
+        close:               mct_u232_close,
+#ifdef FIX_WRITE_RETURN_CODE_PROBLEM
+        write:               mct_u232_write,
+        write_bulk_callback: mct_u232_write_bulk_callback,
+#endif
+        read_int_callback:   mct_u232_read_int_callback,
+        ioctl:               mct_u232_ioctl,
+        set_termios:         mct_u232_set_termios,
+        break_ctl:           mct_u232_break_ctl,
+        startup:             mct_u232_startup,
+        shutdown:            mct_u232_shutdown,
+};
+
 
 
 
@@ -220,7 +256,8 @@
 #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) {
+       if (serial->dev->descriptor.idProduct == MCT_U232_SITECOM_PID
+         || serial->dev->descriptor.idProduct == MCT_U232_BELKIN_F5U109_PID) {
                switch (value) {
                        case    300: return 0x01;
                        case    600: return 0x02; /* this one not tested */
@@ -243,7 +280,7 @@
 {
        unsigned int divisor;
         int rc;
-       divisor = mct_u232_calculate_baud_rate(serial, value);
+       divisor = cpu_to_le32(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,
@@ -374,13 +411,13 @@
 
 static int  mct_u232_open (struct usb_serial_port *port, struct file *filp)
 {
-       unsigned long flags;
        struct usb_serial *serial = port->serial;
        struct mct_u232_private *priv = (struct mct_u232_private *)port->private;
+       int retval = 0;
 
        dbg(__FUNCTION__" port %d", port->number);
 
-       spin_lock_irqsave (&port->port_lock, flags);
+       down (&port->sem);
        
        ++port->open_count;
        MOD_INC_USE_COUNT;
@@ -426,16 +463,21 @@
                }
 
                port->read_urb->dev = port->serial->dev;
-               if (usb_submit_urb(port->read_urb))
+               retval = usb_submit_urb(port->read_urb);
+               if (retval) {
                        err("usb_submit_urb(read bulk) failed");
+                       goto exit;
+               }
 
                port->interrupt_in_urb->dev = port->serial->dev;
-               if (usb_submit_urb(port->interrupt_in_urb))
+               retval = usb_submit_urb(port->interrupt_in_urb);
+               if (retval)
                        err(" usb_submit_urb(read int) failed");
 
        }
 
-       spin_unlock_irqrestore (&port->port_lock, flags);
+exit:
+       up (&port->sem);
        
        return 0;
 } /* mct_u232_open */
@@ -443,26 +485,24 @@
 
 static void mct_u232_close (struct usb_serial_port *port, struct file *filp)
 {
-       unsigned long flags;
-
        dbg(__FUNCTION__" port %d", port->number);
 
-       spin_lock_irqsave (&port->port_lock, flags);
+       down (&port->sem);
 
        --port->open_count;
-       MOD_DEC_USE_COUNT;
 
        if (port->open_count <= 0) {
-               /* shutdown our bulk reads and writes */
-               usb_unlink_urb (port->write_urb);
-               usb_unlink_urb (port->read_urb);
-               /* wgg - do I need this? I think so. */
-               usb_unlink_urb (port->interrupt_in_urb);
+               if (port->serial->dev) {
+                       /* shutdown our urbs */
+                       usb_unlink_urb (port->write_urb);
+                       usb_unlink_urb (port->read_urb);
+                       usb_unlink_urb (port->interrupt_in_urb);
+               }
                port->active = 0;
        }
        
-       spin_unlock_irqrestore (&port->port_lock, flags);
-
+       up (&port->sem);
+       MOD_DEC_USE_COUNT;
 } /* mct_u232_close */
 
 
@@ -473,7 +513,6 @@
                           const unsigned char *buf, int count)
 {
        struct usb_serial *serial = port->serial;
-       unsigned long flags;
        int result, bytes_sent, size;
 
        dbg(__FUNCTION__ " - port %d", port->number);
@@ -496,14 +535,17 @@
        bytes_sent = 0;
        while (count > 0) {
                
-               spin_lock_irqsave (&port->port_lock, flags);
+               down (&port->sem);
                
                size = (count > port->bulk_out_size) ? port->bulk_out_size : count;
                
                usb_serial_debug_data (__FILE__, __FUNCTION__, size, buf);
                
                if (from_user) {
-                       copy_from_user(port->write_urb->transfer_buffer, buf, size);
+                       if (copy_from_user(port->write_urb->transfer_buffer, buf, 
+size)) {
+                               up (&port->sem);
+                               return -EFAULT;
+                       }
                }
                else {
                        memcpy (port->write_urb->transfer_buffer, buf, size);
@@ -524,11 +566,11 @@
                if (result) {
                        err(__FUNCTION__
                            " - failed submitting write urb, error %d", result);
-                       spin_unlock_irqrestore (&port->port_lock, flags);
-                       return bytes_sent;
+                       up (&port->sem);
+                       return result;
                }
 
-               spin_unlock_irqrestore (&port->port_lock, flags);
+               up (&port->sem);
 
                bytes_sent += size;
                if (write_blocking)
@@ -794,7 +836,7 @@
 {
        struct usb_serial *serial = port->serial;
        struct mct_u232_private *priv = (struct mct_u232_private *)port->private;
-       int ret, mask;
+       int mask;
        
        dbg (__FUNCTION__ "cmd=0x%x", cmd);
 
@@ -807,7 +849,8 @@
        case TIOCMSET: /* Turns on and off the lines as specified by the mask */
        case TIOCMBIS: /* turns on (Sets) the lines as specified by the mask */
        case TIOCMBIC: /* turns off (Clears) the lines as specified by the mask */
-               if ((ret = get_user(mask, (unsigned long *) arg))) return ret;
+               if (get_user(mask, (unsigned long *) arg))
+                       return -EFAULT;
 
                if ((cmd == TIOCMSET) || (mask & TIOCM_RTS)) {
                        /* RTS needs set */
@@ -853,6 +896,7 @@
        usb_serial_register (&mct_u232_device);
        usb_serial_register (&mct_u232_sitecom_device);
        usb_serial_register (&mct_u232_du_h3sp_device);
+       usb_serial_register (&mct_u232_belkin_device);
        info(DRIVER_VERSION ":" DRIVER_DESC);
        return 0;
 }
@@ -863,6 +907,7 @@
        usb_serial_deregister (&mct_u232_device);
        usb_serial_deregister (&mct_u232_sitecom_device);
        usb_serial_deregister (&mct_u232_du_h3sp_device);
+       usb_serial_deregister (&mct_u232_belkin_device);
 }
 
 
diff -Nru a/drivers/usb/serial/mct_u232.h b/drivers/usb/serial/mct_u232.h
--- a/drivers/usb/serial/mct_u232.h     Thu Jan  3 21:41:53 2002
+++ b/drivers/usb/serial/mct_u232.h     Thu Jan  3 21:41:53 2002
@@ -30,9 +30,12 @@
 #define MCT_U232_SITECOM_PID           0x0230  /* Sitecom Product Id */
 
 /* DU-H3SP USB BAY hub */
-
 #define MCT_U232_DU_H3SP_PID           0x0200  /* D-Link DU-H3SP USB BAY */
 
+/* Belkin badge the MCT U232-P9 as the F5U109 */
+#define MCT_U232_BELKIN_F5U109_VID     0x050d  /* Vendor Id */
+#define MCT_U232_BELKIN_F5U109_PID     0x0109  /* Product Id */
+
 /*
  * Vendor Request Interface
  */
@@ -363,6 +366,25 @@
  *       bmAttributes        =   03 (Interrupt)
  *       wMaxPacketSize      = 0002
  *       bInterval           =   02
+ *
+ *
+ * Hardware details (added by Martin Hamilton, 2001/12/06)
+ * -----------------------------------------------------------------
+ *
+ * This info was gleaned from opening a Belkin F5U109 DB9 USB serial
+ * adaptor, which turns out to simply be a re-badged U232-P9.  We
+ * know this because there is a sticky label on the circuit board
+ * which says "U232-P9" ;-)
+ * 
+ * The circuit board inside the adaptor contains a Philips PDIUSBD12
+ * USB endpoint chip and a Phillips P87C52UBAA microcontroller with
+ * embedded UART.  Exhaustive documentation for these is available at:
+ *
+ *   http://www.semiconductors.philips.com/pip/p87c52ubaa
+ *   http://www.semiconductors.philips.com/pip/pdiusbd12
+ *
+ * Thanks to Julian Highfield for the pointer to the Philips database.
+ * 
  */
 
 #endif /* __LINUX_USB_SERIAL_MCT_U232_H */


_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to