[PATCH v2 10/12] USB: serial: io_edgeport: deassert DTR/RTS on close() and B0
From: Johan Hovold
Date: Fri Oct 23 2026 - 08:24:52 EST
The modem control signals DTR and RTS should be dropped on close() and
hangup if HUPCL is set and also when requesting B0, but the driver is
currently only asserting the signals on open().
Implement the missing dtr_rts() callback to handle open(), close() and
hangup 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 566f0f1a1632..ebbe8c5370cd 100644
--- a/drivers/usb/serial/io_edgeport.c
+++ b/drivers/usb/serial/io_edgeport.c
@@ -1566,6 +1566,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.
@@ -2412,9 +2429,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