From owner-p4-projects@FreeBSD.ORG Wed Dec 13 10:23:22 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C693116A417; Wed, 13 Dec 2006 10:23:22 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id A26E016A407 for ; Wed, 13 Dec 2006 10:23:22 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1DF8843CA6 for ; Wed, 13 Dec 2006 10:21:54 +0000 (GMT) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id kBDANMrO031797 for ; Wed, 13 Dec 2006 10:23:22 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id kBDANM50031793 for perforce@freebsd.org; Wed, 13 Dec 2006 10:23:22 GMT (envelope-from hselasky@FreeBSD.org) Date: Wed, 13 Dec 2006 10:23:22 GMT Message-Id: <200612131023.kBDANM50031793@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 111621 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: Wed, 13 Dec 2006 10:23:23 -0000 http://perforce.freebsd.org/chv.cgi?CH=111621 Change 111621 by hselasky@hselasky_mini_itx on 2006/12/13 10:23:21 Fix a regression. After this patch it should be possible to do kldload-kldunload cycles without having to replug the USB device. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/usb_subr.c#21 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/usb_subr.c#21 (text+ko) ==== @@ -873,6 +873,53 @@ return 0; } +/* The following function will remove detached + * devices from the interface list. This can + * happen during USB device module unload. + */ +static void +usbd_remove_detached_devices(struct usbd_device *udev) +{ + device_t *subdev = udev->subdevs; + device_t *subdev_end = udev->subdevs_end; + uint8_t detached_first = 0; + + PRINTFN(3,("udev=%p\n", udev)); + + while (subdev < subdev_end) { + if (subdev[0]) { + if (device_is_attached(subdev[0]) == 0) { + if (device_delete_child(device_get_parent(subdev[0]), + subdev[0]) == 0) { + subdev[0] = NULL; + if (subdev == udev->subdevs) { + detached_first = 1; + } + + } else { + /* Panic here, else one can get a double call to + * device_detach(). USB devices should never fail + * on detach! + */ + panic("device_delete_child() failed!\n"); + } + } + } + subdev++; + } + + if (detached_first) { + if ((udev->probed == USBD_PROBED_SPECIFIC_AND_FOUND) || + (udev->probed == USBD_PROBED_GENERIC_AND_FOUND)) { + /* The first and only device is gone. + * Reset the "probed" variable. + */ + udev->probed = USBD_PROBED_NOTHING; + } + } + return; +} + /* "usbd_probe_and_attach()" is called * from "usbd_new_device()" and "uhub_explore()" */ @@ -895,6 +942,8 @@ return (USBD_INVAL); } + usbd_remove_detached_devices(udev); + bzero(&uaa, sizeof(uaa)); /* probe and attach */