Module Name:    src
Committed By:   mlelstv
Date:           Wed Apr  6 22:01:45 UTC 2022

Modified Files:
        src/sys/dev/usb: ehci.c if_smscreg.h if_urtwn.c ubt.c uhub.c usb_subr.c
            usbdi.c uvideo.c xhci.c xhcireg.h

Log Message:
revert accidental last commit (except ukbd.c)


To generate a diff of this commit:
cvs rdiff -u -r1.310 -r1.311 src/sys/dev/usb/ehci.c
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/usb/if_smscreg.h
cvs rdiff -u -r1.102 -r1.103 src/sys/dev/usb/if_urtwn.c
cvs rdiff -u -r1.65 -r1.66 src/sys/dev/usb/ubt.c
cvs rdiff -u -r1.160 -r1.161 src/sys/dev/usb/uhub.c
cvs rdiff -u -r1.276 -r1.277 src/sys/dev/usb/usb_subr.c
cvs rdiff -u -r1.241 -r1.242 src/sys/dev/usb/usbdi.c
cvs rdiff -u -r1.71 -r1.72 src/sys/dev/usb/uvideo.c
cvs rdiff -u -r1.163 -r1.164 src/sys/dev/usb/xhci.c
cvs rdiff -u -r1.20 -r1.21 src/sys/dev/usb/xhcireg.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/ehci.c
diff -u src/sys/dev/usb/ehci.c:1.310 src/sys/dev/usb/ehci.c:1.311
--- src/sys/dev/usb/ehci.c:1.310	Wed Apr  6 21:51:29 2022
+++ src/sys/dev/usb/ehci.c	Wed Apr  6 22:01:45 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: ehci.c,v 1.310 2022/04/06 21:51:29 mlelstv Exp $ */
+/*	$NetBSD: ehci.c,v 1.311 2022/04/06 22:01:45 mlelstv Exp $ */
 
 /*
  * Copyright (c) 2004-2012,2016,2020 The NetBSD Foundation, Inc.
@@ -54,7 +54,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.310 2022/04/06 21:51:29 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.311 2022/04/06 22:01:45 mlelstv Exp $");
 
 #include "ohci.h"
 #include "uhci.h"
@@ -790,9 +790,6 @@ ehci_intr1(ehci_softc_t *sc)
 	if (eintrs & EHCI_STS_HSE) {
 		printf("%s: unrecoverable error, controller halted\n",
 		       device_xname(sc->sc_dev));
-#ifdef EHCI_DEBUG
-		ehci_dump();
-#endif
 		/* XXX what else */
 	}
 	if (eintrs & EHCI_STS_PCD) {
@@ -2244,7 +2241,6 @@ ehci_sync_hc(ehci_softc_t *sc)
 	unsigned starttime = getticks();
 	unsigned endtime = starttime + delta;
 	unsigned now;
-	uint32_t v;
 
 	KASSERT(mutex_owned(&sc->sc_lock));
 
@@ -2264,10 +2260,7 @@ ehci_sync_hc(ehci_softc_t *sc)
 	sc->sc_doorbelllwp = curlwp;
 
 	/* ask for doorbell */
-	v = EOREAD4(sc, EHCI_USBCMD);
-	if ((v & EHCI_CMD_IAAD) == 0)
-		EOWRITE4(sc, EHCI_USBCMD, v | EHCI_CMD_IAAD);
-
+	EOWRITE4(sc, EHCI_USBCMD, EOREAD4(sc, EHCI_USBCMD) | EHCI_CMD_IAAD);
 	DPRINTF("cmd = 0x%08jx sts = 0x%08jx",
 	    EOREAD4(sc, EHCI_USBCMD), EOREAD4(sc, EHCI_USBSTS), 0, 0);
 

Index: src/sys/dev/usb/if_smscreg.h
diff -u src/sys/dev/usb/if_smscreg.h:1.7 src/sys/dev/usb/if_smscreg.h:1.8
--- src/sys/dev/usb/if_smscreg.h:1.7	Wed Apr  6 21:51:29 2022
+++ src/sys/dev/usb/if_smscreg.h	Wed Apr  6 22:01:45 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_smscreg.h,v 1.7 2022/04/06 21:51:29 mlelstv Exp $	*/
+/*	$NetBSD: if_smscreg.h,v 1.8 2022/04/06 22:01:45 mlelstv Exp $	*/
 
 /*	$OpenBSD: if_smscreg.h,v 1.2 2012/09/27 12:38:11 jsg Exp $	*/
 /*-
@@ -244,7 +244,7 @@
 #define SMSC_UR_GET_STATS	0xA2
 
 #define SMSC_RX_LIST_CNT	1
-#define SMSC_TX_LIST_CNT	2
+#define SMSC_TX_LIST_CNT	1
 
 #define	SMSC_CONFIG_INDEX	1	/* config number 1 */
 #define	SMSC_IFACE_IDX		0

Index: src/sys/dev/usb/if_urtwn.c
diff -u src/sys/dev/usb/if_urtwn.c:1.102 src/sys/dev/usb/if_urtwn.c:1.103
--- src/sys/dev/usb/if_urtwn.c:1.102	Wed Apr  6 21:51:29 2022
+++ src/sys/dev/usb/if_urtwn.c	Wed Apr  6 22:01:45 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_urtwn.c,v 1.102 2022/04/06 21:51:29 mlelstv Exp $	*/
+/*	$NetBSD: if_urtwn.c,v 1.103 2022/04/06 22:01:45 mlelstv Exp $	*/
 /*	$OpenBSD: if_urtwn.c,v 1.42 2015/02/10 23:25:46 mpi Exp $	*/
 
 /*-
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.102 2022/04/06 21:51:29 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.103 2022/04/06 22:01:45 mlelstv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -2623,8 +2623,7 @@ urtwn_txeof(struct usbd_xfer *xfer, void
 				struct usbd_pipe *pipe = sc->tx_pipe[pidx];
 				usbd_clear_endpoint_stall_async(pipe);
 			}
-			device_printf(sc->sc_dev, "device error %s\n",
-			              usbd_errstr(status));
+			device_printf(sc->sc_dev, "device timeout\n");
 			if_statinc(ifp, if_oerrors);
 		}
 		splx(s);

Index: src/sys/dev/usb/ubt.c
diff -u src/sys/dev/usb/ubt.c:1.65 src/sys/dev/usb/ubt.c:1.66
--- src/sys/dev/usb/ubt.c:1.65	Wed Apr  6 21:51:29 2022
+++ src/sys/dev/usb/ubt.c	Wed Apr  6 22:01:45 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: ubt.c,v 1.65 2022/04/06 21:51:29 mlelstv Exp $	*/
+/*	$NetBSD: ubt.c,v 1.66 2022/04/06 22:01:45 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ubt.c,v 1.65 2022/04/06 21:51:29 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ubt.c,v 1.66 2022/04/06 22:01:45 mlelstv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -1456,7 +1456,7 @@ ubt_xmit_sco_start1(struct ubt_softc *sc
 			     isoc,
 			     isoc->size,
 			     num,
-			     USBD_FORCE_SHORT_XFER | USBD_SHORT_XFER_OK,
+			     USBD_FORCE_SHORT_XFER,
 			     ubt_xmit_sco_complete);
 
 	usbd_transfer(isoc->xfer);
@@ -1777,11 +1777,11 @@ ubt_recv_sco_complete(struct usbd_xfer *
 			if (m == NULL) {
 				MGETHDR(m, M_DONTWAIT, MT_DATA);
 				if (m == NULL) {
-					device_printf(sc->sc_dev,
+					aprint_error_dev(sc->sc_dev,
 					    "out of memory (xfer halted)\n");
 
 					sc->sc_stats.err_rx++;
-					return; /* lost sync */
+					return;		/* lost sync */
 				}
 
 				ptr = mtod(m, uint8_t *);
