Date: Mon, 24 Aug 2009 04:58:11 +0000 (UTC) From: Alfred Perlstein <alfred@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r196488 - head/sys/dev/usb/controller Message-ID: <200908240458.n7O4wB27082241@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: alfred Date: Mon Aug 24 04:58:11 2009 New Revision: 196488 URL: http://svn.freebsd.org/changeset/base/196488 Log: - allow disabling "root_mount_hold()" by setting a sysctl/tunable at boot - remove some redundant initial explore code Submitted by: hps Modified: head/sys/dev/usb/controller/usb_controller.c Modified: head/sys/dev/usb/controller/usb_controller.c ============================================================================== --- head/sys/dev/usb/controller/usb_controller.c Mon Aug 24 04:57:48 2009 (r196487) +++ head/sys/dev/usb/controller/usb_controller.c Mon Aug 24 04:58:11 2009 (r196488) @@ -67,7 +67,6 @@ static device_attach_t usb_attach; static device_detach_t usb_detach; static void usb_attach_sub(device_t, struct usb_bus *); -static void usb_post_init(void *); /* static variables */ @@ -84,8 +83,6 @@ TUNABLE_INT("hw.usb.no_boot_wait", &usb_ SYSCTL_INT(_hw_usb, OID_AUTO, no_boot_wait, CTLFLAG_RDTUN, &usb_no_boot_wait, 0, "No device enumerate waiting at boot."); -static uint8_t usb_post_init_called = 0; - static devclass_t usb_devclass; static device_method_t usb_methods[] = { @@ -142,12 +139,8 @@ usb_attach(device_t dev) bus->bus_roothold = root_mount_hold(device_get_nameunit(dev)); } - if (usb_post_init_called) { - mtx_lock(&Giant); - usb_attach_sub(dev, bus); - mtx_unlock(&Giant); - usb_needs_explore(bus, 1); - } + usb_attach_sub(dev, bus); + return (0); /* return success */ } @@ -226,22 +219,24 @@ usb_bus_explore(struct usb_proc_msg *pm) /* avoid zero, hence that is memory default */ bus->driver_added_refcount = 1; } - USB_BUS_UNLOCK(bus); - mtx_lock(&Giant); + /* + * The following three lines of code are only here to + * recover from DDB: + */ + usb_proc_rewakeup(&bus->control_xfer_proc); + usb_proc_rewakeup(&bus->giant_callback_proc); + usb_proc_rewakeup(&bus->non_giant_callback_proc); + + USB_BUS_UNLOCK(bus); /* * First update the USB power state! */ usb_bus_powerd(bus); - /* - * Explore the Root USB HUB. This call can sleep, - * exiting Giant, which is actually Giant. - */ - (udev->hub->explore) (udev); - - mtx_unlock(&Giant); + /* Explore the Root USB HUB. */ + (udev->hub->explore) (udev); USB_BUS_LOCK(bus); } if (bus->bus_roothold != NULL) { @@ -269,10 +264,10 @@ usb_bus_detach(struct usb_proc_msg *pm) device_set_softc(dev, NULL); USB_BUS_UNLOCK(bus); - mtx_lock(&Giant); - /* detach children first */ + mtx_lock(&Giant); bus_generic_detach(dev); + mtx_unlock(&Giant); /* * Free USB Root device, but not any sub-devices, hence they @@ -281,7 +276,6 @@ usb_bus_detach(struct usb_proc_msg *pm) usb_free_device(udev, USB_UNCFG_FLAG_FREE_EP0); - mtx_unlock(&Giant); USB_BUS_LOCK(bus); /* clear bdev variable last */ bus->bdev = NULL; @@ -297,6 +291,12 @@ usb_power_wdog(void *arg) usb_callout_reset(&bus->power_wdog, 4 * hz, usb_power_wdog, arg); + /* + * The following line of code is only here to recover from + * DDB: + */ + usb_proc_rewakeup(&bus->explore_proc); /* recover from DDB */ + USB_BUS_UNLOCK(bus); usb_bus_power_update(bus); @@ -350,7 +350,6 @@ usb_bus_attach(struct usb_proc_msg *pm) } USB_BUS_UNLOCK(bus); - mtx_lock(&Giant); /* XXX not required by USB */ /* default power_mask value */ bus->hw_power_state = @@ -383,7 +382,6 @@ usb_bus_attach(struct usb_proc_msg *pm) err = USB_ERR_NOMEM; } - mtx_unlock(&Giant); USB_BUS_LOCK(bus); if (err) { @@ -401,17 +399,18 @@ usb_bus_attach(struct usb_proc_msg *pm) /*------------------------------------------------------------------------* * usb_attach_sub * - * This function creates a thread which runs the USB attach code. It - * is factored out, hence it can be called at two different places in - * time. During bootup this function is called from - * "usb_post_init". During hot-plug it is called directly from the - * "usb_attach()" method. + * This function creates a thread which runs the USB attach code. *------------------------------------------------------------------------*/ static void usb_attach_sub(device_t dev, struct usb_bus *bus) { const char *pname = device_get_nameunit(dev); + mtx_lock(&Giant); + if (usb_devclass_ptr == NULL) + usb_devclass_ptr = devclass_find("usbus"); + mtx_unlock(&Giant); + /* Initialise USB process messages */ bus->explore_msg[0].hdr.pm_callback = &usb_bus_explore; bus->explore_msg[0].bus = bus; @@ -454,55 +453,12 @@ usb_attach_sub(device_t dev, struct usb_ /* ignore */ } USB_BUS_UNLOCK(bus); - } -} - -/*------------------------------------------------------------------------* - * usb_post_init - * - * This function is called to attach all USB busses that were found - * during bootup. - *------------------------------------------------------------------------*/ -static void -usb_post_init(void *arg) -{ - struct usb_bus *bus; - devclass_t dc; - device_t dev; - int max; - int n; - mtx_lock(&Giant); - - usb_devclass_ptr = devclass_find("usbus"); - - dc = usb_devclass_ptr; - if (dc) { - max = devclass_get_maxunit(dc) + 1; - for (n = 0; n != max; n++) { - dev = devclass_get_device(dc, n); - if (dev && device_is_attached(dev)) { - bus = device_get_ivars(dev); - if (bus) { - mtx_lock(&Giant); - usb_attach_sub(dev, bus); - mtx_unlock(&Giant); - } - } - } - } else { - DPRINTFN(0, "no devclass\n"); + /* Do initial explore */ + usb_needs_explore(bus, 1); } - usb_post_init_called = 1; - - /* explore all USB busses in parallell */ - - usb_needs_explore_all(); - - mtx_unlock(&Giant); } -SYSINIT(usb_post_init, SI_SUB_KICK_SCHEDULER, SI_ORDER_ANY, usb_post_init, NULL); SYSUNINIT(usb_bus_unload, SI_SUB_KLD, SI_ORDER_ANY, usb_bus_unload, NULL); /*------------------------------------------------------------------------*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908240458.n7O4wB27082241>