
Hi all,
I've missed one line of code in bootm.c. +#include <stdio_dev.h>
So I will resend this patch.
Thanks, Tony
On Sun, Apr 2, 2023 at 1:31 PM Tony Dinh mibodhi@gmail.com wrote:
Use CONFIG_CONSOLE_MUX for netconsole. When netconsole is running, stdin/stdout/stder must be set to some primary console, in addtion to nc. For example, stdin=serial,nc. Some recent Linux kernels will not boot with only nc on the stdout list, ie. stdout=nc. When netconsole exits, remove nc from the list of devices in stdin/stdout/stderr.
Signed-off-by: Tony Dinh mibodhi@gmail.com
Changes in v2:
- Select CONFIG_CONSOLE_MUX if CONFIG_NETCONSOLE is enabled
- Add new functions in netconsole driver to support CONSOLE_MUX
- Add new function to encapsulate the process of stopping netconsole
from bootm
- Remove unecessary net_timeout initial value = 1
boot/bootm.c | 13 ++++++--- drivers/net/Kconfig | 10 +++++++ drivers/net/netconsole.c | 60 ++++++++++++++++++++++++++++++++++++++++ include/stdio_dev.h | 1 + 4 files changed, 80 insertions(+), 4 deletions(-)
diff --git a/boot/bootm.c b/boot/bootm.c index 2eec60ec7b..11203c01ec 100644 --- a/boot/bootm.c +++ b/boot/bootm.c @@ -472,11 +472,16 @@ ulong bootm_disable_interrupts(void) * recover from any failures any more... */ iflag = disable_interrupts(); -#ifdef CONFIG_NETCONSOLE
/* Stop the ethernet stack if NetConsole could have left it up */
eth_halt();
-#endif
if (IS_ENABLED(CONFIG_NETCONSOLE)) {
/*
* Make sure that the starting kernel message printed out,
* stop netconsole and the ethernet stack
*/
printf("\n\nStarting kernel ...\n\n");
drv_nc_stop();
eth_halt();
}
#if defined(CONFIG_CMD_USB) /* * turn off USB to prevent the host controller from writing to the diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index ceadee98a1..0661059dfa 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -945,4 +945,14 @@ config MDIO_MUX_MESON_G12A This driver is used for the MDIO mux found on the Amlogic G12A & compatible SoCs.
+config NETCONSOLE
bool "Enable netconsole"
select CONSOLE_MUX
help
NetConsole requires CONSOLE_MUX, i.e. at least one default console such
must be specified in addition to nc console. For example, for boards that
the main console is serial, set each of the envs stdin/stdout/stderr to serial,nc.
See CONFIG_CONSOLE_MUX and CONFIG_SYS_CONSOLE_IS_IN_ENV help for detailed
description of usage.
endif # NETDEVICES diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 151bc55e07..bb92d2e130 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -7,6 +7,7 @@ #include <common.h> #include <command.h> #include <env.h> +#include <iomux.h> #include <log.h> #include <stdio_dev.h> #include <net.h> @@ -33,6 +34,12 @@ static int output_packet_len; */ enum proto_t net_loop_last_protocol = BOOTP;
+/*
- Net console helpers
- */
+static void usage(void); +static void remove_nc_from(const int console);
static void nc_wait_arp_handler(uchar *pkt, unsigned dest, struct in_addr sip, unsigned src, unsigned len) @@ -111,6 +118,21 @@ static int refresh_settings_from_env(void) return 0; }
+static void remove_nc_from(const int console) +{
int ret;
ret = iomux_replace_device(console, "nc", "nulldev");
if (ret) {
printf("\n*** Warning: Cannot remove nc from %s Error=%d\n",
stdio_names[console], ret);
printf("%s=", stdio_names[console]);
iomux_printdevs(console);
usage();
flush();
}
+}
/**
- Called from net_loop in net/net.c before each packet
*/ @@ -241,6 +263,29 @@ static int nc_stdio_start(struct stdio_dev *dev) return 0; }
+void nc_stdio_stop(void) +{
if (IS_ENABLED(CONFIG_CONSOLE_MUX)) {
int ret;
struct stdio_dev *sdev;
/* Remove nc from each stdio file */
remove_nc_from(stdin);
remove_nc_from(stderr);
remove_nc_from(stdout);
/* Deregister nc device */
sdev = stdio_get_by_name("nc");
ret = stdio_deregister_dev(sdev, true);
if (ret)
printf("\nWarning: Cannot deregister nc console Error=%d\n", ret);
} else {
printf("\n*** Warning: CONFIG_CONSOLE_MUX must be enabled for netconsole\n"
"to work properly. The nc console will be removed when\n"
"netconsole driver stops\n");
}
+}
static void nc_stdio_putc(struct stdio_dev *dev, char c) { if (output_recursion) @@ -316,6 +361,16 @@ static int nc_stdio_tstc(struct stdio_dev *dev) return input_size != 0; }
+static void usage(void) +{
printf("USAGE:\n"
"NetConsole requires CONFIG_CONSOLE_MUX. At least one default console\n"
"must be specified in addition to nc console. For example, for boards\n"
"that the main console is serial, set the each of envs stdin/stdout/stderr\n"
"to serial,nc. Some kernel might fail to boot when nc is the only device in\n"
"stdout list\n");
+}
int drv_nc_init(void) { struct stdio_dev dev; @@ -335,3 +390,8 @@ int drv_nc_init(void)
return (rc == 0) ? 1 : rc;
}
+void drv_nc_stop(void) +{
nc_stdio_stop();
+} diff --git a/include/stdio_dev.h b/include/stdio_dev.h index 3105928970..9d2375a67e 100644 --- a/include/stdio_dev.h +++ b/include/stdio_dev.h @@ -112,6 +112,7 @@ int drv_keyboard_init(void); int drv_usbtty_init(void); int drv_usbacm_init(void); int drv_nc_init(void); +void drv_nc_stop(void); int drv_jtag_console_init(void); int cbmemc_init(void);
-- 2.30.2