svn commit: r356598 - head/sys/dev/usb/controller

Hans Petter Selasky hselasky at FreeBSD.org
Fri Jan 10 09:32:45 UTC 2020


Author: hselasky
Date: Fri Jan 10 09:32:44 2020
New Revision: 356598
URL: https://svnweb.freebsd.org/changeset/base/356598

Log:
  Check the XHCI endpoint state before stopping any endpoint.
  
  This avoids getting the XHCI_TRB_ERROR_CONTEXT_STATE error code from the XHCI
  controller when the endpoint is disabled or already stopped.
  
  Suggested by:	Shichun.Ma at dell.com
  MFC after:	1 week
  Sponsored by:	Mellanox Technologies

Modified:
  head/sys/dev/usb/controller/xhci.c

Modified: head/sys/dev/usb/controller/xhci.c
==============================================================================
--- head/sys/dev/usb/controller/xhci.c	Fri Jan 10 09:07:43 2020	(r356597)
+++ head/sys/dev/usb/controller/xhci.c	Fri Jan 10 09:32:44 2020	(r356598)
@@ -1598,10 +1598,26 @@ static usb_error_t
 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;


More information about the svn-src-all mailing list