On 3/17/24 12:34 PM, Janne Grunau wrote:
Hej,

On Sun, Mar 17, 2024, at 12:07, Janne Grunau via B4 Relay wrote:
From: Janne Grunau <j...@jannau.net>

Add the environment variable "usb_blocklist" to prevent USB devices
listed in it from being used. This allows to ignore devices which
trigger bugs in u-boot's USB stack or are undesirable for other reasons.
Devices emulating keyboards are one example. U-boot currently supports
only one USB keyboard device. Most commonly, people run into this with
Yubikeys, so let's ignore those in the default environment.

Based on previous USB keyboard specific patches for the same purpose.

Link:
https://lore.kernel.org/u-boot/7ab604fb-0fec-4f5e-8708-7a3a7e2cb...@denx.de/
Signed-off-by: Janne Grunau <j...@jannau.net>
---
  common/usb.c              | 56
+++++++++++++++++++++++++++++++++++++++++++++++
  doc/usage/environment.rst | 12 ++++++++++
  include/env_default.h     | 11 ++++++++++
  3 files changed, 79 insertions(+)

diff --git a/common/usb.c b/common/usb.c
index 836506dcd9..73af5be066 100644
--- a/common/usb.c
+++ b/common/usb.c
@@ -1084,6 +1084,57 @@ static int usb_prepare_device(struct usb_device
*dev, int addr, bool do_read,
        return 0;
  }

+static int usb_blocklist_parse_error(const char *blocklist, size_t pos)
+{
+       printf("usb_blocklist parse error at char %zu in \"%s\"\n", pos,
+              blocklist);
+       return 0;
+}
+
+static int usb_device_is_blocked(u16 id_vendor, u16 id_product)
+{
+       ulong vid, pid;
+       char *end;
+       const char *block_str = env_get("usb_blocklist");
+       const char *cur = block_str;
+
+       /* parse "usb_blocklist" strictly */
+       while (cur && cur[0] != '\0') {
+               vid = simple_strtoul(cur, &end, 0);
+               if (cur == end || end[0] != ':')
+                       return usb_blocklist_parse_error(block_str,
+                                                        cur - block_str);
+
+               cur = end + 1;
+               pid = simple_strtoul(cur, &end, 0);
+               if (cur == end && end[0] != '*')
+                       return usb_blocklist_parse_error(block_str,
+                                                        cur - block_str);
+
+               if (end[0] == '*') {
+                       /* use out of range idProduct as wildcard indication */
+                       pid = U16_MAX + 1;
+                       end++;
+               }
+               if (end[0] != ',' && end[0] != '\0')
+                       return usb_blocklist_parse_error(block_str,
+                                                        cur - block_str);
+
+               if (id_vendor == vid && (pid > U16_MAX || id_product == pid)) {
+                       printf("Ignoring USB device 0x%x:0x%x\n",id_vendor,
+                             id_product);

this is a leftover from testing, already removed locally

You could turn this into dev_dbg()

Reply via email to