NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/56115: uvideo does not work on rpi4



On 2021/07/10 9:40, Michael van Elst wrote:
> The following reply was made to PR kern/56115; it has been noted by GNATS.
> 
> From: mlelstv%serpens.de@localhost (Michael van Elst)
> To: gnats-bugs%netbsd.org@localhost
> Cc: 
> Subject: Re: kern/56115: uvideo does not work on rpi4
> Date: Sat, 10 Jul 2021 09:38:32 -0000 (UTC)
> 
>  mlelstv%serpens.de@localhost (Michael van Elst) writes:
>  
>  >The following reply was made to PR kern/56115; it has been noted by GNATS.
>  
>  >From: mlelstv%serpens.de@localhost (Michael van Elst)
>  >To: gnats-bugs%netbsd.org@localhost
>  >Cc: 
>  >Subject: Re: kern/56115: uvideo does not work on rpi4
>  >Date: Sat, 10 Jul 2021 07:22:50 -0000 (UTC)
>  
>  > sc.dying%gmail.com@localhost writes:
>  > 
>  > >Currently Max ESIT Payload in periodic endpoint context is 0.
>  > >VL805 on rpi4 strictly treats this value as an upper limit of transfer
>  > >size for periodic endpoint, so the xfer fails with Bandwidth Overrun Error.
>  > 
>  > >Attached diff should fix it.
>  > 
>  > Also fixes USB audio.
>  > 
>  
>  
>  But it probably exposes a different issue then (uaudio has some
>  extra debug output):
>  
>  [  9769.030793] audio0(uaudio0): trigger_input failed: errno=5
>  
>  EIO. Either uaudio_chan_open() or uaudio_chan_alloc_buffers() failed.

Depending on size of buffer, large allocation may fail because of
fragmented DMA buffer.

>  
>  [  9769.030793] audio0(uaudio0): audio_drain: device timeout, seq=7, usrbuf=46336/H69120, outbuf=2880/11520
>  [  9769.030793] uaudio0: ptransfer error 6
>  
>  That's USBD_CANCELLED.
>  
>  
>  [  9769.030793] panic: kernel diagnostic assertion "xfer == SIMPLEQ_FIRST(&pipe->up_queue)" failed: file "/scratch/netbsd-current/src/sys/dev/usb/usbdi.c", line 1050 xfer 0xffff0000d6f2e580 is not start of queue (0xffff0000d6f2e440 is at start)
>  [  9769.030793] cpu0: Begin traceback...
>  [  9769.030793] trace fp ffffc0009de17af0
>  [  9769.030793] fp ffffc0009de17b20 vpanic() at ffffc0000056b5bc netbsd:vpanic+0x14c
>  [  9769.030793] fp ffffc0009de17b80 kern_assert() at ffffc000007dea88 netbsd:kern_assert+0x58
>  [  9769.030793] fp ffffc0009de17c10 usb_transfer_complete() at ffffc00000141600 netbsd:usb_transfer_complete+0x38c
>  [  9769.030793] fp ffffc0009de17c50 xhci_softintr() at ffffc000001ef69c netbsd:xhci_softintr+0x478
>  [  9769.030793] fp ffffc0009de17cd0 usb_soft_intr() at ffffc0000013d368 netbsd:usb_soft_intr+0x24
>  [  9769.030793] fp ffffc0009de17d30 softint_dispatch() at ffffc00000534fe0 netbsd:softint_dispatch+0xe0
>  [  9769.030793] fp ffffc0009dda8cc0 cpu_switchto_softint() at ffffc000000a5800 netbsd:cpu_switchto_softint+0x70
>  [  9769.030793] fp 0000000000000000 max_watchpoint() at ffffc00000c466fc ffffc00000c466fc
>  [  9769.030793] cpu0: End traceback...

I think this is an another problem.

https://mail-index.netbsd.org/netbsd-bugs/2021/04/28/msg071340.html

> Does xhci_event_transfer() forget to increment xx_isoc_done and
> avoid calling usb_transfer_comeplete() in error paths?
> When an error occurs while isoc transfer, i.e. completion code is not
> SUCCESS nor SHORT_PKT, usb_transfer_comeplete is called without
> incrementing xx_isoc_done and the xfer is removed from up_queue.
> Then, usb_transfer_comeplete is called at the last of transferring
> ux_frlengths[], but it cannot find the xfer in up_queue and fires KASSERT.

I managed to fix by following patch but it was incomplete.
The fix should also take care of MISSED_SRV, RING_UNDERRUN and RING_OVERRUN
errors.

--- src/sys/dev/usb/xhci.c.orig	2021-01-05 22:12:39.918386246 +0000
+++ src/sys/dev/usb/xhci.c	2021-04-28 22:13:30.751444109 +0000
@@ -2050,8 +2050,6 @@ xhci_event_transfer(struct xhci_softc * 
 			xfer->ux_frlengths[xx->xx_isoc_done] -=
 			    XHCI_TRB_2_REM_GET(trb_2);
 			xfer->ux_actlen += xfer->ux_frlengths[xx->xx_isoc_done];
-			if (++xx->xx_isoc_done < xfer->ux_nframes)
-				return;
 		} else
 		if ((trb_3 & XHCI_TRB_3_ED_BIT) == 0) {
 			if (xfer->ux_actlen == 0)
@@ -2107,6 +2105,19 @@ xhci_event_transfer(struct xhci_softc * 
 		break;
 	}
 
+	if (xfertype == UE_ISOCHRONOUS) {
+		switch (trbcode) {
+		case XHCI_TRB_ERROR_SHORT_PKT:
+		case XHCI_TRB_ERROR_SUCCESS:
+			break;
+		default:
+			xfer->ux_frlengths[xx->xx_isoc_done] = 0;
+			break;
+		}
+		if (++xx->xx_isoc_done < xfer->ux_nframes)
+			return;
+	}
+
 	/*
 	 * Try to claim this xfer for completion.  If it has already
 	 * completed or aborted, drop it on the floor.




Home | Main Index | Thread Index | Old Index