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-head
mailing list