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

Log:
  MFp4 //depot/projects/u...@160655
  
  Fix possible issue with clear-stall and set-config happening at the same time.
  
  Submitted by: Hans Petter Selasky

Modified:
  head/sys/dev/usb/usb_device.c

Modified: head/sys/dev/usb/usb_device.c
==============================================================================
--- head/sys/dev/usb/usb_device.c       Wed Apr 22 17:07:59 2009        
(r191397)
+++ head/sys/dev/usb/usb_device.c       Wed Apr 22 17:08:04 2009        
(r191398)
@@ -724,22 +724,33 @@ usb2_config_parse(struct usb2_device *ud
                                goto done;
                        }
                }
-               udev->pipes_max = ep_max;
-               udev->pipes = NULL;
-               if (udev->pipes_max != 0) {
-                       udev->pipes = malloc(sizeof(*pipe) * udev->pipes_max,
+               if (ep_max != 0) {
+                       udev->pipes = malloc(sizeof(*pipe) * ep_max,
                                M_USB, M_WAITOK | M_ZERO);
                        if (udev->pipes == NULL) {
                                err = USB_ERR_NOMEM;
                                goto done;
                        }
+               } else {
+                       udev->pipes = NULL;
                }
+               USB_BUS_LOCK(udev->bus);
+               udev->pipes_max = ep_max;
+               /* reset any ongoing clear-stall */
+               udev->pipe_curr = NULL;
+               USB_BUS_UNLOCK(udev->bus);
        }
 
 done:
        if (err) {
                if (cmd == USB_CFG_ALLOC) {
 cleanup:
+                       USB_BUS_LOCK(udev->bus);
+                       udev->pipes_max = 0;
+                       /* reset any ongoing clear-stall */
+                       udev->pipe_curr = NULL;
+                       USB_BUS_UNLOCK(udev->bus);
+
                        /* cleanup */
                        if (udev->ifaces != NULL)
                                free(udev->ifaces, M_USB);
@@ -749,7 +760,6 @@ cleanup:
                        udev->ifaces = NULL;
                        udev->pipes = NULL;
                        udev->ifaces_max = 0;
-                       udev->pipes_max = 0;
                }
        }
        return (err);
_______________________________________________
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