forked from mirrors/linux
		
	USB: serial: pl2303: add support for tx xon/xoff flow control
Support hardware-level Xon/Xoff flow control in transmit direction with pl2303. I only know how to get the hardware to do IXON/!IXANY with ^S/^Q as control characters, so I preserve the old behaviour for all other cases. Signed-off-by: Florian Zumbiehl <florz@florz.de> [ johan: rewrite logic using pl2303_termios_change() helper ] Signed-off-by: Johan Hovold <johan@kernel.org>
This commit is contained in:
		
							parent
							
								
									7b0c6b38c4
								
							
						
					
					
						commit
						7041d9c3f0
					
				
					 1 changed files with 15 additions and 1 deletions
				
			
		|  | @ -533,6 +533,17 @@ static int pl2303_set_line_request(struct usb_serial_port *port, | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static bool pl2303_termios_change(const struct ktermios *a, const struct ktermios *b) | ||||
| { | ||||
| 	bool ixon_change; | ||||
| 
 | ||||
| 	ixon_change = ((a->c_iflag ^ b->c_iflag) & (IXON | IXANY)) || | ||||
| 			a->c_cc[VSTART] != b->c_cc[VSTART] || | ||||
| 			a->c_cc[VSTOP] != b->c_cc[VSTOP]; | ||||
| 
 | ||||
| 	return tty_termios_hw_change(a, b) || ixon_change; | ||||
| } | ||||
| 
 | ||||
| static void pl2303_set_termios(struct tty_struct *tty, | ||||
| 		struct usb_serial_port *port, struct ktermios *old_termios) | ||||
| { | ||||
|  | @ -544,7 +555,7 @@ static void pl2303_set_termios(struct tty_struct *tty, | |||
| 	int ret; | ||||
| 	u8 control; | ||||
| 
 | ||||
| 	if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios)) | ||||
| 	if (old_termios && !pl2303_termios_change(&tty->termios, old_termios)) | ||||
| 		return; | ||||
| 
 | ||||
| 	buf = kzalloc(7, GFP_KERNEL); | ||||
|  | @ -662,6 +673,9 @@ static void pl2303_set_termios(struct tty_struct *tty, | |||
| 			pl2303_vendor_write(serial, 0x0, 0x41); | ||||
| 		else | ||||
| 			pl2303_vendor_write(serial, 0x0, 0x61); | ||||
| 	} else if (I_IXON(tty) && !I_IXANY(tty) && START_CHAR(tty) == 0x11 && | ||||
| 			STOP_CHAR(tty) == 0x13) { | ||||
| 		pl2303_vendor_write(serial, 0x0, 0xc0); | ||||
| 	} else { | ||||
| 		pl2303_vendor_write(serial, 0x0, 0x0); | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Florian Zumbiehl
						Florian Zumbiehl