summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2018-09-11 17:23:33 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2018-09-11 17:23:33 +0200
commit742ba2bf084c8d7f6db6af5ce02ebc4d848df013 (patch)
treedd9293a6967ef1b8d8cf81616541d6424511561b
parent87e86dd252bdbbb8b429f28445b92fccfb988819 (diff)
parent0a6a3b4601a89c12bf22bef382083cbbbe8582b5 (diff)
downloadbarebox-742ba2bf084c8d7f6db6af5ce02ebc4d848df013.tar.gz
barebox-742ba2bf084c8d7f6db6af5ce02ebc4d848df013.tar.xz
Merge branch 'for-next/usb'
-rw-r--r--drivers/usb/core/hub.c55
-rw-r--r--drivers/usb/core/hub.h4
-rw-r--r--drivers/usb/core/usb.c3
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;