@@ -562,12 +562,12 @@ static void ch341_set_termios(struct tty_struct *tty,
562562 * TCSBRKP. Due to how the simulation is implemented the duration can't be
563563 * controlled. The duration is always about (1s / 46bd * 9bit) = 196ms.
564564 */
565- static void ch341_simulate_break (struct tty_struct * tty , int break_state )
565+ static int ch341_simulate_break (struct tty_struct * tty , int break_state )
566566{
567567 struct usb_serial_port * port = tty -> driver_data ;
568568 struct ch341_private * priv = usb_get_serial_port_data (port );
569569 unsigned long now , delay ;
570- int r ;
570+ int r , r2 ;
571571
572572 if (break_state != 0 ) {
573573 dev_dbg (& port -> dev , "enter break state requested\n" );
@@ -599,7 +599,7 @@ static void ch341_simulate_break(struct tty_struct *tty, int break_state)
599599 */
600600 priv -> break_end = jiffies + (11 * HZ / CH341_MIN_BPS );
601601
602- return ;
602+ return 0 ;
603603 }
604604
605605 dev_dbg (& port -> dev , "leave break state requested\n" );
@@ -615,17 +615,22 @@ static void ch341_simulate_break(struct tty_struct *tty, int break_state)
615615 schedule_timeout_interruptible (delay );
616616 }
617617
618+ r = 0 ;
618619restore :
619620 /* Restore original baud rate */
620- r = ch341_set_baudrate_lcr (port -> serial -> dev , priv , priv -> baud_rate ,
621- priv -> lcr );
622- if (r < 0 )
621+ r2 = ch341_set_baudrate_lcr (port -> serial -> dev , priv , priv -> baud_rate ,
622+ priv -> lcr );
623+ if (r2 < 0 ) {
623624 dev_err (& port -> dev ,
624625 "restoring original baud rate of %u failed: %d\n" ,
625- priv -> baud_rate , r );
626+ priv -> baud_rate , r2 );
627+ return r2 ;
628+ }
629+
630+ return r ;
626631}
627632
628- static void ch341_break_ctl (struct tty_struct * tty , int break_state )
633+ static int ch341_break_ctl (struct tty_struct * tty , int break_state )
629634{
630635 const uint16_t ch341_break_reg =
631636 ((uint16_t ) CH341_REG_LCR << 8 ) | CH341_REG_BREAK ;
@@ -635,17 +640,17 @@ static void ch341_break_ctl(struct tty_struct *tty, int break_state)
635640 uint16_t reg_contents ;
636641 uint8_t break_reg [2 ];
637642
638- if (priv -> quirks & CH341_QUIRK_SIMULATE_BREAK ) {
639- ch341_simulate_break (tty , break_state );
640- return ;
641- }
643+ if (priv -> quirks & CH341_QUIRK_SIMULATE_BREAK )
644+ return ch341_simulate_break (tty , break_state );
642645
643646 r = ch341_control_in (port -> serial -> dev , CH341_REQ_READ_REG ,
644647 ch341_break_reg , 0 , break_reg , 2 );
645648 if (r ) {
646649 dev_err (& port -> dev , "%s - USB control read error (%d)\n" ,
647650 __func__ , r );
648- return ;
651+ if (r > 0 )
652+ r = - EIO ;
653+ return r ;
649654 }
650655 dev_dbg (& port -> dev , "%s - initial ch341 break register contents - reg1: %x, reg2: %x\n" ,
651656 __func__ , break_reg [0 ], break_reg [1 ]);
@@ -663,9 +668,13 @@ static void ch341_break_ctl(struct tty_struct *tty, int break_state)
663668 reg_contents = get_unaligned_le16 (break_reg );
664669 r = ch341_control_out (port -> serial -> dev , CH341_REQ_WRITE_REG ,
665670 ch341_break_reg , reg_contents );
666- if (r < 0 )
671+ if (r < 0 ) {
667672 dev_err (& port -> dev , "%s - USB control write error (%d)\n" ,
668673 __func__ , r );
674+ return r ;
675+ }
676+
677+ return 0 ;
669678}
670679
671680static int ch341_tiocmset (struct tty_struct * tty ,
0 commit comments