diff options
Diffstat (limited to 'usb/usb-ldusb-bugfix.patch')
| -rw-r--r-- | usb/usb-ldusb-bugfix.patch | 136 |
1 files changed, 0 insertions, 136 deletions
diff --git a/usb/usb-ldusb-bugfix.patch b/usb/usb-ldusb-bugfix.patch deleted file mode 100644 index c47151297254a3..00000000000000 --- a/usb/usb-ldusb-bugfix.patch +++ /dev/null @@ -1,136 +0,0 @@ -From oneukum@suse.de Fri May 4 00:23:49 2007 -From: Oliver Neukum <oneukum@suse.de> -Date: Fri, 4 May 2007 09:23:40 +0200 -Subject: USB: ldusb bugfix -To: Greg KH <greg@kroah.com> -Cc: Alan Stern <stern@rowland.harvard.edu>, David Brownell <david-b@pacbell.net>, linux-usb-devel@lists.sourceforge.net -Message-ID: <200705040923.40388.oneukum@suse.de> -Content-Disposition: inline - - -This patch fixes a problem reported with consecutive reads in the ldusb -driver. - -Signed-off-by: Oliver Neukum <oneukum@suse.de> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/misc/ldusb.c | 35 +++++++++++++++++++++++++++++++---- - 1 file changed, 31 insertions(+), 4 deletions(-) - ---- a/drivers/usb/misc/ldusb.c -+++ b/drivers/usb/misc/ldusb.c -@@ -165,6 +165,8 @@ struct ld_usb { - size_t interrupt_in_endpoint_size; - int interrupt_in_running; - int interrupt_in_done; -+ int buffer_overflow; -+ spinlock_t rbsl; - - char* interrupt_out_buffer; - struct usb_endpoint_descriptor* interrupt_out_endpoint; -@@ -230,10 +232,12 @@ static void ld_usb_interrupt_in_callback - } else { - dbg_info(&dev->intf->dev, "%s: nonzero status received: %d\n", - __FUNCTION__, urb->status); -+ spin_lock(&dev->rbsl); - goto resubmit; /* maybe we can recover */ - } - } - -+ spin_lock(&dev->rbsl); - if (urb->actual_length > 0) { - next_ring_head = (dev->ring_head+1) % ring_buffer_size; - if (next_ring_head != dev->ring_tail) { -@@ -244,21 +248,25 @@ static void ld_usb_interrupt_in_callback - dev->ring_head = next_ring_head; - dbg_info(&dev->intf->dev, "%s: received %d bytes\n", - __FUNCTION__, urb->actual_length); -- } else -+ } else { - dev_warn(&dev->intf->dev, - "Ring buffer overflow, %d bytes dropped\n", - urb->actual_length); -+ dev->buffer_overflow = 1; -+ } - } - - resubmit: - /* resubmit if we're still running */ -- if (dev->interrupt_in_running && dev->intf) { -+ if (dev->interrupt_in_running && !dev->buffer_overflow && dev->intf) { - retval = usb_submit_urb(dev->interrupt_in_urb, GFP_ATOMIC); -- if (retval) -+ if (retval) { - dev_err(&dev->intf->dev, - "usb_submit_urb failed (%d)\n", retval); -+ dev->buffer_overflow = 1; -+ } - } -- -+ spin_unlock(&dev->rbsl); - exit: - dev->interrupt_in_done = 1; - wake_up_interruptible(&dev->read_wait); -@@ -330,6 +338,7 @@ static int ld_usb_open(struct inode *ino - /* initialize in direction */ - dev->ring_head = 0; - dev->ring_tail = 0; -+ dev->buffer_overflow = 0; - usb_fill_int_urb(dev->interrupt_in_urb, - interface_to_usbdev(interface), - usb_rcvintpipe(interface_to_usbdev(interface), -@@ -439,6 +448,7 @@ static ssize_t ld_usb_read(struct file * - size_t *actual_buffer; - size_t bytes_to_read; - int retval = 0; -+ int rv; - - dev = file->private_data; - -@@ -460,7 +470,10 @@ static ssize_t ld_usb_read(struct file * - } - - /* wait for data */ -+ spin_lock_irq(&dev->rbsl); - if (dev->ring_head == dev->ring_tail) { -+ dev->interrupt_in_done = 0; -+ spin_unlock_irq(&dev->rbsl); - if (file->f_flags & O_NONBLOCK) { - retval = -EAGAIN; - goto unlock_exit; -@@ -468,6 +481,8 @@ static ssize_t ld_usb_read(struct file * - retval = wait_event_interruptible(dev->read_wait, dev->interrupt_in_done); - if (retval < 0) - goto unlock_exit; -+ } else { -+ spin_unlock_irq(&dev->rbsl); - } - - /* actual_buffer contains actual_length + interrupt_in_buffer */ -@@ -486,6 +501,17 @@ static ssize_t ld_usb_read(struct file * - - retval = bytes_to_read; - -+ spin_lock_irq(&dev->rbsl); -+ if (dev->buffer_overflow) { -+ dev->buffer_overflow = 0; -+ spin_unlock_irq(&dev->rbsl); -+ rv = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL); -+ if (rv < 0) -+ dev->buffer_overflow = 1; -+ } else { -+ spin_unlock_irq(&dev->rbsl); -+ } -+ - unlock_exit: - /* unlock the device */ - up(&dev->sem); -@@ -635,6 +661,7 @@ static int ld_usb_probe(struct usb_inter - goto exit; - } - init_MUTEX(&dev->sem); -+ spin_lock_init(&dev->rbsl); - dev->intf = intf; - init_waitqueue_head(&dev->read_wait); - init_waitqueue_head(&dev->write_wait); |
