USB: serial: f81232: use usb_control_msg_recv() and usb_control_msg_send()
authorHimadri Pandya <himadrispandya@gmail.com>
Sun, 1 Aug 2021 20:31:19 +0000 (02:01 +0530)
committerJohan Hovold <johan@kernel.org>
Tue, 21 Sep 2021 12:01:14 +0000 (14:01 +0200)
The new wrapper functions usb_control_msg_send/recv accept stack
variables for USB message buffers and eliminate the need of manually
allocating temporary DMA buffers. The read wrapper also treats short
reads as errors. Hence use the wrappers instead of using
usb_control_msg() directly.

Note that the conversion of f81534a_ctrl_set_register() adds an extra an
extra allocation and memcpy for every retry. Since this function is
called rarely and retries are hopefully rare, the overhead should be
acceptable.

Also note that short reads are now logged as -EREMOTEIO instead of
indicating the amount of data read.

Signed-off-by: Himadri Pandya <himadrispandya@gmail.com>
Link: https://lore.kernel.org/r/20210801203122.3515-4-himadrispandya@gmail.com
[ johan: amend commit message ]
Signed-off-by: Johan Hovold <johan@kernel.org>
drivers/usb/serial/f81232.c

index a7a7af8..3ad1f51 100644 (file)
@@ -139,67 +139,46 @@ static int calc_baud_divisor(speed_t baudrate, speed_t clockrate)
 static int f81232_get_register(struct usb_serial_port *port, u16 reg, u8 *val)
 {
        int status;
-       u8 *tmp;
        struct usb_device *dev = port->serial->dev;
 
-       tmp = kmalloc(sizeof(*val), GFP_KERNEL);
-       if (!tmp)
-               return -ENOMEM;
-
-       status = usb_control_msg(dev,
-                               usb_rcvctrlpipe(dev, 0),
-                               F81232_REGISTER_REQUEST,
-                               F81232_GET_REGISTER,
-                               reg,
-                               0,
-                               tmp,
-                               sizeof(*val),
-                               USB_CTRL_GET_TIMEOUT);
-       if (status != sizeof(*val)) {
+       status = usb_control_msg_recv(dev,
+                                     0,
+                                     F81232_REGISTER_REQUEST,
+                                     F81232_GET_REGISTER,
+                                     reg,
+                                     0,
+                                     val,
+                                     sizeof(*val),
+                                     USB_CTRL_GET_TIMEOUT,
+                                     GFP_KERNEL);
+       if (status) {
                dev_err(&port->dev, "%s failed status: %d\n", __func__, status);
-
-               if (status < 0)
-                       status = usb_translate_errors(status);
-               else
-                       status = -EIO;
-       } else {
-               status = 0;
-               *val = *tmp;
+               status = usb_translate_errors(status);
        }
 
-       kfree(tmp);
        return status;
 }
 
 static int f81232_set_register(struct usb_serial_port *port, u16 reg, u8 val)
 {
        int status;
-       u8 *tmp;
        struct usb_device *dev = port->serial->dev;
 
-       tmp = kmalloc(sizeof(val), GFP_KERNEL);
-       if (!tmp)
-               return -ENOMEM;
-
-       *tmp = val;
-
-       status = usb_control_msg(dev,
-                               usb_sndctrlpipe(dev, 0),
-                               F81232_REGISTER_REQUEST,
-                               F81232_SET_REGISTER,
-                               reg,
-                               0,
-                               tmp,
-                               sizeof(val),
-                               USB_CTRL_SET_TIMEOUT);
-       if (status < 0) {
+       status = usb_control_msg_send(dev,
+                                     0,
+                                     F81232_REGISTER_REQUEST,
+                                     F81232_SET_REGISTER,
+                                     reg,
+                                     0,
+                                     &val,
+                                     sizeof(val),
+                                     USB_CTRL_SET_TIMEOUT,
+                                     GFP_KERNEL);
+       if (status) {
                dev_err(&port->dev, "%s failed status: %d\n", __func__, status);
                status = usb_translate_errors(status);
-       } else {
-               status = 0;
        }
 
-       kfree(tmp);
        return status;
 }
 
@@ -857,28 +836,22 @@ static int f81534a_ctrl_set_register(struct usb_interface *intf, u16 reg,
        struct usb_device *dev = interface_to_usbdev(intf);
        int retry = F81534A_ACCESS_REG_RETRY;
        int status;
-       u8 *tmp;
-
-       tmp = kmemdup(val, size, GFP_KERNEL);
-       if (!tmp)
-               return -ENOMEM;
 
        while (retry--) {
-               status = usb_control_msg(dev,
-                                       usb_sndctrlpipe(dev, 0),
-                                       F81232_REGISTER_REQUEST,
-                                       F81232_SET_REGISTER,
-                                       reg,
-                                       0,
-                                       tmp,
-                                       size,
-                                       USB_CTRL_SET_TIMEOUT);
-               if (status < 0) {
+               status = usb_control_msg_send(dev,
+                                             0,
+                                             F81232_REGISTER_REQUEST,
+                                             F81232_SET_REGISTER,
+                                             reg,
+                                             0,
+                                             val,
+                                             size,
+                                             USB_CTRL_SET_TIMEOUT,
+                                             GFP_KERNEL);
+               if (status) {
                        status = usb_translate_errors(status);
                        if (status == -EIO)
                                continue;
-               } else {
-                       status = 0;
                }
 
                break;
@@ -889,7 +862,6 @@ static int f81534a_ctrl_set_register(struct usb_interface *intf, u16 reg,
                                reg, status);
        }
 
-       kfree(tmp);
        return status;
 }