Commit a7388592 authored by Himadri Pandya's avatar Himadri Pandya Committed by Johan Hovold
Browse files

USB: serial: ftdi_sio: use usb_control_msg_recv()



usb_control_msg_recv() nicely wraps usb_control_msg() and removes the
compulsion of using DMA buffers for USB messages. It also includes proper
error check for possible short read. So use the wrapper where
appropriate and remove DMA buffers from the callers.

Signed-off-by: default avatarHimadri Pandya <himadrispandya@gmail.com>
Link: https://lore.kernel.org/r/20210801203122.3515-5-himadrispandya@gmail.com


[ johan: amend commit message ]
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
parent 0d027eea
Loading
Loading
Loading
Loading
+15 −38
Original line number Diff line number Diff line
@@ -1437,27 +1437,15 @@ static int _read_latency_timer(struct usb_serial_port *port)
{
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	struct usb_device *udev = port->serial->dev;
	unsigned char *buf;
	u8 buf;
	int rv;

	buf = kmalloc(1, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

	rv = usb_control_msg(udev,
			     usb_rcvctrlpipe(udev, 0),
			     FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
			     FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
			     0, priv->interface,
			     buf, 1, WDR_TIMEOUT);
	if (rv < 1) {
		if (rv >= 0)
			rv = -EIO;
	} else {
		rv = buf[0];
	}

	kfree(buf);
	rv = usb_control_msg_recv(udev, 0, FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
				  FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE, 0,
				  priv->interface, &buf, 1, WDR_TIMEOUT,
				  GFP_KERNEL);
	if (rv == 0)
		rv = buf;

	return rv;
}
@@ -1852,32 +1840,21 @@ static int ftdi_read_cbus_pins(struct usb_serial_port *port)
{
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	struct usb_serial *serial = port->serial;
	unsigned char *buf;
	u8 buf;
	int result;

	result = usb_autopm_get_interface(serial->interface);
	if (result)
		return result;

	buf = kmalloc(1, GFP_KERNEL);
	if (!buf) {
		usb_autopm_put_interface(serial->interface);
		return -ENOMEM;
	}

	result = usb_control_msg(serial->dev,
				 usb_rcvctrlpipe(serial->dev, 0),
	result = usb_control_msg_recv(serial->dev, 0,
				      FTDI_SIO_READ_PINS_REQUEST,
				      FTDI_SIO_READ_PINS_REQUEST_TYPE, 0,
				 priv->interface, buf, 1, WDR_TIMEOUT);
	if (result < 1) {
		if (result >= 0)
			result = -EIO;
	} else {
		result = buf[0];
	}
				      priv->interface, &buf, 1, WDR_TIMEOUT,
				      GFP_KERNEL);
	if (result == 0)
		result = buf;

	kfree(buf);
	usb_autopm_put_interface(serial->interface);

	return result;