diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2020-09-23 15:43:45 +0200 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2020-09-25 16:33:59 +0200 | 
| commit | d9f0d82f06c6775b3adb9e4925e27377bc87af54 (patch) | |
| tree | f5c864dfaff2be0a144908a7614be277a1e08f76 /drivers/usb/misc | |
| parent | 9ad71af922a8b4a619665498e0094dc5206e9f50 (diff) | |
| download | linux-d9f0d82f06c6775b3adb9e4925e27377bc87af54.tar.bz2 | |
USB: legousbtower: use usb_control_msg_recv()
The usb_control_msg_recv() function can handle data on the stack, as
well as properly detecting short reads, so move to use that function
instead of the older usb_control_msg() call.  This ends up removing a
lot of extra lines in the driver.
v2: change API of usb_control_msg_send()
Cc: Juergen Stuber <starblue@users.sourceforge.net>
Link: https://lore.kernel.org/r/20200914153756.3412156-6-gregkh@linuxfoundation.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Link: https://lore.kernel.org/r/20200923134348.23862-12-oneukum@suse.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/misc')
| -rw-r--r-- | drivers/usb/misc/legousbtower.c | 61 | 
1 files changed, 20 insertions, 41 deletions
| diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c index f922544056de..ba655b4af4fc 100644 --- a/drivers/usb/misc/legousbtower.c +++ b/drivers/usb/misc/legousbtower.c @@ -308,15 +308,9 @@ 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); @@ -347,15 +341,12 @@ static int tower_open(struct inode *inode, struct file *file)  	}  	/* reset the tower */ -	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); +	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, +				      GFP_KERNEL);  	if (result < 0) {  		dev_err(&dev->udev->dev,  			"LEGO USB Tower reset control request failed\n"); @@ -394,7 +385,6 @@ unlock_exit:  	mutex_unlock(&dev->lock);  exit: -	kfree(reset_reply);  	return retval;  } @@ -753,7 +743,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 = NULL; +	struct tower_get_version_reply get_version_reply;  	int retval = -ENOMEM;  	int result; @@ -798,34 +788,25 @@ 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(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; +	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, GFP_KERNEL); +	if (!result) {  		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); @@ -844,11 +825,9 @@ 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;  } |