diff options
Diffstat (limited to 'drivers/usb/misc/legousbtower.c')
-rw-r--r-- | drivers/usb/misc/legousbtower.c | 38 |
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 | ||
408 | exit: | 415 | exit: |
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 | ||
939 | exit: | 955 | exit: |
956 | kfree(get_version_reply); | ||
940 | return retval; | 957 | return retval; |
941 | 958 | ||
942 | error: | 959 | error: |
960 | kfree(get_version_reply); | ||
943 | tower_delete(dev); | 961 | tower_delete(dev); |
944 | return retval; | 962 | return retval; |
945 | } | 963 | } |