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/keyspan_pda.c | 172 +++++++++++++------------------
 1 file changed, 72 insertions(+), 100 deletions(-)

diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c
index c1333919716b..44e1c4490fa9 100644
--- a/drivers/usb/serial/keyspan_pda.c
+++ b/drivers/usb/serial/keyspan_pda.c
@@ -115,17 +115,17 @@ static void keyspan_pda_request_unthrottle(struct 
work_struct *work)
 
        /* ask the device to tell us when the tx buffer becomes
           sufficiently empty */
-       result = usb_control_msg(serial->dev,
-                                usb_sndctrlpipe(serial->dev, 0),
-                                7, /* request_unthrottle */
-                                USB_TYPE_VENDOR | USB_RECIP_INTERFACE
-                                | USB_DIR_OUT,
-                                16, /* value: threshold */
-                                0, /* index */
-                                NULL,
-                                0,
-                                2000);
-       if (result < 0)
+       result = usb_control_msg_send(serial->dev, 0,
+                                     7, /* request_unthrottle */
+                                     USB_TYPE_VENDOR | USB_RECIP_INTERFACE
+                                     | USB_DIR_OUT,
+                                     16, /* value: threshold */
+                                     0, /* index */
+                                     NULL,
+                                     0,
+                                     2000,
+                                     GFP_KERNEL);
+       if (result)
                dev_dbg(&serial->dev->dev, "%s - error %d from 
usb_control_msg\n",
                        __func__, result);
 }
@@ -269,17 +269,18 @@ static speed_t keyspan_pda_setbaud(struct usb_serial 
*serial, speed_t baud)
 
        /* rather than figure out how to sleep while waiting for this
           to complete, I just use the "legacy" API. */
-       rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
-                            0, /* set baud */
-                            USB_TYPE_VENDOR
-                            | USB_RECIP_INTERFACE
-                            | USB_DIR_OUT, /* type */
-                            bindex, /* value */
-                            0, /* index */
-                            NULL, /* &data */
-                            0, /* size */
-                            2000); /* timeout */
-       if (rc < 0)
+       rc = usb_control_msg_send(serial->dev, 0,
+                                 0, /* set baud */
+                                 USB_TYPE_VENDOR
+                                 | USB_RECIP_INTERFACE
+                                 | USB_DIR_OUT, /* type */
+                                 bindex, /* value */
+                                 0, /* index */
+                                 NULL, /* &data */
+                                 0, /* size */
+                                 2000, /* timeout */
+                                 GFP_KERNEL);
+       if (rc)
                return 0;
        return baud;
 }
@@ -296,11 +297,12 @@ static void keyspan_pda_break_ctl(struct tty_struct *tty, 
int break_state)
                value = 1; /* start break */
        else
                value = 0; /* clear break */
-       result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
-                       4, /* set break */
-                       USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
-                       value, 0, NULL, 0, 2000);
-       if (result < 0)
+       result = usb_control_msg_send(serial->dev, 0,
+                                     4, /* set break */
+                                     USB_TYPE_VENDOR | USB_RECIP_INTERFACE |
+                                     USB_DIR_OUT,
+                                     value, 0, NULL, 0, 2000, GFP_KERNEL);
+       if (result)
                dev_dbg(&port->dev, "%s - error %d from usb_control_msg\n",
                        __func__, result);
        /* there is something funky about this.. the TCSBRK that 'cu' performs
@@ -359,22 +361,11 @@ static int keyspan_pda_get_modem_info(struct usb_serial 
*serial,
                                      unsigned char *value)
 {
        int rc;
-       u8 *data;
-
-       data = kmalloc(1, GFP_KERNEL);
-       if (!data)
-               return -ENOMEM;
-
-       rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
-                            3, /* get pins */
-                            USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_IN,
-                            0, 0, data, 1, 2000);
-       if (rc == 1)
-               *value = *data;
-       else if (rc >= 0)
-               rc = -EIO;
-
-       kfree(data);
+       rc = usb_control_msg_recv(serial->dev, 0,
+                                 3, /* get pins */
+                                 USB_TYPE_VENDOR | USB_RECIP_INTERFACE |
+                                 USB_DIR_IN, 0, 0, value, 1, 2000,
+                                 GFP_KERNEL);
        return rc;
 }
 
