Module Name: src
Committed By: mrg
Date: Tue Sep 18 01:36:44 UTC 2018
Modified Files:
src/sys/dev/usb: uhub.c usb_subr.c
Log Message:
add config_pending usage to uhub and general USB device attachment.
- call config_pending_incr() and config_pending_decr() around attaching
devices against "usbdevif" attribute.
uhub:
- convert sc_explorepending and sc_running to bool. add new sc_first_explore.
- call config_pending_incr() at the start of uhub_attach(). dropped in
uhub_explore(), if this is the first explore.
To generate a diff of this commit:
cvs rdiff -u -r1.138 -r1.139 src/sys/dev/usb/uhub.c
cvs rdiff -u -r1.226 -r1.227 src/sys/dev/usb/usb_subr.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/usb/uhub.c
diff -u src/sys/dev/usb/uhub.c:1.138 src/sys/dev/usb/uhub.c:1.139
--- src/sys/dev/usb/uhub.c:1.138 Thu Feb 1 09:50:48 2018
+++ src/sys/dev/usb/uhub.c Tue Sep 18 01:36:44 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: uhub.c,v 1.138 2018/02/01 09:50:48 msaitoh Exp $ */
+/* $NetBSD: uhub.c,v 1.139 2018/09/18 01:36:44 mrg Exp $ */
/* $FreeBSD: src/sys/dev/usb/uhub.c,v 1.18 1999/11/17 22:33:43 n_hibma Exp $ */
/* $OpenBSD: uhub.c,v 1.86 2015/06/29 18:27:40 mpi Exp $ */
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uhub.c,v 1.138 2018/02/01 09:50:48 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uhub.c,v 1.139 2018/09/18 01:36:44 mrg Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -113,9 +113,9 @@ struct uhub_softc {
uint8_t *sc_statuspend;
uint8_t *sc_status;
size_t sc_statuslen;
- int sc_explorepending;
-
- u_char sc_running;
+ bool sc_explorepending;
+ bool sc_first_explore;
+ bool sc_running;
};
#define UHUB_IS_HIGH_SPEED(sc) \
@@ -263,6 +263,8 @@ uhub_attach(device_t parent, device_t se
usb_endpoint_descriptor_t *ed;
struct usbd_tt *tts = NULL;
+ config_pending_incr(self);
+
UHUBHIST_FUNC(); UHUBHIST_CALLED();
sc->sc_dev = self;
@@ -284,14 +286,14 @@ uhub_attach(device_t parent, device_t se
if (err) {
DPRINTF("configuration failed, sc %#jx error %jd",
(uintptr_t)sc, err, 0, 0);
- return;
+ goto bad2;
}
if (dev->ud_depth > USB_HUB_MAX_DEPTH) {
aprint_error_dev(self,
"hub depth (%d) exceeded, hub ignored\n",
USB_HUB_MAX_DEPTH);
- return;
+ goto bad2;
}
/* Get hub descriptor. */
@@ -301,7 +303,7 @@ uhub_attach(device_t parent, device_t se
if (err) {
DPRINTF("getting hub descriptor failed, uhub%jd error %jd",
device_unit(self), err, 0, 0);
- return;
+ goto bad2;
}
for (nremov = 0, port = 1; port <= nports; port++)
@@ -365,7 +367,7 @@ uhub_attach(device_t parent, device_t se
/* force initial scan */
memset(sc->sc_status, 0xff, sc->sc_statuslen);
- sc->sc_explorepending = 1;
+ sc->sc_explorepending = true;
err = usbd_open_pipe_intr(iface, ed->bEndpointAddress,
USBD_SHORT_XFER_OK|USBD_MPSAFE, &sc->sc_ipipe, sc,
@@ -450,8 +452,8 @@ uhub_attach(device_t parent, device_t se
usbd_delay_ms(dev, pwrdly);
/* The usual exploration will finish the setup. */
-
- sc->sc_running = 1;
+ sc->sc_running = true;
+ sc->sc_first_explore = true;
if (!pmf_device_register(self, NULL, NULL))
aprint_error_dev(self, "couldn't establish power handler\n");
@@ -469,7 +471,8 @@ uhub_attach(device_t parent, device_t se
kmem_free(hub,
sizeof(*hub) + (nports-1) * sizeof(struct usbd_port));
dev->ud_hub = NULL;
- return;
+ bad2:
+ config_pending_decr(self);
}
usbd_status
@@ -778,7 +781,7 @@ uhub_explore(struct usbd_device *dev)
}
}
mutex_enter(&sc->sc_lock);
- sc->sc_explorepending = 0;
+ sc->sc_explorepending = false;
for (int i = 0; i < sc->sc_statuslen; i++) {
if (sc->sc_statuspend[i] != 0) {
memcpy(sc->sc_status, sc->sc_statuspend,
@@ -789,6 +792,10 @@ uhub_explore(struct usbd_device *dev)
}
}
mutex_exit(&sc->sc_lock);
+ if (sc->sc_first_explore) {
+ config_pending_decr(sc->sc_dev);
+ sc->sc_first_explore = false;
+ }
return USBD_NORMAL_COMPLETION;
}
@@ -943,7 +950,7 @@ uhub_intr(struct usbd_xfer *xfer, void *
}
if (!sc->sc_explorepending) {
- sc->sc_explorepending = 1;
+ sc->sc_explorepending = true;
memcpy(sc->sc_status, sc->sc_statuspend,
sc->sc_statuslen);
Index: src/sys/dev/usb/usb_subr.c
diff -u src/sys/dev/usb/usb_subr.c:1.226 src/sys/dev/usb/usb_subr.c:1.227
--- src/sys/dev/usb/usb_subr.c:1.226 Thu Aug 2 06:09:04 2018
+++ src/sys/dev/usb/usb_subr.c Tue Sep 18 01:36:44 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: usb_subr.c,v 1.226 2018/08/02 06:09:04 riastradh Exp $ */
+/* $NetBSD: usb_subr.c,v 1.227 2018/09/18 01:36:44 mrg Exp $ */
/* $FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $ */
/*
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.226 2018/08/02 06:09:04 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.227 2018/09/18 01:36:44 mrg Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -907,6 +907,7 @@ usbd_attachwholedevice(device_t parent,
dlocs[USBDEVIFCF_INTERFACE] = -1;
KERNEL_LOCK(1, curlwp);
+ config_pending_incr(parent);
dv = config_found_sm_loc(parent, "usbdevif", dlocs, &uaa, usbd_print,
config_stdsubmatch);
KERNEL_UNLOCK_ONE(curlwp);
@@ -917,6 +918,7 @@ usbd_attachwholedevice(device_t parent,
dev->ud_nifaces_claimed = 1; /* XXX */
usbd_serialnumber(dv, dev);
}
+ config_pending_decr(parent);
return USBD_NORMAL_COMPLETION;
}