Skip to contentSkip to conversation

USB: EHCI: Initialize multiple USB controllers at once

PATCH Superseded Jim Lin 3 participants 7 messages Aug 8, 2012 – Aug 14, 2012

Subsystems (2)
lore
Share & tools
lore

Jim Lin

author
#0 lore raw

PATCH v2 1/1 USB: EHCI: Initialize multiple USB controllers at once

Add support for command line "usb reset" or "usb start" to initialize , "usb stop" to stop multiple USB controllers at once. Other command like "usb tree" also supports multiple controllers.

New added definitions in header file are:
CONFIG_USB_MULTI
CONFIG_USB_MAX_CONTROLLER_COUNT

---
Changes in v2:
- Renaming from CONFIG_USB_INIT_MULTI to CONFIG_USB_MULTI
- Define CONFIG_USB_MAX_CONTROLLER_COUNT as 1 if not defined
- Remove volatile from structure ehci_ctrl of ehci-hcd.c for a checkpatch.pl warning

 common/cmd_usb.c            |   10 +++
 common/usb.c                |   98 +++++++++++++++++++++++++-
 common/usb_hub.c            |    4 +
 drivers/usb/host/ehci-hcd.c |  167 +++++++++++++++++++++++++++++++-----------
 drivers/usb/host/ehci.h     |    5 ++
 include/usb.h               |   12 +++
 6 files changed, 251 insertions(+), 45 deletions(-)
common/cmd_usb.c +10 -0
index a8e3ae5..8d3093b 100644
@@ -554,7 +554,17 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        }
        if (strncmp(argv[1], "tree", 4) == 0) {
                printf("\nDevice Tree:\n");
+#ifdef CONFIG_USB_MULTI
+               for (i = 0; i < USB_MAX_DEVICE; i++) {
+                       dev = usb_get_dev_index(i);
+                       if (dev == NULL)
+                               break;
+                       if (dev->parent == NULL)
+                               usb_show_tree(dev);
+               }
+#else
                usb_show_tree(usb_get_dev_index(0));
+#endif
                return 0;
        }
        if (strncmp(argv[1], "inf", 3) == 0) {
common/usb.c +97 -1

137 lines not on this page · raw message

common/usb_hub.c +4 -0
index f35ad95..8f2e3e3 100644
@@ -243,7 +243,11 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
        mdelay(200);
 
        /* Allocate a new device struct for it */
+#ifdef CONFIG_USB_MULTI
+       usb = usb_alloc_new_device(dev->controller);
+#else
        usb = usb_alloc_new_device();
+#endif
 
        if (portstatus & USB_PORT_STAT_HIGH_SPEED)
                usb->speed = USB_SPEED_HIGH;
drivers/usb/host/ehci-hcd.c +123 -44

333 lines not on this page · raw message

drivers/usb/host/ehci.h +5 -0
index cc00ce4..1cc5c6e 100644
@@ -201,7 +201,12 @@ struct QH {
 };
 
 /* Low level init functions */
+#ifdef CONFIG_USB_MULTI
+int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor);
+int ehci_hcd_stop(int index);
+#else
 int ehci_hcd_init(void);
 int ehci_hcd_stop(void);
+#endif
 
 #endif /* USB_EHCI_H */
include/usb.h +12 -0
index ba3d169..628cfd5 100644
@@ -140,6 +140,9 @@ struct usb_device {
        int portnr;
        struct usb_device *parent;
        struct usb_device *children[USB_MAXCHILDREN];
+#ifdef CONFIG_USB_MULTI
+       void *controller;               /* hardware controller private data */
+#endif
 };
 
 /**********************************************************************
@@ -153,8 +156,13 @@ struct usb_device {
        defined(CONFIG_USB_OMAP3) || defined(CONFIG_USB_DA8XX) || \
        defined(CONFIG_USB_BLACKFIN) || defined(CONFIG_USB_AM35X)
 
+#ifdef CONFIG_USB_MULTI
+void *usb_lowlevel_init(int index);
+int usb_lowlevel_stop(int index);
+#else
 int usb_lowlevel_init(void);
 int usb_lowlevel_stop(void);
+#endif
 int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
                        void *buffer, int transfer_len);
 int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
@@ -382,7 +390,11 @@ void usb_hub_reset(void);
 int hub_port_reset(struct usb_device *dev, int port,
                          unsigned short *portstat);
 
+#ifdef CONFIG_USB_MULTI
+struct usb_device *usb_alloc_new_device(void *controller);
+#else
 struct usb_device *usb_alloc_new_device(void);
+#endif
 int usb_new_device(struct usb_device *dev);
 
 #endif /*_USB_H_ */

