mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-20 11:11:24 +00:00
MFp4 //depot/projects/usb@160706
Resolve possible device side mode deadlock by creating another thread. Submitted by: Hans Petter Selasky
This commit is contained in:
parent
39063699e6
commit
672c9965ef
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=191400
@ -169,6 +169,10 @@ usb2_detach(device_t dev)
|
||||
|
||||
usb2_proc_free(&bus->explore_proc);
|
||||
|
||||
/* Get rid of control transfer process */
|
||||
|
||||
usb2_proc_free(&bus->control_xfer_proc);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -412,6 +416,10 @@ usb2_attach_sub(device_t dev, struct usb2_bus *bus)
|
||||
&bus->bus_mtx, pname, USB_PRI_MED)) {
|
||||
printf("WARNING: Creation of USB explore "
|
||||
"process failed.\n");
|
||||
} else if (usb2_proc_create(&bus->control_xfer_proc,
|
||||
&bus->bus_mtx, pname, USB_PRI_MED)) {
|
||||
printf("WARNING: Creation of USB control transfer "
|
||||
"process failed.\n");
|
||||
} else {
|
||||
/* Get final attach going */
|
||||
USB_BUS_LOCK(bus);
|
||||
|
@ -62,7 +62,6 @@ struct usb2_sw_transfer {
|
||||
struct usb2_bus {
|
||||
struct usb2_bus_stat stats_err;
|
||||
struct usb2_bus_stat stats_ok;
|
||||
struct usb2_process explore_proc;
|
||||
struct usb2_sw_transfer roothub_req;
|
||||
struct root_hold_token *bus_roothold;
|
||||
/*
|
||||
@ -72,6 +71,13 @@ struct usb2_bus {
|
||||
*/
|
||||
struct usb2_process giant_callback_proc;
|
||||
struct usb2_process non_giant_callback_proc;
|
||||
|
||||
/* Explore process */
|
||||
struct usb2_process explore_proc;
|
||||
|
||||
/* Control request process */
|
||||
struct usb2_process control_xfer_proc;
|
||||
|
||||
struct usb2_bus_msg explore_msg[2];
|
||||
struct usb2_bus_msg detach_msg[2];
|
||||
struct usb2_bus_msg attach_msg[2];
|
||||
|
@ -822,7 +822,16 @@ usb2_transfer_setup(struct usb2_device *udev,
|
||||
info->done_m[1].hdr.pm_callback = &usb2_callback_proc;
|
||||
info->done_m[1].xroot = info;
|
||||
|
||||
if (xfer_mtx == &Giant)
|
||||
/*
|
||||
* In device side mode control endpoint
|
||||
* requests need to run from a separate
|
||||
* context, else there is a chance of
|
||||
* deadlock!
|
||||
*/
|
||||
if (setup_start == usb2_control_ep_cfg)
|
||||
info->done_p =
|
||||
&udev->bus->control_xfer_proc;
|
||||
else if (xfer_mtx == &Giant)
|
||||
info->done_p =
|
||||
&udev->bus->giant_callback_proc;
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user