summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/Kconfig8
-rw-r--r--cmd/Makefile2
-rw-r--r--cmd/blk_common.c2
-rw-r--r--cmd/bootefi.c73
-rw-r--r--cmd/fastboot/Kconfig1
-rw-r--r--cmd/i2c.c14
-rw-r--r--cmd/jffs2.c2
-rw-r--r--cmd/log.c326
-rw-r--r--cmd/mtdparts.c5
-rw-r--r--cmd/usb.c22
10 files changed, 141 insertions, 314 deletions
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 5a6afab99b..c033223526 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1502,6 +1502,14 @@ config CMD_KGDB
single-stepping, inspecting variables, etc. This is supported only
on PowerPC at present.
+config CMD_LOG
+ bool "log - Generation, control and access to logging"
+ help
+ This provides access to logging features. It allows the output of
+ log data to be controlled to a limited extent (setting up the default
+ maximum log level for emitting of records). It also provides access
+ to a command used for testing the log system.
+
config CMD_TRACE
bool "trace - Support tracing of function calls and timing"
help
diff --git a/cmd/Makefile b/cmd/Makefile
index 2b0444d5b7..00e38696da 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -76,7 +76,7 @@ obj-$(CONFIG_LED_STATUS_CMD) += legacy_led.o
obj-$(CONFIG_CMD_LED) += led.o
obj-$(CONFIG_CMD_LICENSE) += license.o
obj-y += load.o
-obj-$(CONFIG_LOGBUFFER) += log.o
+obj-$(CONFIG_CMD_LOG) += log.o
obj-$(CONFIG_ID_EEPROM) += mac.o
obj-$(CONFIG_CMD_MD5SUM) += md5sum.o
obj-$(CONFIG_CMD_MEMORY) += mem.o
diff --git a/cmd/blk_common.c b/cmd/blk_common.c
index 0c0c23eb37..bf2f626dd6 100644
--- a/cmd/blk_common.c
+++ b/cmd/blk_common.c
@@ -95,8 +95,6 @@ int blk_common_cmd(int argc, char * const argv[], enum if_type if_type,
} else {
return CMD_RET_USAGE;
}
-
- return 0;
}
}
#endif
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 478bc116e2..78ff109835 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -6,10 +6,12 @@
* SPDX-License-Identifier: GPL-2.0+
*/
+#include <charset.h>
#include <common.h>
#include <command.h>
#include <dm.h>
#include <efi_loader.h>
+#include <efi_selftest.h>
#include <errno.h>
#include <libfdt.h>
#include <libfdt_env.h>
@@ -43,12 +45,39 @@ static void efi_init_obj_list(void)
#ifdef CONFIG_GENERATE_SMBIOS_TABLE
efi_smbios_register();
#endif
+ efi_watchdog_register();
/* Initialize EFI runtime services */
efi_reset_system_init();
efi_get_time_init();
}
+/*
+ * Set the load options of an image from an environment variable.
+ *
+ * @loaded_image_info: the image
+ * @env_var: name of the environment variable
+ */
+static void set_load_options(struct efi_loaded_image *loaded_image_info,
+ const char *env_var)
+{
+ size_t size;
+ const char *env = env_get(env_var);
+
+ loaded_image_info->load_options = NULL;
+ loaded_image_info->load_options_size = 0;
+ if (!env)
+ return;
+ size = strlen(env) + 1;
+ loaded_image_info->load_options = calloc(size, sizeof(u16));
+ if (!loaded_image_info->load_options) {
+ printf("ERROR: Out of memory\n");
+ return;
+ }
+ utf8_to_utf16(loaded_image_info->load_options, (u8 *)env, size);
+ loaded_image_info->load_options_size = size * 2;
+}
+
static void *copy_fdt(void *fdt)
{
u64 fdt_size = fdt_totalsize(fdt);
@@ -92,10 +121,10 @@ static void *copy_fdt(void *fdt)
return new_fdt;
}
-static ulong efi_do_enter(void *image_handle,
- struct efi_system_table *st,
- asmlinkage ulong (*entry)(void *image_handle,
- struct efi_system_table *st))
+static efi_status_t efi_do_enter(
+ void *image_handle, struct efi_system_table *st,
+ asmlinkage ulong (*entry)(void *image_handle,
+ struct efi_system_table *st))
{
efi_status_t ret = EFI_LOAD_ERROR;
@@ -106,7 +135,7 @@ static ulong efi_do_enter(void *image_handle,
}
#ifdef CONFIG_ARM64
-static unsigned long efi_run_in_el2(asmlinkage ulong (*entry)(
+static efi_status_t efi_run_in_el2(asmlinkage ulong (*entry)(
void *image_handle, struct efi_system_table *st),
void *image_handle, struct efi_system_table *st)
{
@@ -121,9 +150,9 @@ static unsigned long efi_run_in_el2(asmlinkage ulong (*entry)(
* Load an EFI payload into a newly allocated piece of memory, register all
* EFI objects it would want to access and jump to it.
*/
-static unsigned long do_bootefi_exec(void *efi, void *fdt,
- struct efi_device_path *device_path,
- struct efi_device_path *image_path)
+static efi_status_t do_bootefi_exec(void *efi, void *fdt,
+ struct efi_device_path *device_path,
+ struct efi_device_path *image_path)
{
struct efi_loaded_image loaded_image_info = {};
struct efi_object loaded_image_info_obj = {};
@@ -189,6 +218,8 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt,
efi_install_configuration_table(&fdt_guid, NULL);
}
+ /* Transfer environment variable bootargs as load options */
+ set_load_options(&loaded_image_info, "bootargs");
/* Load the EFI payload */
entry = efi_load_pe(efi, &loaded_image_info);
if (!entry) {
@@ -223,7 +254,8 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt,
dcache_disable(); /* flush cache before switch to EL2 */
/* Move into EL2 and keep running there */
- armv8_switch_to_el2((ulong)entry, (ulong)&loaded_image_info,
+ armv8_switch_to_el2((ulong)entry,
+ (ulong)&loaded_image_info_obj.handle,
(ulong)&systab, 0, (ulong)efi_run_in_el2,
ES_TO_AARCH64);
@@ -232,7 +264,7 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt,
}
#endif
- ret = efi_do_enter(&loaded_image_info, &systab, entry);
+ ret = efi_do_enter(loaded_image_info_obj.handle, &systab, entry);
exit:
/* image has returned, loaded-image obj goes *poof*: */
@@ -277,7 +309,7 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
char *saddr, *sfdt;
unsigned long addr, fdt_addr = 0;
- unsigned long r;
+ efi_status_t r;
if (argc < 2)
return CMD_RET_USAGE;
@@ -298,6 +330,12 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
struct efi_loaded_image loaded_image_info = {};
struct efi_object loaded_image_info_obj = {};
+ /* Construct a dummy device path. */
+ bootefi_device_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
+ (uintptr_t)&efi_selftest,
+ (uintptr_t)&efi_selftest);
+ bootefi_image_path = efi_dp_from_file(NULL, 0, "\\selftest");
+
efi_setup_loaded_image(&loaded_image_info,
&loaded_image_info_obj,
bootefi_device_path, bootefi_image_path);
@@ -310,7 +348,14 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
/* Initialize and populate EFI object list */
if (!efi_obj_list_initalized)
efi_init_obj_list();
- return efi_selftest(&loaded_image_info, &systab);
+ /* Transfer environment variable efi_selftest as load options */
+ set_load_options(&loaded_image_info, "efi_selftest");
+ /* Execute the test */
+ r = efi_selftest(loaded_image_info_obj.handle, &systab);
+ efi_restore_gd();
+ free(loaded_image_info.load_options);
+ list_del(&loaded_image_info_obj.link);
+ return r != EFI_SUCCESS;
} else
#endif
if (!strcmp(argv[1], "bootmgr")) {
@@ -356,6 +401,8 @@ static char bootefi_help_text[] =
#ifdef CONFIG_CMD_BOOTEFI_SELFTEST
"bootefi selftest\n"
" - boot an EFI selftest application stored within U-Boot\n"
+ " Use environment variable efi_selftest to select a single test.\n"
+ " Use 'setenv efi_selftest list' to enumerate all tests.\n"
#endif
"bootmgr [fdt addr]\n"
" - load and boot EFI payload based on BootOrder/BootXXXX variables.\n"
@@ -390,6 +437,8 @@ void efi_set_bootdev(const char *dev, const char *devnr, const char *path)
int part;
desc = blk_get_dev(dev, simple_strtol(devnr, NULL, 10));
+ if (!desc)
+ return;
part = parse_partnum(devnr);
bootefi_device_path = efi_dp_from_part(desc, part);
diff --git a/cmd/fastboot/Kconfig b/cmd/fastboot/Kconfig
index 4ce7a775e2..cbb9183ea2 100644
--- a/cmd/fastboot/Kconfig
+++ b/cmd/fastboot/Kconfig
@@ -66,6 +66,7 @@ config FASTBOOT_USB_DEV
config FASTBOOT_FLASH
bool "Enable FASTBOOT FLASH command"
+ default y if ARCH_SUNXI
help
The fastboot protocol includes a "flash" command for writing
the downloaded image to a non-volatile storage device. Define
diff --git a/cmd/i2c.c b/cmd/i2c.c
index 3dd7c6ba4d..bfddf8be1b 100644
--- a/cmd/i2c.c
+++ b/cmd/i2c.c
@@ -1156,7 +1156,10 @@ static int do_sdram (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
uint chip;
u_char data[128];
u_char cksum;
- int j;
+ int j, ret;
+#ifdef CONFIG_DM_I2C
+ struct udevice *dev;
+#endif
static const char *decode_CAS_DDR2[] = {
" TBD", " 6", " 5", " 4", " 3", " 2", " TBD", " TBD"
@@ -1210,7 +1213,14 @@ static int do_sdram (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
*/
chip = simple_strtoul (argv[1], NULL, 16);
- if (i2c_read (chip, 0, 1, data, sizeof (data)) != 0) {
+#ifdef CONFIG_DM_I2C
+ ret = i2c_get_cur_bus_chip(chip, &dev);
+ if (!ret)
+ ret = dm_i2c_read(dev, 0, data, sizeof(data));
+#else
+ ret = i2c_read(chip, 0, 1, data, sizeof(data));
+#endif
+ if (ret) {
puts ("No SDRAM Serial Presence Detect found.\n");
return 1;
}
diff --git a/cmd/jffs2.c b/cmd/jffs2.c
index aee2f4513d..13c533cf12 100644
--- a/cmd/jffs2.c
+++ b/cmd/jffs2.c
@@ -80,7 +80,7 @@
#include <cramfs/cramfs_fs.h>
#if defined(CONFIG_CMD_NAND)
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <nand.h>
#endif
diff --git a/cmd/log.c b/cmd/log.c
index 7a3bd5cd69..abc523b497 100644
--- a/cmd/log.c
+++ b/cmd/log.c
@@ -1,313 +1,61 @@
/*
- * (C) Copyright 2002-2007
- * Detlev Zundel, DENX Software Engineering, dzu@denx.de.
+ * Copyright (c) 2017 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
*
- * Code used from linux/kernel/printk.c
- * Copyright (C) 1991, 1992 Linus Torvalds
- *
- * SPDX-License-Identifier: GPL-2.0+
- *
- * Comments:
- *
- * After relocating the code, the environment variable "loglevel" is
- * copied to console_loglevel. The functionality is similar to the
- * handling in the Linux kernel, i.e. messages logged with a priority
- * less than console_loglevel are also output to stdout.
- *
- * If you want messages with the default level (e.g. POST messages) to
- * appear on stdout also, make sure the environment variable
- * "loglevel" is set at boot time to a number higher than
- * default_message_loglevel below.
- */
-
-/*
- * Logbuffer handling routines
+ * SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <command.h>
-#include <stdio_dev.h>
-#include <post.h>
-#include <logbuff.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-/* Local prototypes */
-static void logbuff_putc(struct stdio_dev *dev, const char c);
-static void logbuff_puts(struct stdio_dev *dev, const char *s);
-static int logbuff_printk(const char *line);
-
-static char buf[1024];
-
-/* This combination will not print messages with the default loglevel */
-static unsigned console_loglevel = 3;
-static unsigned default_message_loglevel = 4;
-static unsigned log_version = 1;
-#ifdef CONFIG_ALT_LB_ADDR
-static volatile logbuff_t *log;
-#else
-static logbuff_t *log;
-#endif
-static char *lbuf;
-
-unsigned long __logbuffer_base(void)
-{
- return CONFIG_SYS_SDRAM_BASE + get_effective_memsize() - LOGBUFF_LEN;
-}
-unsigned long logbuffer_base(void)
-__attribute__((weak, alias("__logbuffer_base")));
+#include <dm.h>
+#include <log.h>
-void logbuff_init_ptrs(void)
+static int do_log_level(cmd_tbl_t *cmdtp, int flag, int argc,
+ char * const argv[])
{
- unsigned long tag, post_word;
- char *s;
-
-#ifdef CONFIG_ALT_LB_ADDR
- log = (logbuff_t *)CONFIG_ALT_LH_ADDR;
- lbuf = (char *)CONFIG_ALT_LB_ADDR;
-#else
- log = (logbuff_t *)(logbuffer_base()) - 1;
- lbuf = (char *)log->buf;
-#endif
-
- /* Set up log version */
- s = env_get("logversion");
- if (s)
- log_version = (int)simple_strtoul(s, NULL, 10);
-
- if (log_version == 2)
- tag = log->v2.tag;
+ if (argc > 1)
+ gd->default_log_level = simple_strtol(argv[1], NULL, 10);
else
- tag = log->v1.tag;
- post_word = post_word_load();
-#ifdef CONFIG_POST
- /* The post routines have setup the word so we can simply test it */
- if (tag != LOGBUFF_MAGIC || (post_word & POST_COLDBOOT))
- logbuff_reset();
-#else
- /* No post routines, so we do our own checking */
- if (tag != LOGBUFF_MAGIC || post_word != LOGBUFF_MAGIC) {
- logbuff_reset ();
- post_word_store (LOGBUFF_MAGIC);
- }
-#endif
- if (log_version == 2 && (long)log->v2.start > (long)log->v2.con)
- log->v2.start = log->v2.con;
-
- /* Initialize default loglevel if present */
- s = env_get("loglevel");
- if (s)
- console_loglevel = (int)simple_strtoul(s, NULL, 10);
+ printf("Default log level: %d\n", gd->default_log_level);
- gd->flags |= GD_FLG_LOGINIT;
+ return 0;
}
-void logbuff_reset(void)
-{
-#ifndef CONFIG_ALT_LB_ADDR
- memset(log, 0, sizeof(logbuff_t));
-#endif
- if (log_version == 2) {
- log->v2.tag = LOGBUFF_MAGIC;
-#ifdef CONFIG_ALT_LB_ADDR
- log->v2.start = 0;
- log->v2.con = 0;
- log->v2.end = 0;
- log->v2.chars = 0;
+static cmd_tbl_t log_sub[] = {
+ U_BOOT_CMD_MKENT(level, CONFIG_SYS_MAXARGS, 1, do_log_level, "", ""),
+#ifdef CONFIG_LOG_TEST
+ U_BOOT_CMD_MKENT(test, 2, 1, do_log_test, "", ""),
#endif
- } else {
- log->v1.tag = LOGBUFF_MAGIC;
-#ifdef CONFIG_ALT_LB_ADDR
- log->v1.dummy = 0;
- log->v1.start = 0;
- log->v1.size = 0;
- log->v1.chars = 0;
-#endif
- }
-}
+};
-int drv_logbuff_init(void)
+static int do_log(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
- struct stdio_dev logdev;
- int rc;
-
- /* Device initialization */
- memset (&logdev, 0, sizeof (logdev));
-
- strcpy (logdev.name, "logbuff");
- logdev.ext = 0; /* No extensions */
- logdev.flags = DEV_FLAGS_OUTPUT; /* Output only */
- logdev.putc = logbuff_putc; /* 'putc' function */
- logdev.puts = logbuff_puts; /* 'puts' function */
-
- rc = stdio_register(&logdev);
+ cmd_tbl_t *cp;
- return (rc == 0) ? 1 : rc;
-}
+ if (argc < 2)
+ return CMD_RET_USAGE;
-static void logbuff_putc(struct stdio_dev *dev, const char c)
-{
- char buf[2];
- buf[0] = c;
- buf[1] = '\0';
- logbuff_printk(buf);
-}
+ /* drop initial "log" arg */
+ argc--;
+ argv++;
-static void logbuff_puts(struct stdio_dev *dev, const char *s)
-{
- logbuff_printk (s);
-}
+ cp = find_cmd_tbl(argv[0], log_sub, ARRAY_SIZE(log_sub));
+ if (cp)
+ return cp->cmd(cmdtp, flag, argc, argv);
-void logbuff_log(char *msg)
-{
- if ((gd->flags & GD_FLG_LOGINIT)) {
- logbuff_printk(msg);
- } else {
- /*
- * Can happen only for pre-relocated errors as logging
- * at that stage should be disabled
- */
- puts (msg);
- }
+ return CMD_RET_USAGE;
}
-/*
- * Subroutine: do_log
- *
- * Description: Handler for 'log' command..
- *
- * Inputs: argv[1] contains the subcommand
- *
- * Return: None
- *
- */
-int do_log(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
-{
- struct stdio_dev *sdev = NULL;
- char *s;
- unsigned long i, start, size;
-
- if (strcmp(argv[1], "append") == 0) {
- /* Log concatenation of all arguments separated by spaces */
- for (i = 2; i < argc; i++) {
- logbuff_printk(argv[i]);
- logbuff_putc(sdev, (i < argc - 1) ? ' ' : '\n');
- }
- return 0;
- }
-
- switch (argc) {
-
- case 2:
- if (strcmp(argv[1], "show") == 0) {
- if (log_version == 2) {
- start = log->v2.start;
- size = log->v2.end - log->v2.start;
- } else {
- start = log->v1.start;
- size = log->v1.size;
- }
- if (size > LOGBUFF_LEN)
- size = LOGBUFF_LEN;
- for (i = 0; i < size; i++) {
- s = lbuf + ((start + i) & LOGBUFF_MASK);
- putc(*s);
- }
- return 0;
- } else if (strcmp(argv[1], "reset") == 0) {
- logbuff_reset();
- return 0;
- } else if (strcmp(argv[1], "info") == 0) {
- printf("Logbuffer at %08lx\n", (unsigned long)lbuf);
- if (log_version == 2) {
- printf("log_start = %08lx\n",
- log->v2.start);
- printf("log_end = %08lx\n", log->v2.end);
- printf("log_con = %08lx\n", log->v2.con);
- printf("logged_chars = %08lx\n",
- log->v2.chars);
- }
- else {
- printf("log_start = %08lx\n",
- log->v1.start);
- printf("log_size = %08lx\n",
- log->v1.size);
- printf("logged_chars = %08lx\n",
- log->v1.chars);
- }
- return 0;
- }
- return CMD_RET_USAGE;
-
- default:
- return CMD_RET_USAGE;
- }
-}
+#ifdef CONFIG_SYS_LONGHELP
+static char log_help_text[] =
+ "level - get/set log level\n"
+#ifdef CONFIG_LOG_TEST
+ "log test - run log tests\n"
+#endif
+ ;
+#endif
U_BOOT_CMD(
- log, 255, 1, do_log,
- "manipulate logbuffer",
- "info - show pointer details\n"
- "log reset - clear contents\n"
- "log show - show contents\n"
- "log append <msg> - append <msg> to the logbuffer"
+ log, CONFIG_SYS_MAXARGS, 1, do_log,
+ "log system", log_help_text
);
-
-static int logbuff_printk(const char *line)
-{
- int i;
- char *msg, *p, *buf_end;
- int line_feed;
- static signed char msg_level = -1;
-
- strcpy(buf + 3, line);
- i = strlen(line);
- buf_end = buf + 3 + i;
- for (p = buf + 3; p < buf_end; p++) {
- msg = p;
- if (msg_level < 0) {
- if (
- p[0] != '<' ||
- p[1] < '0' ||
- p[1] > '7' ||
- p[2] != '>'
- ) {
- p -= 3;
- p[0] = '<';
- p[1] = default_message_loglevel + '0';
- p[2] = '>';
- } else {
- msg += 3;
- }
- msg_level = p[1] - '0';
- }
- line_feed = 0;
- for (; p < buf_end; p++) {
- if (log_version == 2) {
- lbuf[log->v2.end & LOGBUFF_MASK] = *p;
- log->v2.end++;
- if (log->v2.end - log->v2.start > LOGBUFF_LEN)
- log->v2.start++;
- log->v2.chars++;
- } else {
- lbuf[(log->v1.start + log->v1.size) &
- LOGBUFF_MASK] = *p;
- if (log->v1.size < LOGBUFF_LEN)
- log->v1.size++;
- else
- log->v1.start++;
- log->v1.chars++;
- }
- if (*p == '\n') {
- line_feed = 1;
- break;
- }
- }
- if (msg_level < console_loglevel) {
- printf("%s", msg);
- }
- if (line_feed)
- msg_level = -1;
- }
- return i;
-}
diff --git a/cmd/mtdparts.c b/cmd/mtdparts.c
index 3275eb919b..9bc977450c 100644
--- a/cmd/mtdparts.c
+++ b/cmd/mtdparts.c
@@ -81,7 +81,7 @@
#include <linux/mtd/mtd.h>
#if defined(CONFIG_CMD_NAND)
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <nand.h>
#endif
@@ -873,15 +873,12 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
return 1;
}
-#ifdef DEBUG
pend = strchr(p, ';');
-#endif
debug("dev type = %d (%s), dev num = %d, mtd-id = %s\n",
id->type, MTD_DEV_TYPE(id->type),
id->num, id->mtd_id);
debug("parsing partitions %.*s\n", (int)(pend ? pend - p : strlen(p)), p);
-
/* parse partitions */
num_parts = 0;
diff --git a/cmd/usb.c b/cmd/usb.c
index d95bcf5c8e..907debe30f 100644
--- a/cmd/usb.c
+++ b/cmd/usb.c
@@ -349,6 +349,16 @@ static void usb_show_tree_graph(struct usb_device *dev, char *pre)
printf(" %s", pre);
#ifdef CONFIG_DM_USB
has_child = device_has_active_children(dev->dev);
+ if (device_get_uclass_id(dev->dev) == UCLASS_MASS_STORAGE) {
+ struct udevice *child;
+
+ for (device_find_first_child(dev->dev, &child);
+ child;
+ device_find_next_child(&child)) {
+ if (device_get_uclass_id(child) == UCLASS_BLK)
+ has_child = 0;
+ }
+ }
#else
/* check if the device has connected children */
int i;
@@ -414,8 +424,12 @@ static void usb_show_tree_graph(struct usb_device *dev, char *pre)
udev = dev_get_parent_priv(child);
- /* Ignore emulators, we only want real devices */
- if (device_get_uclass_id(child) != UCLASS_USB_EMUL) {
+ /*
+ * Ignore emulators and block child devices, we only want
+ * real devices
+ */
+ if ((device_get_uclass_id(child) != UCLASS_USB_EMUL) &&
+ (device_get_uclass_id(child) != UCLASS_BLK)) {
usb_show_tree_graph(udev, pre);
pre[index] = 0;
}
@@ -605,7 +619,9 @@ static void usb_show_info(struct usb_device *udev)
for (device_find_first_child(udev->dev, &child);
child;
device_find_next_child(&child)) {
- if (device_active(child)) {
+ if (device_active(child) &&
+ (device_get_uclass_id(child) != UCLASS_USB_EMUL) &&
+ (device_get_uclass_id(child) != UCLASS_BLK)) {
udev = dev_get_parent_priv(child);
usb_show_info(udev);
}