[PATCH v2 3/8] usb: xhci: Allow context state errors when halting an endpoint

Marek Vasut marex at denx.de
Sun Oct 29 15:34:59 CET 2023


On 10/29/23 07:37, Hector Martin wrote:
> There is a race where an endpoint may halt by itself while we are trying
> to halt it, which results in a context state error. See xHCI 4.6.9 which
> mentions this case.
> 
> This also avoids BUGging when we attempt to stop an endpoint which was
> already stopped to begin with, which is probably a bug elsewhere but
> not a good reason to crash.
> 
> Signed-off-by: Hector Martin <marcan at marcan.st>
> ---
>   drivers/usb/host/xhci-ring.c | 6 ++++--
>   1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
> index d21e76e0bdb6..e02a6e300c4f 100644
> --- a/drivers/usb/host/xhci-ring.c
> +++ b/drivers/usb/host/xhci-ring.c
> @@ -545,6 +545,7 @@ static void abort_td(struct usb_device *udev, int ep_index)
>   	struct xhci_ctrl *ctrl = xhci_get_ctrl(udev);
>   	struct xhci_ring *ring =  ctrl->devs[udev->slot_id]->eps[ep_index].ring;
>   	union xhci_trb *event;
> +	xhci_comp_code comp;
>   	trb_type type;
>   	u64 addr;
>   	u32 field;
> @@ -573,10 +574,11 @@ static void abort_td(struct usb_device *udev, int ep_index)
>   		printf("abort_td: Expected a TRB_TRANSFER TRB first\n");
>   	}
>   
> +	comp = GET_COMP_CODE(le32_to_cpu(event->event_cmd.status));
>   	BUG_ON(type != TRB_COMPLETION ||
>   		TRB_TO_SLOT_ID(le32_to_cpu(event->event_cmd.flags))
> -		!= udev->slot_id || GET_COMP_CODE(le32_to_cpu(
> -		event->event_cmd.status)) != COMP_SUCCESS);
> +		!= udev->slot_id || (comp != COMP_SUCCESS && comp
> +		!= COMP_CTX_STATE));

Can you please, in the process, reformat this condition so it is more 
readable ?

>   	xhci_acknowledge_event(ctrl);
>   
>   	addr = xhci_trb_virt_to_dma(ring->enq_seg,

Reviewed-by: Marek Vasut <marex at denx.de>


More information about the U-Boot mailing list