summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/usb/uhub.c9
-rw-r--r--sys/dev/usb/usb.c11
-rw-r--r--sys/dev/usb/usbdivar.h4
3 files changed, 19 insertions, 5 deletions
diff --git a/sys/dev/usb/uhub.c b/sys/dev/usb/uhub.c
index 56033142051..0aa3c6129eb 100644
--- a/sys/dev/usb/uhub.c
+++ b/sys/dev/usb/uhub.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uhub.c,v 1.27 2004/12/09 11:49:55 dlg Exp $ */
+/* $OpenBSD: uhub.c,v 1.28 2004/12/12 05:17:40 dlg Exp $ */
/* $NetBSD: uhub.c,v 1.64 2003/02/08 03:32:51 ichiro Exp $ */
/* $FreeBSD: src/sys/dev/usb/uhub.c,v 1.18 1999/11/17 22:33:43 n_hibma Exp $ */
@@ -295,6 +295,7 @@ USB_ATTACH(uhub)
else
up->power = USB_MIN_POWER;
up->restartcnt = 0;
+ up->reattach = 0;
}
/* XXX should check for none, individual, or ganged power? */
@@ -412,7 +413,7 @@ uhub_explore(usbd_device_handle dev)
usbd_status err;
int speed;
int port;
- int change, status;
+ int change, status, reconnect;
DPRINTFN(10, ("uhub_explore dev=%p addr=%d\n", dev, dev->address));
@@ -425,6 +426,8 @@ uhub_explore(usbd_device_handle dev)
for(port = 1; port <= hd->bNbrPorts; port++) {
up = &dev->hub->ports[port-1];
+ reconnect = up->reattach;
+ up->reattach = 0;
err = usbd_get_port_status(dev, port, &up->status);
if (err) {
DPRINTF(("uhub_explore: get port status failed, "
@@ -459,7 +462,7 @@ uhub_explore(usbd_device_handle dev)
USBDEVNAME(sc->sc_dev), port);
}
}
- if (!(change & UPS_C_CONNECT_STATUS)) {
+ if (!reconnect && !(change & UPS_C_CONNECT_STATUS)) {
DPRINTFN(3,("uhub_explore: port=%d !C_CONNECT_"
"STATUS\n", port));
/* No status change, just do recursive explore. */
diff --git a/sys/dev/usb/usb.c b/sys/dev/usb/usb.c
index 6d7f6d242b9..b5aa2161c6b 100644
--- a/sys/dev/usb/usb.c
+++ b/sys/dev/usb/usb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: usb.c,v 1.29 2004/07/08 22:18:44 deraadt Exp $ */
+/* $OpenBSD: usb.c,v 1.30 2004/12/12 05:17:40 dlg Exp $ */
/* $NetBSD: usb.c,v 1.77 2003/01/01 00:10:26 thorpej Exp $ */
/*
@@ -672,6 +672,15 @@ usb_needs_explore(usbd_device_handle dev)
wakeup(&dev->bus->needs_explore);
}
+void
+usb_needs_reattach(usbd_device_handle dev)
+{
+ DPRINTFN(2,("usb_needs_reattach\n"));
+ dev->powersrc->reattach = 1;
+ dev->bus->needs_explore = 1;
+ wakeup(&dev->bus->needs_explore);
+}
+
/* Called at splusb() */
int
usb_get_next_event(struct usb_event *ue)
diff --git a/sys/dev/usb/usbdivar.h b/sys/dev/usb/usbdivar.h
index be9534447f7..70537942206 100644
--- a/sys/dev/usb/usbdivar.h
+++ b/sys/dev/usb/usbdivar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: usbdivar.h,v 1.20 2004/12/09 11:49:55 dlg Exp $ */
+/* $OpenBSD: usbdivar.h,v 1.21 2004/12/12 05:17:40 dlg Exp $ */
/* $NetBSD: usbdivar.h,v 1.70 2002/07/11 21:14:36 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usbdivar.h,v 1.11 1999/11/17 22:33:51 n_hibma Exp $ */
@@ -80,6 +80,7 @@ struct usbd_port {
u_int8_t portno;
u_int8_t restartcnt;
#define USBD_RESTART_MAX 5
+ u_int8_t reattach;
struct usbd_device *device; /* Connected device */
struct usbd_device *parent; /* The ports hub */
};
@@ -260,6 +261,7 @@ void usb_disconnect_port(struct usbd_port *up, device_ptr_t);
/* Routines from usb.c */
void usb_needs_explore(usbd_device_handle);
+void usb_needs_reattach(usbd_device_handle);
void usb_schedsoftintr(struct usbd_bus *);
/*