Hi,

Can you test the attached patch?

--HPS
Index: sys/dev/usb/controller/xhci.c
===================================================================
--- sys/dev/usb/controller/xhci.c	(revision 356545)
+++ sys/dev/usb/controller/xhci.c	(working copy)
@@ -1598,11 +1598,27 @@
 xhci_cmd_stop_ep(struct xhci_softc *sc, uint8_t suspend,
     uint8_t ep_id, uint8_t slot_id)
 {
+	struct usb_page_search buf_dev;
+	struct xhci_dev_ctx *pdev;
 	struct xhci_trb trb;
 	uint32_t temp;
 
 	DPRINTF("\n");
 
+	usbd_get_page(&sc->sc_hw.devs[slot_id].device_pc, 0, &buf_dev);
+	pdev = buf_dev.buffer;
+	usb_pc_cpu_invalidate(&sc->sc_hw.devs[slot_id].device_pc);
+
+	switch (XHCI_EPCTX_0_EPSTATE_GET(pdev->ctx_ep[ep_id - 1].dwEpCtx0)) {
+	case XHCI_EPCTX_0_EPSTATE_DISABLED:
+	case XHCI_EPCTX_0_EPSTATE_STOPPED:
+		DPRINTF("Endpoint %u on slot %u is already stopped\n",
+		    ep_id, slot_id);
+		return (USB_ERR_NORMAL_COMPLETION);
+	default:
+		break;
+	}
+
 	trb.qwTrb0 = 0;
 	trb.dwTrb2 = 0;
 	temp = XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_STOP_EP) |
Index: sys/dev/usb/controller/xhci.h
===================================================================
--- sys/dev/usb/controller/xhci.h	(revision 356545)
+++ sys/dev/usb/controller/xhci.h	(working copy)
@@ -115,6 +115,14 @@
 	volatile uint32_t	dwEpCtx0;
 #define	XHCI_EPCTX_0_EPSTATE_SET(x)		((x) & 0x7)
 #define	XHCI_EPCTX_0_EPSTATE_GET(x)		((x) & 0x7)
+#define	XHCI_EPCTX_0_EPSTATE_DISABLED		0
+#define	XHCI_EPCTX_0_EPSTATE_RUNNING		1
+#define	XHCI_EPCTX_0_EPSTATE_HALTED		2
+#define	XHCI_EPCTX_0_EPSTATE_STOPPED		3
+#define	XHCI_EPCTX_0_EPSTATE_ERROR		4
+#define	XHCI_EPCTX_0_EPSTATE_RESERVED_5		5
+#define	XHCI_EPCTX_0_EPSTATE_RESERVED_6		6
+#define	XHCI_EPCTX_0_EPSTATE_RESERVED_7		7
 #define	XHCI_EPCTX_0_MULT_SET(x)		(((x) & 0x3) << 8)
 #define	XHCI_EPCTX_0_MULT_GET(x)		(((x) >> 8) & 0x3)
 #define	XHCI_EPCTX_0_MAXP_STREAMS_SET(x)	(((x) & 0x1F) << 10)
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to "[email protected]"

Reply via email to