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 <himadrispan...@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);
+       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);
-- 
2.17.1

Reply via email to