@@ -1808,21 +1808,14 @@ ubt_recv_sco_complete(struct usbd_xfer *
 				if (want == sizeof(hci_scodata_hdr_t)) {
 					uint32_t len =
 					    mtod(m, hci_scodata_hdr_t *)->length;
-					if (len == 0) {
-						ptr = mtod(m, uint8_t *);
-						ptr++;
-						got = 1;
-					} else if (want > MHLEN) {
-						device_printf(sc->sc_dev,
+					want += len;
+					if (len == 0 || want > MHLEN) {
+						aprint_error_dev(sc->sc_dev,
 						    "packet too large %u "
 						    "(lost sync)\n", len);
 						sc->sc_stats.err_rx++;
-
-						/* lost sync */
-						m_freem(m);
 						return;
-					} else
-						want += len;
+					}
 				}
 
 				if (got == want) {
@@ -1832,9 +1825,6 @@ ubt_recv_sco_complete(struct usbd_xfer *
 						sc->sc_stats.err_rx++;
 
 					m = NULL;
-					ptr = NULL;
-					got = 0;
-					want = 0;
 				}
 			}
 

Index: src/sys/dev/usb/uhub.c
diff -u src/sys/dev/usb/uhub.c:1.160 src/sys/dev/usb/uhub.c:1.161
--- src/sys/dev/usb/uhub.c:1.160	Wed Apr  6 21:51:29 2022
+++ src/sys/dev/usb/uhub.c	Wed Apr  6 22:01:45 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: uhub.c,v 1.160 2022/04/06 21:51:29 mlelstv Exp $	*/
+/*	$NetBSD: uhub.c,v 1.161 2022/04/06 22:01:45 mlelstv Exp $	*/
 /*	$FreeBSD: src/sys/dev/usb/uhub.c,v 1.18 1999/11/17 22:33:43 n_hibma Exp $	*/
 /*	$OpenBSD: uhub.c,v 1.86 2015/06/29 18:27:40 mpi Exp $ */
 
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uhub.c,v 1.160 2022/04/06 21:51:29 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uhub.c,v 1.161 2022/04/06 22:01:45 mlelstv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -563,29 +563,9 @@ uhub_explore(struct usbd_device *dev)
 		for (port = 1; port <= hd->bNbrPorts; port++) {
 			SDT_PROBE3(usb, hub, explore, rescan,
 			    dev, port, &dev->ud_hub->uh_ports[port - 1]);
-			up = &dev->ud_hub->uh_ports[port - 1];
-			subdev = up->up_dev;
+			subdev = dev->ud_hub->uh_ports[port - 1].up_dev;
 			if (subdev == NULL)
 				continue;
-
-			err = usbd_get_port_status(subdev, port, &up->up_status);
-			if (err) {
-				DPRINTF("uhub%jd get port stat failed, err %jd",
-				device_unit(sc->sc_dev), err, 0, 0);
-				continue;
-			}
-
-			change = UGETW(up->up_status.wPortChange);
-			if ((change & UPS_C_PORT_ENABLED) == 0) {
-				if (usbd_reset_port(subdev, port, &up->up_status)) {
-					device_printf(sc->sc_dev,
-					"port %d reset failed\n", port);
-					continue;
-				}
-				device_printf(sc->sc_dev,
-				    "port %d reset succeeded\n", port);
-			}
-
 			usbd_reattach_device(sc->sc_dev, subdev, port, NULL);
 		}
 	}
@@ -884,7 +864,7 @@ uhub_explore(struct usbd_device *dev)
 			 * some other serious problem.  Since we cannot leave
 			 * at 0 we have to disable the port instead.
 			 */
-			device_printf(sc->sc_dev,
+			aprint_error_dev(sc->sc_dev,
 			    "device problem, disabling port %d\n", port);
 			usbd_clear_port_feature(dev, port, UHF_PORT_ENABLE);
 		} else {

Index: src/sys/dev/usb/usb_subr.c
diff -u src/sys/dev/usb/usb_subr.c:1.276 src/sys/dev/usb/usb_subr.c:1.277
--- src/sys/dev/usb/usb_subr.c:1.276	Wed Apr  6 21:51:29 2022
+++ src/sys/dev/usb/usb_subr.c	Wed Apr  6 22:01:45 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: usb_subr.c,v 1.276 2022/04/06 21:51:29 mlelstv Exp $	*/
+/*	$NetBSD: usb_subr.c,v 1.277 2022/04/06 22:01:45 mlelstv Exp $	*/
 /*	$FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $	*/
 
 /*
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.276 2022/04/06 21:51:29 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.277 2022/04/06 22:01:45 mlelstv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -247,11 +247,8 @@ usb_delay_ms_locked(struct usbd_bus *bus
 	/* Wait at least two clock ticks so we know the time has passed. */
 	if (bus->ub_usepolling || cold)
 		delay((ms+1) * 1000);
-	else {
-int timeo = (ms*hz+999)/1000 + 1;
-if (timeo > hz/2) printf("usb_delay_ms_locked(%p) %d ticks\n",lock,timeo);
+	else
 		kpause("usbdly", false, (ms*hz+999)/1000 + 1, lock);
-	}
 }
 
 void
@@ -461,16 +458,8 @@ usbd_iface_exlock(struct usbd_interface 
 {
 
 	mutex_enter(iface->ui_dev->ud_bus->ub_lock);
-#if 1
-if (iface->ui_busy != 0) {
-	printf("%s: addr %d not idle, busy = %"PRId64"\n",
-		device_xname(iface->ui_dev->ud_bus->ub_usbctl),
-		iface->ui_dev->ud_addr, iface->ui_busy);
-}
-#else
 	KASSERTMSG(iface->ui_busy == 0, "interface is not idle,"
 	    " busy=%"PRId64, iface->ui_busy);
-#endif
 	iface->ui_busy = -1;
 	mutex_exit(iface->ui_dev->ud_bus->ub_lock);
 }

Index: src/sys/dev/usb/usbdi.c
diff -u src/sys/dev/usb/usbdi.c:1.241 src/sys/dev/usb/usbdi.c:1.242
--- src/sys/dev/usb/usbdi.c:1.241	Wed Apr  6 21:51:29 2022
+++ src/sys/dev/usb/usbdi.c	Wed Apr  6 22:01:45 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: usbdi.c,v 1.241 2022/04/06 21:51:29 mlelstv Exp $	*/
+/*	$NetBSD: usbdi.c,v 1.242 2022/04/06 22:01:45 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 1998, 2012, 2015 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.241 2022/04/06 21:51:29 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.242 2022/04/06 22:01:45 mlelstv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -1185,11 +1185,7 @@ usb_transfer_complete(struct usbd_xfer *
 
 	if (xfer->ux_callback) {
 		if (!polling) {
-			while (pipe->up_callingxfer != NULL) {
-printf("callingxfer used\n");
-				cv_wait(&pipe->up_callingcv,
-				    pipe->up_dev->ud_bus->ub_lock);
-			}
+			KASSERT(pipe->up_callingxfer == NULL);
 			pipe->up_callingxfer = xfer;
 			mutex_exit(pipe->up_dev->ud_bus->ub_lock);
 			if (!(pipe->up_flags & USBD_MPSAFE))

Index: src/sys/dev/usb/uvideo.c
diff -u src/sys/dev/usb/uvideo.c:1.71 src/sys/dev/usb/uvideo.c:1.72
--- src/sys/dev/usb/uvideo.c:1.71	Wed Apr  6 21:51:29 2022
+++ src/sys/dev/usb/uvideo.c	Wed Apr  6 22:01:45 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvideo.c,v 1.71 2022/04/06 21:51:29 mlelstv Exp $	*/
+/*	$NetBSD: uvideo.c,v 1.72 2022/04/06 22:01:45 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 2008 Patrick Mahoney
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvideo.c,v 1.71 2022/04/06 21:51:29 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvideo.c,v 1.72 2022/04/06 22:01:45 mlelstv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -1696,7 +1696,7 @@ uvideo_stream_stop_xfer(struct uvideo_st
 		}
 
 		/* Give it some time to settle */
-		usbd_delay_ms(vs->vs_parent->sc_udev, 20);
+		usbd_delay_ms(vs->vs_parent->sc_udev, 1000);
 
 		/* Set to zero bandwidth alternate interface zero */
 		err = usbd_set_interface(vs->vs_iface, 0);
@@ -2142,11 +2142,11 @@ static int
 uvideo_start_transfer(void *addr)
 {
 	struct uvideo_stream *vs = addr;
-	int /*s, */err;
+	int s, err;
 
-	// s = splusb();
+	s = splusb();
 	err = uvideo_stream_start_xfer(vs);
-	// splx(s);
+	splx(s);
 
 	return err;
 }
@@ -2155,11 +2155,11 @@ static int
 uvideo_stop_transfer(void *addr)
 {
 	struct uvideo_stream *vs = addr;
-	int err/* , s*/;
+	int err, s;
 
-	// s = splusb();
+	s = splusb();
 	err = uvideo_stream_stop_xfer(vs);
-	// splx(s);
+	splx(s);
 
 	return err;
 }
@@ -2174,7 +2174,7 @@ uvideo_get_control_group(void *addr, str
 	usbd_status err;
 	uint8_t control_id, ent_id, data[16];
 	uint16_t len;
-	// int s;
+	int s;
 
 	/* request setup */
 	switch (group->group_id) {
@@ -2204,9 +2204,9 @@ uvideo_get_control_group(void *addr, str
 	USETW(req.wIndex, (ent_id << 8) | sc->sc_ifaceno);
 	USETW(req.wLength, len);
 
-	// s = splusb();
+	s = splusb();
 	err = usbd_do_request(sc->sc_udev, &req, data);
-	// splx(s);
+	splx(s);
 	if (err != USBD_NORMAL_COMPLETION) {
 		DPRINTF(("uvideo_set_control: error %s (%d)\n",
 			 usbd_errstr(err), err));
@@ -2235,7 +2235,7 @@ uvideo_set_control_group(void *addr, con
 	usbd_status err;
 	uint8_t control_id, ent_id, data[16]; /* long enough for all controls */
 	uint16_t len;
-	// int s;
+	int s;
 
 	switch (group->group_id) {
 	case VIDEO_CONTROL_PANTILT_RELATIVE:
@@ -2296,9 +2296,9 @@ uvideo_set_control_group(void *addr, con
 	USETW(req.wIndex, (ent_id << 8) | sc->sc_ifaceno);
 	USETW(req.wLength, len);
 
-	// s = splusb();
+	s = splusb();
 	err = usbd_do_request(sc->sc_udev, &req, data);
-	// splx(s);
+	splx(s);
 	if (err != USBD_NORMAL_COMPLETION) {
 		DPRINTF(("uvideo_set_control: error %s (%d)\n",
 			 usbd_errstr(err), err));

Index: src/sys/dev/usb/xhci.c
diff -u src/sys/dev/usb/xhci.c:1.163 src/sys/dev/usb/xhci.c:1.164
--- src/sys/dev/usb/xhci.c:1.163	Wed Apr  6 21:51:29 2022
+++ src/sys/dev/usb/xhci.c	Wed Apr  6 22:01:45 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: xhci.c,v 1.163 2022/04/06 21:51:29 mlelstv Exp $	*/
+/*	$NetBSD: xhci.c,v 1.164 2022/04/06 22:01:45 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 2013 Jonathan A. Kollasch
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.163 2022/04/06 21:51:29 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.164 2022/04/06 22:01:45 mlelstv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -192,7 +192,7 @@ static void xhci_setup_ctx(struct usbd_p
 static void xhci_setup_route(struct usbd_pipe *, uint32_t *);
 static void xhci_setup_tthub(struct usbd_pipe *, uint32_t *);
 static void xhci_setup_maxburst(struct usbd_pipe *, uint32_t *);
-static uint32_t xhci_bival2ival(uint32_t, uint32_t, uint32_t);
+static uint32_t xhci_bival2ival(uint32_t, uint32_t);
 
 static void xhci_noop(struct usbd_pipe *);
 
@@ -2440,6 +2440,8 @@ 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)
@@ -2471,22 +2473,6 @@ 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;
-		case XHCI_TRB_ERROR_MISSED_SERVICE:
-		case XHCI_TRB_ERROR_RING_UNDERRUN:
-		case XHCI_TRB_ERROR_RING_OVERRUN:
-		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.
@@ -3493,7 +3479,9 @@ xhci_setup_ctx(struct usbd_pipe *pipe)
 	const u_int dci = xhci_ep_get_dci(ed);
 	const uint8_t xfertype = UE_GET_XFERTYPE(ed->bmAttributes);
 	uint32_t *cp;
+	uint16_t mps = UGETW(ed->wMaxPacketSize);
 	uint8_t speed = dev->ud_speed;
+	uint8_t ival = ed->bInterval;
 
 	XHCIHIST_FUNC();
 	XHCIHIST_CALLARGS("pipe %#jx: slot %ju dci %ju speed %ju",
@@ -3538,16 +3526,43 @@ xhci_setup_ctx(struct usbd_pipe *pipe)
 	if (xfertype != UE_ISOCHRONOUS)
 		cp[1] |= XHCI_EPCTX_1_CERR_SET(3);
 
+	if (xfertype == UE_CONTROL)
+		cp[4] = XHCI_EPCTX_4_AVG_TRB_LEN_SET(8); /* 6.2.3 */
+	else if (USB_IS_SS(speed))
+		cp[4] = XHCI_EPCTX_4_AVG_TRB_LEN_SET(mps);
+	else
+		cp[4] = XHCI_EPCTX_4_AVG_TRB_LEN_SET(UE_GET_SIZE(mps));
+
 	xhci_setup_maxburst(pipe, cp);
 
-	DPRINTFN(4, "setting on dci %ju ival %ju mult %ju mps %#jx",
-	    dci, XHCI_EPCTX_0_IVAL_GET(cp[0]), XHCI_EPCTX_0_MULT_GET(cp[0]),
-	    XHCI_EPCTX_1_MAXP_SIZE_GET(cp[1]));
-	DPRINTFN(4, " maxburst %ju mep %#jx atl %#jx",
-	    XHCI_EPCTX_1_MAXB_GET(cp[1]),
-	    (XHCI_EPCTX_0_MAX_ESIT_PAYLOAD_HI_GET(cp[0]) << 16) +
-	    XHCI_EPCTX_4_MAX_ESIT_PAYLOAD_GET(cp[4]),
-	    XHCI_EPCTX_4_AVG_TRB_LEN_GET(cp[4]), 0);
+	switch (xfertype) {
+	case UE_CONTROL:
+		break;
+	case UE_BULK:
+		/* XXX Set MaxPStreams, HID, and LSA if streams enabled */
+		break;
+	case UE_INTERRUPT:
+		if (pipe->up_interval != USBD_DEFAULT_INTERVAL)
+			ival = pipe->up_interval;
+
+		ival = xhci_bival2ival(ival, speed);
+		cp[0] |= XHCI_EPCTX_0_IVAL_SET(ival);
+		break;
+	case UE_ISOCHRONOUS:
+		if (pipe->up_interval != USBD_DEFAULT_INTERVAL)
+			ival = pipe->up_interval;
+
+		/* xHCI 6.2.3.6 Table 65, USB 2.0 9.6.6 */
+		if (speed == USB_SPEED_FULL)
+			ival += 3; /* 1ms -> 125us */
+		ival--;
+		cp[0] |= XHCI_EPCTX_0_IVAL_SET(ival);
+		break;
+	default:
+		break;
+	}
+	DPRINTFN(4, "setting ival %ju MaxBurst %#jx",
+	    XHCI_EPCTX_0_IVAL_GET(cp[0]), XHCI_EPCTX_1_MAXB_GET(cp[1]), 0, 0);
 
 	/* rewind TR dequeue pointer in xHC */
 	/* can't use xhci_ep_get_dci() yet? */
@@ -3732,24 +3747,29 @@ xhci_setup_tthub(struct usbd_pipe *pipe,
 	    XHCI_SCTX_2_TT_PORT_NUM_SET(ttportnum);
 }
 
-static const usb_endpoint_ss_comp_descriptor_t *
-xhci_get_essc_desc(struct usbd_pipe *pipe)
+/* set up params for periodic endpoint */
+static void
+xhci_setup_maxburst(struct usbd_pipe *pipe, uint32_t *cp)
 {
+	struct xhci_pipe * const xpipe = (struct xhci_pipe *)pipe;
 	struct usbd_device *dev = pipe->up_dev;
 	usb_endpoint_descriptor_t * const ed = pipe->up_endpoint->ue_edesc;
-	const usb_cdc_descriptor_t *cdcd;
+	const uint8_t xfertype = UE_GET_XFERTYPE(ed->bmAttributes);
 	usbd_desc_iter_t iter;
+	const usb_cdc_descriptor_t *cdcd;
+	uint32_t maxb = 0;
+	uint16_t mps = UGETW(ed->wMaxPacketSize);
+	uint8_t speed = dev->ud_speed;
+	uint8_t mult = 0;
 	uint8_t ep;
 
 	/* config desc is NULL when opening ep0 */
 	if (dev == NULL || dev->ud_cdesc == NULL)
-		return NULL;
-
+		goto no_cdcd;
 	cdcd = (const usb_cdc_descriptor_t *)usb_find_desc(dev,
 	    UDESC_INTERFACE, USBD_CDCSUBTYPE_ANY);
 	if (cdcd == NULL)
-		return NULL;
-
+		goto no_cdcd;
 	usb_desc_iter_init(dev, &iter);
 	iter.cur = (const void *)cdcd;
 
@@ -3771,153 +3791,61 @@ xhci_get_essc_desc(struct usbd_pipe *pip
 		}
 	}
 	if (cdcd != NULL && cdcd->bDescriptorType == UDESC_ENDPOINT_SS_COMP) {
-		return (const usb_endpoint_ss_comp_descriptor_t *)cdcd;
+		const usb_endpoint_ss_comp_descriptor_t * esscd =
+		    (const usb_endpoint_ss_comp_descriptor_t *)cdcd;
+		maxb = esscd->bMaxBurst;
+		mult = UE_GET_SS_ISO_MULT(esscd->bmAttributes);
 	}
-	return NULL;
-}
 
-/* set up params for periodic endpoint */
-static void
-xhci_setup_maxburst(struct usbd_pipe *pipe, uint32_t *cp)
-{
-	struct xhci_pipe * const xpipe = (struct xhci_pipe *)pipe;
-	struct xhci_softc * const sc = XHCI_PIPE2SC(pipe);
-	struct usbd_device * const dev = pipe->up_dev;
-	usb_endpoint_descriptor_t * const ed = pipe->up_endpoint->ue_edesc;
-	const uint8_t xfertype = UE_GET_XFERTYPE(ed->bmAttributes);
-	uint16_t mps = UGETW(ed->wMaxPacketSize);
-	uint8_t speed = dev->ud_speed;
-	uint32_t maxb, mep, atl;
-	uint8_t ival, mult;
-
-	const usb_endpoint_ss_comp_descriptor_t * esscd =
-	    xhci_get_essc_desc(pipe);
-
-	/* USB 2.0  9.6.6, xHCI 4.8.2.4, 6.2.3.2 - 6.2.3.8 */
-	switch (xfertype) {
-	case UE_ISOCHRONOUS:
-	case UE_INTERRUPT:
-		if (USB_IS_SS(speed)) {
-			maxb = esscd ? esscd->bMaxBurst : UE_GET_TRANS(mps);
-			mep = esscd ? UGETW(esscd->wBytesPerInterval) :
-			    UE_GET_SIZE(mps) * (maxb + 1);
-			if (esscd && xfertype == UE_ISOCHRONOUS &&
-			    XHCI_HCC2_LEC(sc->sc_hcc2) == 0) {
-				mult = UE_GET_SS_ISO_MULT(esscd->bmAttributes);
-				mult = (mult > 2) ? 2 : mult;
-			} else
-				mult = 0;
+ no_cdcd:
+	/* 6.2.3.4,  4.8.2.4 */
+	if (USB_IS_SS(speed)) {
+		/* USB 3.1  9.6.6 */
+		cp[1] |= XHCI_EPCTX_1_MAXP_SIZE_SET(mps);
+		/* USB 3.1  9.6.7 */
+		cp[1] |= XHCI_EPCTX_1_MAXB_SET(maxb);
+#ifdef notyet
+		if (xfertype == UE_ISOCHRONOUS) {
+		}
+		if (XHCI_HCC2_LEC(sc->sc_hcc2) != 0) {
+			/* use ESIT */
+			cp[4] |= XHCI_EPCTX_4_MAX_ESIT_PAYLOAD_SET(x);
+			cp[0] |= XHCI_EPCTX_0_MAX_ESIT_PAYLOAD_HI_SET(x);
 
+			/* XXX if LEC = 1, set ESIT instead */
+			cp[0] |= XHCI_EPCTX_0_MULT_SET(0);
 		} else {
-			switch (speed) {
-			case USB_SPEED_HIGH:
-				maxb = UE_GET_TRANS(mps);
-				mep = UE_GET_SIZE(mps) * (maxb + 1);
-				break;
-			case USB_SPEED_FULL:
-				maxb = 0;
-				mep = UE_GET_SIZE(mps);
-				break;
-			default:
-				maxb = 0;
-				mep = 0;
-				break;
-			}
-			mult = 0;
+			/* use ival */
 		}
-		mps = UE_GET_SIZE(mps);
-
-		if (pipe->up_interval == USBD_DEFAULT_INTERVAL)
-			ival = ed->bInterval;
-		else
-			ival = pipe->up_interval;
+#endif
+	} else {
+		/* USB 2.0  9.6.6 */
+		cp[1] |= XHCI_EPCTX_1_MAXP_SIZE_SET(UE_GET_SIZE(mps));
 
-		ival = xhci_bival2ival(ival, speed, xfertype);
-		atl = mep;
-		break;
-	case UE_CONTROL:
-	case UE_BULK:
-	default:
-		if (USB_IS_SS(speed)) {
-			maxb = esscd ? esscd->bMaxBurst : 0;
-		} else
+		/* 6.2.3.4 */
+		if (speed == USB_SPEED_HIGH &&
+		   (xfertype == UE_ISOCHRONOUS || xfertype == UE_INTERRUPT)) {
+			maxb = UE_GET_TRANS(mps);
+		} else {
+			/* LS/FS or HS CTRL or HS BULK */
 			maxb = 0;
-
-		mps = UE_GET_SIZE(mps);
-		mep = 0;
-		mult = 0;
-		ival = 0;
-		if (xfertype == UE_CONTROL)
-			atl = 8;		/* 6.2.3 */
-		else
-			atl = mps;
-		break;
-	}
-
-	switch (speed) {
-	case USB_SPEED_LOW:
-		break;
-	case USB_SPEED_FULL:
-		if (xfertype == UE_INTERRUPT)
-			if (mep > XHCI_EPCTX_MEP_FS_INTR)
-				mep = XHCI_EPCTX_MEP_FS_INTR;
-		if (xfertype == UE_ISOCHRONOUS)
-			if (mep > XHCI_EPCTX_MEP_FS_ISOC)
-				mep = XHCI_EPCTX_MEP_FS_ISOC;
-		break;
-	case USB_SPEED_HIGH:
-		if (xfertype == UE_INTERRUPT)
-			if (mep > XHCI_EPCTX_MEP_HS_INTR)
-				mep = XHCI_EPCTX_MEP_HS_INTR;
-		if (xfertype == UE_ISOCHRONOUS)
-			if (mep > XHCI_EPCTX_MEP_HS_ISOC)
-				mep = XHCI_EPCTX_MEP_HS_ISOC;
-		break;
-	case USB_SPEED_SUPER:
-	case USB_SPEED_SUPER_PLUS:
-	default:
-		if (xfertype == UE_INTERRUPT)
-			if (mep > XHCI_EPCTX_MEP_SS_INTR)
-				mep = XHCI_EPCTX_MEP_SS_INTR;
-		if (xfertype == UE_ISOCHRONOUS) {
-			if (speed == USB_SPEED_SUPER ||
-			    XHCI_HCC2_LEC(sc->sc_hcc2) == 0) {
-				if (mep > XHCI_EPCTX_MEP_SS_ISOC)
-					mep = XHCI_EPCTX_MEP_SS_ISOC;
-			} else {
-				if (mep > XHCI_EPCTX_MEP_SS_ISOC_LEC)
-					mep = XHCI_EPCTX_MEP_SS_ISOC_LEC;
-			}
 		}
-		break;
+		cp[1] |= XHCI_EPCTX_1_MAXB_SET(maxb);
 	}
-
 	xpipe->xp_maxb = maxb + 1;
 	xpipe->xp_mult = mult + 1;
-
-	cp[0] |= XHCI_EPCTX_0_MAX_ESIT_PAYLOAD_HI_SET(mep >> 16);
-	cp[0] |= XHCI_EPCTX_0_IVAL_SET(ival);
-	cp[0] |= XHCI_EPCTX_0_MULT_SET(mult);
-	cp[1] |= XHCI_EPCTX_1_MAXP_SIZE_SET(mps);
-	cp[1] |= XHCI_EPCTX_1_MAXB_SET(maxb);
-	cp[4] |= XHCI_EPCTX_4_MAX_ESIT_PAYLOAD_SET(mep & 0xffff);
-	cp[4] |= XHCI_EPCTX_4_AVG_TRB_LEN_SET(atl);
 }
 
 /*
- * Convert usbdi bInterval value to xhci endpoint context interval value
- * for periodic pipe.
+ * Convert endpoint bInterval value to endpoint context interval value
+ * for Interrupt pipe.
  * xHCI 6.2.3.6 Table 65, USB 2.0 9.6.6
  */
 static uint32_t
-xhci_bival2ival(uint32_t ival, uint32_t speed, uint32_t xfertype)
+xhci_bival2ival(uint32_t ival, uint32_t speed)
 {
-	if (xfertype != UE_INTERRUPT && xfertype != UE_ISOCHRONOUS)
-		return 0;
-
-	if (xfertype == UE_INTERRUPT &&
-	    (speed == USB_SPEED_LOW || speed == USB_SPEED_FULL)) {
-		u_int i;
+	if (speed == USB_SPEED_LOW || speed == USB_SPEED_FULL) {
+		int i;
 
 		/*
 		 * round ival down to "the nearest base 2 multiple of
@@ -3930,22 +3858,9 @@ xhci_bival2ival(uint32_t ival, uint32_t 
 				break;
 		}
 		ival = i;
-
-		/* 3 - 10 */
-		ival = (ival < 3) ? 3 : ival;
-	} else if (speed == USB_SPEED_FULL) {
-		/* FS isoc */
-		ival += 3;			/* 1ms -> 125us */
-		ival--;				/* Interval = bInterval-1 */
-		/* 3 - 18 */
-		ival = (ival > 18) ? 18 : ival;
-		ival = (ival < 3) ? 3 : ival;
 	} else {
-		/* SS/HS intr/isoc */
-		if (ival > 0)
-			ival--;			/* Interval = bInterval-1 */
-		/* 0 - 15 */
-		ival = (ival > 15) ? 15 : ival;
+		/* Interval = bInterval-1 for SS/HS */
+		ival--;
 	}
 
 	return ival;

Index: src/sys/dev/usb/xhcireg.h
diff -u src/sys/dev/usb/xhcireg.h:1.20 src/sys/dev/usb/xhcireg.h:1.21
--- src/sys/dev/usb/xhcireg.h:1.20	Wed Apr  6 21:51:29 2022
+++ src/sys/dev/usb/xhcireg.h	Wed Apr  6 22:01:45 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: xhcireg.h,v 1.20 2022/04/06 21:51:29 mlelstv Exp $ */
+/* $NetBSD: xhcireg.h,v 1.21 2022/04/06 22:01:45 mlelstv Exp $ */
 
 /*-
  * Copyright (c) 2010 Hans Petter Selasky. All rights reserved.
@@ -105,7 +105,7 @@
 #define	 XHCI_HCC2_CMC(x)	__SHIFTOUT((x), __BIT(1))	/* CEC MaxExLatTooLg */
 #define	 XHCI_HCC2_FSC(x)	__SHIFTOUT((x), __BIT(2))	/* Foce Save Context */
 #define	 XHCI_HCC2_CTC(x)	__SHIFTOUT((x), __BIT(3))	/* Compliance Transc */
-#define	 XHCI_HCC2_LEC(x)	__SHIFTOUT((x), __BIT(4))	/* Large ESIT Payload */
+#define	 XHCI_HCC2_LEC(x)	__SHIFTOUT((x), __BIT(4))	/* Large ESIT Paylod */
 #define	 XHCI_HCC2_CIC(x)	__SHIFTOUT((x), __BIT(5))	/* Configuration Inf */
 #define	 XHCI_HCC2_ETC(x)	__SHIFTOUT((x), __BIT(6))	/* Extended TBC */
 #define	 XHCI_HCC2_ETC_TSC(x)	__SHIFTOUT((x), __BIT(7))	/* ExtTBC TRB Status */
@@ -648,13 +648,6 @@ struct xhci_trb {
 #define XHCI_EPCTX_4_MAX_ESIT_PAYLOAD_MASK	__BITS(16, 31)
 #define XHCI_EPCTX_4_MAX_ESIT_PAYLOAD_SET(x)    __SHIFTIN((x), XHCI_EPCTX_4_MAX_ESIT_PAYLOAD_MASK)
 #define XHCI_EPCTX_4_MAX_ESIT_PAYLOAD_GET(x)    __SHIFTOUT((x), XHCI_EPCTX_4_MAX_ESIT_PAYLOAD_MASK)
-#define XHCI_EPCTX_MEP_FS_INTR			64U
-#define XHCI_EPCTX_MEP_FS_ISOC			(1*1024U)
-#define XHCI_EPCTX_MEP_HS_INTR			(3*1024U)
-#define XHCI_EPCTX_MEP_HS_ISOC			(3*1024U)
-#define XHCI_EPCTX_MEP_SS_INTR			(3*1024U)
-#define XHCI_EPCTX_MEP_SS_ISOC			(48*1024U)
-#define XHCI_EPCTX_MEP_SS_ISOC_LEC		(16*1024*1024U - 1)
 
 
 #define XHCI_INCTX_NON_CTRL_MASK        0xFFFFFFFCU

Reply via email to