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
This commit is contained in:
Hans Petter Selasky 2020-01-10 09:32:44 +00:00
parent b8ffd2d5d6
commit 92dfc0fc1d

View File

@ -1598,11 +1598,27 @@ 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;
temp = XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_STOP_EP) |