On Wed, Aug 03, 2016 at 05:59:59AM +0200, Greg Kroah-Hartman wrote:
> But your patch was "one-way", once you switched to the other mode, the
> old one could not be used :(

Yes, also was lacking proper description and signoff. So, I'm considering
ioctls based approach okay, although that question (the only one I really
had) was never answered.

After re-reading specifications [*] I decided to allow arbitrary MsgID
selection, as USB488 adds MsgID=TRIGGER (128) and other subclass
specifications may add other values.

[*] http://www.usb.org/developers/docs/devclass_docs/USBTMC_1_006a.zip

After sorting out all eventual objections, patch bellow will be turned
into proper one.

Thank you,
        ladis

diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c
index 917a55c..c6d3ca3 100644
--- a/drivers/usb/class/usbtmc.c
+++ b/drivers/usb/class/usbtmc.c
@@ -84,6 +84,9 @@ struct usbtmc_device_data {
        unsigned int bulk_in;
        unsigned int bulk_out;
 
+       u8 msgid_in;
+       u8 msgid_out;
+
        u8 bTag;
        u8 bTag_last_write;     /* needed for abort */
        u8 bTag_last_read;      /* needed for abort */
@@ -393,6 +396,20 @@ exit:
        return rv;
 }
 
+static int usbtmc_ioctl_set_msgids(struct usbtmc_device_data *data,
+                               void __user *arg)
+{
+       struct usbtmc_msg_ids val;
+
+       if (copy_from_user(&val, arg, sizeof(val)))
+               return -EFAULT;
+
+       data->msgid_in = val.in;
+       data->msgid_out = val.out;
+
+       return 0;
+}
+
 static int usbtmc488_ioctl_read_stb(struct usbtmc_device_data *data,
                                void __user *arg)
 {
@@ -549,7 +566,7 @@ static int send_request_dev_dep_msg_in(struct 
usbtmc_device_data *data, size_t t
        /* Setup IO buffer for REQUEST_DEV_DEP_MSG_IN message
         * Refer to class specs for details
         */
-       buffer[0] = 2;
+       buffer[0] = data->msgid_in;
        buffer[1] = data->bTag;
        buffer[2] = ~data->bTag;
        buffer[3] = 0; /* Reserved */
@@ -677,8 +694,8 @@ static ssize_t usbtmc_read(struct file *filp, char __user 
*buf,
                                goto exit;
                        }
 
-                       if (buffer[0] != 2) {
-                               dev_err(dev, "Device sent reply with wrong 
MsgID: %u != 2\n", buffer[0]);
+                       if (buffer[0] != data->msgid_in) {
+                               dev_err(dev, "Device sent reply with wrong 
MsgID: %u != %u\n", buffer[0], data->msgid_in);
                                if (data->auto_abort)
                                        usbtmc_ioctl_abort_bulk_in(data);
                                goto exit;
@@ -807,7 +824,7 @@ static ssize_t usbtmc_write(struct file *filp, const char 
__user *buf,
                }
 
                /* Setup IO buffer for DEV_DEP_MSG_OUT message */
-               buffer[0] = 1;
+               buffer[0] = data->msgid_out;
                buffer[1] = data->bTag;
                buffer[2] = ~data->bTag;
                buffer[3] = 0; /* Reserved */
@@ -1227,6 +1244,10 @@ static long usbtmc_ioctl(struct file *file, unsigned int 
cmd, unsigned long arg)
                retval = usbtmc_ioctl_abort_bulk_in(data);
                break;
 
+       case USBTMC_IOCTL_SET_MSGIDS:
+               retval = usbtmc_ioctl_set_msgids(data, (void __user *)arg);
+               break;
+
        case USBTMC488_IOCTL_GET_CAPS:
                retval = copy_to_user((void __user *)arg,
                                &data->usb488_caps,
@@ -1409,6 +1430,8 @@ static int usbtmc_probe(struct usb_interface *intf,
        }
 
        /* Initialize USBTMC bTag and other fields */
+       data->msgid_in  = 2;
+       data->msgid_out = 1;
        data->bTag      = 1;
        data->TermCharEnabled = 0;
        data->TermChar = '\n';
diff --git a/include/uapi/linux/usb/tmc.h b/include/uapi/linux/usb/tmc.h
index 2e59d9c..46f21cc 100644
--- a/include/uapi/linux/usb/tmc.h
+++ b/include/uapi/linux/usb/tmc.h
@@ -37,6 +37,12 @@
 #define USBTMC488_REQUEST_GOTO_LOCAL                   161
 #define USBTMC488_REQUEST_LOCAL_LOCKOUT                        162
 
+/* USB TMC command messages ids */
+struct usbtmc_msg_ids {
+       __u8 in;
+       __u8 out;
+};
+
 /* Request values for USBTMC driver's ioctl entry point */
 #define USBTMC_IOC_NR                  91
 #define USBTMC_IOCTL_INDICATOR_PULSE   _IO(USBTMC_IOC_NR, 1)
@@ -45,6 +51,7 @@
 #define USBTMC_IOCTL_ABORT_BULK_IN     _IO(USBTMC_IOC_NR, 4)
 #define USBTMC_IOCTL_CLEAR_OUT_HALT    _IO(USBTMC_IOC_NR, 6)
 #define USBTMC_IOCTL_CLEAR_IN_HALT     _IO(USBTMC_IOC_NR, 7)
+#define USBTMC_IOCTL_SET_MSGIDS                _IOW(USBTMC_IOC_NR, 8, struct 
usbtmc_msg_ids)
 #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)
--
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