--
1.7.3

nvpublic

#1 lore raw

PATCH v2 1/1 USB: EHCI: Initialize multiple USB controllers at once

Dear Jim Lin,

Quoted 30 lines

Add support for command line "usb reset" or "usb start" to initialize , "usb stop" to stop multiple USB controllers at once. Other command like "usb tree" also supports multiple controllers.

New added definitions in header file are:
CONFIG_USB_MULTI
CONFIG_USB_MAX_CONTROLLER_COUNT

---
Changes in v2:
- Renaming from CONFIG_USB_INIT_MULTI to CONFIG_USB_MULTI
- Define CONFIG_USB_MAX_CONTROLLER_COUNT as 1 if not defined
- Remove volatile from structure ehci_ctrl of ehci-hcd.c for a checkpatch.pl warning

 common/cmd_usb.c            |   10 +++
 common/usb.c                |   98 +++++++++++++++++++++++++-
 common/usb_hub.c            |    4 +
 drivers/usb/host/ehci-hcd.c |  167
+++++++++++++++++++++++++++++++----------- drivers/usb/host/ehci.h     |  
 5 ++
 include/usb.h               |   12 +++
 6 files changed, 251 insertions(+), 45 deletions(-)
common/cmd_usb.c +0 -0
index a8e3ae5..8d3093b 100644

common/cmd_usb.c int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char · line 557

Quoted 4 lines
common/cmd_usb.c +1 -0
@@ -554,7 +554,17 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char
 * const argv[]) }
        if (strncmp(argv[1], "tree", 4) == 0) {
                printf("\nDevice Tree:\n");
+#ifdef CONFIG_USB_MULTI

How's this supposed to work? Shouldn't this call usb_show_tree on roots of all the trees?

Quoted 66 lines
common/cmd_usb.c +9 -0
+               for (i = 0; i < USB_MAX_DEVICE; i++) {
+                       dev = usb_get_dev_index(i);
+                       if (dev == NULL)
+                               break;
+                       if (dev->parent == NULL)
+                               usb_show_tree(dev);
+               }
+#else
                usb_show_tree(usb_get_dev_index(0));
+#endif
                return 0;
        }
        if (strncmp(argv[1], "inf", 3) == 0) {
common/usb.c +44 -0
index 1b40228..065c70c 100644
@@ -77,6 +77,89 @@ static int asynch_allowed;
 
 char usb_started; /* flag for the started/stopped USB status */
 
+#ifdef CONFIG_USB_MULTI
+/*************************************************************************
 ** + * Init USB Device
+ */
+#ifndef CONFIG_USB_MAX_CONTROLLER_COUNT
+#define CONFIG_USB_MAX_CONTROLLER_COUNT 1
+#endif
+
+int usb_init(void)
+{
+       void *ctrl;
+       int i;
+       struct usb_device *dev;
+
+       running = 0;
+       dev_index = 0;
+       asynch_allowed = 1;
+       usb_hub_reset();
+
+       /* first make all devices unknown */
+       for (i = 0; i < USB_MAX_DEVICE; i++) {
+               memset(&usb_dev[i], 0, sizeof(struct usb_device));
+               usb_dev[i].devnum = -1;
+       }
+
+       /* init low_level USB */
+       printf("USB:   ");
+       for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
+               /* init low_level USB */
+               ctrl = usb_lowlevel_init(i);
+               /*
+                * if lowlevel init is OK, scan the bus for devices
+                * i.e. search HUBs and configure them
+                */
+               if (ctrl) {
+                       running = 1;
+
+                       printf("scanning bus for devices... ");
+                       dev = usb_alloc_new_device(ctrl);
+                       /*
+                        * device 0 is always present
+                        * (root hub, so let it analyze)
+                        */
+                       if (dev)
+                               usb_new_device(dev);

common/usb.c static int asynch_allowed; · line 134

Quoted 10 lines
common/usb.c +10 -0
+               }
+       }
+
+       if (running) {
+               if (!dev_index)
+                       printf("No USB Device found\n");
+               else
+                       printf("%d USB Device(s) found\n", dev_index);
+#ifdef CONFIG_USB_KEYBOARD
+       drv_usb_kbd_init();

Will the keyboard driver survive this?

Quoted 43 lines
common/usb.c +12 -0
+#endif
+       USB_PRINTF("scan end\n");
+               usb_started = 1;
+               return 0;
+       } else {
+               printf("Error, couldn't init Lowlevel part\n");
+               usb_started = 0;
+               return -1;
+       }
+}
+
+/*************************************************************************
 ***** + * Stop USB this stops the LowLevel Part and deregisters USB

devices. + */

