usb: usbtmc: Fix ioctl USBTMC_IOCTL_ABORT_BULK_OUT
authorGuido Kiener <guido@kiener-muenchen.de>
Wed, 12 Sep 2018 08:51:05 +0000 (10:51 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 20 Sep 2018 11:04:02 +0000 (13:04 +0200)
Add parameter 'tag' to function usbtmc_ioctl_abort_bulk_out_tag()
for future versions.

Use USBTMC_BUFSIZE (4k) instead of USBTMC_SIZE_IOBUFFER (2k).
Using USBTMC_SIZE_IOBUFFER is deprecated.

Insert a sleep of 50 ms between subsequent
CHECK_ABORT_BULK_OUT_STATUS control requests to avoid stressing
the instrument with repeated requests.

Use common macro USB_CTRL_GET_TIMEOUT instead of USBTMC_TIMEOUT.

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

index 0b05aaa0247c852016a31e83c8a137a10a34c03b..329daa7425dce18ca010fb60d85dc5192cfef3c5 100644 (file)
@@ -398,7 +398,8 @@ static int usbtmc_ioctl_abort_bulk_in(struct usbtmc_device_data *data)
        return usbtmc_ioctl_abort_bulk_in_tag(data, data->bTag_last_read);
 }
 
-static int usbtmc_ioctl_abort_bulk_out(struct usbtmc_device_data *data)
+static int usbtmc_ioctl_abort_bulk_out_tag(struct usbtmc_device_data *data,
+                                          u8 tag)
 {
        struct device *dev;
        u8 *buffer;
@@ -415,8 +416,8 @@ static int usbtmc_ioctl_abort_bulk_out(struct usbtmc_device_data *data)
                             usb_rcvctrlpipe(data->usb_dev, 0),
                             USBTMC_REQUEST_INITIATE_ABORT_BULK_OUT,
                             USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT,
-                            data->bTag_last_write, data->bulk_out,
-                            buffer, 2, USBTMC_TIMEOUT);
+                            tag, data->bulk_out,
+                            buffer, 2, USB_CTRL_GET_TIMEOUT);
 
        if (rv < 0) {
                dev_err(dev, "usb_control_msg returned %d\n", rv);
@@ -435,12 +436,14 @@ static int usbtmc_ioctl_abort_bulk_out(struct usbtmc_device_data *data)
        n = 0;
 
 usbtmc_abort_bulk_out_check_status:
+       /* do not stress device with subsequent requests */
+       msleep(50);
        rv = usb_control_msg(data->usb_dev,
                             usb_rcvctrlpipe(data->usb_dev, 0),
                             USBTMC_REQUEST_CHECK_ABORT_BULK_OUT_STATUS,
                             USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT,
                             0, data->bulk_out, buffer, 0x08,
-                            USBTMC_TIMEOUT);
+                            USB_CTRL_GET_TIMEOUT);
        n++;
        if (rv < 0) {
                dev_err(dev, "usb_control_msg returned %d\n", rv);
@@ -474,6 +477,11 @@ exit:
        return rv;
 }
 
+static int usbtmc_ioctl_abort_bulk_out(struct usbtmc_device_data *data)
+{
+       return usbtmc_ioctl_abort_bulk_out_tag(data, data->bTag_last_write);
+}
+
 static int usbtmc488_ioctl_read_stb(struct usbtmc_file_data *file_data,
                                void __user *arg)
 {