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: Guido Kiener <guido.kie...@rohde-schwarz.com>
Reviewed-by: Steve Bayless <steve_bayl...@keysight.com>
---
 drivers/usb/class/usbtmc.c   | 19 +++++++++++++++++++
 include/uapi/linux/usb/tmc.h |  1 +
 2 files changed, 20 insertions(+)

diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c
index d9ebecce65a4..9fc468ed0dee 100644
--- a/drivers/usb/class/usbtmc.c
+++ b/drivers/usb/class/usbtmc.c
@@ -1774,6 +1774,21 @@ static int usbtmc_ioctl_cancel_io(struct 
usbtmc_file_data *file_data)
        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)
 {
        struct device *dev = &data->usb_dev->dev;
@@ -2278,6 +2293,10 @@ static long usbtmc_ioctl(struct file *file, unsigned int 
cmd, unsigned long arg)
        case USBTMC_IOCTL_CANCEL_IO:
                retval = usbtmc_ioctl_cancel_io(file_data);
                break;
+
+       case USBTMC_IOCTL_CLEANUP_IO:
+               retval = usbtmc_ioctl_cleanup_io(file_data);
+               break;
        }
 
 skip_io_on_zombie:
diff --git a/include/uapi/linux/usb/tmc.h b/include/uapi/linux/usb/tmc.h
index 44d29e65ba80..60da62e02d9c 100644
--- a/include/uapi/linux/usb/tmc.h
+++ b/include/uapi/linux/usb/tmc.h
@@ -99,6 +99,7 @@ struct usbtmc_message {
 
 /* Cancel and cleanup asynchronous calls */
 #define USBTMC_IOCTL_CANCEL_IO         _IO(USBTMC_IOC_NR, 35)
+#define USBTMC_IOCTL_CLEANUP_IO                _IO(USBTMC_IOC_NR, 36)
 
 /* Driver encoded usb488 capabilities */
 #define USBTMC488_CAPABILITY_TRIGGER         1
-- 
2.17.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to