common/usb.c +15 -0
+int usb_stop(void)
+{
+       int i;
+
+       if (usb_started) {
+               asynch_allowed = 1;
+               usb_started = 0;
+               usb_hub_reset();
+               for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++)
+                       usb_lowlevel_stop(i);
+       }
+       return 0;
+}
+#else
 /**********************************************************************
  * some forward declerations...
  */
@@ -127,6 +210,7 @@ int usb_stop(void)
        }
        return res;
 }
+#endif
 
 /*
  * disables the asynch behaviour of the control message. This is used for

data @@ -750,11 +834,18 @@ struct usb_device *usb_get_dev_index(int index) return &usb_dev[index];
}

common/usb.c struct usb_device *usb_get_dev_index(int index) · line 837

Quoted 2 lines
common/usb.c +1 -1
-
+#ifdef CONFIG_USB_MULTI

I still believe it's possible to get rid of this MULTI crap, simply set the "multiness" to 1 for non-multi setups. How big overhead will that generate? [...]
btw you might want to rebase on top of latest u-boot-usb.

author
#2 lore raw

PATCH v2 1/1 USB: EHCI: Initialize multiple USB controllers at once

Quoted 7 lines

-----Original Message-----
From: Marek Vasut [mailto:marex at denx.de]
Sent: Sunday, August 12, 2012 7:47 AM
To: Jim Lin
Cc: u-boot at lists.denx.de; Wolfgang Denk; Tom Warren
Subject: Re: [U-Boot] [PATCH v2 1/1] USB: EHCI: Initialize multiple USB controllers at once

Quoted 12 lines
Quoted 10 lines
common/cmd_usb.c index renamed from common/cmd_usb.c +0 -0

a8e3ae5..8d3093b 100644

common/cmd_usb.c +0 -0
@@ -554,7 +554,17 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, 

char
* const argv[]) }

        if (strncmp(argv[1], "tree", 4) == 0) {
                printf("\nDevice Tree:\n");

+#ifdef CONFIG_USB_MULTI

How's this supposed to work? Shouldn't this call usb_show_tree on roots of all the trees?

You see the following if dev->parent is NULL that means it's the only root hub under a controller , then we show devices under this root hub of the controller by usb_show_tree. Root hub under different controller is listed as separate device.

Quoted 60 lines
Quoted 60 lines
common/cmd_usb.c +9 -0
+               for (i = 0; i < USB_MAX_DEVICE; i++) {
+                       dev = usb_get_dev_index(i);
+                       if (dev == NULL)
+                               break;
+                       if (dev->parent == NULL)
+                               usb_show_tree(dev);
+               }
+#else
                usb_show_tree(usb_get_dev_index(0));
+#endif
                return 0;
        }
        if (strncmp(argv[1], "inf", 3) == 0) { diff --git 

a/common/usb.c b/common/usb.c index 1b40228..065c70c 100644

common/usb.c +13 -0
 
+#endif
+       USB_PRINTF("scan end\n");
+               usb_started = 1;
+               return 0;
+       } else {
+               printf("Error, couldn't init Lowlevel part\n");
+               usb_started = 0;
+               return -1;
+       }
+}
+
+/********************************************************************
+*****

***** + * Stop USB this stops the LowLevel Part and deregisters USB devices. + */

common/usb.c +15 -0
+int usb_stop(void)
+{
+       int i;
+
+       if (usb_started) {
+               asynch_allowed = 1;
+               usb_started = 0;
+               usb_hub_reset();
+               for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++)
+                       usb_lowlevel_stop(i);
+       }
+       return 0;
+}
+#else
 /**********************************************************************
  * some forward declerations...
  */
@@ -127,6 +210,7 @@ int usb_stop(void)
        }
        return res;
 }
