USB: serial: f81232: use usb_control_msg_recv() and usb_control_msg_send()
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>
This commit is contained in:
parent
6400b97491
commit
0d027eea89
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user