usb: usbtmc: Add ioctl USBTMC_IOCTL_WRITE_RESULT
authorGuido Kiener <guido@kiener-muenchen.de>
Wed, 12 Sep 2018 08:50:53 +0000 (10:50 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 20 Sep 2018 11:04:02 +0000 (13:04 +0200)
ioctl USBTMC_IOCTL_WRITE_RESULT copies current out_transfer_size
to given __u32 pointer and returns current out_status of the last
(asnynchronous) USBTMC_IOCTL_WRITE call.

Signed-off-by: Guido Kiener <guido.kiener@rohde-schwarz.com>
Reviewed-by: Steve Bayless <steve_bayless@keysight.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/class/usbtmc.c
include/uapi/linux/usb/tmc.h

index 915c3fefc4e3b32091eef4185a78d01d85fd552f..eec382ab1a4442323b30e4e808e3cc29f139c920 100644 (file)
@@ -893,6 +893,26 @@ static ssize_t usbtmc_ioctl_generic_write(struct usbtmc_file_data *file_data,
        return retval;
 }
 
+/*
+ * Get the generic write result
+ */
+static ssize_t usbtmc_ioctl_write_result(struct usbtmc_file_data *file_data,
+                               void __user *arg)
+{
+       u32 transferred;
+       int retval;
+
+       spin_lock_irq(&file_data->err_lock);
+       transferred = file_data->out_transfer_size;
+       retval = file_data->out_status;
+       spin_unlock_irq(&file_data->err_lock);
+
+       if (put_user(transferred, (__u32 __user *)arg))
+               return -EFAULT;
+
+       return retval;
+}
+
 /*
  * Sends a REQUEST_DEV_DEP_MSG_IN message on the Bulk-OUT endpoint.
  * @transfer_size: number of bytes to request from the device.
@@ -1748,6 +1768,11 @@ static long usbtmc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                                                    (void __user *)arg);
                break;
 
+       case USBTMC_IOCTL_WRITE_RESULT:
+               retval = usbtmc_ioctl_write_result(file_data,
+                                                  (void __user *)arg);
+               break;
+
        case USBTMC488_IOCTL_GET_CAPS:
                retval = copy_to_user((void __user *)arg,
                                &data->usb488_caps,
index 44dc88f3479d2ad95800e942ea370e4c15caa89b..0166ba5452d5d286b438c43948a1a95026289776 100644 (file)
@@ -86,6 +86,7 @@ struct usbtmc_message {
 #define USBTMC_IOCTL_EOM_ENABLE                _IOW(USBTMC_IOC_NR, 11, __u8)
 #define USBTMC_IOCTL_CONFIG_TERMCHAR   _IOW(USBTMC_IOC_NR, 12, struct usbtmc_termchar)
 #define USBTMC_IOCTL_WRITE             _IOWR(USBTMC_IOC_NR, 13, struct usbtmc_message)
+#define USBTMC_IOCTL_WRITE_RESULT      _IOWR(USBTMC_IOC_NR, 15, __u32)
 
 #define USBTMC488_IOCTL_GET_CAPS       _IOR(USBTMC_IOC_NR, 17, unsigned char)
 #define USBTMC488_IOCTL_READ_STB       _IOR(USBTMC_IOC_NR, 18, unsigned char)