diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-09-11 17:23:33 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-09-11 17:23:33 +0200 |
commit | 742ba2bf084c8d7f6db6af5ce02ebc4d848df013 (patch) | |
tree | dd9293a6967ef1b8d8cf81616541d6424511561b | |
parent | 87e86dd252bdbbb8b429f28445b92fccfb988819 (diff) | |
parent | 0a6a3b4601a89c12bf22bef382083cbbbe8582b5 (diff) | |
download | barebox-742ba2bf084c8d7f6db6af5ce02ebc4d848df013.tar.gz barebox-742ba2bf084c8d7f6db6af5ce02ebc4d848df013.tar.xz |
Merge branch 'for-next/usb'
-rw-r--r-- | drivers/usb/core/hub.c | 55 | ||||
-rw-r--r-- | drivers/usb/core/hub.h | 4 | ||||
-rw-r--r-- | drivers/usb/core/usb.c | 3 |
3 files changed, 31 insertions, 31 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index f44aea55af..39e5fe67d4 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -112,32 +112,31 @@ static inline char *portspeed(int portstatus) return "12 Mb/s"; } -int hub_port_reset(struct usb_device *dev, int port, - unsigned short *portstat) +int hub_port_reset(struct usb_device *hub, int port, struct usb_device *usb) { int tries; struct usb_port_status portsts; unsigned short portstatus, portchange; - dev_dbg(&dev->dev, "hub_port_reset: resetting port %d...\n", port); + dev_dbg(&hub->dev, "hub_port_reset: resetting port %d...\n", port); for (tries = 0; tries < MAX_TRIES; tries++) { - usb_set_port_feature(dev, port + 1, USB_PORT_FEAT_RESET); + usb_set_port_feature(hub, port + 1, USB_PORT_FEAT_RESET); mdelay(200); - if (usb_get_port_status(dev, port + 1, &portsts) < 0) { - dev_dbg(&dev->dev, "get_port_status failed status %lX\n", - dev->status); + if (usb_get_port_status(hub, port + 1, &portsts) < 0) { + dev_dbg(&hub->dev, "get_port_status failed status %lX\n", + hub->status); return -1; } portstatus = le16_to_cpu(portsts.wPortStatus); portchange = le16_to_cpu(portsts.wPortChange); - dev_dbg(&dev->dev, "portstatus %x, change %x, %s\n", + dev_dbg(&hub->dev, "portstatus %x, change %x, %s\n", portstatus, portchange, portspeed(portstatus)); - dev_dbg(&dev->dev, "STAT_C_CONNECTION = %d STAT_CONNECTION = %d" \ + dev_dbg(&hub->dev, "STAT_C_CONNECTION = %d STAT_CONNECTION = %d" \ " USB_PORT_STAT_ENABLE %d\n", (portchange & USB_PORT_STAT_C_CONNECTION) ? 1 : 0, (portstatus & USB_PORT_STAT_CONNECTION) ? 1 : 0, @@ -154,14 +153,21 @@ int hub_port_reset(struct usb_device *dev, int port, } if (tries == MAX_TRIES) { - dev_dbg(&dev->dev, "Cannot enable port %i after %i retries, " \ + dev_dbg(&hub->dev, "Cannot enable port %i after %i retries, " \ "disabling port.\n", port + 1, MAX_TRIES); - dev_dbg(&dev->dev, "Maybe the USB cable is bad?\n"); + dev_dbg(&hub->dev, "Maybe the USB cable is bad?\n"); return -1; } - usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_C_RESET); - *portstat = portstatus; + usb_clear_port_feature(hub, port + 1, USB_PORT_FEAT_C_RESET); + + if (portstatus & USB_PORT_STAT_HIGH_SPEED) + usb->speed = USB_SPEED_HIGH; + else if (portstatus & USB_PORT_STAT_LOW_SPEED) + usb->speed = USB_SPEED_LOW; + else + usb->speed = USB_SPEED_FULL; + return 0; } @@ -203,26 +209,20 @@ static void usb_hub_port_connect_change(struct usb_device *dev, int port) mdelay(200); - /* Reset the port */ - if (hub_port_reset(dev, port, &portstatus) < 0) { + /* Allocate a new device struct for the port */ + usb = usb_alloc_new_device(); + usb->dev.parent = &dev->dev; + usb->host = dev->host; + + /* Reset it */ + if (hub_port_reset(dev, port, usb) < 0) { dev_warn(&dev->dev, "cannot reset port %i!?\n", port + 1); + usb_free_device(usb); return; } mdelay(200); - /* Allocate a new device struct for it */ - usb = usb_alloc_new_device(); - usb->dev.parent = &dev->dev; - usb->host = dev->host; - - if (portstatus & USB_PORT_STAT_HIGH_SPEED) - usb->speed = USB_SPEED_HIGH; - else if (portstatus & USB_PORT_STAT_LOW_SPEED) - usb->speed = USB_SPEED_LOW; - else - usb->speed = USB_SPEED_FULL; - dev->children[port] = usb; usb->parent = dev; usb->portnr = port + 1; @@ -233,6 +233,7 @@ static void usb_hub_port_connect_change(struct usb_device *dev, int port) dev_dbg(&dev->dev, "hub: disabling port %d\n", port + 1); usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_ENABLE); usb_free_device(usb); + dev->children[port] = NULL; return; } diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h index fcf1f0c18a..74921b66fd 100644 --- a/drivers/usb/core/hub.h +++ b/drivers/usb/core/hub.h @@ -1,7 +1,7 @@ #ifndef __CORE_HUB_H #define __CORE_HUB_H -int hub_port_reset(struct usb_device *dev, int port, - unsigned short *portstat); +int hub_port_reset(struct usb_device *hub, int port, + struct usb_device *usb); #endif /* __CORE_HUB_H */ diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 9170ba4d53..70ded6ded1 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -312,7 +312,6 @@ int usb_new_device(struct usb_device *dev) void *buf; struct usb_device_descriptor *desc; struct usb_device *parent = dev->parent; - unsigned short portstatus; char str[16]; buf = dma_alloc(USB_BUFSIZ); @@ -352,7 +351,7 @@ int usb_new_device(struct usb_device *dev) /* find the port number we're at */ if (parent) { /* reset the port for the second time */ - err = hub_port_reset(dev->parent, dev->portnr - 1, &portstatus); + err = hub_port_reset(dev->parent, dev->portnr - 1, dev); if (err < 0) { printf("\n Couldn't reset port %i\n", dev->portnr); goto err_out; |