Commit 987b8199 authored by Guido Kiener's avatar Guido Kiener Committed by Greg Kroah-Hartman

usb: usbtmc: Add ioctl USBTMC_IOCTL_CLEANUP_IO

The ioctl USBTMC_IOCTL_CLEANUP_IO kills all submitted urbs to OUT
and IN bulk, and clears all received data from IN bulk. Internal
transfer counters and error states are reset.

An application should use this ioctl after an asnychronous transfer
was canceled and/or error handling has finished.
Signed-off-by: default avatarGuido Kiener <guido.kiener@rohde-schwarz.com>
Reviewed-by: default avatarSteve Bayless <steve_bayless@keysight.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 46ecc9d5
...@@ -1706,6 +1706,21 @@ static int usbtmc_ioctl_cancel_io(struct usbtmc_file_data *file_data) ...@@ -1706,6 +1706,21 @@ static int usbtmc_ioctl_cancel_io(struct usbtmc_file_data *file_data)
return 0; return 0;
} }
static int usbtmc_ioctl_cleanup_io(struct usbtmc_file_data *file_data)
{
usb_kill_anchored_urbs(&file_data->submitted);
usb_scuttle_anchored_urbs(&file_data->in_anchor);
spin_lock_irq(&file_data->err_lock);
file_data->in_status = 0;
file_data->in_transfer_size = 0;
file_data->out_status = 0;
file_data->out_transfer_size = 0;
spin_unlock_irq(&file_data->err_lock);
file_data->in_urbs_used = 0;
return 0;
}
static int get_capabilities(struct usbtmc_device_data *data) static int get_capabilities(struct usbtmc_device_data *data)
{ {
struct device *dev = &data->usb_dev->dev; struct device *dev = &data->usb_dev->dev;
...@@ -2130,6 +2145,10 @@ static long usbtmc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ...@@ -2130,6 +2145,10 @@ static long usbtmc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
case USBTMC_IOCTL_CANCEL_IO: case USBTMC_IOCTL_CANCEL_IO:
retval = usbtmc_ioctl_cancel_io(file_data); retval = usbtmc_ioctl_cancel_io(file_data);
break; break;
case USBTMC_IOCTL_CLEANUP_IO:
retval = usbtmc_ioctl_cleanup_io(file_data);
break;
} }
skip_io_on_zombie: skip_io_on_zombie:
......
...@@ -99,6 +99,7 @@ struct usbtmc_message { ...@@ -99,6 +99,7 @@ struct usbtmc_message {
/* Cancel and cleanup asynchronous calls */ /* Cancel and cleanup asynchronous calls */
#define USBTMC_IOCTL_CANCEL_IO _IO(USBTMC_IOC_NR, 35) #define USBTMC_IOCTL_CANCEL_IO _IO(USBTMC_IOC_NR, 35)
#define USBTMC_IOCTL_CLEANUP_IO _IO(USBTMC_IOC_NR, 36)
/* Driver encoded usb488 capabilities */ /* Driver encoded usb488 capabilities */
#define USBTMC488_CAPABILITY_TRIGGER 1 #define USBTMC488_CAPABILITY_TRIGGER 1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment