Date: Fri, 4 Jan 2019 12:45:47 +0100 From: Hans Petter Selasky <hps@selasky.org> To: Ludovic Rousseau <ludovic.rousseau@gmail.com>, freebsd-usb@freebsd.org Subject: Re: r342378: usbconfig takes 3-5 minutes to read the bus Message-ID: <85a6ed88-126d-2f89-ba3f-ef3e61e0bf92@selasky.org> In-Reply-To: <20190104104601.GA2536@c720-r342378> References: <d0f569af-342f-dac8-8f6d-4fc0ff21924e@selasky.org> <20190103060431.GA2711@c720-r342378> <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> <CAGstE8B6RxBqBG9uqUXc60JcsB6=-QcmN1Q4kTgbgwoWGVaNyA@mail.gmail.com> <20190104080227.GB2604@c720-r342378> <64a0f5c6-ea58-6fdb-8d94-dd442619cde9@selasky.org> <20190104104601.GA2536@c720-r342378>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------9C2E8EE6200B9E751295C075 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit 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? --HPS --------------9C2E8EE6200B9E751295C075 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) @@ -590,11 +590,23 @@ err = usbd_req_get_port_status( sc->sc_udev, NULL, &ps, portno); - /* update status regardless of error */ + if (err != 0) { + DPRINTFN(4, "port %d, Trying again, err=%s\n", + portno, usbd_errstr(err)); - sc->sc_st.port_status = UGETW(ps.wPortStatus); - sc->sc_st.port_change = UGETW(ps.wPortChange); + /* try a second time before giving up */ + err = usbd_req_get_port_status( + sc->sc_udev, NULL, &ps, portno); + } + if (err == 0) { + sc->sc_st.port_status = UGETW(ps.wPortStatus); + sc->sc_st.port_change = UGETW(ps.wPortChange); + } else { + sc->sc_st.port_status = 0; + sc->sc_st.port_change = 0; + } + /* 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)); } /*------------------------------------------------------------------------* --------------9C2E8EE6200B9E751295C075--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?85a6ed88-126d-2f89-ba3f-ef3e61e0bf92>