]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
serial: core: Add dedicated uart_port field for console flow
authorJohn Ogness <john.ogness@linutronix.de>
Wed, 6 May 2026 12:15:56 +0000 (14:21 +0206)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 11 May 2026 14:58:28 +0000 (16:58 +0200)
Currently the UPF_CONS_FLOW bit in the uart_port.flags field is used
by serial console drivers to identify if a user has configured flow
control on the console. Usually this policy is setup during early
boot, but can be changed at runtime.

The bits in uart_port.flags are either hardware and driver
properties that are initialized before usage or are properties that
can be changed via the tty layer.

The UPF_CONS_FLOW bit is an exception because it is a console-only
policy that can change at runtime and its setting and usage have
nothing to do with the tty layer. This actually causes a problem
for its usage because uart_port.flags is synchronized by a related
tty_port.mutex, but a console has no relation to a tty (other than
sharing the port).

This is probably why console flow control is not properly available
for most serial drivers. And it is hindering being able to provide a
proper implementation. Commit d01f4d181c92 ("serial: core: Privatize
tty->hw_stopped") addressed a similar issue to deal with software
assisted CTS flow state tracking.

Add a new uart_port boolean field "cons_flow" to store the user
configuration for console flow control. Add getter/setter wrappers
to allow for adding more policies later and/or locking constraint
validation.

Mark UPF_CONS_FLOW as deprecated.

Signed-off-by: John Ogness <john.ogness@linutronix.de>
Link: https://patch.msgid.link/20260506121606.5805-2-john.ogness@linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
include/linux/serial_core.h

index 666430b4789977ae19641442b369eb1c773233f4..4f7bbdd90017602ba72b8a67e077922feeec95da 100644 (file)
@@ -533,6 +533,7 @@ struct uart_port {
 #define UPF_HARD_FLOW          ((__force upf_t) (UPF_AUTO_CTS | UPF_AUTO_RTS))
 /* Port has hardware-assisted s/w flow control */
 #define UPF_SOFT_FLOW          ((__force upf_t) BIT_ULL(22))
+/* Deprecated: use uart_set_cons_flow_enabled()/uart_cons_flow_enabled() instead. */
 #define UPF_CONS_FLOW          ((__force upf_t) BIT_ULL(23))
 #define UPF_SHARE_IRQ          ((__force upf_t) BIT_ULL(24))
 #define UPF_EXAR_EFR           ((__force upf_t) BIT_ULL(25))
@@ -567,6 +568,7 @@ struct uart_port {
 #define UPSTAT_SYNC_FIFO       ((__force upstat_t) (1 << 5))
 
        bool                    hw_stopped;             /* sw-assisted CTS flow state */
+       bool                    cons_flow;              /* user specified console flow control */
        unsigned int            mctrl;                  /* current modem ctrl settings */
        unsigned int            frame_time;             /* frame timing in ns */
        unsigned int            type;                   /* port type */
@@ -1163,6 +1165,16 @@ static inline bool uart_softcts_mode(struct uart_port *uport)
        return ((uport->status & mask) == UPSTAT_CTS_ENABLE);
 }
 
+static inline void uart_set_cons_flow_enabled(struct uart_port *uport, bool enabled)
+{
+       uport->cons_flow = enabled;
+}
+
+static inline bool uart_cons_flow_enabled(const struct uart_port *uport)
+{
+       return uport->cons_flow;
+}
+
 /*
  * The following are helper functions for the low level drivers.
  */