From owner-p4-projects@FreeBSD.ORG Thu Aug 12 15:28:11 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4D24210656A7; Thu, 12 Aug 2010 15:28:11 +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 0964410656A3 for ; Thu, 12 Aug 2010 15:28:11 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id D0D178FC15 for ; Thu, 12 Aug 2010 15:28:10 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id o7CFSAFV057125 for ; Thu, 12 Aug 2010 15:28:10 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id o7CFSA8q057122 for perforce@freebsd.org; Thu, 12 Aug 2010 15:28:10 GMT (envelope-from hselasky@FreeBSD.org) Date: Thu, 12 Aug 2010 15:28:10 GMT Message-Id: <201008121528.o7CFSA8q057122@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 182321 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 12 Aug 2010 15:28:11 -0000 http://p4web.freebsd.org/@@182321?ac=10 Change 182321 by hselasky@hselasky_laptop001 on 2010/08/12 15:27:40 USB core (HUB): - Fix problem with selective suspend feature. The problem was introduced in r208008. We need to issue the remote wakeup feature before setting that the USB device is suspended. Else the request will time out. The issue was probably not caught because USB debug prints are turned off by default. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/usb_hub.c#57 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/usb_hub.c#57 (text+ko) ==== @@ -2328,6 +2328,23 @@ } } + if (usb_peer_can_wakeup(udev) && + usb_device_20_compatible(udev)) { + + /* + * This request needs to be done before we set + * "udev->flags.self_suspended": + */ + + /* allow device to do remote wakeup */ + err = usbd_req_set_device_feature(udev, + NULL, UF_DEVICE_REMOTE_WAKEUP); + if (err) { + DPRINTFN(0, "Setting device " + "remote wakeup failed\n"); + } + } + USB_BUS_LOCK(udev->bus); /* * Checking for suspend condition and setting suspended bit @@ -2345,6 +2362,18 @@ USB_BUS_UNLOCK(udev->bus); if (err != 0) { + + if (usb_peer_can_wakeup(udev) && + usb_device_20_compatible(udev)) { + /* allow device to do remote wakeup */ + err = usbd_req_clear_device_feature(udev, + NULL, UF_DEVICE_REMOTE_WAKEUP); + if (err) { + DPRINTFN(0, "Setting device " + "remote wakeup failed\n"); + } + } + if (udev->flags.usb_mode == USB_MODE_DEVICE) { /* resume parent HUB first */ usb_dev_resume_peer(udev->parent_hub); @@ -2370,17 +2399,6 @@ usbd_sr_unlock(udev); - if (usb_peer_can_wakeup(udev) && - usb_device_20_compatible(udev)) { - /* allow device to do remote wakeup */ - err = usbd_req_set_device_feature(udev, - NULL, UF_DEVICE_REMOTE_WAKEUP); - if (err) { - DPRINTFN(0, "Setting device " - "remote wakeup failed\n"); - } - } - if (udev->bus->methods->device_suspend != NULL) { usb_timeout_t temp;