mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
serial: core: Add dedicated uart_port field for console flow
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 d01f4d181c ("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>
This commit is contained in:
parent
430a1386df
commit
9c7eb1c9c3
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user