[PATCH 09/11] USB: serial: io_edgeport: deassert DTR/RTS on close() and B0
From: Johan Hovold
Date: Wed Oct 21 2026 - 10:21:44 EST
The modem control signals DTR and RTS should be dropped on close() if
HUPCL is set and when requesting B0, but the driver is currently only
asserting the signals on open().
Implement the missing dtr_rts() callback to handle open() and close()
while letting set_termios() handle B0 transitions.
Signed-off-by: Johan Hovold <johan@xxxxxxxxxx>
---
drivers/usb/serial/io_edgeport.c | 30 +++++++++++++++++++++++++++---
1 file changed, 27 insertions(+), 3 deletions(-)
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
index acaac342f43f..fd983ebd1b6d 100644
--- a/drivers/usb/serial/io_edgeport.c
+++ b/drivers/usb/serial/io_edgeport.c
@@ -1567,6 +1567,23 @@ static int edge_break(struct tty_struct *tty, int break_state)
}
+static void edge_dtr_rts(struct usb_serial_port *port, int on)
+{
+ struct edgeport_port *edge_port = usb_get_serial_port_data(port);
+
+ mutex_lock(&edge_port->mutex);
+
+ if (on)
+ edge_port->shadowMCR |= MCR_DTR | MCR_RTS;
+ else
+ edge_port->shadowMCR &= ~(MCR_DTR | MCR_RTS);
+
+ send_cmd_write_uart_register(edge_port, MCR, edge_port->shadowMCR);
+
+ mutex_unlock(&edge_port->mutex);
+}
+
+
/*****************************************************************************
* process_rcvd_data
* this function handles the data received on the bulk in pipe.
@@ -2415,9 +2432,12 @@ static void edge_set_termios(struct tty_struct *tty, struct usb_serial_port *por
/* set up the MCR register and send it to the EdgePort */
mutex_lock(&edge_port->mutex);
- edge_port->shadowMCR = MCR_MASTER_IE;
- if (cflag & CBAUD)
- edge_port->shadowMCR |= (MCR_DTR | MCR_RTS);
+ if (cflag & CBAUD) {
+ if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
+ edge_port->shadowMCR |= MCR_DTR | MCR_RTS;
+ } else {
+ edge_port->shadowMCR &= ~(MCR_DTR | MCR_RTS);
+ }
status = send_cmd_write_uart_register(edge_port, MCR,
edge_port->shadowMCR);
@@ -2959,6 +2979,7 @@ static struct usb_serial_driver edgeport_2port_device = {
.tiocmset = edge_tiocmset,
.tiocmiwait = usb_serial_generic_tiocmiwait,
.get_icount = usb_serial_generic_get_icount,
+ .dtr_rts = edge_dtr_rts,
.write = edge_write,
.write_room = edge_write_room,
.chars_in_buffer = edge_chars_in_buffer,
@@ -2993,6 +3014,7 @@ static struct usb_serial_driver edgeport_4port_device = {
.tiocmset = edge_tiocmset,
.tiocmiwait = usb_serial_generic_tiocmiwait,
.get_icount = usb_serial_generic_get_icount,
+ .dtr_rts = edge_dtr_rts,
.write = edge_write,
.write_room = edge_write_room,
.chars_in_buffer = edge_chars_in_buffer,
@@ -3027,6 +3049,7 @@ static struct usb_serial_driver edgeport_8port_device = {
.tiocmset = edge_tiocmset,
.tiocmiwait = usb_serial_generic_tiocmiwait,
.get_icount = usb_serial_generic_get_icount,
+ .dtr_rts = edge_dtr_rts,
.write = edge_write,
.write_room = edge_write_room,
.chars_in_buffer = edge_chars_in_buffer,
@@ -3061,6 +3084,7 @@ static struct usb_serial_driver epic_device = {
.tiocmset = edge_tiocmset,
.tiocmiwait = usb_serial_generic_tiocmiwait,
.get_icount = usb_serial_generic_get_icount,
+ .dtr_rts = edge_dtr_rts,
.write = edge_write,
.write_room = edge_write_room,
.chars_in_buffer = edge_chars_in_buffer,
--
2.55.0