From c8e1645124176f496678eaa2b6ea4fc7e877d270 Mon Sep 17 00:00:00 2001 From: Benoit Goby Date: Wed, 3 Nov 2010 13:54:31 -0700 Subject: [PATCH] mdm6600: Use usb_get_from_anchor 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 --- drivers/usb/serial/mdm6600.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/drivers/usb/serial/mdm6600.c b/drivers/usb/serial/mdm6600.c index 98eb6e7d69a8..5f2fcd250d32 100644 --- a/drivers/usb/serial/mdm6600.c +++ b/drivers/usb/serial/mdm6600.c @@ -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); -- 2.34.1