@@ -383,10 +374,11 @@ static int keyspan_pda_set_modem_info(struct usb_serial 
*serial,
                                      unsigned char value)
 {
        int rc;
-       rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
-                            3, /* set pins */
-                            USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_OUT,
-                            value, 0, NULL, 0, 2000);
+       rc = usb_control_msg_send(serial->dev, 0,
+                                 3, /* set pins */
+                                 USB_TYPE_VENDOR | USB_RECIP_INTERFACE |
+                                 USB_DIR_OUT, value, 0, NULL, 0, 2000,
+                                 GFP_KERNEL);
        return rc;
 }
 
@@ -481,36 +473,25 @@ static int keyspan_pda_write(struct tty_struct *tty,
           device how much room it really has.  This is done only on
           scheduler time, since usb_control_msg() sleeps. */
        if (count > priv->tx_room && !in_interrupt()) {
-               u8 *room;
-
-               room = kmalloc(1, GFP_KERNEL);
-               if (!room) {
-                       rc = -ENOMEM;
-                       goto exit;
+               u8 room;
+
+               rc = usb_control_msg_recv(serial->dev, 0,
+                                         6, /* write_room */
+                                         USB_TYPE_VENDOR | USB_RECIP_INTERFACE
+                                         | USB_DIR_IN,
+                                         0, /* value: 0 means "remaining room" 
*/
+                                         0, /* index */
+                                         &room,
+                                         1,
+                                         2000,
+                                         GFP_KERNEL);
+               if (rc == 0) {
+                       dev_dbg(&port->dev, "roomquery says %d\n", room);
+                       priv->tx_room = room;
                }
 
-               rc = usb_control_msg(serial->dev,
-                                    usb_rcvctrlpipe(serial->dev, 0),
-                                    6, /* write_room */
-                                    USB_TYPE_VENDOR | USB_RECIP_INTERFACE
-                                    | USB_DIR_IN,
-                                    0, /* value: 0 means "remaining room" */
-                                    0, /* index */
-                                    room,
-                                    1,
-                                    2000);
-               if (rc > 0) {
-                       dev_dbg(&port->dev, "roomquery says %d\n", *room);
-                       priv->tx_room = *room;
-               }
-               kfree(room);
-               if (rc < 0) {
-                       dev_dbg(&port->dev, "roomquery failed\n");
-                       goto exit;
-               }
-               if (rc == 0) {
-                       dev_dbg(&port->dev, "roomquery returned 0 bytes\n");
-                       rc = -EIO; /* device didn't return any data */
+               if (rc) {
+                       dev_dbg(&port->dev, "roomquery failed %d\n", rc);
                        goto exit;
                }
        }
@@ -613,36 +594,28 @@ static int keyspan_pda_open(struct tty_struct *tty,
                                        struct usb_serial_port *port)
 {
        struct usb_serial *serial = port->serial;
-       u8 *room;
+       u8 room;
        int rc = 0;
        struct keyspan_pda_private *priv;
 
-       /* find out how much room is in the Tx ring */
-       room = kmalloc(1, GFP_KERNEL);
-       if (!room)
-               return -ENOMEM;
-
-       rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
-                            6, /* write_room */
-                            USB_TYPE_VENDOR | USB_RECIP_INTERFACE
-                            | USB_DIR_IN,
-                            0, /* value */
-                            0, /* index */
-                            room,
-                            1,
-                            2000);
-       if (rc < 0) {
-               dev_dbg(&port->dev, "%s - roomquery failed\n", __func__);
-               goto error;
-       }
-       if (rc == 0) {
-               dev_dbg(&port->dev, "%s - roomquery returned 0 bytes\n", 
__func__);
-               rc = -EIO;
+       rc = usb_control_msg_recv(serial->dev, 0,
+                                 6, /* write_room */
+                                 USB_TYPE_VENDOR | USB_RECIP_INTERFACE |
+                                 USB_DIR_IN,
+                                 0, /* value */
+                                 0, /* index */
+                                 &room,
+                                 1,
+                                 2000,
+                                 GFP_KERNEL);
+       if (rc) {
+               dev_dbg(&port->dev, "%s - roomquery failed %d\n", __func__, rc);
                goto error;
        }
+
        priv = usb_get_serial_port_data(port);
-       priv->tx_room = *room;
-       priv->tx_throttled = *room ? 0 : 1;
+       priv->tx_room = room;
+       priv->tx_throttled = room ? 0 : 1;
 
        /*Start reading from the device*/
        rc = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
@@ -651,7 +624,6 @@ static int keyspan_pda_open(struct tty_struct *tty,
                goto error;
        }
 error:
-       kfree(room);
        return rc;
 }
 static void keyspan_pda_close(struct usb_serial_port *port)
-- 
2.17.1

Reply via email to