]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
usb: usbtmc: Add ioctl for EOM bit
authorGuido Kiener <guido@kiener-muenchen.de>
Wed, 18 Jul 2018 08:45:38 +0000 (10:45 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 21 Jul 2018 06:22:15 +0000 (08:22 +0200)
add USBTMC_IOCTL_EOM_ENABLE to specify EOM bit for next write()
call. Sets Bit 0 of field 'bmTransferAttributes' of DEV_DEP_MSG_OUT
Bulk-OUT Header.
Allows fine grained control over end of message handling on a
per file descriptor basis.

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

index 38fc7abdc00cf0c0e431984387fc557bc68ed214..c77e0ac6260b7f3bc284869858e646620ca4bc4e 100644 (file)
@@ -120,6 +120,7 @@ struct usbtmc_file_data {
        u32            timeout;
        u8             srq_byte;
        atomic_t       srq_asserted;
+       u8             eom_val;
 };
 
 /* Forward declarations */
@@ -157,6 +158,7 @@ static int usbtmc_open(struct inode *inode, struct file *filp)
        file_data->data = data;
 
        file_data->timeout = USBTMC_TIMEOUT;
+       file_data->eom_val = 1;
 
        INIT_LIST_HEAD(&file_data->file_elem);
        spin_lock_irq(&data->dev_lock);
@@ -855,7 +857,7 @@ static ssize_t usbtmc_write(struct file *filp, const char __user *buf,
                        buffer[8] = 0;
                } else {
                        this_part = remaining;
-                       buffer[8] = 1;
+                       buffer[8] = file_data->eom_val;
                }
 
                /* Setup IO buffer for DEV_DEP_MSG_OUT message */
@@ -1277,6 +1279,25 @@ static int usbtmc_ioctl_set_timeout(struct usbtmc_file_data *file_data,
        return 0;
 }
 
+/*
+ * enables/disables sending EOM on write
+ */
+static int usbtmc_ioctl_eom_enable(struct usbtmc_file_data *file_data,
+                               void __user *arg)
+{
+       u8 eom_enable;
+
+       if (copy_from_user(&eom_enable, arg, sizeof(eom_enable)))
+               return -EFAULT;
+
+       if (eom_enable > 1)
+               return -EINVAL;
+
+       file_data->eom_val = eom_enable;
+
+       return 0;
+}
+
 static long usbtmc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        struct usbtmc_file_data *file_data;
@@ -1327,6 +1348,11 @@ static long usbtmc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                                                  (void __user *)arg);
                break;
 
+       case USBTMC_IOCTL_EOM_ENABLE:
+               retval = usbtmc_ioctl_eom_enable(file_data,
+                                                (void __user *)arg);
+               break;
+
        case USBTMC488_IOCTL_GET_CAPS:
                retval = copy_to_user((void __user *)arg,
                                &data->usb488_caps,
index c61bad7150dddb687b09dcc778aa6143ac78be2d..e7317dfdd2ae575acb269439f9dedbc99f869c59 100644 (file)
@@ -50,6 +50,8 @@
 #define USBTMC_IOCTL_CLEAR_IN_HALT     _IO(USBTMC_IOC_NR, 7)
 #define USBTMC_IOCTL_GET_TIMEOUT       _IOR(USBTMC_IOC_NR, 9, __u32)
 #define USBTMC_IOCTL_SET_TIMEOUT       _IOW(USBTMC_IOC_NR, 10, __u32)
+#define USBTMC_IOCTL_EOM_ENABLE                _IOW(USBTMC_IOC_NR, 11, __u8)
+
 #define USBTMC488_IOCTL_GET_CAPS       _IOR(USBTMC_IOC_NR, 17, unsigned char)
 #define USBTMC488_IOCTL_READ_STB       _IOR(USBTMC_IOC_NR, 18, unsigned char)
 #define USBTMC488_IOCTL_REN_CONTROL    _IOW(USBTMC_IOC_NR, 19, unsigned char)