From owner-p4-projects@FreeBSD.ORG Wed Jan 23 21:40:13 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id CD0B316A41B; Wed, 23 Jan 2008 21:40: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 7A0B516A41A for ; Wed, 23 Jan 2008 21:40: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 7773313C4E8 for ; Wed, 23 Jan 2008 21:40: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 m0NLeDwa006680 for ; Wed, 23 Jan 2008 21:40:13 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m0NLeDk0006677 for perforce@freebsd.org; Wed, 23 Jan 2008 21:40:13 GMT (envelope-from hselasky@FreeBSD.org) Date: Wed, 23 Jan 2008 21:40:13 GMT Message-Id: <200801232140.m0NLeDk0006677@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 133951 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, 23 Jan 2008 21:40:14 -0000 http://perforce.freebsd.org/chv.cgi?CH=133951 Change 133951 by hselasky@hselasky_laptop001 on 2008/01/23 21:40:11 More advanced USB sysctls for USB device stress testing. The sysctls are only available when USB is compiled having USB_DEBUG defined. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/usb_requests.c#18 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/usb_requests.c#18 (text+ko) ==== @@ -50,6 +50,16 @@ #include #include +#ifdef USB_DEBUG +static int usb_pr_poll_delay = USB_PORT_RESET_DELAY; +static int usb_pr_recovery_delay = USB_PORT_RESET_RECOVERY; + +SYSCTL_INT(_hw_usb, OID_AUTO, pr_poll_delay, CTLFLAG_RW, + &usb_pr_poll_delay, 0, "USB port reset poll delay in ms"); +SYSCTL_INT(_hw_usb, OID_AUTO, pr_recovery_delay, CTLFLAG_RW, + &usb_pr_recovery_delay, 0, "USB port reset recovery delay in ms"); +#endif + /*------------------------------------------------------------------------* * usbreq_reset_port *------------------------------------------------------------------------*/ @@ -58,16 +68,41 @@ { usb_port_status_t ps; usbd_status_t err; - uint8_t n; + uint16_t n; + +#ifdef USB_DEBUG + uint16_t pr_poll_delay; + uint16_t pr_recovery_delay; +#endif err = usbreq_set_port_feature(udev, mtx, port, UHF_PORT_RESET); if (err) { goto done; } - for (n = 12; n != 0; n--) { - +#ifdef USB_DEBUG + /* range check input parameters */ + pr_poll_delay = usb_pr_poll_delay; + if (pr_poll_delay < 1) { + pr_poll_delay = 1; + } else if (pr_poll_delay > 1000) { + pr_poll_delay = 1000; + } + pr_recovery_delay = usb_pr_recovery_delay; + if (pr_recovery_delay > 1000) { + pr_recovery_delay = 1000; + } +#endif + n = 0; + while (1) { +#ifdef USB_DEBUG + /* wait for the device to recover from reset */ + usbd_pause_mtx(mtx, pr_poll_delay); + n += pr_poll_delay; +#else /* wait for the device to recover from reset */ usbd_pause_mtx(mtx, USB_PORT_RESET_DELAY); + n += USB_PORT_RESET_DELAY; +#endif err = usbreq_get_port_status(udev, mtx, &ps, port); if (err) { goto done; @@ -80,6 +115,11 @@ if (UGETW(ps.wPortChange) & UPS_C_PORT_RESET) { break; } + /* check for timeout */ + if (n > 1000) { + n = 0; + break; + } } /* clear port reset first */ @@ -93,8 +133,14 @@ err = USBD_ERR_TIMEOUT; goto done; } +#ifdef USB_DEBUG + /* wait for the device to recover from reset */ + usbd_pause_mtx(mtx, pr_recovery_delay); +#else /* wait for the device to recover from reset */ usbd_pause_mtx(mtx, USB_PORT_RESET_RECOVERY); +#endif + done: PRINTFN(1, ("port %d reset returning error=%s\n", port, usbd_errstr(err)));