PERFORCE change 160706 for review

Hans Petter Selasky hselasky at FreeBSD.org
Thu Apr 16 10:14:14 PDT 2009


http://perforce.freebsd.org/chv.cgi?CH=160706

Change 160706 by hselasky at hselasky_laptop001 on 2009/04/16 17:13:34

	
	USB CORE:
	 - resolve possible device side mode deadlock by creating
	another thread.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb/controller/usb_controller.c#12 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_bus.h#7 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#140 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb/controller/usb_controller.c#12 (text+ko) ====

@@ -169,6 +169,10 @@
 
 	usb2_proc_free(&bus->explore_proc);
 
+	/* Get rid of control transfer process */
+
+	usb2_proc_free(&bus->control_xfer_proc);
+
 	return (0);
 }
 
@@ -418,6 +422,10 @@
 	    &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);

==== //depot/projects/usb/src/sys/dev/usb/usb_bus.h#7 (text+ko) ====

@@ -62,7 +62,6 @@
 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_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];

==== //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#140 (text+ko) ====

@@ -822,7 +822,16 @@
 			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


More information about the p4-projects mailing list