diff mbox series

[04/15] usb: serial: cp210x: use usb_control_msg_recv() and usb_control_msg_send()

Message ID 20201104064703.15123-5-himadrispandya@gmail.com
State New
Headers show
Series usb: serial: avoid using usb_control_msg() directly | expand

Commit Message

Himadri Pandya Nov. 4, 2020, 6:46 a.m. UTC
The new usb_control_msg_recv() and usb_control_msg_send() nicely wraps
usb_control_msg() with proper error check. Hence use the wrappers
instead of calling usb_control_msg() directly.

Signed-off-by: Himadri Pandya <himadrispandya@gmail.com>
---
 drivers/usb/serial/cp210x.c | 148 ++++++++++--------------------------
 1 file changed, 42 insertions(+), 106 deletions(-)

Comments

Johan Hovold Dec. 4, 2020, 9:34 a.m. UTC | #1
On Wed, Nov 04, 2020 at 12:16:52PM +0530, Himadri Pandya wrote:
> The new usb_control_msg_recv() and usb_control_msg_send() nicely wraps

> usb_control_msg() with proper error check. Hence use the wrappers

> instead of calling usb_control_msg() directly.


This too is a good example of when the new helpers can be used, but
please mention the transfer buffers here are that is the primary reason.

> Signed-off-by: Himadri Pandya <himadrispandya@gmail.com>

> ---

>  drivers/usb/serial/cp210x.c | 148 ++++++++++--------------------------

>  1 file changed, 42 insertions(+), 106 deletions(-)

> 

> diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c

> index d0c05aa8a0d6..29436ab392e8 100644

> --- a/drivers/usb/serial/cp210x.c

> +++ b/drivers/usb/serial/cp210x.c

> @@ -555,31 +555,15 @@ static int cp210x_read_reg_block(struct usb_serial_port *port, u8 req,

>  {

>  	struct usb_serial *serial = port->serial;

>  	struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);

> -	void *dmabuf;

>  	int result;

>  

> -	dmabuf = kmalloc(bufsize, GFP_KERNEL);

> -	if (!dmabuf) {

> -		/*

> -		 * FIXME Some callers don't bother to check for error,

> -		 * at least give them consistent junk until they are fixed

> -		 */

> -		memset(buf, 0, bufsize);

> -		return -ENOMEM;

> -	}

> -

> -	result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),

> -			req, REQTYPE_INTERFACE_TO_HOST, 0,

> -			port_priv->bInterfaceNumber, dmabuf, bufsize,

> -			USB_CTRL_SET_TIMEOUT);

