svn commit: r245848 - head/sys/boot/i386/libi386

Sergey Kandaurov pluknet at freebsd.org
Mon Feb 4 09:43:44 UTC 2013


On 23 January 2013 22:34, John Baldwin <jhb at freebsd.org> wrote:
> Author: jhb
> Date: Wed Jan 23 18:34:21 2013
> New Revision: 245848
> URL: http://svnweb.freebsd.org/changeset/base/245848
>
> Log:
>   Always update the hw.uart.console hint anytime a change is made to the
>   comconsole setup.  Previously the hint would be set when if you set a
>   custom port, but it would not be updated if you later set a custom speed.
>
>   Also, leave the hw.uart.console hint mutable so it can be overridden or
>   unset by the user if needed.
>
>   Reviewed by:  kib (earlier version)
>   MFC after:    1 week

Looks like this results in something wrong.
I have a serial console at COM2 (uart1), but it chooses uart0
(1016 == 0x3F8), compare .flags and the final hw.uart.console value.

hint.uart.0.at="isa"
hint.uart.0.irq="4"
hint.uart.0.port="0x3F8"
hint.uart.1.at="isa"
hint.uart.1.flags="0x10"
hint.uart.1.irq="3"
hint.uart.1.port="0x2F8"
hw.uart.console="io:1016,br:9600"

Or even:
hint.uart.0.at="isa"
hint.uart.0.disabled="1"
hint.uart.0.irq="4"
hint.uart.0.port="0x3F8"
hint.uart.1.at="isa"
hint.uart.1.flags="0x10"
hint.uart.1.irq="3"
hint.uart.1.port="0x2F8"
hw.uart.console="io:1016,br:9600"

>
> Modified:
>   head/sys/boot/i386/libi386/comconsole.c
>
> Modified: head/sys/boot/i386/libi386/comconsole.c
> ==============================================================================
> --- head/sys/boot/i386/libi386/comconsole.c     Wed Jan 23 18:19:50 2013        (r245847)
> +++ head/sys/boot/i386/libi386/comconsole.c     Wed Jan 23 18:34:21 2013        (r245848)
> @@ -50,7 +50,6 @@ static int    comc_init(int arg);
>  static void    comc_putchar(int c);
>  static int     comc_getchar(void);
>  static int     comc_getspeed(void);
> -static void    set_hw_console_hint(void);
>  static int     comc_ischar(void);
>  static int     comc_parseint(const char *string);
>  static uint32_t comc_parse_pcidev(const char *string);
> @@ -202,27 +201,14 @@ comc_port_set(struct env_var *ev, int fl
>      }
>
>      if ((comconsole.c_flags & (C_ACTIVEIN | C_ACTIVEOUT)) != 0 &&
> -       comc_port != port) {
> +       comc_port != port)
>         comc_setup(comc_curspeed, port);
> -       set_hw_console_hint();
> -    }
>
>      env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
>
>      return (CMD_OK);
>  }
>
> -static void
> -set_hw_console_hint(void)
> -{
> -       char intbuf[64];
> -
> -       unsetenv("hw.uart.console");
> -       sprintf(intbuf, "io:%d,br:%d", comc_port, comc_curspeed);
> -       env_setenv("hw.uart.console", EV_VOLATILE, intbuf,
> -           env_noset, env_nounset);
> -}
> -
>  /*
>   * Input: bus:dev:func[:bar]. If bar is not specified, it is 0x10.
>   * Output: bar[24:16] bus[15:8] dev[7:3] func[2:0]
> @@ -288,7 +274,6 @@ comc_pcidev_handle(uint32_t locator)
>                    comc_port_set, env_nounset);
>
>         comc_setup(comc_curspeed, port);
> -       set_hw_console_hint();
>         comc_locator = locator;
>
>         return (CMD_OK);
> @@ -318,8 +303,10 @@ static void
>  comc_setup(int speed, int port)
>  {
>      static int TRY_COUNT = 1000000;
> +    char intbuf[64];
>      int tries;
>
> +    unsetenv("hw.uart.console");
>      comc_curspeed = speed;
>      comc_port = port;
>
> @@ -334,9 +321,11 @@ comc_setup(int speed, int port)
>          inb(comc_port + com_data);
>      while (inb(comc_port + com_lsr) & LSR_RXRDY && ++tries < TRY_COUNT);
>
> -    if (tries < TRY_COUNT)
> +    if (tries < TRY_COUNT) {
>         comconsole.c_flags |= (C_PRESENTIN | C_PRESENTOUT);
> -    else
> +       sprintf(intbuf, "io:%d,br:%d", comc_port, comc_curspeed);
> +       env_setenv("hw.uart.console", EV_VOLATILE, intbuf, NULL, NULL);
> +    } else
>         comconsole.c_flags &= ~(C_PRESENTIN | C_PRESENTOUT);
>  }
>



-- 
wbr,
pluknet


More information about the svn-src-all mailing list