RE: [PATCH] xhci: Fix reset-device and configure-endpoint commands

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

 



Both email addresses are valid (one is an alias for the other, or something like that).

-- 
Paul

> -----Original Message-----
> From: Sarah Sharp [mailto:sarah.a.sharp@xxxxxxxxxxxxxxx]
> Sent: Wednesday, November 17, 2010 4:56 PM
> To: Paul Zimmerman
> Cc: linux-usb@xxxxxxxxxxxxxxx
> Subject: Re: [PATCH] xhci: Fix reset-device and configure-endpoint commands
> 
> On Wed, Nov 17, 2010 at 04:26:50PM -0800, Paul Zimmerman wrote:
> > We have been having problems with the USB-IF Gold Tree tests when plugging
> > and unplugging devices from the tree. I have seen that the reset-device
> > and configure-endpoint commands, which are invoked from
> > xhci_discover_or_reset_device() and xhci_configure_endpoint(), will sometimes
> > time out.
> >
> > After much debugging, I determined that the commands themselves do not actually
> > time out, but rather their completion events do not get delivered to the right
> > place.
> >
> > This happens when the command ring has just wrapped around, and it's enqueue
> > pointer is left pointing to the link TRB. xhci_discover_or_reset_device() and
> > xhci_configure_endpoint() use the enqueue pointer directly as their command
> > TRB pointer, without checking whether it's pointing to the link TRB.
> >
> > When the completion event arrives, if the command TRB is pointing to the link
> > TRB, the check against the command ring dequeue pointer in
> > handle_cmd_in_cmd_wait_list() fails, so the completion inside the command does
> > not get signaled.
> >
> > The patch below fixes the timeout problem for me.
> >
> > Signed-off-by: Paul Zimmerman <paulz@xxxxxxxxxxxx>
> 
> Your signed-off-by email address is different from the email you're
> currently sending from.  Which one is correct?  Otherwise looks fine.
> 
> Sarah Sharp
> 
> > ---
> >  drivers/usb/host/xhci.c |   18 ++++++++++++++++++
> >  1 files changed, 18 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> > index 06fca08..45e4a31 100644
> > --- a/drivers/usb/host/xhci.c
> > +++ b/drivers/usb/host/xhci.c
> > @@ -1549,6 +1549,15 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci,
> >  		cmd_completion = command->completion;
> >  		cmd_status = &command->status;
> >  		command->command_trb = xhci->cmd_ring->enqueue;
> > +
> > +		/* Enqueue pointer can be left pointing to the link TRB,
> > +		 * we must handle that
> > +		 */
> > +		if ((command->command_trb->link.control & TRB_TYPE_BITMASK)
> > +				== TRB_TYPE(TRB_LINK))
> > +			command->command_trb =
> > +				xhci->cmd_ring->enq_seg->next->trbs;
> > +
> >  		list_add_tail(&command->cmd_list, &virt_dev->cmd_list);
> >  	} else {
> >  		in_ctx = virt_dev->in_ctx;
> > @@ -2272,6 +2281,15 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device
> *udev)
> >  	/* Attempt to submit the Reset Device command to the command ring */
> >  	spin_lock_irqsave(&xhci->lock, flags);
> >  	reset_device_cmd->command_trb = xhci->cmd_ring->enqueue;
> > +
> > +	/* Enqueue pointer can be left pointing to the link TRB,
> > +	 * we must handle that
> > +	 */
> > +	if ((reset_device_cmd->command_trb->link.control & TRB_TYPE_BITMASK)
> > +			== TRB_TYPE(TRB_LINK))
> > +		reset_device_cmd->command_trb =
> > +			xhci->cmd_ring->enq_seg->next->trbs;
> > +
> >  	list_add_tail(&reset_device_cmd->cmd_list, &virt_dev->cmd_list);
> >  	ret = xhci_queue_reset_device(xhci, slot_id);
> >  	if (ret) {
> > --
> > 1.6.5.2
> >
--
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