+#endif
 
 /*
  * disables the asynch behaviour of the control message. This is used 

for data @@ -750,11 +834,18 @@ struct usb_device *usb_get_dev_index(int index) return &usb_dev[index]; }

Quoted 4 lines

common/usb.c struct usb_device *usb_get_dev_index(int index) · line 837

Quoted 2 lines
common/usb.c +1 -1
-
+#ifdef CONFIG_USB_MULTI

I still believe it's possible to get rid of this MULTI crap, simply set the "multiness" to 1 for non-multi setups. How big overhead will that generate?

I assume you want me to use code in ifdef CONFIG_USB_MULTI block, remove CONFIG_USB_MULTI and if CONFIG_USB_MAX_CONTROLLER_COUNT is 1 , then do non-multi setups.

nvpublic

#3 lore raw

PATCH v2 1/1 USB: EHCI: Initialize multiple USB controllers at once

Dear Jim Lin,

Quoted 25 lines
Quoted 16 lines

-----Original Message-----
From: Marek Vasut [mailto:marex at denx.de]
Sent: Sunday, August 12, 2012 7:47 AM
To: Jim Lin
Cc: u-boot at lists.denx.de; Wolfgang Denk; Tom Warren
Subject: Re: [U-Boot] [PATCH v2 1/1] USB: EHCI: Initialize multiple USB controllers at once

Quoted 8 lines
common/cmd_usb.c index renamed from common/cmd_usb.c +0 -0

a8e3ae5..8d3093b 100644

common/cmd_usb.c +0 -0
@@ -554,7 +554,17 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc,

char
* const argv[]) }

Quoted 8 lines
Quoted 5 lines
        if (strncmp(argv[1], "tree", 4) == 0) {
        
                printf("\nDevice Tree:\n");

+#ifdef CONFIG_USB_MULTI

How's this supposed to work? Shouldn't this call usb_show_tree on roots of all the trees?

Quoted 4 lines

You see the following if dev->parent is NULL that means it's the only root hub under a controller , then we show devices under this root hub of the controller by usb_show_tree. Root hub under different controller is listed as separate device.

So if you set USB_MAX_DEVICE to 1, this code won't need the ifdefs? :)

Quoted 22 lines
Quoted 22 lines
Quoted 22 lines
common/cmd_usb.c +9 -0
+               for (i = 0; i < USB_MAX_DEVICE; i++) {
+                       dev = usb_get_dev_index(i);
+                       if (dev == NULL)
+                               break;
+                       if (dev->parent == NULL)
+                               usb_show_tree(dev);
+               }
+#else
 
                usb_show_tree(usb_get_dev_index(0));
 
+#endif
 
                return 0;
 
        }
        if (strncmp(argv[1], "inf", 3) == 0) { diff --git

a/common/usb.c b/common/usb.c index 1b40228..065c70c 100644

common/usb.c +0 -0
Quoted 6 lines
Quoted 6 lines

common/usb.c static int asynch_allowed; · line 140

Quoted 6 lines
common/usb.c +6 -0
+#endif
+       USB_PRINTF("scan end\n");
+               usb_started = 1;
+               return 0;
+       } else {
+               printf("Error, couldn't init Lowlevel part\n");

puts();

Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
common/usb.c +5 -0
+               usb_started = 0;
+               return -1;
+       }
+}
+
Quoted 8 lines
Quoted 8 lines

common/usb.c static int asynch_allowed; · line 152

Quoted 8 lines
common/usb.c +2 -0
+/********************************************************************
+*****

***** + * Stop USB this stops the LowLevel Part and deregisters USB devices. + */

common/usb.c +4 -0
+int usb_stop(void)
+{
+       int i;
+

if (!started)
return 0;

... do the work ...

;-)

Quoted 39 lines
Quoted 32 lines
Quoted 32 lines
common/usb.c +11 -0
+       if (usb_started) {
+               asynch_allowed = 1;
+               usb_started = 0;
+               usb_hub_reset();
+               for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++)
+                       usb_lowlevel_stop(i);
+       }
+       return 0;
+}
+#else
 
 /**********************************************************************
 
  * some forward declerations...
  */
@@ -127,6 +210,7 @@ int usb_stop(void)
 
        }
        return res;
 
 }
 
+#endif

