This patch updates the empeg driver.

diff -Nru a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c
--- a/drivers/usb/serial/empeg.c        Thu Jan  3 21:41:53 2002
+++ b/drivers/usb/serial/empeg.c        Thu Jan  3 21:41:53 2002
@@ -1,10 +1,10 @@
 /*
  * USB Empeg empeg-car player driver
  *
- *     Copyright (C) 2000
+ *     Copyright (C) 2000, 2001
  *         Gary Brubaker ([EMAIL PROTECTED])
  *
- *     Copyright (C) 1999, 2000
+ *     Copyright (C) 1999 - 2001
  *         Greg Kroah-Hartman ([EMAIL PROTECTED])
  *
  *     This program is free software; you can redistribute it and/or modify
@@ -13,10 +13,13 @@
  *
  * See Documentation/usb/usb-serial.txt for more information on using this driver
  * 
- * (07/29/2001) gb
+ * (07/16/2001) gb
  *     remove unused code in empeg_close() (thanks to Oliver Neukum for pointing this
  *     out) and rewrote empeg_set_termios().
  * 
+ * (05/30/2001) gkh
+ *     switched from using spinlock to a semaphore, which fixes lots of problems.
+ *
  * (04/08/2001) gb
  *      Identify version on module load.
  * 
@@ -75,7 +78,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v1.0.1"
+#define DRIVER_VERSION "v1.2"
 #define DRIVER_AUTHOR "Greg Kroah-Hartman <[EMAIL PROTECTED]>, Gary Brubaker 
<[EMAIL PROTECTED]>"
 #define DRIVER_DESC "USB Empeg Mark I/II Driver"
 
@@ -147,15 +150,14 @@
 static int empeg_open (struct usb_serial_port *port, struct file *filp)
 {
        struct usb_serial *serial = port->serial;
-       unsigned long flags;
-       int result;
+       int result = 0;;
 
        if (port_paranoia_check (port, __FUNCTION__))
                return -ENODEV;
 
        dbg(__FUNCTION__ " - port %d", port->number);
 
-       spin_lock_irqsave (&port->port_lock, flags);
+       down (&port->sem);
 
        ++port->open_count;
        MOD_INC_USE_COUNT;
@@ -189,16 +191,15 @@
 
        }
 
-       spin_unlock_irqrestore (&port->port_lock, flags);
+       up (&port->sem);
 
-       return 0;
+       return result;
 }
 
 
 static void empeg_close (struct usb_serial_port *port, struct file * filp)
 {
        struct usb_serial *serial;
-       unsigned long flags;
 
        if (port_paranoia_check (port, __FUNCTION__))
                return;
@@ -209,24 +210,25 @@
        if (!serial)
                return;
 
-       spin_lock_irqsave (&port->port_lock, flags);
+       down (&port->sem);
 
        --port->open_count;
 
        if (port->open_count <= 0) {
-               /* shutdown our bulk read */
-               usb_unlink_urb (port->read_urb);
+               if (serial->dev) {
+                       /* shutdown our bulk read */
+                       usb_unlink_urb (port->read_urb);
+               }
                port->active = 0;
                port->open_count = 0;
        }
 
-       spin_unlock_irqrestore (&port->port_lock, flags);
+       up (&port->sem);
 
        /* Uncomment the following line if you want to see some statistics in your 
syslog */
        /* info ("Bytes In = %d  Bytes Out = %d", bytes_in, bytes_out); */
 
        MOD_DEC_USE_COUNT;
-
 }
 
 
@@ -277,7 +279,10 @@
                transfer_size = MIN (count, URB_TRANSFER_BUFFER_SIZE);
 
                if (from_user) {
-                       copy_from_user (urb->transfer_buffer, current_position, 
transfer_size);
+                       if (copy_from_user (urb->transfer_buffer, current_position, 
+transfer_size)) {
+                               bytes_sent = -EFAULT;
+                               break;
+                       }
                } else {
                        memcpy (urb->transfer_buffer, current_position, transfer_size);
                }
@@ -297,8 +302,11 @@
 
                /* send it down the pipe */
                status = usb_submit_urb(urb);
-               if (status)
-                       dbg(__FUNCTION__ " - usb_submit_urb(write bulk) failed with 
status = %d", status);
+               if (status) {
+                       err(__FUNCTION__ " - usb_submit_urb(write bulk) failed with 
+status = %d", status);
+                       bytes_sent = status;
+                       break;
+               }
 
                current_position += transfer_size;
                bytes_sent += transfer_size;
@@ -321,7 +329,7 @@
 
        dbg(__FUNCTION__ " - port %d", port->number);
 
-       spin_lock_irqsave (&port->port_lock, flags);
+       spin_lock_irqsave (&write_urb_pool_lock, flags);
 
        /* tally up the number of bytes available */
        for (i = 0; i < NUM_URBS; ++i) {
@@ -330,7 +338,7 @@
                }
        } 
 
-       spin_unlock_irqrestore (&port->port_lock, flags);
+       spin_unlock_irqrestore (&write_urb_pool_lock, flags);
 
        dbg(__FUNCTION__ " - returns %d", room);
 
@@ -347,7 +355,7 @@
 
        dbg(__FUNCTION__ " - port %d", port->number);
 
-       spin_lock_irqsave (&port->port_lock, flags);
+       spin_lock_irqsave (&write_urb_pool_lock, flags);
 
        /* tally up the number of bytes waiting */
        for (i = 0; i < NUM_URBS; ++i) {
@@ -356,7 +364,7 @@
                }
        }
 
-       spin_unlock_irqrestore (&port->port_lock, flags);
+       spin_unlock_irqrestore (&write_urb_pool_lock, flags);
 
        dbg (__FUNCTION__ " - returns %d", chars);
 
@@ -458,15 +466,13 @@
 
 static void empeg_throttle (struct usb_serial_port *port)
 {
-       unsigned long flags;
-
        dbg(__FUNCTION__ " - port %d", port->number);
 
-       spin_lock_irqsave (&port->port_lock, flags);
+       down (&port->sem);
 
        usb_unlink_urb (port->read_urb);
 
-       spin_unlock_irqrestore (&port->port_lock, flags);
+       up (&port->sem);
 
        return;
 
@@ -475,12 +481,11 @@
 
 static void empeg_unthrottle (struct usb_serial_port *port)
 {
-       unsigned long flags;
        int result;
 
        dbg(__FUNCTION__ " - port %d", port->number);
 
-       spin_lock_irqsave (&port->port_lock, flags);
+       down (&port->sem);
 
        port->read_urb->dev = port->serial->dev;
 
@@ -489,7 +494,7 @@
        if (result)
                err(__FUNCTION__ " - failed submitting read urb, error %d", result);
 
-       spin_unlock_irqrestore (&port->port_lock, flags);
+       up (&port->sem);
 
        return;
 


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

Reply via email to