Skip to content

Commit 0d027ee

Browse files
himadricsjhovold
authored andcommitted
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 <[email protected]> Link: https://lore.kernel.org/r/[email protected] [ johan: amend commit message ] Signed-off-by: Johan Hovold <[email protected]>
1 parent 6400b97 commit 0d027ee

File tree

1 file changed

+34
-62
lines changed

1 file changed

+34
-62
lines changed

drivers/usb/serial/f81232.c

Lines changed: 34 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -139,67 +139,46 @@ static int calc_baud_divisor(speed_t baudrate, speed_t clockrate)
139139
static int f81232_get_register(struct usb_serial_port *port, u16 reg, u8 *val)
140140
{
141141
int status;
142-
u8 *tmp;
143142
struct usb_device *dev = port->serial->dev;
144143

145-
tmp = kmalloc(sizeof(*val), GFP_KERNEL);
146-
if (!tmp)
147-
return -ENOMEM;
148-
149-
status = usb_control_msg(dev,
150-
usb_rcvctrlpipe(dev, 0),
151-
F81232_REGISTER_REQUEST,
152-
F81232_GET_REGISTER,
153-
reg,
154-
0,
155-
tmp,
156-
sizeof(*val),
157-
USB_CTRL_GET_TIMEOUT);
158-
if (status != sizeof(*val)) {
144+
status = usb_control_msg_recv(dev,
145+
0,
146+
F81232_REGISTER_REQUEST,
147+
F81232_GET_REGISTER,
148+
reg,
149+
0,
150+
val,
151+
sizeof(*val),
152+
USB_CTRL_GET_TIMEOUT,
153+
GFP_KERNEL);
154+
if (status) {
159155
dev_err(&port->dev, "%s failed status: %d\n", __func__, status);
160-
161-
if (status < 0)
162-
status = usb_translate_errors(status);
163-
else
164-
status = -EIO;
165-
} else {
166-
status = 0;
167-
*val = *tmp;
156+
status = usb_translate_errors(status);
168157
}
169158

170-
kfree(tmp);
171159
return status;
172160
}
173161

174162
static int f81232_set_register(struct usb_serial_port *port, u16 reg, u8 val)
175163
{
176164
int status;
177-
u8 *tmp;
178165
struct usb_device *dev = port->serial->dev;
179166

180-
tmp = kmalloc(sizeof(val), GFP_KERNEL);
181-
if (!tmp)
182-
return -ENOMEM;
183-
184-
*tmp = val;
185-
186-
status = usb_control_msg(dev,
187-
usb_sndctrlpipe(dev, 0),
188-
F81232_REGISTER_REQUEST,
189-
F81232_SET_REGISTER,
190-
reg,
191-
0,
192-
tmp,
193-
sizeof(val),
194-
USB_CTRL_SET_TIMEOUT);
195-
if (status < 0) {
167+
status = usb_control_msg_send(dev,
168+
0,
169+
F81232_REGISTER_REQUEST,
170+
F81232_SET_REGISTER,
171+
reg,
172+
0,
173+
&val,
174+
sizeof(val),
175+
USB_CTRL_SET_TIMEOUT,
176+
GFP_KERNEL);
177+
if (status) {
196178
dev_err(&port->dev, "%s failed status: %d\n", __func__, status);
197179
status = usb_translate_errors(status);
198-
} else {
199-
status = 0;
200180
}
201181

202-
kfree(tmp);
203182
return status;
204183
}
205184

@@ -857,28 +836,22 @@ static int f81534a_ctrl_set_register(struct usb_interface *intf, u16 reg,
857836
struct usb_device *dev = interface_to_usbdev(intf);
858837
int retry = F81534A_ACCESS_REG_RETRY;
859838
int status;
860-
u8 *tmp;
861-
862-
tmp = kmemdup(val, size, GFP_KERNEL);
863-
if (!tmp)
864-
return -ENOMEM;
865839

866840
while (retry--) {
867-
status = usb_control_msg(dev,
868-
usb_sndctrlpipe(dev, 0),
869-
F81232_REGISTER_REQUEST,
870-
F81232_SET_REGISTER,
871-
reg,
872-
0,
873-
tmp,
874-
size,
875-
USB_CTRL_SET_TIMEOUT);
876-
if (status < 0) {
841+
status = usb_control_msg_send(dev,
842+
0,
843+
F81232_REGISTER_REQUEST,
844+
F81232_SET_REGISTER,
845+
reg,
846+
0,
847+
val,
848+
size,
849+
USB_CTRL_SET_TIMEOUT,
850+
GFP_KERNEL);
851+
if (status) {
877852
status = usb_translate_errors(status);
878853
if (status == -EIO)
879854
continue;
880-
} else {
881-
status = 0;
882855
}
883856

884857
break;
@@ -889,7 +862,6 @@ static int f81534a_ctrl_set_register(struct usb_interface *intf, u16 reg,
889862
reg, status);
890863
}
891864

892-
kfree(tmp);
893865
return status;
894866
}
895867

0 commit comments

Comments
 (0)