On Tue, 18 Oct 2022, Martin Hundebøll wrote: > The logic to find unused ports when registering new 8250 uart ports > searches only up to CONFIG_SERIAL_8250_RUNTIME_UARTS, which forces users > of external 8250 ports to increase the number of runtime ports > artificially. > > Fix this by initializing each allocated port structure with basic > settings like line number and uart operation callbacks, and by searching > the entire array of allocated ports to find an unused one. So nr_uarts no longer means "Maximum number of UARTs supported." ? Perhaps it should be reworded too. -- i. > Signed-off-by: Martin Hundebøll <martin@xxxxxxxxxx> > --- > drivers/tty/serial/8250/8250_core.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c > index 94fbf0add2ce..a166cc66e7d1 100644 > --- a/drivers/tty/serial/8250/8250_core.c > +++ b/drivers/tty/serial/8250/8250_core.c > @@ -500,7 +500,7 @@ static void __init serial8250_isa_init_ports(void) > if (nr_uarts > UART_NR) > nr_uarts = UART_NR; > > - for (i = 0; i < nr_uarts; i++) { > + for (i = 0; i < UART_NR; i++) { > struct uart_8250_port *up = &serial8250_ports[i]; > struct uart_port *port = &up->port; > > @@ -926,15 +926,16 @@ static struct uart_8250_port *serial8250_find_match_or_unused(const struct uart_ > > /* try line number first if still available */ > i = port->line; > - if (i < nr_uarts && serial8250_ports[i].port.type == PORT_UNKNOWN && > + if (i < UART_NR && serial8250_ports[i].port.type == PORT_UNKNOWN && > serial8250_ports[i].port.iobase == 0) > return &serial8250_ports[i]; > + > /* > * We didn't find a matching entry, so look for the first > * free entry. We look for one which hasn't been previously > * used (indicated by zero iobase). > */ > - for (i = 0; i < nr_uarts; i++) > + for (i = 0; i < UART_NR; i++) > if (serial8250_ports[i].port.type == PORT_UNKNOWN && > serial8250_ports[i].port.iobase == 0) > return &serial8250_ports[i]; > @@ -943,7 +944,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(const struct uart_ > * That also failed. Last resort is to find any entry which > * doesn't have a real port associated with it. > */ > - for (i = 0; i < nr_uarts; i++) > + for (i = 0; i < UART_NR; i++) > if (serial8250_ports[i].port.type == PORT_UNKNOWN) > return &serial8250_ports[i]; > >