Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Himadri Pandya and committed by
Johan Hovold
0d027eea 6400b974

+34 -62
+34 -62
drivers/usb/serial/f81232.c
··· 139 139 static int f81232_get_register(struct usb_serial_port *port, u16 reg, u8 *val) 140 140 { 141 141 int status; 142 - u8 *tmp; 143 142 struct usb_device *dev = port->serial->dev; 144 143 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) { 159 155 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); 168 157 } 169 158 170 - kfree(tmp); 171 159 return status; 172 160 } 173 161 174 162 static int f81232_set_register(struct usb_serial_port *port, u16 reg, u8 val) 175 163 { 176 164 int status; 177 - u8 *tmp; 178 165 struct usb_device *dev = port->serial->dev; 179 166 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) { 196 178 dev_err(&port->dev, "%s failed status: %d\n", __func__, status); 197 179 status = usb_translate_errors(status); 198 - } else { 199 - status = 0; 200 180 } 201 181 202 - kfree(tmp); 203 182 return status; 204 183 } 205 184 ··· 836 857 struct usb_device *dev = interface_to_usbdev(intf); 837 858 int retry = F81534A_ACCESS_REG_RETRY; 838 859 int status; 839 - u8 *tmp; 840 - 841 - tmp = kmemdup(val, size, GFP_KERNEL); 842 - if (!tmp) 843 - return -ENOMEM; 844 860 845 861 while (retry--) { 846 - status = usb_control_msg(dev, 847 - usb_sndctrlpipe(dev, 0), 848 - F81232_REGISTER_REQUEST, 849 - F81232_SET_REGISTER, 850 - reg, 851 - 0, 852 - tmp, 853 - size, 854 - USB_CTRL_SET_TIMEOUT); 855 - if (status < 0) { 862 + status = usb_control_msg_send(dev, 863 + 0, 864 + F81232_REGISTER_REQUEST, 865 + F81232_SET_REGISTER, 866 + reg, 867 + 0, 868 + val, 869 + size, 870 + USB_CTRL_SET_TIMEOUT, 871 + GFP_KERNEL); 872 + if (status) { 856 873 status = usb_translate_errors(status); 857 874 if (status == -EIO) 858 875 continue; 859 - } else { 860 - status = 0; 861 876 } 862 877 863 878 break; ··· 862 889 reg, status); 863 890 } 864 891 865 - kfree(tmp); 866 892 return status; 867 893 } 868 894