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: [email protected]
  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;
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to