This patch updates the omninet driver.


diff -Nru a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c
--- a/drivers/usb/serial/omninet.c      Thu Jan  3 21:41:53 2002
+++ b/drivers/usb/serial/omninet.c      Thu Jan  3 21:41:53 2002
@@ -10,6 +10,9 @@
  *
  * Please report both successes and troubles to the author at [EMAIL PROTECTED]
  * 
+ * (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.
  *
@@ -57,7 +60,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v1.0.0"
+#define DRIVER_VERSION "v1.1"
 #define DRIVER_AUTHOR "Anonymous"
 #define DRIVER_DESC "USB ZyXEL omni.net LCD PLUS Driver"
 
@@ -77,7 +80,7 @@
 static __u16   zyxel_vendor_id                 = ZYXEL_VENDOR_ID;
 static __u16   zyxel_omninet_product_id        = ZYXEL_OMNINET_ID;
 
-struct usb_serial_device_type zyxel_omninet_device = {
+static struct usb_serial_device_type zyxel_omninet_device = {
        name:                   "ZyXEL - omni.net lcd plus usb",
        idVendor:               &zyxel_vendor_id,
        idProduct:              &zyxel_omninet_product_id,
@@ -139,8 +142,7 @@
        struct usb_serial       *serial;
        struct usb_serial_port  *wport;
        struct omninet_data     *od;
-       unsigned long           flags;
-       int                     result;
+       int                     result = 0;
 
        if (port_paranoia_check (port, __FUNCTION__))
                return -ENODEV;
@@ -151,7 +153,7 @@
        if (!serial)
                return -ENODEV;
 
-       spin_lock_irqsave (&port->port_lock, flags);
+       down (&port->sem);
 
        MOD_INC_USE_COUNT;
        ++port->open_count;
@@ -164,7 +166,7 @@
                        err(__FUNCTION__"- kmalloc(%Zd) failed.", sizeof(struct 
omninet_data));
                        --port->open_count;
                        port->active = 0;
-                       spin_unlock_irqrestore (&port->port_lock, flags);
+                       up (&port->sem);
                        MOD_DEC_USE_COUNT;
                        return -ENOMEM;
                }
@@ -183,9 +185,9 @@
                        err(__FUNCTION__ " - failed submitting read urb, error %d", 
result);
        }
 
-       spin_unlock_irqrestore (&port->port_lock, flags);
+       up (&port->sem);
 
-       return (0);
+       return result;
 }
 
 static void omninet_close (struct usb_serial_port *port, struct file * filp)
@@ -193,7 +195,6 @@
        struct usb_serial       *serial;
        struct usb_serial_port  *wport;
        struct omninet_data     *od;
-       unsigned long           flags;
 
        if (port_paranoia_check (port, __FUNCTION__))
                return;
@@ -204,25 +205,26 @@
        if (!serial)
                return;
 
-       spin_lock_irqsave (&port->port_lock, flags);
+       down (&port->sem);
 
        --port->open_count;
-       MOD_DEC_USE_COUNT;
 
        if (port->open_count <= 0) {
-               od = (struct omninet_data *)port->private;
-               wport = &serial->port[1];
-
-               usb_unlink_urb (wport->write_urb);
-               usb_unlink_urb (port->read_urb);
+               if (serial->dev) {
+                       wport = &serial->port[1];
+                       usb_unlink_urb (wport->write_urb);
+                       usb_unlink_urb (port->read_urb);
+               }
 
                port->active = 0;
                port->open_count = 0;
+               od = (struct omninet_data *)port->private;
                if (od)
                        kfree(od);
        }
 
-       spin_unlock_irqrestore (&port->port_lock, flags);
+       up (&port->sem);
+       MOD_DEC_USE_COUNT;
 }
 
 
@@ -290,7 +292,6 @@
        struct omninet_data     *od     = (struct omninet_data   *) port->private;
        struct omninet_header   *header = (struct omninet_header *) 
wport->write_urb->transfer_buffer;
 
-       unsigned long           flags;
        int                     result;
 
 //     dbg("omninet_write port %d", port->number);
@@ -304,12 +305,13 @@
                return (0);
        }
 
-       spin_lock_irqsave (&port->port_lock, flags);
-       
        count = (count > OMNINET_BULKOUTSIZE) ? OMNINET_BULKOUTSIZE : count;
 
        if (from_user) {
-               copy_from_user(wport->write_urb->transfer_buffer + OMNINET_DATAOFFSET, 
buf, count);
+               if (copy_from_user(wport->write_urb->transfer_buffer + 
+OMNINET_DATAOFFSET, buf, count) != 0) {
+                       result = -EFAULT;
+                       goto exit;
+               }
        }
        else {
                memcpy (wport->write_urb->transfer_buffer + OMNINET_DATAOFFSET, buf, 
count);
@@ -327,16 +329,13 @@
 
        wport->write_urb->dev = serial->dev;
        result = usb_submit_urb(wport->write_urb);
-       if (result) {
+       if (result)
                err(__FUNCTION__ " - failed submitting write urb, error %d", result);
-               spin_unlock_irqrestore (&port->port_lock, flags);
-               return 0;
-       }
-
-//     dbg("omninet_write returns %d", count);
+       else
+               result = count;
 
-       spin_unlock_irqrestore (&port->port_lock, flags);
-       return (count);
+exit:  
+       return result;
 }
 
 


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

Reply via email to