Port-arm archive

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

Re: apple m1 status update (20230610)



Hello,

I'm revisiting this problem.
https://mail-index.netbsd.org/port-arm/2023/06/18/msg008275.html

If interested, could you please test new patch?

Differences from previous are
- Set ival = 2^xp_ival, not 2^(xp_ival - 1) in xhci_device_isoc_enter.
  Perhaps this is the reason why previous patch does not work.
- Roundup xp_isoc_next to ival, not ival * USB_UFRAMES_PER_FRAME,
  as xp_isoc_next and ival are in microframe units.


Index: src/sys/dev/usb/xhci.c
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/xhci.c,v
retrieving revision 1.188
diff -u -u -p -r1.188 xhci.c
--- src/sys/dev/usb/xhci.c	30 Jan 2025 10:51:39 -0000	1.188
+++ src/sys/dev/usb/xhci.c	2 May 2025 08:29:51 -0000
@@ -132,6 +132,7 @@ struct xhci_pipe {
 	int16_t xp_isoc_next; /* next frame */
 	uint8_t xp_maxb; /* max burst */
 	uint8_t xp_mult;
+	uint8_t xp_ival;
 };
 
 #define XHCI_COMMAND_RING_TRBS 256
@@ -3983,6 +3984,8 @@ xhci_setup_maxburst(struct usbd_pipe *pi
 		break;
 	}
 
+	/* for TBC calculation */
+	xpipe->xp_ival = ival;
 	xpipe->xp_maxb = maxb + 1;
 	xpipe->xp_mult = mult + 1;
 
@@ -4604,9 +4607,9 @@ xhci_device_isoc_enter(struct usbd_xfer 
 		usb_syncmem(dma, 0, xfer->ux_length,
 		    isread ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
 
-	ival = xfer->ux_pipe->up_endpoint->ue_edesc->bInterval;
-	if (ival >= 1 && ival <= 16)
-		ival = 1 << (ival - 1);
+	ival = xpipe->xp_ival;
+	if (ival >= 0 && ival <= 18)
+		ival = 1 << ival;
 	else
 		ival = 1; /* fake something up */
 
@@ -4615,8 +4618,8 @@ xhci_device_isoc_enter(struct usbd_xfer 
 
 		DPRINTF("mfindex %jx", (uintmax_t)mfindex, 0, 0, 0);
 		mfindex = XHCI_MFINDEX_GET(mfindex + 1);
-		mfindex /= USB_UFRAMES_PER_FRAME;
-		mfindex += 7; /* 7 frames is max possible IST */
+		/* 7 frames is max possible IST */
+		mfindex += 7 * USB_UFRAMES_PER_FRAME;
 		xpipe->xp_isoc_next = roundup2(mfindex, ival);
 	}
 
@@ -4639,7 +4642,8 @@ xhci_device_isoc_enter(struct usbd_xfer 
 		    XHCI_TRB_3_TLBPC_SET(tlbpc) |
 		    XHCI_TRB_3_IOC_BIT;
 		if (XHCI_HCC_CFC(sc->sc_hcc)) {
-			control |= XHCI_TRB_3_FRID_SET(xpipe->xp_isoc_next);
+			control |= XHCI_TRB_3_FRID_SET(xpipe->xp_isoc_next /
+			    USB_UFRAMES_PER_FRAME);
 #if 0
 		} else if (xpipe->xp_isoc_next == -1) {
 			control |= XHCI_TRB_3_FRID_SET(xpipe->xp_isoc_next);
@@ -4653,7 +4657,8 @@ xhci_device_isoc_enter(struct usbd_xfer 
 #endif
 		xhci_xfer_put_trb(xx, i, parameter, status, control);
 
-		xpipe->xp_isoc_next += ival;
+		xpipe->xp_isoc_next =
+		    XHCI_MFINDEX_GET(xpipe->xp_isoc_next + ival);
 		offs += len;
 	}
 



Home | Main Index | Thread Index | Old Index