mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-02-04 01:57:59 +00:00
USB: sierra: refactor delayed-urb submission
Refactor and clean up delayed-urb submission at resume. Signed-off-by: Johan Hovold <jhovold@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
7d8825bed4
commit
71c149b901
@ -981,12 +981,51 @@ static int sierra_suspend(struct usb_serial *serial, pm_message_t message)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Caller must hold susp_lock. */
|
||||||
|
static int sierra_submit_delayed_urbs(struct usb_serial_port *port)
|
||||||
|
{
|
||||||
|
struct sierra_port_private *portdata = usb_get_serial_port_data(port);
|
||||||
|
struct sierra_intf_private *intfdata;
|
||||||
|
struct urb *urb;
|
||||||
|
int ec = 0;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
intfdata = usb_get_serial_data(port->serial);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
urb = usb_get_from_anchor(&portdata->delayed);
|
||||||
|
if (!urb)
|
||||||
|
break;
|
||||||
|
|
||||||
|
usb_anchor_urb(urb, &portdata->active);
|
||||||
|
intfdata->in_flight++;
|
||||||
|
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||||
|
if (err) {
|
||||||
|
dev_err(&port->dev, "%s - submit urb failed: %d",
|
||||||
|
__func__, err);
|
||||||
|
ec++;
|
||||||
|
intfdata->in_flight--;
|
||||||
|
usb_unanchor_urb(urb);
|
||||||
|
kfree(urb->transfer_buffer);
|
||||||
|
usb_free_urb(urb);
|
||||||
|
|
||||||
|
spin_lock(&portdata->lock);
|
||||||
|
portdata->outstanding_urbs--;
|
||||||
|
spin_unlock(&portdata->lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ec)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int sierra_resume(struct usb_serial *serial)
|
static int sierra_resume(struct usb_serial *serial)
|
||||||
{
|
{
|
||||||
struct usb_serial_port *port;
|
struct usb_serial_port *port;
|
||||||
struct sierra_intf_private *intfdata = usb_get_serial_data(serial);
|
struct sierra_intf_private *intfdata = usb_get_serial_data(serial);
|
||||||
struct sierra_port_private *portdata;
|
struct sierra_port_private *portdata;
|
||||||
struct urb *urb;
|
|
||||||
int ec = 0;
|
int ec = 0;
|
||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
@ -998,25 +1037,9 @@ static int sierra_resume(struct usb_serial *serial)
|
|||||||
if (!portdata || !portdata->opened)
|
if (!portdata || !portdata->opened)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
while ((urb = usb_get_from_anchor(&portdata->delayed))) {
|
err = sierra_submit_delayed_urbs(port);
|
||||||
usb_anchor_urb(urb, &portdata->active);
|
if (err)
|
||||||
intfdata->in_flight++;
|
ec++;
|
||||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
|
||||||
if (err < 0) {
|
|
||||||
dev_err(&port->dev,
|
|
||||||
"%s - submit urb failed: %d",
|
|
||||||
__func__, err);
|
|
||||||
ec++;
|
|
||||||
intfdata->in_flight--;
|
|
||||||
usb_unanchor_urb(urb);
|
|
||||||
kfree(urb->transfer_buffer);
|
|
||||||
usb_free_urb(urb);
|
|
||||||
spin_lock(&portdata->lock);
|
|
||||||
portdata->outstanding_urbs--;
|
|
||||||
spin_unlock(&portdata->lock);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = sierra_submit_rx_urbs(port, GFP_ATOMIC);
|
err = sierra_submit_rx_urbs(port, GFP_ATOMIC);
|
||||||
if (err)
|
if (err)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user