Revert "USB: legousbtower: use usb_control_msg_recv()"
authorOliver Neukum <oneukum@suse.com>
Wed, 23 Sep 2020 13:43:41 +0000 (15:43 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 25 Sep 2020 14:33:58 +0000 (16:33 +0200)
This reverts commit be40c366416bf6ff74b25fd02e38cb6eaba497d1.
The API has to be changed.

Signed-off-by: Oliver Neukum <oneukum@suse.com>
Link: https://lore.kernel.org/r/20200923134348.23862-8-oneukum@suse.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/misc/legousbtower.c

index c3583df..f922544 100644 (file)
@@ -308,9 +308,15 @@ static int tower_open(struct inode *inode, struct file *file)
        int subminor;
        int retval = 0;
        struct usb_interface *interface;
-       struct tower_reset_reply reset_reply;
+       struct tower_reset_reply *reset_reply;
        int result;
 
+       reset_reply = kmalloc(sizeof(*reset_reply), GFP_KERNEL);
+       if (!reset_reply) {
+               retval = -ENOMEM;
+               goto exit;
+       }
+
        nonseekable_open(inode, file);
        subminor = iminor(inode);
 
@@ -341,11 +347,15 @@ static int tower_open(struct inode *inode, struct file *file)
        }
 
        /* reset the tower */
-       result = usb_control_msg_recv(dev->udev, 0,
-                                     LEGO_USB_TOWER_REQUEST_RESET,
-                                     USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE,
-                                     0, 0,
-                                     &reset_reply, sizeof(reset_reply), 1000);
+       result = usb_control_msg(dev->udev,
+                                usb_rcvctrlpipe(dev->udev, 0),
+                                LEGO_USB_TOWER_REQUEST_RESET,
+                                USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE,
+                                0,
+                                0,
+                                reset_reply,
+                                sizeof(*reset_reply),
+                                1000);
        if (result < 0) {
                dev_err(&dev->udev->dev,
                        "LEGO USB Tower reset control request failed\n");
@@ -384,6 +394,7 @@ unlock_exit:
        mutex_unlock(&dev->lock);
 
 exit:
+       kfree(reset_reply);
        return retval;
 }
 
@@ -742,7 +753,7 @@ static int tower_probe(struct usb_interface *interface, const struct usb_device_
        struct device *idev = &interface->dev;
        struct usb_device *udev = interface_to_usbdev(interface);
        struct lego_usb_tower *dev;
-       struct tower_get_version_reply get_version_reply;
+       struct tower_get_version_reply *get_version_reply = NULL;
        int retval = -ENOMEM;
        int result;
 
@@ -787,25 +798,34 @@ static int tower_probe(struct usb_interface *interface, const struct usb_device_
        dev->interrupt_in_interval = interrupt_in_interval ? interrupt_in_interval : dev->interrupt_in_endpoint->bInterval;
        dev->interrupt_out_interval = interrupt_out_interval ? interrupt_out_interval : dev->interrupt_out_endpoint->bInterval;
 
+       get_version_reply = kmalloc(sizeof(*get_version_reply), GFP_KERNEL);
+       if (!get_version_reply) {
+               retval = -ENOMEM;
+               goto error;
+       }
+
        /* get the firmware version and log it */
-       result = usb_control_msg_recv(udev, 0,
-                                     LEGO_USB_TOWER_REQUEST_GET_VERSION,
-                                     USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE,
-                                     0,
-                                     0,
-                                     &get_version_reply,
-                                     sizeof(get_version_reply),
-                                     1000);
-       if (!result) {
+       result = usb_control_msg(udev,
+                                usb_rcvctrlpipe(udev, 0),
+                                LEGO_USB_TOWER_REQUEST_GET_VERSION,
+                                USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE,
+                                0,
+                                0,
+                                get_version_reply,
+                                sizeof(*get_version_reply),
+                                1000);
+       if (result != sizeof(*get_version_reply)) {
+               if (result >= 0)
+                       result = -EIO;
                dev_err(idev, "get version request failed: %d\n", result);
                retval = result;
                goto error;
        }
        dev_info(&interface->dev,
                 "LEGO USB Tower firmware version is %d.%d build %d\n",
-                get_version_reply.major,
-                get_version_reply.minor,
-                le16_to_cpu(get_version_reply.build_no));
+                get_version_reply->major,
+                get_version_reply->minor,
+                le16_to_cpu(get_version_reply->build_no));
 
        /* we can register the device now, as it is ready */
        usb_set_intfdata(interface, dev);
@@ -824,9 +844,11 @@ static int tower_probe(struct usb_interface *interface, const struct usb_device_
                 USB_MAJOR, dev->minor);
 
 exit:
+       kfree(get_version_reply);
        return retval;
 
 error:
+       kfree(get_version_reply);
        tower_delete(dev);
        return retval;
 }