Skip to content

Commit

Permalink
usb_wwan: error case of resume
Browse files Browse the repository at this point in the history
If an error happens during resumption.
The remaining data has to be cleanly discarded and the pm
counters have to be adjusted.

Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Oliver Neukum authored and Greg Kroah-Hartman committed Feb 17, 2011
1 parent 433508a commit 16871dc
Showing 1 changed file with 22 additions and 1 deletion.
23 changes: 22 additions & 1 deletion drivers/usb/serial/usb_wwan.c
Original file line number Diff line number Diff line change
Expand Up @@ -664,6 +664,18 @@ int usb_wwan_suspend(struct usb_serial *serial, pm_message_t message)
}
EXPORT_SYMBOL(usb_wwan_suspend);

static void unbusy_queued_urb(struct urb *urb, struct usb_wwan_port_private *portdata)
{
int i;

for (i = 0; i < N_OUT_URB; i++) {
if (urb == portdata->out_urbs[i]) {
clear_bit(i, &portdata->out_busy);
break;
}
}
}

static void play_delayed(struct usb_serial_port *port)
{
struct usb_wwan_intf_private *data;
Expand All @@ -675,8 +687,17 @@ static void play_delayed(struct usb_serial_port *port)
data = port->serial->private;
while ((urb = usb_get_from_anchor(&portdata->delayed))) {
err = usb_submit_urb(urb, GFP_ATOMIC);
if (!err)
if (!err) {
data->in_flight++;
} else {
/* we have to throw away the rest */
do {
unbusy_queued_urb(urb, portdata);
//extremely dirty
atomic_dec(&port->serial->interface->dev.power.usage_count);
} while ((urb = usb_get_from_anchor(&portdata->delayed)));
break;
}
}
}

Expand Down

0 comments on commit 16871dc

Please sign in to comment.