/*

* disables the asynch behaviour of the control message. This is used

for data @@ -750,11 +834,18 @@ struct usb_device *usb_get_dev_index(int index) return &usb_dev[index]; }

Quoted 6 lines

common/usb.c struct usb_device *usb_get_dev_index(int index) · line 837

Quoted 2 lines
common/usb.c +1 -1
-
+#ifdef CONFIG_USB_MULTI

I still believe it's possible to get rid of this MULTI crap, simply set the "multiness" to 1 for non-multi setups. How big overhead will that generate?

Quoted 2 lines

I assume you want me to use code in ifdef CONFIG_USB_MULTI block, remove CONFIG_USB_MULTI

Yes!

Quoted 2 lines

and if CONFIG_USB_MAX_CONTROLLER_COUNT is 1
, then do non-multi setups.

No ;-) Why can't the "multi setups" be used for "non-multi" configuration?

Quoted 5 lines

nvpublic
_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

author
#4 lore raw

PATCH v2 1/1 USB: EHCI: Initialize multiple USB controllers at once

In reply to Marek Vasut
Quoted 34 lines

-----Original Message-----
From: Marek Vasut [mailto:marex at denx.de]
Sent: Sunday, August 12, 2012 7:47 AM
To: Jim Lin
Cc: u-boot at lists.denx.de; Wolfgang Denk; Tom Warren
Subject: Re: [U-Boot] [PATCH v2 1/1] USB: EHCI: Initialize multiple USB controllers at once

Dear Jim Lin,

Quoted 9 lines

Add support for command line "usb reset" or "usb start" to initialize , "usb stop" to stop multiple USB controllers at once. Other command like "usb tree" also supports multiple controllers.

New added definitions in header file are:
CONFIG_USB_MULTI
CONFIG_USB_MAX_CONTROLLER_COUNT

---

Quoted 15 lines

Changes in v2:
- Renaming from CONFIG_USB_INIT_MULTI to CONFIG_USB_MULTI
- Define CONFIG_USB_MAX_CONTROLLER_COUNT as 1 if not defined
- Remove volatile from structure ehci_ctrl of ehci-hcd.c for a checkpatch.pl warning

 common/cmd_usb.c            |   10 +++
 common/usb.c                |   98 +++++++++++++++++++++++++-
 common/usb_hub.c            |    4 +
 drivers/usb/host/ehci-hcd.c |  167
+++++++++++++++++++++++++++++++----------- drivers/usb/host/ehci.h     |  
 5 ++
 include/usb.h               |   12 +++
 6 files changed, 251 insertions(+), 45 deletions(-)
Quoted 12 lines
Quoted 10 lines
common/cmd_usb.c index renamed from common/cmd_usb.c +0 -0

a8e3ae5..8d3093b 100644

common/cmd_usb.c +0 -0
@@ -554,7 +554,17 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, 

char
* const argv[]) }

        if (strncmp(argv[1], "tree", 4) == 0) {
                printf("\nDevice Tree:\n");

+#ifdef CONFIG_USB_MULTI

How's this supposed to work? Shouldn't this call usb_show_tree on roots of all the trees?

See the following code, if dev->parent is NULL, then current device is root hub, we show devices below it

Quoted 69 lines
Quoted 69 lines
common/cmd_usb.c +9 -0
+               for (i = 0; i < USB_MAX_DEVICE; i++) {
+                       dev = usb_get_dev_index(i);
+                       if (dev == NULL)
+                               break;
+                       if (dev->parent == NULL)
+                               usb_show_tree(dev);
+               }
+#else
                usb_show_tree(usb_get_dev_index(0));
+#endif
                return 0;
        }
        if (strncmp(argv[1], "inf", 3) == 0) { diff --git 

a/common/usb.c b/common/usb.c index 1b40228..065c70c 100644

common/usb.c +48 -0
@@ -77,6 +77,89 @@ static int asynch_allowed;
 
 char usb_started; /* flag for the started/stopped USB status */
 
