[U-Boot] [PATCH 0/2] Misc. USB fixes

Hi Marek,
And last 2 misc. fixes for USB for next. The first patch is self explanatory, the second patch is a result of me looking into why u-boot's usb scanning is so sloooowwwwww, not that it really helps there, but it is a tiny start.
I've several other ideas how to speed things up, but those are more work, I've written them down for now, I've no idea if / when I'll have time to work on them.
Regards,
Hans

If the device has a parent, it is instantiated from usb_hub_port_connect_change and the portnr is right there in dev->portnr, so there is no need for this whole dance to look it up.
Signed-off-by: Hans de Goede hdegoede@redhat.com --- common/usb.c | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-)
diff --git a/common/usb.c b/common/usb.c index bd0f8d5..7d33a0f 100644 --- a/common/usb.c +++ b/common/usb.c @@ -927,7 +927,6 @@ int usb_new_device(struct usb_device *dev) * thread_id=5729457&forum_id=5398 */ __maybe_unused struct usb_device_descriptor *desc; - int port = -1; struct usb_device *parent = dev->parent; unsigned short portstatus;
@@ -965,24 +964,10 @@ int usb_new_device(struct usb_device *dev) #endif
if (parent) { - int j; - - /* find the port number we're at */ - for (j = 0; j < parent->maxchild; j++) { - if (parent->children[j] == dev) { - port = j; - break; - } - } - if (port < 0) { - printf("usb_new_device:cannot locate device's port.\n"); - return 1; - } - /* reset the port for the second time */ - err = hub_port_reset(dev->parent, port, &portstatus); + err = hub_port_reset(dev->parent, dev->portnr - 1, &portstatus); if (err < 0) { - printf("\n Couldn't reset port %i\n", port); + printf("\n Couldn't reset port %i\n", dev->portnr); return 1; } }

Do as the Linux kernel does and power on any ports which are not yet one, this is enough.
Signed-off-by: Hans de Goede hdegoede@redhat.com --- common/usb_hub.c | 39 --------------------------------------- 1 file changed, 39 deletions(-)
diff --git a/common/usb_hub.c b/common/usb_hub.c index c416e5e..0f1eab4 100644 --- a/common/usb_hub.c +++ b/common/usb_hub.c @@ -86,50 +86,11 @@ static void usb_hub_power_on(struct usb_hub_device *hub) int i; struct usb_device *dev; unsigned pgood_delay = hub->desc.bPwrOn2PwrGood * 2; - ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1); - unsigned short portstatus; - int ret;
dev = hub->pusb_dev;
- /* - * Enable power to the ports: - * Here we Power-cycle the ports: aka, - * turning them off and turning on again. - */ debug("enabling power on all ports\n"); for (i = 0; i < dev->maxchild; i++) { - usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_POWER); - debug("port %d returns %lX\n", i + 1, dev->status); - } - - /* Wait at least 2*bPwrOn2PwrGood for PP to change */ - mdelay(pgood_delay); - - for (i = 0; i < dev->maxchild; i++) { - ret = usb_get_port_status(dev, i + 1, portsts); - if (ret < 0) { - debug("port %d: get_port_status failed\n", i + 1); - continue; - } - - /* - * Check to confirm the state of Port Power: - * xHCI says "After modifying PP, s/w shall read - * PP and confirm that it has reached the desired state - * before modifying it again, undefined behavior may occur - * if this procedure is not followed". - * EHCI doesn't say anything like this, but no harm in keeping - * this. - */ - portstatus = le16_to_cpu(portsts->wPortStatus); - if (portstatus & (USB_PORT_STAT_POWER << 1)) { - debug("port %d: Port power change failed\n", i + 1); - continue; - } - } - - for (i = 0; i < dev->maxchild; i++) { usb_set_port_feature(dev, i + 1, USB_PORT_FEAT_POWER); debug("port %d returns %lX\n", i + 1, dev->status); }

On Saturday, September 20, 2014 at 05:03:51 PM, Hans de Goede wrote:
Hi Marek,
And last 2 misc. fixes for USB for next. The first patch is self explanatory, the second patch is a result of me looking into why u-boot's usb scanning is so sloooowwwwww, not that it really helps there, but it is a tiny start.
I've several other ideas how to speed things up, but those are more work, I've written them down for now, I've no idea if / when I'll have time to work on them.
Applied both, thanks a lot!
Best regards, Marek Vasut
participants (2)
-
Hans de Goede
-
Marek Vasut