Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Jan 2020 09:32:44 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r356598 - head/sys/dev/usb/controller
Message-ID:  <202001100932.00A9Wis9033785@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202001100932.00A9Wis9033785>