usbdrain problem (was: Re: "legacy" usb stack fixes)

Hans Petter Selasky hselasky at c2i.net
Thu Sep 11 21:45:16 UTC 2008


Hi Volker,

Could you try the following. Add an extra check for "UGEN_CLOSING" to the code 
statement in ugen.c in the function ugenclose():

if ((!(sce->state & UGEN_CLOSING)) && (sce->state & (UGEN_OPEN_DEV | 
UGEN_OPEN_IN | UGEN_OPEN_OUT)) ....

The ugenclose() is called from both "detach()" and "close()" and maybe there 
is a race there!

--HPS

static int
ugenclose(struct cdev *dev, int flag, int mode, struct thread *p)
{
	struct ugen_softc *sc = DEV2SC(dev);
	struct ugen_endpoint *sce = DEV2SCE(dev);
	struct usbd_xfer *temp_xfer[4];
	int32_t error;

	PRINTFN(5, ("flag=%d, mode=%d\n", flag, mode));

	if ((sc == NULL) || (sce == NULL)) {
		return (0);
	}
	mtx_lock(&sc->sc_mtx);

here >>>	if (sce->state & (UGEN_OPEN_DEV | UGEN_OPEN_IN | UGEN_OPEN_OUT)) {
		/* control endpoint is also ``closed'' here */

		sce->state |= UGEN_CLOSING;

On Thursday 11 September 2008, Hans Petter Selasky wrote:
> On Thursday 11 September 2008, Volker wrote:
> > On 09/11/08 22:13, Julian Elischer wrote:
> > > Volker wrote:
> > >> On 09/11/08 10:13, Hans Petter Selasky wrote:
> > >>> On Monday 25 August 2008, Volker wrote:
> > >>>> Anyway, I've already had those crashes even with the "new" usb stack
> > >>>> (but it doesn't happen everytime - YMMV).
> > >>
> > >> // dropped current@ from CC
> > >>
> > >> Hans Petter,
> > >>
> > >> the device unplug problem is not just with usb, but these devices are
> > >> the most frequent unplugged devices so far.
> > >>
> > >> Early this week, I discovered a new problem. I've fetched fresh
> > >> RELENG_7 sources, patched your usb stack in and recompiled kernel
> > >> (using usb, not usb2).
>
> Hi Volker,
>
> There has been significant changes to ugen between usb and usb2.
>
> It looks to me like that ugen started the transfer again after the USB
> transfer drain process started, so the drain will never exit. Probably it
> could need an extra flag there to catch that case, to prevent the start
> after trying to unsetup the transfer!
>
> Try to turn on USB debugging:
>
> sysctl hw.usb.debug=15
>
> And grep for transfer start and stop.
>
> --HPS
> _______________________________________________
> freebsd-usb at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-usb
> To unsubscribe, send any mail to "freebsd-usb-unsubscribe at freebsd.org"




More information about the freebsd-usb mailing list