This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / drivers / usb / serial / mct_u232.c
index 1c16a1f..212906c 100644 (file)
@@ -110,6 +110,7 @@ static void mct_u232_close           (struct usb_serial_port *port,
                                          struct file *filp);
 #ifdef FIX_WRITE_RETURN_CODE_PROBLEM
 static int  mct_u232_write              (struct usb_serial_port *port,
+                                         int from_user,
                                          const unsigned char *buf,
                                          int count);
 static void mct_u232_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
@@ -236,7 +237,7 @@ static int mct_u232_calculate_baud_rate(struct usb_serial *serial, int value) {
 
 static int mct_u232_set_baud_rate(struct usb_serial *serial, int value)
 {
-       __le32 divisor;
+       unsigned int divisor;
         int rc;
         unsigned char zero_byte = 0;
 
@@ -479,9 +480,9 @@ static void mct_u232_close (struct usb_serial_port *port, struct file *filp)
 
        if (port->serial->dev) {
                /* shutdown our urbs */
-               usb_kill_urb(port->write_urb);
-               usb_kill_urb(port->read_urb);
-               usb_kill_urb(port->interrupt_in_urb);
+               usb_unlink_urb (port->write_urb);
+               usb_unlink_urb (port->read_urb);
+               usb_unlink_urb (port->interrupt_in_urb);
        }
 } /* mct_u232_close */
 
@@ -489,7 +490,7 @@ static void mct_u232_close (struct usb_serial_port *port, struct file *filp)
 #ifdef FIX_WRITE_RETURN_CODE_PROBLEM
 /* The generic routines work fine otherwise */
 
-static int mct_u232_write (struct usb_serial_port *port,
+static int mct_u232_write (struct usb_serial_port *port, int from_user,
                           const unsigned char *buf, int count)
 {
        struct usb_serial *serial = port->serial;
@@ -518,7 +519,14 @@ static int mct_u232_write (struct usb_serial_port *port,
                
                usb_serial_debug_data(debug, &port->dev, __FUNCTION__, size, buf);
                
-               memcpy (port->write_urb->transfer_buffer, buf, size);
+               if (from_user) {
+                       if (copy_from_user(port->write_urb->transfer_buffer, buf, size)) {
+                               return -EFAULT;
+                       }
+               }
+               else {
+                       memcpy (port->write_urb->transfer_buffer, buf, size);
+               }
                
                /* set up our urb */
                usb_fill_bulk_urb(port->write_urb, serial->dev,