Date: Sun, 29 May 2005 13:10:19 +0100 From: Ian Dowse <iedowse@iedowse.com> To: sigsegv@radiotube.org Cc: Ian Dowse <iedowse@iedowse.com>, freebsd-usb@freebsd.org Subject: Re: ulpt_tick after close Message-ID: <200505291310.aa19689@nowhere.iedowse.com> In-Reply-To: Your message of "Sun, 29 May 2005 11:27:52 %2B0200." <42998B18.8020806@radiotube.org>
next in thread | previous in thread | raw e-mail | index | archive | help
In message <42998B18.8020806@radiotube.org>, Jan-Espen Pettersen writes: >I think I'll replace that printf with a panic in ulpt_read_cb to get a >backtrace next time. (And at the same time update my sources) As it >would reveal what is actually calling ulpt_read_cb after the callout has >been stopped. The problem is that this is very unlikely to happen during >a single print job, but it does over time, so it might take me some time >to get that backtrace. Thanks for the details. By the way, is it lpd or something else that is actually accessing the ulpt device? Below is a patch you could try that will hopefully find out a bit more about what is going on. You could also change the new return statement in ulpt_read_cb() to a panic, as the stack trace might reveal more information like you say. Ian Index: ulpt.c =================================================================== RCS file: /dump/FreeBSD-CVS/src/sys/dev/usb/ulpt.c,v retrieving revision 1.65.2.1 diff -u -r1.65.2.1 ulpt.c --- ulpt.c 30 Jan 2005 01:00:10 -0000 1.65.2.1 +++ ulpt.c 29 May 2005 11:51:30 -0000 @@ -122,6 +122,7 @@ #define ULPT_OPEN 0x01 /* device is open */ #define ULPT_OBUSY 0x02 /* printer is busy doing output */ #define ULPT_INIT 0x04 /* waiting to initialize for open */ +#define ULPT_CLOSING 0x05 /* closing */ u_char sc_flags; #define ULPT_NOPRIME 0x40 /* don't prime on open */ u_char sc_laststatus; @@ -660,9 +661,13 @@ USB_GET_SC(ulpt, ULPTUNIT(dev), sc); - if (sc->sc_state != ULPT_OPEN) + if (sc->sc_state != ULPT_OPEN) { /* We are being forced to close before the open completed. */ + printf("%s: ignoring close in state %d\n", + USBDEVNAME(sc->sc_dev), sc->sc_state); return (0); + } + sc->sc_state = ULPT_CLOSING; if (sc->sc_has_callout) { usb_uncallout(sc->sc_read_callout, ulpt_tick, sc); @@ -810,6 +815,13 @@ usbd_get_xfer_status(xfer, &xsc, NULL, &n, &err); sc = xsc; + if (sc->sc_state != ULPT_OPEN && (status != USBD_CANCELLED || + err != USBD_CANCELLED)) { + printf("%s: ulpt_read_cb state=%d status=%s err=%s\n", + USBDEVNAME(sc->sc_dev), sc->sc_state, usbd_errstr(status), + usbd_errstr(err)); + return; + } DPRINTFN(1,("ulpt_read_cb: start sc=%p, err=%d n=%d\n", sc, err, n)); #ifdef ULPT_DEBUG @@ -832,6 +844,11 @@ DPRINTFN(1,("ulpt_tick: start sc=%p\n", sc)); + if (sc->sc_state != ULPT_OPEN) { + printf("%s: ulpt_tick state=%d\n", USBDEVNAME(sc->sc_dev), + sc->sc_state); + return; + } usbd_setup_xfer(sc->sc_in_xfer, sc->sc_in_pipe, sc, sc->sc_in_buf, ULPT_BSIZE, USBD_NO_COPY | USBD_SHORT_XFER_OK, ULPT_READ_TIMO, ulpt_read_cb);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200505291310.aa19689>