aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/misc/legousbtower.c')
-rw-r--r--drivers/usb/misc/legousbtower.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c
index 4dd531ac5a7f..0ec9ee573ffa 100644
--- a/drivers/usb/misc/legousbtower.c
+++ b/drivers/usb/misc/legousbtower.c
@@ -317,9 +317,16 @@ static int tower_open (struct inode *inode, struct file *file)
317 int subminor; 317 int subminor;
318 int retval = 0; 318 int retval = 0;
319 struct usb_interface *interface; 319 struct usb_interface *interface;
320 struct tower_reset_reply reset_reply; 320 struct tower_reset_reply *reset_reply;
321 int result; 321 int result;
322 322
323 reset_reply = kmalloc(sizeof(*reset_reply), GFP_KERNEL);
324
325 if (!reset_reply) {
326 retval = -ENOMEM;
327 goto exit;
328 }
329
323 nonseekable_open(inode, file); 330 nonseekable_open(inode, file);
324 subminor = iminor(inode); 331 subminor = iminor(inode);
325 332
@@ -364,8 +371,8 @@ static int tower_open (struct inode *inode, struct file *file)
364 USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE, 371 USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE,
365 0, 372 0,
366 0, 373 0,
367 &reset_reply, 374 reset_reply,
368 sizeof(reset_reply), 375 sizeof(*reset_reply),
369 1000); 376 1000);
370 if (result < 0) { 377 if (result < 0) {
371 dev_err(&dev->udev->dev, 378 dev_err(&dev->udev->dev,
@@ -406,6 +413,7 @@ unlock_exit:
406 mutex_unlock(&dev->lock); 413 mutex_unlock(&dev->lock);
407 414
408exit: 415exit:
416 kfree(reset_reply);
409 return retval; 417 return retval;
410} 418}
411 419
@@ -808,7 +816,7 @@ static int tower_probe (struct usb_interface *interface, const struct usb_device
808 struct lego_usb_tower *dev = NULL; 816 struct lego_usb_tower *dev = NULL;
809 struct usb_host_interface *iface_desc; 817 struct usb_host_interface *iface_desc;
810 struct usb_endpoint_descriptor* endpoint; 818 struct usb_endpoint_descriptor* endpoint;
811 struct tower_get_version_reply get_version_reply; 819 struct tower_get_version_reply *get_version_reply = NULL;
812 int i; 820 int i;
813 int retval = -ENOMEM; 821 int retval = -ENOMEM;
814 int result; 822 int result;
@@ -898,6 +906,13 @@ static int tower_probe (struct usb_interface *interface, const struct usb_device
898 dev->interrupt_in_interval = interrupt_in_interval ? interrupt_in_interval : dev->interrupt_in_endpoint->bInterval; 906 dev->interrupt_in_interval = interrupt_in_interval ? interrupt_in_interval : dev->interrupt_in_endpoint->bInterval;
899 dev->interrupt_out_interval = interrupt_out_interval ? interrupt_out_interval : dev->interrupt_out_endpoint->bInterval; 907 dev->interrupt_out_interval = interrupt_out_interval ? interrupt_out_interval : dev->interrupt_out_endpoint->bInterval;
900 908
909 get_version_reply = kmalloc(sizeof(*get_version_reply), GFP_KERNEL);
910
911 if (!get_version_reply) {
912 retval = -ENOMEM;
913 goto error;
914 }
915
901 /* get the firmware version and log it */ 916 /* get the firmware version and log it */
902 result = usb_control_msg (udev, 917 result = usb_control_msg (udev,
903 usb_rcvctrlpipe(udev, 0), 918 usb_rcvctrlpipe(udev, 0),
@@ -905,18 +920,19 @@ static int tower_probe (struct usb_interface *interface, const struct usb_device
905 USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE, 920 USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE,
906 0, 921 0,
907 0, 922 0,
908 &get_version_reply, 923 get_version_reply,
909 sizeof(get_version_reply), 924 sizeof(*get_version_reply),
910 1000); 925 1000);
911 if (result < 0) { 926 if (result < 0) {
912 dev_err(idev, "LEGO USB Tower get version control request failed\n"); 927 dev_err(idev, "LEGO USB Tower get version control request failed\n");
913 retval = result; 928 retval = result;
914 goto error; 929 goto error;
915 } 930 }
916 dev_info(&interface->dev, "LEGO USB Tower firmware version is %d.%d " 931 dev_info(&interface->dev,
917 "build %d\n", get_version_reply.major, 932 "LEGO USB Tower firmware version is %d.%d build %d\n",
918 get_version_reply.minor, 933 get_version_reply->major,
919 le16_to_cpu(get_version_reply.build_no)); 934 get_version_reply->minor,
935 le16_to_cpu(get_version_reply->build_no));
920 936
921 /* we can register the device now, as it is ready */ 937 /* we can register the device now, as it is ready */
922 usb_set_intfdata (interface, dev); 938 usb_set_intfdata (interface, dev);
@@ -937,9 +953,11 @@ static int tower_probe (struct usb_interface *interface, const struct usb_device
937 USB_MAJOR, dev->minor); 953 USB_MAJOR, dev->minor);
938 954
939exit: 955exit:
956 kfree(get_version_reply);
940 return retval; 957 return retval;
941 958
942error: 959error:
960 kfree(get_version_reply);
943 tower_delete(dev); 961 tower_delete(dev);
944 return retval; 962 return retval;
945} 963}