USB: usb_wwan: fix discarded writes on resume errors
authorJohan Hovold <jhovold@gmail.com>
Mon, 26 May 2014 17:23:19 +0000 (19:23 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 May 2014 22:04:06 +0000 (15:04 -0700)
There's no reason not to try sending off any further delayed write urbs,
should one urb-submission fail.

Signed-off-by: Johan Hovold <jhovold@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/serial/usb_wwan.c

index d91a9883e8695e736434564b0a38a6b38e08f92c..ab8c17536534dfd9c4a0ad7fa7e440790146fade 100644 (file)
@@ -621,28 +621,33 @@ EXPORT_SYMBOL(usb_wwan_suspend);
 
 static int play_delayed(struct usb_serial_port *port)
 {
+       struct usb_serial *serial = port->serial;
        struct usb_wwan_intf_private *data;
        struct usb_wwan_port_private *portdata;
        struct urb *urb;
-       int err = 0;
+       int err_count = 0;
+       int err;
 
        portdata = usb_get_serial_port_data(port);
        data = port->serial->private;
        while ((urb = usb_get_from_anchor(&portdata->delayed))) {
                err = usb_submit_urb(urb, GFP_ATOMIC);
-               if (!err) {
-                       data->in_flight++;
-               } else {
-                       /* we have to throw away the rest */
-                       do {
-                               unbusy_queued_urb(urb, portdata);
-                               usb_autopm_put_interface_no_suspend(port->serial->interface);
-                       } while ((urb = usb_get_from_anchor(&portdata->delayed)));
-                       break;
+               if (err) {
+                       dev_err(&port->dev,
+                                       "%s: submit write urb failed: %d\n",
+                                       __func__, err);
+                       err_count++;
+                       unbusy_queued_urb(urb, portdata);
+                       usb_autopm_put_interface_async(serial->interface);
+                       continue;
                }
+               data->in_flight++;
        }
 
-       return err;
+       if (err_count)
+               return -EIO;
+
+       return 0;
 }
 
 int usb_wwan_resume(struct usb_serial *serial)