On Fri, Jan 01, 2021 at 07:15:53PM +0000, Natasha Kerensikova wrote: > Hello, > > I'm only catching up with the thread now, but thanks a lot for including > me, I am indeed interested in how this topic is evolve. > > FWIW, I have been running with a CURRENT and this patch since April, on > my main computer (which I also use for remote working, so it's quite > extensively used). But because I'm a bit lazy and need this computer to > work, I don't update my CURRENT as often as I should. > > I have scanned about a hundred pages, and used common USB devices > (keyboard, mouse, KVM masquerading as a hub, flash drive, PTP camera) > without any issue whatsoever (except for an sudden shutdown when the > power strip got loose from the wall socket, we clearly need a patch to > handle such cases). > > > > Sorry, I was not clear; I meant to say that 'scanimage -L' isn't > > > recognizing my EPSON ET-2750 device at all. But in the meantime I > > > could get my hands on a CANON CanoScan LiDE 400, which gets > > > recognized, and it looks like I see similar issues like you do. > > > Based on that I can do some further investigations. > > > > It looks like with xhci(4) for some reason the bulk endpoints are > > stalling after some operations, which isn't happening with ehci(4). I > > currently can't see why this happens only with xhci(4). That's why > > on your second attempt you see the timeouts happening, because the bulk > > endpoints still are in a stalled state. > > Did you check my summary in > https://marc.info/?l=openbsd-tech&m=158729024415324&w=2 ? > > If you have not already ruled it out, it seems worth considering: > XHCI-specific packet loss detection feature, which uses alternating PID > between DATA0 and DATA1, and only works when the OS and the device agree > on the current PID for the next packet. > > When they get out of sync, e.g. because the OS kept the DATA1 state > after the device reset its on state to DATA0, the OS will send a DATA1 > packet which will be ignored by the device as if a previous DATA0 was > lost so that both a retransmitted. Maybe the OS retries, still with > DATA1, until a timeout occurs. > > AFAIU, usbd_clear_endpoint_stall() is used for the side effect of both > resetting the OS-side state to DATA0 (which I guess is done by > usbd_clear_endpoint_toggle()) and the device-side state through the > associated request UR_CLEAR_FAEATURE/UF_ENDPOINT_HALT. > > > Using usbd_clear_endpoint_stall() at the pipe closing routine simply > > resets all the endpoints, which is why on the next attempt the > > transfers are working fine again. That's probably why this was called > > a workaround, because we should understand why the endpoints are > > getting stalled in a first line with xhci(4). > > I'm not sure what exactly is going on in your setup, but on mine the > stall came from the previous use which left the device and the OS > out-of-sync. Hence USB scanner working only once, because they are in > sync when both power up and get out-of-sync after the first use. > > I don't remember whether I tracked out whether OpenBSD-side state is > reset when it shouldn't (e.g. because it's not stored after closing the > device) or not reset when it should (e.g. because it's stored despite > the device resetting its own state). But if I did I have completely > forgotten the conclusion. > > > Hoping this helps, > Natasha
Thanks for your feedback. I was not following up the initial conversation on this thread, so I probably missed a lot of what was already discussed. I'm also not very familiar with any xhci specific packet loss feature mechanism. But if there was already an proposal from patrick@ to come over this by doing an EP clearing on device open, I've just tested the following diff, and it makes my scanner reliably fail now with xhci :-) I saw that you already had a similar diff tested unsuccessfully. Never the less, can you give this one another spin please on a freshly updated -current kernel, and see if it makes any difference for you as well? Index: dev/usb/ugen.c =================================================================== RCS file: /cvs/src/sys/dev/usb/ugen.c,v retrieving revision 1.109 diff -u -p -u -p -r1.109 ugen.c --- dev/usb/ugen.c 25 Dec 2020 12:59:52 -0000 1.109 +++ dev/usb/ugen.c 2 Jan 2021 08:22:42 -0000 @@ -389,6 +389,10 @@ ugenopen(dev_t dev, int flag, int mode, } } sc->sc_is_open[endpt] = 1; + + if (sce->pipeh) + usbd_clear_endpoint_stall(sce->pipeh); + return (0); }