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

USB: serial: keyspan_pda: use usb_control_msg_recv()

Use the wrapper function usb_control_msg_recv() that accepts stack
variables and remove dma buffers from callers of usb_control_msg().

Signed-off-by: Himadri Pandya <himadrispandya@gmail.com>
Link: https://lore.kernel.org/r/20210801203122.3515-6-himadrispandya@gmail.com
[ johan: simplify write-room error handling further ]
Signed-off-by: Johan Hovold <johan@kernel.org>

authored by

Himadri Pandya and committed by
Johan Hovold
c9129371 a7388592

+27 -38
+27 -38
drivers/usb/serial/keyspan_pda.c
··· 77 77 { 78 78 struct usb_serial_port *port = priv->port; 79 79 struct usb_serial *serial = port->serial; 80 - u8 *room; 80 + u8 room; 81 81 int rc; 82 82 83 - room = kmalloc(1, GFP_KERNEL); 84 - if (!room) 85 - return -ENOMEM; 86 - 87 - rc = usb_control_msg(serial->dev, 88 - usb_rcvctrlpipe(serial->dev, 0), 89 - 6, /* write_room */ 90 - USB_TYPE_VENDOR | USB_RECIP_INTERFACE 91 - | USB_DIR_IN, 92 - 0, /* value: 0 means "remaining room" */ 93 - 0, /* index */ 94 - room, 95 - 1, 96 - 2000); 97 - if (rc != 1) { 98 - if (rc >= 0) 99 - rc = -EIO; 83 + rc = usb_control_msg_recv(serial->dev, 84 + 0, 85 + 6, /* write_room */ 86 + USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_IN, 87 + 0, /* value: 0 means "remaining room" */ 88 + 0, /* index */ 89 + &room, 90 + 1, 91 + 2000, 92 + GFP_KERNEL); 93 + if (rc) { 100 94 dev_dbg(&port->dev, "roomquery failed: %d\n", rc); 101 - goto out_free; 95 + return rc; 102 96 } 103 97 104 - dev_dbg(&port->dev, "roomquery says %d\n", *room); 105 - rc = *room; 106 - out_free: 107 - kfree(room); 98 + dev_dbg(&port->dev, "roomquery says %d\n", room); 108 99 109 - return rc; 100 + return room; 110 101 } 111 102 112 103 static void keyspan_pda_request_unthrottle(struct work_struct *work) ··· 372 381 unsigned char *value) 373 382 { 374 383 int rc; 375 - u8 *data; 384 + u8 data; 376 385 377 - data = kmalloc(1, GFP_KERNEL); 378 - if (!data) 379 - return -ENOMEM; 386 + rc = usb_control_msg_recv(serial->dev, 0, 387 + 3, /* get pins */ 388 + USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_IN, 389 + 0, 390 + 0, 391 + &data, 392 + 1, 393 + 2000, 394 + GFP_KERNEL); 395 + if (rc == 0) 396 + *value = data; 380 397 381 - rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), 382 - 3, /* get pins */ 383 - USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_IN, 384 - 0, 0, data, 1, 2000); 385 - if (rc == 1) 386 - *value = *data; 387 - else if (rc >= 0) 388 - rc = -EIO; 389 - 390 - kfree(data); 391 398 return rc; 392 399 } 393 400