mdm6600: Use usb_get_from_anchor
authorBenoit Goby <benoit@android.com>
Wed, 3 Nov 2010 20:54:31 +0000 (13:54 -0700)
committerBenoit Goby <benoit@android.com>
Thu, 4 Nov 2010 21:29:20 +0000 (14:29 -0700)
It is safe to remove a urb from the read pending anchor
before processing it.
This fixes the "dropped 4294965808 of 0 bytes" issue.

Change-Id: I15c25c6eb876d4b5bb09ac54f9acd691ff60992e
Signed-off-by: Benoit Goby <benoit@android.com>
drivers/usb/serial/mdm6600.c

index 98eb6e7d69a800ef8d13bdb462e3983449a05115..5f2fcd250d32915ed44d49c9ddfffa11d77a89d7 100644 (file)
@@ -713,22 +713,10 @@ static void mdm6600_read_bulk_work(struct work_struct *work)
        unsigned long flags;
        struct mdm6600_port *modem = container_of(work, struct mdm6600_port,
                read.work);
-       struct usb_anchor *anchor = &modem->read.pending;
 
        dbg("%s", __func__);
 
-       while (true) {
-               spin_lock_irqsave(&anchor->lock, flags);
-               if (list_empty(&anchor->urb_list)) {
-                       spin_unlock_irqrestore(&anchor->lock, flags);
-                       return;
-               }
-
-               u = list_entry(anchor->urb_list.next, struct urb,
-                                   anchor_list);
-               usb_get_urb(u);
-               spin_unlock_irqrestore(&anchor->lock, flags);
-
+       while ((u = usb_get_from_anchor(&modem->read.pending))) {
                dbg("%s: processing urb %p len %u", __func__, u,
                        u->actual_length);
                usb_serial_debug_data(debug_data, &modem->port->dev, __func__,
@@ -747,7 +735,6 @@ static void mdm6600_read_bulk_work(struct work_struct *work)
                tty_kref_put(tty);
 
 next:
-               usb_unanchor_urb(u);
                spin_lock_irqsave(&modem->susp_lock, flags);
                if (modem->susp_count || !modem->opened) {
                        spin_unlock_irqrestore(&modem->susp_lock, flags);