USB: fix errornous assumption in the usb serial framework revealed by iuu_phoenix
the iuu_phoenix driver submits another URB from a completion handler. This dictates a certain order of calls to usb_kill_urb() in kill_traffic(). As other drivers may do it the other way round, we need to use both orders in kill_traffic(). This patch does so and should be merged before iuu_phoenix is merged. Signed-off-by: Oliver Neukum <oneukum@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
b5b80f2b20
commit
5adceac5da
@@ -578,6 +578,17 @@ static void kill_traffic(struct usb_serial_port *port)
|
|||||||
{
|
{
|
||||||
usb_kill_urb(port->read_urb);
|
usb_kill_urb(port->read_urb);
|
||||||
usb_kill_urb(port->write_urb);
|
usb_kill_urb(port->write_urb);
|
||||||
|
/*
|
||||||
|
* This is tricky.
|
||||||
|
* Some drivers submit the read_urb in the
|
||||||
|
* handler for the write_urb or vice versa
|
||||||
|
* this order determines the order in which
|
||||||
|
* usb_kill_urb() must be used to reliably
|
||||||
|
* kill the URBs. As it is unknown here,
|
||||||
|
* both orders must be used in turn.
|
||||||
|
* The call below is not redundant.
|
||||||
|
*/
|
||||||
|
usb_kill_urb(port->read_urb);
|
||||||
usb_kill_urb(port->interrupt_in_urb);
|
usb_kill_urb(port->interrupt_in_urb);
|
||||||
usb_kill_urb(port->interrupt_out_urb);
|
usb_kill_urb(port->interrupt_out_urb);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user