Skip to content

Commit 71b20b3

Browse files
himadricsjhovold
authored andcommitted
USB: serial: kl5kusb105: use usb_control_msg_recv() and usb_control_msg_send()
The wrappers usb_control_msg_send/recv eliminate the need of manually allocating DMA buffers for USB messages. They also treat short reads as an error. Hence use the wrappers and remove DMA allocations. Note that short reads are now logged as -EREMOTEIO instead of 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 c912937 commit 71b20b3

File tree

1 file changed

+34
-45
lines changed

1 file changed

+34
-45
lines changed

drivers/usb/serial/kl5kusb105.c

Lines changed: 34 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -124,16 +124,18 @@ static int klsi_105_chg_port_settings(struct usb_serial_port *port,
124124
{
125125
int rc;
126126

127-
rc = usb_control_msg(port->serial->dev,
128-
usb_sndctrlpipe(port->serial->dev, 0),
129-
KL5KUSB105A_SIO_SET_DATA,
130-
USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_INTERFACE,
131-
0, /* value */
132-
0, /* index */
133-
settings,
134-
sizeof(struct klsi_105_port_settings),
135-
KLSI_TIMEOUT);
136-
if (rc < 0)
127+
rc = usb_control_msg_send(port->serial->dev,
128+
0,
129+
KL5KUSB105A_SIO_SET_DATA,
130+
USB_TYPE_VENDOR | USB_DIR_OUT |
131+
USB_RECIP_INTERFACE,
132+
0, /* value */
133+
0, /* index */
134+
settings,
135+
sizeof(struct klsi_105_port_settings),
136+
KLSI_TIMEOUT,
137+
GFP_KERNEL);
138+
if (rc)
137139
dev_err(&port->dev,
138140
"Change port settings failed (error = %d)\n", rc);
139141

@@ -167,28 +169,21 @@ static int klsi_105_get_line_state(struct usb_serial_port *port,
167169
unsigned long *line_state_p)
168170
{
169171
int rc;
170-
u8 *status_buf;
172+
u8 status_buf[KLSI_STATUSBUF_LEN];
171173
__u16 status;
172174

173-
status_buf = kmalloc(KLSI_STATUSBUF_LEN, GFP_KERNEL);
174-
if (!status_buf)
175-
return -ENOMEM;
176-
177175
status_buf[0] = 0xff;
178176
status_buf[1] = 0xff;
179-
rc = usb_control_msg(port->serial->dev,
180-
usb_rcvctrlpipe(port->serial->dev, 0),
181-
KL5KUSB105A_SIO_POLL,
182-
USB_TYPE_VENDOR | USB_DIR_IN,
183-
0, /* value */
184-
0, /* index */
185-
status_buf, KLSI_STATUSBUF_LEN,
186-
10000
187-
);
188-
if (rc != KLSI_STATUSBUF_LEN) {
177+
rc = usb_control_msg_recv(port->serial->dev, 0,
178+
KL5KUSB105A_SIO_POLL,
179+
USB_TYPE_VENDOR | USB_DIR_IN,
180+
0, /* value */
181+
0, /* index */
182+
status_buf, KLSI_STATUSBUF_LEN,
183+
10000,
184+
GFP_KERNEL);
185+
if (rc) {
189186
dev_err(&port->dev, "reading line status failed: %d\n", rc);
190-
if (rc >= 0)
191-
rc = -EIO;
192187
} else {
193188
status = get_unaligned_le16(status_buf);
194189

@@ -198,7 +193,6 @@ static int klsi_105_get_line_state(struct usb_serial_port *port,
198193
*line_state_p = klsi_105_status2linestate(status);
199194
}
200195

201-
kfree(status_buf);
202196
return rc;
203197
}
204198

@@ -245,7 +239,7 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port)
245239
int retval = 0;
246240
int rc;
247241
unsigned long line_state;
248-
struct klsi_105_port_settings *cfg;
242+
struct klsi_105_port_settings cfg;
249243
unsigned long flags;
250244

251245
/* Do a defined restart:
@@ -255,27 +249,22 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port)
255249
* Then read the modem line control and store values in
256250
* priv->line_state.
257251
*/
258-
cfg = kmalloc(sizeof(*cfg), GFP_KERNEL);
259-
if (!cfg)
260-
return -ENOMEM;
261252

262-
cfg->pktlen = 5;
263-
cfg->baudrate = kl5kusb105a_sio_b9600;
264-
cfg->databits = kl5kusb105a_dtb_8;
265-
cfg->unknown1 = 0;
266-
cfg->unknown2 = 1;
267-
klsi_105_chg_port_settings(port, cfg);
253+
cfg.pktlen = 5;
254+
cfg.baudrate = kl5kusb105a_sio_b9600;
255+
cfg.databits = kl5kusb105a_dtb_8;
256+
cfg.unknown1 = 0;
257+
cfg.unknown2 = 1;
258+
klsi_105_chg_port_settings(port, &cfg);
268259

269260
spin_lock_irqsave(&priv->lock, flags);
270-
priv->cfg.pktlen = cfg->pktlen;
271-
priv->cfg.baudrate = cfg->baudrate;
272-
priv->cfg.databits = cfg->databits;
273-
priv->cfg.unknown1 = cfg->unknown1;
274-
priv->cfg.unknown2 = cfg->unknown2;
261+
priv->cfg.pktlen = cfg.pktlen;
262+
priv->cfg.baudrate = cfg.baudrate;
263+
priv->cfg.databits = cfg.databits;
264+
priv->cfg.unknown1 = cfg.unknown1;
265+
priv->cfg.unknown2 = cfg.unknown2;
275266
spin_unlock_irqrestore(&priv->lock, flags);
276267

277-
kfree(cfg);
278-
279268
/* READ_ON and urb submission */
280269
rc = usb_serial_generic_open(tty, port);
281270
if (rc)

0 commit comments

Comments
 (0)