From owner-p4-projects@FreeBSD.ORG Fri Jul 4 18:32:13 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D3B241065679; Fri, 4 Jul 2008 18:32:13 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 97A33106564A for ; Fri, 4 Jul 2008 18:32:13 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 854648FC2C for ; Fri, 4 Jul 2008 18:32:13 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m64IWDRU054118 for ; Fri, 4 Jul 2008 18:32:13 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m64IWDGk054116 for perforce@freebsd.org; Fri, 4 Jul 2008 18:32:13 GMT (envelope-from hselasky@FreeBSD.org) Date: Fri, 4 Jul 2008 18:32:13 GMT Message-Id: <200807041832.m64IWDGk054116@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 144650 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Jul 2008 18:32:14 -0000 http://perforce.freebsd.org/chv.cgi?CH=144650 Change 144650 by hselasky@hselasky_laptop001 on 2008/07/04 18:31:55 Cleanup locking a little bit. Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_device.c#11 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_hub.c#10 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_device.c#11 (text+ko) ==== @@ -507,15 +507,19 @@ uint16_t max_power; uint8_t nifc; uint8_t selfpowered; + uint8_t do_unlock; usb2_error_t err; DPRINTF(5, "udev=%p index=%d\n", udev, index); - if (!sx_xlocked(udev->default_sx + 1)) { - /* the caller is not properly locked */ - DPRINTF(-1, "not locked\n"); - return (USB_ERR_NOT_LOCKED); + /* automatic locking */ + if (sx_xlocked(udev->default_sx + 1)) { + do_unlock = 0; + } else { + do_unlock = 1; + sx_xlock(udev->default_sx + 1); } + /* detach all interface drivers */ usb2_detach_device(udev, USB_IFACE_INDEX_ANY, 1); @@ -529,13 +533,13 @@ * the current config number and index. */ err = usb2_req_set_config(udev, &Giant, USB_UNCONFIG_NO); - return (err); + goto done; } /* get the full config descriptor */ err = usb2_req_get_config_desc_full(udev, &Giant, &cdp, M_USB, index); if (err) { - goto error; + goto done; } /* set the new config descriptor */ @@ -606,7 +610,7 @@ if (power > max_power) { DPRINTF(-1, "power exceeded %d > %d\n", power, max_power); err = USB_ERR_NO_POWER; - goto error; + goto done; } /* Only update "self_powered" in USB Host Mode */ if (udev->flags.usb2_mode == USB_MODE_HOST) { @@ -619,21 +623,25 @@ /* Set the actual configuration value. */ err = usb2_req_set_config(udev, &Giant, cdp->bConfigurationValue); if (err) { - goto error; + goto done; } /* Allocate and fill interface data. */ nifc = cdp->bNumInterface; while (nifc--) { err = usb2_fill_iface_data(udev, nifc, 0); if (err) { - goto error; + goto done; } } - return (0); -error: +done: DPRINTF(0, "error=%s\n", usb2_errstr(err)); - usb2_free_iface_data(udev); + if (err) { + usb2_free_iface_data(udev); + } + if (do_unlock) { + sx_unlock(udev->default_sx + 1); + } return (err); } @@ -655,12 +663,14 @@ { struct usb2_interface *iface = usb2_get_iface(udev, iface_index); usb2_error_t err; + uint8_t do_unlock; - if (!sx_xlocked(udev->default_sx + 1)) { - /* the caller is not properly locked */ - DPRINTF(-1, "not locked\n"); - err = USB_ERR_NOT_LOCKED; - goto done; + /* automatic locking */ + if (sx_xlocked(udev->default_sx + 1)) { + do_unlock = 0; + } else { + do_unlock = 1; + sx_xlock(udev->default_sx + 1); } if (iface == NULL) { err = USB_ERR_INVAL; @@ -677,6 +687,9 @@ iface->idesc->bAlternateSetting); done: + if (do_unlock) { + sx_unlock(udev->default_sx + 1); + } return (err); } @@ -1041,16 +1054,23 @@ struct usb2_interface *iface; uint8_t i; uint8_t j; + uint8_t do_unlock; if (udev == NULL) { DPRINTF(0, "udev == NULL\n"); return (USB_ERR_INVAL); } - sx_assert(udev->default_sx + 1, SA_LOCKED); + /* automatic locking */ + if (sx_xlocked(udev->default_sx + 1)) { + do_unlock = 0; + } else { + do_unlock = 1; + sx_xlock(udev->default_sx + 1); + } if (udev->curr_config_index == USB_UNCONFIG_INDEX) { /* do nothing - no configuration has been set */ - return (0); + goto done; } /* setup USB attach arguments */ @@ -1123,6 +1143,10 @@ DPRINTF(-1, "device delete child failed!\n"); } } +done: + if (do_unlock) { + sx_unlock(udev->default_sx + 1); + } return (0); } ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_hub.c#10 (text+ko) ==== @@ -227,10 +227,8 @@ if (child->driver_added_refcount != refcount) { child->driver_added_refcount = refcount; - sx_xlock(child->default_sx + 1); err = usb2_probe_and_attach(child, USB_IFACE_INDEX_ANY); - sx_unlock(child->default_sx + 1); if (err) { goto done; }