usb/79436: Panic: ohci_abort_xfer: not in process context

Ian Dowse iedowse at maths.tcd.ie
Mon Apr 11 18:00:52 PDT 2005


The following reply was made to PR usb/79436; it has been noted by GNATS.

From: Ian Dowse <iedowse at maths.tcd.ie>
To: Anthony Ginepro <anthony.ginepro at laposte.net>
Cc: FreeBSD-gnats-submit at FreeBSD.org
Subject: Re: usb/79436: Panic: ohci_abort_xfer: not in process context 
Date: Tue, 12 Apr 2005 01:54:04 +0100

 In message <200504020537.j325buK8001163 at renaissance.homeip.net>, Anthony Ginepr
 o writes:
 >When plugging T3 in craddle, the kernel panics in a few seconds after 
 >(due to some action in ppp), it either get caught in one of this panic strings
 >:
 >- ohci_abort_xfer: not in process context
 >- page fault
 
 Hi,
 
 Would you be able to try the following patch to see if it helps?
 I'm not sure if it will solve the problem with the OHCI controller,
 as the ucom device is re-using a transfer from the completion
 callback, which is not generally safe, and the OHCI controller
 appears to handle this the worst.
 
 If it doesn't help, or just changes into a different panic,
 you could try applying the patch from
 
 	http://people.freebsd.org/~iedowse/releng_5_xfer_reuse.diff
 
 in addition to the patch below.
 
 Ian
 
 Index: ucom.c
 ===================================================================
 RCS file: /dump/FreeBSD-CVS/src/sys/dev/usb/ucom.c,v
 retrieving revision 1.51.2.2
 diff -u -r1.51.2.2 ucom.c
 --- ucom.c	30 Jan 2005 01:00:10 -0000	1.51.2.2
 +++ ucom.c	10 Apr 2005 18:08:28 -0000
 @@ -381,6 +381,7 @@
  		    (minor(dev) & UCOM_CALLOUT_MASK))
  			ttyld_modem(tp, 1);
  
 +		sc->sc_state |= UCS_RXSTOP;
  		ucomstartread(sc);
  	}
  
 @@ -929,7 +930,7 @@
  
  	DPRINTF(("ucomstop: %d\n", flag));
  
 -	if (flag & FREAD) {
 +	if ((flag & FREAD) && (sc->sc_state & UCS_RXSTOP) == 0) {
  		DPRINTF(("ucomstop: read\n"));
  		ucomstopread(sc);
  		ucomstartread(sc);
 @@ -1009,10 +1010,9 @@
  
  	DPRINTF(("ucomstartread: start\n"));
  
 -	sc->sc_state &= ~UCS_RXSTOP;
 -
 -	if (sc->sc_bulkin_pipe == NULL)
 +	if (sc->sc_bulkin_pipe == NULL || (sc->sc_state & UCS_RXSTOP) == 0)
  		return (USBD_NORMAL_COMPLETION);
 +	sc->sc_state &= ~UCS_RXSTOP;
  
  	usbd_setup_xfer(sc->sc_ixfer, sc->sc_bulkin_pipe,
  			(usbd_private_handle)sc,
 @@ -1021,7 +1021,8 @@
  			USBD_NO_TIMEOUT, ucomreadcb);
  
  	err = usbd_transfer(sc->sc_ixfer);
 -	if (err != USBD_IN_PROGRESS) {
 +	if (err && err != USBD_IN_PROGRESS) {
 +		sc->sc_state |= UCS_RXSTOP;
  		DPRINTF(("ucomstartread: err = %s\n", usbd_errstr(err)));
  		return (err);
  	}
 @@ -1046,11 +1047,13 @@
  		if (!(sc->sc_state & UCS_RXSTOP))
  			printf("%s: ucomreadcb: %s\n",
  			       USBDEVNAME(sc->sc_dev), usbd_errstr(status));
 +		sc->sc_state |= UCS_RXSTOP;
  		if (status == USBD_STALLED)
  			usbd_clear_endpoint_stall_async(sc->sc_bulkin_pipe);
  		/* XXX we should restart after some delay. */
  		return;
  	}
 +	sc->sc_state |= UCS_RXSTOP;
  
  	usbd_get_xfer_status(xfer, NULL, (void **)&cp, &cc, NULL);
  	DPRINTF(("ucomreadcb: got %d chars, tp = %p\n", cc, tp));
 
 
 


More information about the freebsd-usb mailing list