Re: [PATCH 11/12] usb: usbtmc: Add ioctls to abort with specific tags

2018-05-18 Thread Greg KH
On Thu, May 17, 2018 at 07:03:35PM +0200, Guido Kiener wrote:
> - fix ioctls USBTMC_IOCTL_ABORT_BULK_OUT/IN

"fix" how?  be specific  :)

> 
> - add ioctls USBTMC_IOCTL_ABORT_BULK_OUT_TAG and
>   USBTMC_IOCTL_ABORT_BULK_IN_TAG for test purpose.

Again, why test stuff in a generic driver?

And again, please break this up into different patches.

thanks,

greg k-h
--
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


[PATCH 11/12] usb: usbtmc: Add ioctls to abort with specific tags

2018-05-17 Thread Guido Kiener
- fix ioctls USBTMC_IOCTL_ABORT_BULK_OUT/IN

- add ioctls USBTMC_IOCTL_ABORT_BULK_OUT_TAG and
  USBTMC_IOCTL_ABORT_BULK_IN_TAG for test purpose.

  Useful for testing devices and client applications: The ioctls
  allow to test the abort mechanism and the response of the
  device when using different or wrong tag ids.

Signed-off-by: Guido Kiener 
Reviewed-by: Steve Bayless 
---
 drivers/usb/class/usbtmc.c   | 151 ++-
 include/uapi/linux/usb/tmc.h |   2 +
 2 files changed, 81 insertions(+), 72 deletions(-)

diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c
index 8b464598bee5..c24efe513556 100644
--- a/drivers/usb/class/usbtmc.c
+++ b/drivers/usb/class/usbtmc.c
@@ -277,18 +277,17 @@ static int usbtmc_release(struct inode *inode, struct 
file *file)
return 0;
 }
 
-static int usbtmc_ioctl_abort_bulk_in(struct usbtmc_device_data *data)
+static int usbtmc_ioctl_abort_bulk_in_tag(struct usbtmc_device_data *data,
+ u8 bTag)
 {
u8 *buffer;
struct device *dev;
int rv;
int n;
int actual;
-   struct usb_host_interface *current_setting;
-   int max_size;
 
dev = >intf->dev;
-   buffer = kmalloc(USBTMC_SIZE_IOBUFFER, GFP_KERNEL);
+   buffer = kmalloc(USBTMC_BUFSIZE, GFP_KERNEL);
if (!buffer)
return -ENOMEM;
 
@@ -296,86 +295,87 @@ static int usbtmc_ioctl_abort_bulk_in(struct 
usbtmc_device_data *data)
 usb_rcvctrlpipe(data->usb_dev, 0),
 USBTMC_REQUEST_INITIATE_ABORT_BULK_IN,
 USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT,
-data->bTag_last_read, data->bulk_in,
-buffer, 2, USBTMC_TIMEOUT);
+bTag, data->bulk_in,
+buffer, 2, USB_CTRL_GET_TIMEOUT);
 
if (rv < 0) {
dev_err(dev, "usb_control_msg returned %d\n", rv);
goto exit;
}
 
-   dev_dbg(dev, "INITIATE_ABORT_BULK_IN returned %x\n", buffer[0]);
+   dev_dbg(dev, "INITIATE_ABORT_BULK_IN returned %x with tag %02x\n",
+   buffer[0], buffer[1]);
 
if (buffer[0] == USBTMC_STATUS_FAILED) {
+   /* No transfer in progress and the Bulk-OUT FIFO is empty. */
rv = 0;
goto exit;
}
 
-   if (buffer[0] != USBTMC_STATUS_SUCCESS) {
-   dev_err(dev, "INITIATE_ABORT_BULK_IN returned %x\n",
-   buffer[0]);
-   rv = -EPERM;
+   if (buffer[0] == USBTMC_STATUS_TRANSFER_NOT_IN_PROGRESS) {
+   /* The device returns this status if either:
+* - There is a transfer in progress, but the specified bTag
+*   does not match.
+* - There is no transfer in progress, but the Bulk-OUT FIFO
+*   is not empty.
+*/
+   rv = -ENOMSG;
goto exit;
}
 
-   max_size = 0;
-   current_setting = data->intf->cur_altsetting;
-   for (n = 0; n < current_setting->desc.bNumEndpoints; n++)
-   if (current_setting->endpoint[n].desc.bEndpointAddress ==
-   data->bulk_in)
-   max_size = 
usb_endpoint_maxp(_setting->endpoint[n].desc);
-
-   if (max_size == 0) {
-   dev_err(dev, "Couldn't get wMaxPacketSize\n");
+   if (buffer[0] != USBTMC_STATUS_SUCCESS) {
+   dev_err(dev, "INITIATE_ABORT_BULK_IN returned %x\n",
+   buffer[0]);
rv = -EPERM;
goto exit;
}
 
-   dev_dbg(>intf->dev, "wMaxPacketSize is %d\n", max_size);
-
n = 0;
 
-   do {
-   dev_dbg(dev, "Reading from bulk in EP\n");
+usbtmc_abort_bulk_in_status:
+   dev_dbg(dev, "Reading from bulk in EP\n");
 
-   rv = usb_bulk_msg(data->usb_dev,
- usb_rcvbulkpipe(data->usb_dev,
- data->bulk_in),
- buffer, USBTMC_SIZE_IOBUFFER,
- , USBTMC_TIMEOUT);
+   /* Data must be present. So use low timeout 300 ms */
+   rv = usb_bulk_msg(data->usb_dev,
+ usb_rcvbulkpipe(data->usb_dev,
+ data->bulk_in),
+ buffer, USBTMC_BUFSIZE,
+ , 300);
 
-   n++;
+   print_hex_dump_debug("usbtmc ", DUMP_PREFIX_NONE, 16, 1,
+buffer, actual, true);
 
-   if (rv < 0) {
-   dev_err(dev, "usb_bulk_msg returned %d\n", rv);
+   n++;
+
+   if (rv < 0) {
+   dev_err(dev, "usb_bulk_msg returned %d\n", rv);
+   if