Author: thompsa
Date: Wed Apr 22 17:08:10 2009
New Revision: 191400
URL: http://svn.freebsd.org/changeset/base/191400

Log:
  MFp4 //depot/projects/u...@160706
  
  Resolve possible device side mode deadlock by creating another thread.
  
  Submitted by: Hans Petter Selasky

Modified:
  head/sys/dev/usb/controller/usb_controller.c
  head/sys/dev/usb/usb_bus.h
  head/sys/dev/usb/usb_transfer.c

Modified: head/sys/dev/usb/controller/usb_controller.c
==============================================================================
--- head/sys/dev/usb/controller/usb_controller.c        Wed Apr 22 17:08:07 
2009        (r191399)
+++ head/sys/dev/usb/controller/usb_controller.c        Wed Apr 22 17:08:10 
2009        (r191400)
@@ -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 usb
            &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);

Modified: head/sys/dev/usb/usb_bus.h
==============================================================================
--- head/sys/dev/usb/usb_bus.h  Wed Apr 22 17:08:07 2009        (r191399)
+++ head/sys/dev/usb/usb_bus.h  Wed Apr 22 17:08:10 2009        (r191400)
@@ -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];

Modified: head/sys/dev/usb/usb_transfer.c
==============================================================================
--- head/sys/dev/usb/usb_transfer.c     Wed Apr 22 17:08:07 2009        
(r191399)
+++ head/sys/dev/usb/usb_transfer.c     Wed Apr 22 17:08:10 2009        
(r191400)
@@ -822,7 +822,16 @@ usb2_transfer_setup(struct usb2_device *
                        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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to