Re: [RFC] usb: remove "clear_halt for a busy endpoint" warning

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

 



Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> writes:
> On Thu, 13 Feb 2014, Bjørn Mork wrote:
>> Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> writes:
>> 
>> >>  Schould we request to fix that in
>> >> user space, or can we remove this warning like on below patch (call
>> >> CLEAR_HALT ioctl, does not seems to do any harm except printing a
>> >> warning) ?
>> >
>> > Doing an endpoint reset while URBs are queued is a bug, because the
>> > results are not defined.  It should be fixed in the userspace program.
>> 
>> Maybe the usbfs driver should catch bugs like this and log a message
>> pointing to the buggy userspace "driver" instead of blindly forwarding
>> the clear halt?  That would make it more obvious that this is not a
>> kernel bug.
>
> You mean something like this?

Yes, that looks nice.  And maybe even reject the command to avoid the
warning from the hcd?


Bjørn

>
>  drivers/usb/core/devio.c |   16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
>
> Index: usb-3.14/drivers/usb/core/devio.c
> ===================================================================
> --- usb-3.14.orig/drivers/usb/core/devio.c
> +++ usb-3.14/drivers/usb/core/devio.c
> @@ -1043,6 +1043,20 @@ static int proc_bulk(struct dev_state *p
>  	return ret;
>  }
>  
> +static void check_reset_of_active_ep(struct usb_device *udev,
> +		unsigned int epnum, char *ioctl_name)
> +{
> +	struct usb_host_endpoint **eps;
> +	struct usb_host_endpoint *ep;
> +
> +	eps = (epnum & USB_DIR_IN) ? udev->ep_in : udev->ep_out;
> +	ep = eps[epnum & 0x0f];
> +	if (ep && !list_empty(&ep->urb_list))
> +		pr_warn("Process %d (%s) called USBDEVFS_%s for active endpoint %s ep %02x\n",
> +				task_pid_nr(current), current->comm,
> +				ioctl_name, dev_name(&udev->dev), epnum);
> +}
> +
>  static int proc_resetep(struct dev_state *ps, void __user *arg)
>  {
>  	unsigned int ep;
> @@ -1056,6 +1070,7 @@ static int proc_resetep(struct dev_state
>  	ret = checkintf(ps, ret);
>  	if (ret)
>  		return ret;
> +	check_reset_of_active_ep(ps->dev, ep, "RESETEP");
>  	usb_reset_endpoint(ps->dev, ep);
>  	return 0;
>  }
> @@ -1074,6 +1089,7 @@ static int proc_clearhalt(struct dev_sta
>  	ret = checkintf(ps, ret);
>  	if (ret)
>  		return ret;
> +	check_reset_of_active_ep(ps->dev, ep, "CLEAR_HALT");
>  	if (ep & USB_DIR_IN)
>  		pipe = usb_rcvbulkpipe(ps->dev, ep & 0x7f);
>  	else
--
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