> -	if (result == bufsize) {

> -		memcpy(buf, dmabuf, bufsize);

> -		result = 0;

> -	} else {

> +	result = usb_control_msg_recv(serial->dev, 0, req,

> +				      REQTYPE_INTERFACE_TO_HOST, 0,

> +				      port_priv->bInterfaceNumber, buf, bufsize,

> +				      USB_CTRL_SET_TIMEOUT, GFP_KERNEL);


Please keep the existing indentation style. That way you don't need to
change the middle-two argument lines just to align the arguments.

> +	if (result) {

>  		dev_err(&port->dev, "failed get req 0x%x size %d status: %d\n",

> -				req, bufsize, result);

> -		if (result >= 0)

> -			result = -EIO;

> +			req, bufsize, result);


Nit: This is an unrelated indentation change.

>  

>  		/*

>  		 * FIXME Some callers don't bother to check for error,

> @@ -588,8 +572,6 @@ static int cp210x_read_reg_block(struct usb_serial_port *port, u8 req,

>  		memset(buf, 0, bufsize);

>  	}

>  

> -	kfree(dmabuf);

> -

>  	return result;

>  }

>  

> @@ -648,29 +630,16 @@ static int cp210x_read_u8_reg(struct usb_serial_port *port, u8 req, u8 *val)

>  static int cp210x_read_vendor_block(struct usb_serial *serial, u8 type, u16 val,

>  				    void *buf, int bufsize)

>  {

> -	void *dmabuf;

>  	int result;

>  

> -	dmabuf = kmalloc(bufsize, GFP_KERNEL);

> -	if (!dmabuf)

> -		return -ENOMEM;

> -

> -	result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),

> -				 CP210X_VENDOR_SPECIFIC, type, val,

> -				 cp210x_interface_num(serial), dmabuf, bufsize,

> -				 USB_CTRL_GET_TIMEOUT);

> -	if (result == bufsize) {

> -		memcpy(buf, dmabuf, bufsize);

> -		result = 0;

> -	} else {

> +	result = usb_control_msg_recv(serial->dev, 0, CP210X_VENDOR_SPECIFIC,

> +				      type, val, cp210x_interface_num(serial),

> +				      buf, bufsize, USB_CTRL_GET_TIMEOUT,

> +				      GFP_KERNEL);

> +	if (result)

>  		dev_err(&serial->interface->dev,

>  			"failed to get vendor val 0x%04x size %d: %d\n", val,

>  			bufsize, result);

> -		if (result >= 0)

> -			result = -EIO;

> -	}


Nit: Please keep the brackets around multiline single statements since
it improves readability.

Similar comments apply to the rest of the patch.

Johan
diff mbox series

Patch

diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
index d0c05aa8a0d6..29436ab392e8 100644
--- a/drivers/usb/serial/cp210x.c
+++ b/drivers/usb/serial/cp210x.c
@@ -555,31 +555,15 @@  static int cp210x_read_reg_block(struct usb_serial_port *port, u8 req,
 {
 	struct usb_serial *serial = port->serial;
 	struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
-	void *dmabuf;
 	int result;
 
-	dmabuf = kmalloc(bufsize, GFP_KERNEL);
-	if (!dmabuf) {
-		/*
-		 * FIXME Some callers don't bother to check for error,
-		 * at least give them consistent junk until they are fixed
-		 */
-		memset(buf, 0, bufsize);
-		return -ENOMEM;
-	}
-
-	result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
-			req, REQTYPE_INTERFACE_TO_HOST, 0,
-			port_priv->bInterfaceNumber, dmabuf, bufsize,
-			USB_CTRL_SET_TIMEOUT);
-	if (result == bufsize) {
-		memcpy(buf, dmabuf, bufsize);
-		result = 0;
-	} else {
+	result = usb_control_msg_recv(serial->dev, 0, req,
+				      REQTYPE_INTERFACE_TO_HOST, 0,
+				      port_priv->bInterfaceNumber, buf, bufsize,
+				      USB_CTRL_SET_TIMEOUT, GFP_KERNEL);
+	if (result) {
 		dev_err(&port->dev, "failed get req 0x%x size %d status: %d\n",
-				req, bufsize, result);
-		if (result >= 0)
-			result = -EIO;
+			req, bufsize, result);
 
 		/*
 		 * FIXME Some callers don't bother to check for error,
@@ -588,8 +572,6 @@  static int cp210x_read_reg_block(struct usb_serial_port *port, u8 req,
 		memset(buf, 0, bufsize);
 	}
 
-	kfree(dmabuf);
-
 	return result;
 }
 
@@ -648,29 +630,16 @@  static int cp210x_read_u8_reg(struct usb_serial_port *port, u8 req, u8 *val)
 static int cp210x_read_vendor_block(struct usb_serial *serial, u8 type, u16 val,
 				    void *buf, int bufsize)
 {
-	void *dmabuf;
 	int result;
 
-	dmabuf = kmalloc(bufsize, GFP_KERNEL);
-	if (!dmabuf)
-		return -ENOMEM;
-
-	result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
-				 CP210X_VENDOR_SPECIFIC, type, val,
-				 cp210x_interface_num(serial), dmabuf, bufsize,
-				 USB_CTRL_GET_TIMEOUT);
-	if (result == bufsize) {
-		memcpy(buf, dmabuf, bufsize);
-		result = 0;
-	} else {
+	result = usb_control_msg_recv(serial->dev, 0, CP210X_VENDOR_SPECIFIC,
+				      type, val, cp210x_interface_num(serial),
+				      buf, bufsize, USB_CTRL_GET_TIMEOUT,
+				      GFP_KERNEL);
+	if (result)
 		dev_err(&serial->interface->dev,
 			"failed to get vendor val 0x%04x size %d: %d\n", val,
 			bufsize, result);
-		if (result >= 0)
-			result = -EIO;
-	}
-
-	kfree(dmabuf);
 
 	return result;
 }
@@ -685,14 +654,13 @@  static int cp210x_write_u16_reg(struct usb_serial_port *port, u8 req, u16 val)
 	struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 	int result;
 
-	result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
-			req, REQTYPE_HOST_TO_INTERFACE, val,
-			port_priv->bInterfaceNumber, NULL, 0,
-			USB_CTRL_SET_TIMEOUT);
-	if (result < 0) {
+	result = usb_control_msg_send(serial->dev, 0, req,
+				      REQTYPE_HOST_TO_INTERFACE, val,
+				      port_priv->bInterfaceNumber, NULL, 0,
+				      USB_CTRL_SET_TIMEOUT, GFP_KERNEL);
+	if (result)
 		dev_err(&port->dev, "failed set request 0x%x status: %d\n",
 				req, result);
-	}
 
 	return result;
 }
@@ -706,28 +674,17 @@  static int cp210x_write_reg_block(struct usb_serial_port *port, u8 req,
 {
 	struct usb_serial *serial = port->serial;
 	struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
-	void *dmabuf;
 	int result;
 
-	dmabuf = kmemdup(buf, bufsize, GFP_KERNEL);
-	if (!dmabuf)
-		return -ENOMEM;
+	result = usb_control_msg_send(serial->dev, 0, req,
+				      REQTYPE_HOST_TO_INTERFACE, 0,
+				      port_priv->bInterfaceNumber, buf, bufsize,
+				      USB_CTRL_SET_TIMEOUT, GFP_KERNEL);
 
-	result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
-			req, REQTYPE_HOST_TO_INTERFACE, 0,
-			port_priv->bInterfaceNumber, dmabuf, bufsize,
-			USB_CTRL_SET_TIMEOUT);
 
-	kfree(dmabuf);
-
-	if (result == bufsize) {
-		result = 0;
-	} else {
+	if (result)
 		dev_err(&port->dev, "failed set req 0x%x size %d status: %d\n",
 				req, bufsize, result);
-		if (result >= 0)
-			result = -EIO;
-	}
 
 	return result;
 }
@@ -752,29 +709,17 @@  static int cp210x_write_u32_reg(struct usb_serial_port *port, u8 req, u32 val)
 static int cp210x_write_vendor_block(struct usb_serial *serial, u8 type,
 				     u16 val, void *buf, int bufsize)
 {
-	void *dmabuf;
 	int result;
 
-	dmabuf = kmemdup(buf, bufsize, GFP_KERNEL);
-	if (!dmabuf)
-		return -ENOMEM;
-
-	result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
-				 CP210X_VENDOR_SPECIFIC, type, val,
-				 cp210x_interface_num(serial), dmabuf, bufsize,
-				 USB_CTRL_SET_TIMEOUT);
-
-	kfree(dmabuf);
+	result = usb_control_msg_send(serial->dev, 0, CP210X_VENDOR_SPECIFIC,
+				      type, val, cp210x_interface_num(serial),
+				      buf, bufsize, USB_CTRL_SET_TIMEOUT,
+				      GFP_KERNEL);
 
-	if (result == bufsize) {
-		result = 0;
-	} else {
+	if (result)
 		dev_err(&serial->interface->dev,
 			"failed to set vendor val 0x%04x size %d: %d\n", val,
 			bufsize, result);
-		if (result >= 0)
-			result = -EIO;
-	}
 
 	return result;
 }
@@ -995,27 +940,19 @@  static int cp210x_get_tx_queue_byte_count(struct usb_serial_port *port,
 {
 	struct usb_serial *serial = port->serial;
 	struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
-	struct cp210x_comm_status *sts;
+	struct cp210x_comm_status sts;
 	int result;
 
-	sts = kmalloc(sizeof(*sts), GFP_KERNEL);
-	if (!sts)
-		return -ENOMEM;
-
-	result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
-			CP210X_GET_COMM_STATUS, REQTYPE_INTERFACE_TO_HOST,
-			0, port_priv->bInterfaceNumber, sts, sizeof(*sts),
-			USB_CTRL_GET_TIMEOUT);
-	if (result == sizeof(*sts)) {
-		*count = le32_to_cpu(sts->ulAmountInOutQueue);
-		result = 0;
-	} else {
+	result = usb_control_msg_recv(serial->dev, 0,
+				      CP210X_GET_COMM_STATUS,
+				      REQTYPE_INTERFACE_TO_HOST, 0,
+				      port_priv->bInterfaceNumber, &sts,
+				      sizeof(sts), USB_CTRL_GET_TIMEOUT,
+				      GFP_KERNEL);
+	if (result == 0)
+		*count = le32_to_cpu(sts.ulAmountInOutQueue);
+	else
 		dev_err(&port->dev, "failed to get comm status: %d\n", result);
-		if (result >= 0)
-			result = -EIO;
-	}
-
-	kfree(sts);
 
 	return result;
 }
@@ -1624,13 +1561,12 @@  static void cp210x_gpio_set(struct gpio_chip *gc, unsigned int gpio, int value)
 	} else {
 		u16 wIndex = buf.state << 8 | buf.mask;
 
-		result = usb_control_msg(serial->dev,
-					 usb_sndctrlpipe(serial->dev, 0),
-					 CP210X_VENDOR_SPECIFIC,
-					 REQTYPE_HOST_TO_DEVICE,
-					 CP210X_WRITE_LATCH,
-					 wIndex,
-					 NULL, 0, USB_CTRL_SET_TIMEOUT);
+		result = usb_control_msg_send(serial->dev, 0,
+					      CP210X_VENDOR_SPECIFIC,
+					      REQTYPE_HOST_TO_DEVICE,
+					      CP210X_WRITE_LATCH,
+					      wIndex, NULL, 0,
+					      USB_CTRL_SET_TIMEOUT, GFP_KERNEL);
 	}
 
 	usb_autopm_put_interface(serial->interface);