|
@@ -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,
|