[U-Boot] [PATCH v2 16/80] dm: usb: Refactor port resets
Simon Glass
sjg at chromium.org
Wed Mar 25 19:22:04 CET 2015
Move the port reset code into its own function. Rename usb_hub_reset() to
indicate that is is now a legacy function.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
Changes in v2: None
common/usb.c | 40 ++++++++++++++++++++++++++--------------
common/usb_hub.c | 4 ++--
include/usb.h | 18 +++++++++++++++++-
3 files changed, 45 insertions(+), 17 deletions(-)
diff --git a/common/usb.c b/common/usb.c
index 330e6a2..4ab2213 100644
--- a/common/usb.c
+++ b/common/usb.c
@@ -871,6 +871,26 @@ __weak int usb_alloc_device(struct usb_device *udev)
{
return 0;
}
+
+int usb_legacy_port_reset(struct usb_device *hub, int portnr)
+{
+ if (hub) {
+ unsigned short portstatus;
+ int err;
+
+ /* reset the port for the second time */
+ err = legacy_hub_port_reset(hub, portnr - 1, &portstatus);
+ if (err < 0) {
+ printf("\n Couldn't reset port %i\n", portnr);
+ return err;
+ }
+ } else {
+ usb_reset_root_port();
+ }
+
+ return 0;
+}
+
/*
* By the time we get here, the device has gotten a new device ID
* and is in the default state. We need to identify the thing and
@@ -907,9 +927,6 @@ int usb_new_device(struct usb_device *dev)
* http://sourceforge.net/mailarchive/forum.php?
* thread_id=5729457&forum_id=5398
*/
- __maybe_unused struct usb_device_descriptor *desc;
- struct usb_device *parent = dev->parent;
- unsigned short portstatus;
/*
* send 64-byte GET-DEVICE-DESCRIPTOR request. Since the descriptor is
@@ -917,7 +934,6 @@ int usb_new_device(struct usb_device *dev)
* the maxpacket size is 8 or 16 the device may be waiting to transmit
* some more, or keeps on retransmitting the 8 byte header. */
- desc = (struct usb_device_descriptor *)tmpbuf;
dev->descriptor.bMaxPacketSize0 = 64; /* Start off at 64 bytes */
/* Default to 64 byte max packet size */
dev->maxpacketsize = PACKET_SIZE_64;
@@ -931,6 +947,9 @@ int usb_new_device(struct usb_device *dev)
* of that is done for XHCI unlike EHCI.
*/
#ifndef CONFIG_USB_XHCI
+ struct usb_device_descriptor *desc;
+
+ desc = (struct usb_device_descriptor *)tmpbuf;
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
if (err < 0) {
debug("usb_new_device: usb_get_descriptor() failed\n");
@@ -945,16 +964,9 @@ int usb_new_device(struct usb_device *dev)
dev->descriptor.bDeviceClass = desc->bDeviceClass;
#endif
- if (parent) {
- /* reset the port for the second time */
- err = hub_port_reset(dev->parent, dev->portnr - 1, &portstatus);
- if (err < 0) {
- printf("\n Couldn't reset port %i\n", dev->portnr);
- return 1;
- }
- } else {
- usb_reset_root_port();
- }
+ err = usb_legacy_port_reset(dev->parent, dev->portnr);
+ if (err)
+ return err;
dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
diff --git a/common/usb_hub.c b/common/usb_hub.c
index 7199e25..49fa5a6 100644
--- a/common/usb_hub.c
+++ b/common/usb_hub.c
@@ -141,7 +141,7 @@ static inline char *portspeed(int portstatus)
return speed_str;
}
-int hub_port_reset(struct usb_device *dev, int port,
+int legacy_hub_port_reset(struct usb_device *dev, int port,
unsigned short *portstat)
{
int tries;
@@ -241,7 +241,7 @@ int usb_hub_port_connect_change(struct usb_device *dev, int port)
mdelay(200);
/* Reset the port */
- ret = hub_port_reset(dev, port, &portstatus);
+ ret = legacy_hub_port_reset(dev, port, &portstatus);
if (ret < 0) {
printf("cannot reset port %i!?\n", port + 1);
return ret;
diff --git a/include/usb.h b/include/usb.h
index 11ff5ab..badb287 100644
--- a/include/usb.h
+++ b/include/usb.h
@@ -700,9 +700,25 @@ bool usb_device_has_child_on_port(struct usb_device *parent, int port);
int usb_hub_probe(struct usb_device *dev, int ifnum);
void usb_hub_reset(void);
-int hub_port_reset(struct usb_device *dev, int port,
+
+/**
+ * legacy_hub_port_reset() - reset a port given its usb_device pointer
+ *
+ * Reset a hub port and see if a device is present on that port, providing
+ * sufficient time for it to show itself. The port status is returned.
+ *
+ * With driver model this moves to hub_port_reset() and is passed a struct
+ * udevice.
+ *
+ * @dev: USB device to reset
+ * @port: Port number to reset (note ports are numbered from 0 here)
+ * @portstat: Returns port status
+ */
+int legacy_hub_port_reset(struct usb_device *dev, int port,
unsigned short *portstat);
+int hub_port_reset(struct udevice *dev, int port, unsigned short *portstat);
+
/**
* usb_alloc_new_device() - Allocate a new device
*
--
2.2.0.rc0.207.ga3a616c
More information about the U-Boot
mailing list