+#ifdef CONFIG_USB_MULTI
+/********************************************************************
+*****
 ** + * Init USB Device
+ */
+#ifndef CONFIG_USB_MAX_CONTROLLER_COUNT #define 
+CONFIG_USB_MAX_CONTROLLER_COUNT 1 #endif
+
+int usb_init(void)
+{
+       void *ctrl;
+       int i;
+       struct usb_device *dev;
+
+       running = 0;
+       dev_index = 0;
+       asynch_allowed = 1;
+       usb_hub_reset();
+
+       /* first make all devices unknown */
+       for (i = 0; i < USB_MAX_DEVICE; i++) {
+               memset(&usb_dev[i], 0, sizeof(struct usb_device));
+               usb_dev[i].devnum = -1;
+       }
+
+       /* init low_level USB */
+       printf("USB:   ");
+       for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
+               /* init low_level USB */
+               ctrl = usb_lowlevel_init(i);
+               /*
+                * if lowlevel init is OK, scan the bus for devices
+                * i.e. search HUBs and configure them
+                */
+               if (ctrl) {
+                       running = 1;
+
+                       printf("scanning bus for devices... ");
+                       dev = usb_alloc_new_device(ctrl);
+                       /*
+                        * device 0 is always present
+                        * (root hub, so let it analyze)
+                        */
+                       if (dev)
+                               usb_new_device(dev);
+               }
+       }
+
+       if (running) {
Quoted 8 lines

common/usb.c static int asynch_allowed; · line 134

Quoted 6 lines
common/usb.c +6 -0
+               if (!dev_index)
+                       printf("No USB Device found\n");
+               else
+                       printf("%d USB Device(s) found\n", dev_index); 
+#ifdef CONFIG_USB_KEYBOARD
+       drv_usb_kbd_init();

Will the keyboard driver survive this?

Yes I have tried it after doing the following.
1. Define CONFIG_USB_KEYBOARD, CONFIG_SYS_USB_EVENT_POLL, CONFIG_USB_MULTI, and CONFIG_USB_MAX_CONTROLLER_COUNT 3 in config header file like seaboard.h to compile
2. Install USB keyboard
3. Run "usb reset" in u-boot serial console
4. Run "coninfo" to see usbkbd appeared
5. Run "setenv stdin usbkbd"
6. Typing u-boot console command on USB keyboard

--
nvpublic

#5 lore raw

PATCH v2 1/1 USB: EHCI: Initialize multiple USB controllers at once

Quoted 6 lines · Jim Lin

Marek Vasut wrote at Sunday, August 12, 2012 7:47 AM:

Quoted 5 lines

Dear Jim Lin,

Quoted 3 lines

Add support for command line "usb reset" or "usb start" to initialize , "usb stop" to stop multiple USB controllers at once. Other command like "usb tree" also supports multiple controllers.

...

Quoted 5 lines
Quoted 4 lines

common/usb.c static int asynch_allowed; · line 134

Quoted 2 lines
common/usb.c +2 -0
+#ifdef CONFIG_USB_KEYBOARD
+       drv_usb_kbd_init();

Will the keyboard driver survive this?

Quoted 8 lines

Yes I have tried it after doing the following.
1. Define CONFIG_USB_KEYBOARD, CONFIG_SYS_USB_EVENT_POLL, CONFIG_USB_MULTI, and CONFIG_USB_MAX_CONTROLLER_COUNT 3 in config header file like seaboard.h to compile
2. Install USB keyboard
3. Run "usb reset" in u-boot serial console
4. Run "coninfo" to see usbkbd appeared
5. Run "setenv stdin usbkbd"
6. Typing u-boot console command on USB keyboard

I've also tested this on Springbank, which has a built-in USB keyboard and an external USB port via a separate host controller, which I connected to an Ethernet device, and it appears to all work very well for me.

So,

#6 lore raw

PATCH v2 1/1 USB: EHCI: Initialize multiple USB controllers at once

Dear Stephen Warren,

Quoted 27 lines · Jim Lin
Quoted 6 lines

Marek Vasut wrote at Sunday, August 12, 2012 7:47 AM:

Quoted 5 lines

Dear Jim Lin,

Quoted 3 lines

Add support for command line "usb reset" or "usb start" to initialize , "usb stop" to stop multiple USB controllers at once. Other command like "usb tree" also supports multiple controllers.

...

Quoted 9 lines
Quoted 4 lines

common/usb.c static int asynch_allowed; · line 134

Quoted 2 lines
common/usb.c +2 -0
+#ifdef CONFIG_USB_KEYBOARD
+       drv_usb_kbd_init();

Will the keyboard driver survive this?

Yes I have tried it after doing the following.
1. Define CONFIG_USB_KEYBOARD, CONFIG_SYS_USB_EVENT_POLL, CONFIG_USB_MULTI, and CONFIG_USB_MAX_CONTROLLER_COUNT 3

Quoted 7 lines

in config header file like seaboard.h to compile

2. Install USB keyboard
3. Run "usb reset" in u-boot serial console
4. Run "coninfo" to see usbkbd appeared
5. Run "setenv stdin usbkbd"
6. Typing u-boot console command on USB keyboard

Quoted 8 lines

I've also tested this on Springbank, which has a built-in USB keyboard and an external USB port via a separate host controller, which I connected to an Ethernet device, and it appears to all work very well for me.

So,

Good, thanks! :)

Best regards,
Marek Vasut