tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: patch review: avoid com delay() in VMs



On Fri, Feb 07, 2025 at 06:35:04AM +0100, Emile `iMil' Heitor wrote:
> On Wed, 5 Feb 2025, Emile `iMil' Heitor wrote:
> 
> > After several back-and-forths, thanks Martin, Simon and Taylor for
> > your help, here's a cleaner approach based on prop_dictionary_util,
> > avoiding #ifdefs:
> 
> Another day, another proposal!
> Here are the results of discussions about finally getting rid of delay()
> and instead checking LSR_TXRDY (aka LSR_THRE) or LSR_TSRE (aka LSR_TEMT)
> 
> diff --git a/sys/dev/ic/com.c b/sys/dev/ic/com.c
> index d271b594346..082b5b8a985 100644
> --- a/sys/dev/ic/com.c
> +++ b/sys/dev/ic/com.c
> @@ -536,6 +536,7 @@ com_attach_subr(struct com_softc *sc)
>         struct tty *tp;
>         uint32_t cpr;
>         uint8_t lcr;
> +       int timo;
>         const char *fifo_msg = NULL;
>         prop_dictionary_t dict;
>         bool is_console = true;
> @@ -588,9 +589,13 @@ com_attach_subr(struct com_softc *sc)
>                         sc->sc_lcr = cflag2lcr(comcons_info.cflag);
>                         break;
>                 }
> +               /* wait for output to finish */
> +               timo = 10000;
> +               while (!ISSET(CSR_READ_1(regsp, COM_REG_LSR),
> +                   LSR_TXRDY | LSR_TSRE) && --timo)
> +                       continue;
> 
>                 /* Make sure the console is always "hardwired". */
> -               delay(10000);                   /* wait for output to finish */
>                 if (is_console) {
>                         SET(sc->sc_hwflags, COM_HW_CONSOLE);
>                 }

timo looks way too low to me.
On a multi-gHz CPU, counting from 10000 to 0 doens't even let you send
one byte at 9600bds.

Another way to compute the timeout is probably needed.

-- 
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
     NetBSD: 26 ans d'experience feront toujours la difference
--


Home | Main Index | Thread Index | Old Index