From owner-freebsd-usb@freebsd.org Fri Jan 4 16:11:31 2019 Return-Path: Delivered-To: freebsd-usb@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 8E84414303EA for ; Fri, 4 Jan 2019 16:11:31 +0000 (UTC) (envelope-from hps@selasky.org) Received: from mail.turbocat.net (turbocat.net [IPv6:2a01:4f8:c17:6c4b::2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 37C936F149 for ; Fri, 4 Jan 2019 16:11:30 +0000 (UTC) (envelope-from hps@selasky.org) Received: from hps2016.home.selasky.org (unknown [176.74.212.121]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.turbocat.net (Postfix) with ESMTPSA id 475612602B1; Fri, 4 Jan 2019 17:11:29 +0100 (CET) Subject: Re: r342378: usbconfig takes 3-5 minutes to read the bus From: Hans Petter Selasky To: Ludovic Rousseau , freebsd-usb@freebsd.org References: <5950d771-ffa9-9325-b102-295fd092052e@selasky.org> <20190103094850.GA2595@c720-r342378> <076e01a2-51e7-b140-28c9-1c58d034327b@selasky.org> <20190103113512.GA2547@c720-r342378> <34dfc02b-b252-9f38-a905-31a713012c6a@selasky.org> <20190104080227.GB2604@c720-r342378> <64a0f5c6-ea58-6fdb-8d94-dd442619cde9@selasky.org> <20190104104601.GA2536@c720-r342378> <85a6ed88-126d-2f89-ba3f-ef3e61e0bf92@selasky.org> <20190104152720.GA2802@c720-r342378> Message-ID: <1af01261-ab9a-a137-233c-180cf7f1b99c@selasky.org> Date: Fri, 4 Jan 2019 17:09:09 +0100 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------729C29B71134767DF8CAE340" Content-Language: en-US X-Rspamd-Queue-Id: 37C936F149 X-Spamd-Bar: ------ Authentication-Results: mx1.freebsd.org; spf=pass (mx1.freebsd.org: domain of hps@selasky.org designates 2a01:4f8:c17:6c4b::2 as permitted sender) smtp.mailfrom=hps@selasky.org X-Spamd-Result: default: False [-6.02 / 15.00]; ARC_NA(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; RCVD_COUNT_TWO(0.00)[2]; NEURAL_HAM_MEDIUM(-1.00)[-1.000,0]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; R_SPF_ALLOW(-0.20)[+a:mail.turbocat.net]; NEURAL_HAM_LONG(-1.00)[-1.000,0]; TAGGED_RCPT(0.00)[]; HAS_ATTACHMENT(0.00)[]; DMARC_NA(0.00)[selasky.org]; MIME_GOOD(-0.10)[multipart/mixed,text/plain]; TO_MATCH_ENVRCPT_SOME(0.00)[]; MX_GOOD(-0.01)[cached: mail.turbocat.net]; RCPT_COUNT_TWO(0.00)[2]; NEURAL_HAM_SHORT(-0.96)[-0.962,0]; IP_SCORE(-2.85)[ip: (-9.11), ipnet: 2a01:4f8::/29(-2.73), asn: 24940(-2.41), country: DE(-0.01)]; FREEMAIL_TO(0.00)[gmail.com]; FROM_EQ_ENVFROM(0.00)[]; R_DKIM_NA(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:~]; ASN(0.00)[asn:24940, ipnet:2a01:4f8::/29, country:DE]; MID_RHS_MATCH_FROM(0.00)[]; RCVD_TLS_ALL(0.00)[]; MIME_UNKNOWN(0.10)[text/x-patch] X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Jan 2019 16:11:31 -0000 This is a multi-part message in MIME format. --------------729C29B71134767DF8CAE340 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit On 1/4/19 5:05 PM, Hans Petter Selasky wrote: > On 1/4/19 4:27 PM, Matthias Apitz wrote: >> El día viernes, enero 04, 2019 a las 12:45:47p. m. +0100, Hans Petter >> Selasky escribió: >> >>> On 1/4/19 11:46 AM, Matthias Apitz wrote: >>>> Jan  4 11:26:39 c720-r342378 kernel: uhub_read_port_status: port 13, >>>> wPortStatus=0x07a0, wPortChange=0x0000, err=USB_ERR_NORMAL_COMPLETION >>>> Jan  4 11:26:41 c720-r342378 kernel: uhub_read_port_status: port 1, >>>> wPortStatus=0xe070, wPortChange=0x161e, err=USB_ERR_TIMEOUT >>>> Jan  4 11:26:41 c720-r342378 kernel: uhub_read_port_status: port 2, >>>> wPortStatus=0x0500, wPortChange=0x0000, err=USB_ERR_NORMAL_COMPLETION >>> >>> Hi, >>> >>> The problem appears to be that one of the USB HUBs port status request >>> don't respond: USB_ERR_TIMEOUT, which in turn blocks the enumeration >>> thread. >>> >>> Can you try the attached kernel patch and send new debug log? >> >> Hi, >> >> I applied the patch and the new debug output is attached. >> >> And it works now as it should, without any devd(8) hook. I just start >> pcsdd as a service via rc.conf and can attach or withdraw the security >> token. When the token is not attached GnuPG asks me to insert it and >> when it is inserted I'm asked for the PIN. All as it should be >> >> A big THANKS! >> >> Should I file a PR to get your patch included upstream? >> > > No PR needed, but I might need you to test one more patch. > Can you try this patch aswell and attach new logs? Thank you! --HPS --------------729C29B71134767DF8CAE340 Content-Type: text/x-patch; name="usb.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="usb.diff" Index: sys/dev/usb/usb_hub.c =================================================================== --- sys/dev/usb/usb_hub.c (revision 342455) +++ sys/dev/usb/usb_hub.c (working copy) @@ -129,6 +129,8 @@ int sc_disable_enumeration; int sc_disable_port_power; #endif + uint8_t sc_usb_port_errors; /* error counter */ +#define UHUB_USB_PORT_ERRORS_MAX 4 uint8_t sc_flags; #define UHUB_FLAG_DID_EXPLORE 0x01 }; @@ -587,14 +589,26 @@ struct usb_port_status ps; usb_error_t err; + if (sc->sc_usb_port_errors >= UHUB_USB_PORT_ERRORS_MAX) { + DPRINTFN(4, "port %d, HUB looks dead, too many errors\n", portno); + sc->sc_st.port_status = 0; + sc->sc_st.port_change = 0; + return (USB_ERR_TIMEOUT); + } + err = usbd_req_get_port_status( sc->sc_udev, NULL, &ps, portno); - /* update status regardless of error */ + if (err == 0) { + sc->sc_st.port_status = UGETW(ps.wPortStatus); + sc->sc_st.port_change = UGETW(ps.wPortChange); + sc->sc_usb_port_errors = 0; + } else { + sc->sc_st.port_status = 0; + sc->sc_st.port_change = 0; + sc->sc_usb_port_errors++; + } - sc->sc_st.port_status = UGETW(ps.wPortStatus); - sc->sc_st.port_change = UGETW(ps.wPortChange); - /* debugging print */ DPRINTFN(4, "port %d, wPortStatus=0x%04x, " Index: sys/dev/usb/usb_request.c =================================================================== --- sys/dev/usb/usb_request.c (revision 342455) +++ sys/dev/usb/usb_request.c (working copy) @@ -1601,8 +1601,9 @@ USETW(req.wValue, 0); req.wIndex[0] = port; req.wIndex[1] = 0; - USETW(req.wLength, sizeof *ps); - return (usbd_do_request(udev, mtx, &req, ps)); + USETW(req.wLength, sizeof(*ps)); + + return (usbd_do_request_flags(udev, mtx, &req, ps, 0, NULL, 1000)); } /*------------------------------------------------------------------------* --------------729C29B71134767DF8CAE340--