Re: [PATCH] xhci: Fix race between ep halt and URB cancellation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks Florian.  I was waiting for after the 3.12 merge window to close
to send Greg bug fixes.  I'm queuing this up for test today, and will
send it out once it passes.

Sarah Sharp

On Sun, Sep 22, 2013 at 09:09:54PM +0200, Florian Wolter wrote:
> Hi Sarah,
> 
> the described Problem also exisits on actual Linux Kernel 3.12-rc so I 
> rebased my patch to this.
> ------
> 
> 
> The halted state of a endpoint cannot be cleared over CLEAR_HALT from a
> user process, because the stopped_td variable was overwritten in the 
> handle_stopped_endpoint() function. So the xhci_endpoint_reset() function will 
> refuse the reset and communication with device can not run over this endpoint.
> https://bugzilla.kernel.org/show_bug.cgi?id=60699
> 
> 
> Signed-off-by: Florian Wolter <wolly84@xxxxxx>
> ---
>  drivers/usb/host/xhci-ring.c |    8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
> index c47f90e..411da1f 100644
> --- a/drivers/usb/host/xhci-ring.c
> +++ b/drivers/usb/host/xhci-ring.c
> @@ -859,8 +859,12 @@ remove_finished_td:
>  		/* Otherwise ring the doorbell(s) to restart queued transfers */
>  		ring_doorbell_for_active_rings(xhci, slot_id, ep_index);
>  	}
> -	ep->stopped_td = NULL;
> -	ep->stopped_trb = NULL;
> +
> +	/* Clear stopped_td and stopped_trb if endpoint is not halted */
> +	if (!(ep->ep_state & EP_HALTED)) {
> +		ep->stopped_td = NULL;
> +		ep->stopped_trb = NULL;
> +	}
>  
>  	/*
>  	 * Drop the lock and complete the URBs in the cancelled TD list.
> -- 
> 1.7.10.4
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux