aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/ch341.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/serial/ch341.c')
-rw-r--r--drivers/usb/serial/ch341.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
index 59eff721fcc5..9f4fed1968b5 100644
--- a/drivers/usb/serial/ch341.c
+++ b/drivers/usb/serial/ch341.c
@@ -22,6 +22,7 @@
22#include <linux/usb.h> 22#include <linux/usb.h>
23#include <linux/usb/serial.h> 23#include <linux/usb/serial.h>
24#include <linux/serial.h> 24#include <linux/serial.h>
25#include <asm/unaligned.h>
25 26
26#define DEFAULT_BAUD_RATE 9600 27#define DEFAULT_BAUD_RATE 9600
27#define DEFAULT_TIMEOUT 1000 28#define DEFAULT_TIMEOUT 1000
@@ -70,7 +71,7 @@
70 71
71static int debug; 72static int debug;
72 73
73static struct usb_device_id id_table [] = { 74static const struct usb_device_id id_table[] = {
74 { USB_DEVICE(0x4348, 0x5523) }, 75 { USB_DEVICE(0x4348, 0x5523) },
75 { USB_DEVICE(0x1a86, 0x7523) }, 76 { USB_DEVICE(0x1a86, 0x7523) },
76 { }, 77 { },
@@ -392,16 +393,22 @@ static void ch341_break_ctl(struct tty_struct *tty, int break_state)
392 struct usb_serial_port *port = tty->driver_data; 393 struct usb_serial_port *port = tty->driver_data;
393 int r; 394 int r;
394 uint16_t reg_contents; 395 uint16_t reg_contents;
395 uint8_t break_reg[2]; 396 uint8_t *break_reg;
396 397
397 dbg("%s()", __func__); 398 dbg("%s()", __func__);
398 399
400 break_reg = kmalloc(2, GFP_KERNEL);
401 if (!break_reg) {
402 dev_err(&port->dev, "%s - kmalloc failed\n", __func__);
403 return;
404 }
405
399 r = ch341_control_in(port->serial->dev, CH341_REQ_READ_REG, 406 r = ch341_control_in(port->serial->dev, CH341_REQ_READ_REG,
400 ch341_break_reg, 0, break_reg, sizeof(break_reg)); 407 ch341_break_reg, 0, break_reg, 2);
401 if (r < 0) { 408 if (r < 0) {
402 printk(KERN_WARNING "%s: USB control read error whilst getting" 409 dev_err(&port->dev, "%s - USB control read error (%d)\n",
403 " break register contents.\n", __FILE__); 410 __func__, r);
404 return; 411 goto out;
405 } 412 }
406 dbg("%s - initial ch341 break register contents - reg1: %x, reg2: %x", 413 dbg("%s - initial ch341 break register contents - reg1: %x, reg2: %x",
407 __func__, break_reg[0], break_reg[1]); 414 __func__, break_reg[0], break_reg[1]);
@@ -416,12 +423,14 @@ static void ch341_break_ctl(struct tty_struct *tty, int break_state)
416 } 423 }
417 dbg("%s - New ch341 break register contents - reg1: %x, reg2: %x", 424 dbg("%s - New ch341 break register contents - reg1: %x, reg2: %x",
418 __func__, break_reg[0], break_reg[1]); 425 __func__, break_reg[0], break_reg[1]);
419 reg_contents = (uint16_t)break_reg[0] | ((uint16_t)break_reg[1] << 8); 426 reg_contents = get_unaligned_le16(break_reg);
420 r = ch341_control_out(port->serial->dev, CH341_REQ_WRITE_REG, 427 r = ch341_control_out(port->serial->dev, CH341_REQ_WRITE_REG,
421 ch341_break_reg, reg_contents); 428 ch341_break_reg, reg_contents);
422 if (r < 0) 429 if (r < 0)
423 printk(KERN_WARNING "%s: USB control write error whilst setting" 430 dev_err(&port->dev, "%s - USB control write error (%d)\n",
424 " break register contents.\n", __FILE__); 431 __func__, r);
432out:
433 kfree(break_reg);
425} 434}
426 435
427static int ch341_tiocmset(struct tty_struct *tty, struct file *file, 436static int ch341_tiocmset(struct tty_struct *tty, struct file *file,