Date: Sun, 12 Sep 2010 00:49:16 +0000 (UTC) From: Weongyo Jeong <weongyo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r212488 - in user/weongyo/usb/sys/dev/usb: . controller Message-ID: <201009120049.o8C0nGQm060045@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: weongyo Date: Sun Sep 12 00:49:16 2010 New Revision: 212488 URL: http://svn.freebsd.org/changeset/base/212488 Log: No more the USB explore process that it's replaced to the taskqueue. As further works other process contexts would be changed to taskqueues finally. Modified: user/weongyo/usb/sys/dev/usb/controller/usb_controller.c user/weongyo/usb/sys/dev/usb/usb_bus.h user/weongyo/usb/sys/dev/usb/usb_hub.c user/weongyo/usb/sys/dev/usb/usb_transfer.c Modified: user/weongyo/usb/sys/dev/usb/controller/usb_controller.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/controller/usb_controller.c Sun Sep 12 00:12:18 2010 (r212487) +++ user/weongyo/usb/sys/dev/usb/controller/usb_controller.c Sun Sep 12 00:49:16 2010 (r212488) @@ -170,26 +170,15 @@ usb_detach(device_t dev) bus->bus_roothold = NULL; } - USB_BUS_LOCK(bus); - if (usb_proc_msignal(&bus->explore_proc, - &bus->detach_msg[0], &bus->detach_msg[1])) { - /* ignore */ - } - /* Wait for detach to complete */ - - usb_proc_mwait(&bus->explore_proc, - &bus->detach_msg[0], &bus->detach_msg[1]); - - USB_BUS_UNLOCK(bus); + taskqueue_enqueue(bus->explore_tq, &bus->detach_task); + taskqueue_drain(bus->explore_tq, &bus->detach_task); /* Get rid of USB callback processes */ usb_proc_free(&bus->giant_callback_proc); usb_proc_free(&bus->non_giant_callback_proc); - /* Get rid of USB explore process */ - - usb_proc_free(&bus->explore_proc); + taskqueue_free(bus->explore_tq); /* Get rid of control transfer process */ @@ -204,16 +193,13 @@ usb_detach(device_t dev) * This function is used to explore the device tree from the root. *------------------------------------------------------------------------*/ static void -usb_bus_explore(struct usb_proc_msg *pm) +usb_bus_explore(void *arg, int npending) { - struct usb_bus *bus; - struct usb_device *udev; - - bus = ((struct usb_bus_msg *)pm)->bus; - udev = bus->devices[USB_ROOT_HUB_ADDR]; + struct usb_bus *bus = arg; + struct usb_device *udev = bus->devices[USB_ROOT_HUB_ADDR]; + USB_BUS_LOCK(bus); if (udev && udev->hub) { - if (bus->do_probe) { bus->do_probe = 0; bus->driver_added_refcount++; @@ -249,6 +235,7 @@ usb_bus_explore(struct usb_proc_msg *pm) root_mount_rel(bus->bus_roothold); bus->bus_roothold = NULL; } + USB_BUS_UNLOCK(bus); } /*------------------------------------------------------------------------* @@ -257,15 +244,13 @@ usb_bus_explore(struct usb_proc_msg *pm) * This function is used to detach the device tree from the root. *------------------------------------------------------------------------*/ static void -usb_bus_detach(struct usb_proc_msg *pm) +usb_bus_detach(void *arg, int npending) { - struct usb_bus *bus; - struct usb_device *udev; - device_t dev; - - bus = ((struct usb_bus_msg *)pm)->bus; - udev = bus->devices[USB_ROOT_HUB_ADDR]; - dev = bus->bdev; + struct usb_bus *bus = arg; + struct usb_device *udev = bus->devices[USB_ROOT_HUB_ADDR]; + device_t dev = bus->bdev; + + USB_BUS_LOCK(bus); /* clear the softc */ device_set_softc(dev, NULL); USB_BUS_UNLOCK(bus); @@ -283,6 +268,7 @@ usb_bus_detach(struct usb_proc_msg *pm) USB_BUS_LOCK(bus); /* clear bdev variable last */ bus->bdev = NULL; + USB_BUS_UNLOCK(bus); } static void @@ -300,7 +286,7 @@ usb_power_wdog(void *arg) * The following line of code is only here to recover from * DDB: */ - usb_proc_rewakeup(&bus->explore_proc); /* recover from DDB */ + taskqueue_unblock(bus->explore_tq); /* recover from DDB */ #endif #if USB_HAVE_POWERD @@ -318,17 +304,14 @@ usb_power_wdog(void *arg) * This function attaches USB in context of the explore thread. *------------------------------------------------------------------------*/ static void -usb_bus_attach(struct usb_proc_msg *pm) +usb_bus_attach(void *arg, int npending) { - struct usb_bus *bus; + struct usb_bus *bus = arg; struct usb_device *child; - device_t dev; + device_t dev = bus->bdev; usb_error_t err; enum usb_dev_speed speed; - bus = ((struct usb_bus_msg *)pm)->bus; - dev = bus->bdev; - DPRINTF("\n"); switch (bus->usbrev) { @@ -357,8 +340,6 @@ usb_bus_attach(struct usb_proc_msg *pm) return; } - USB_BUS_UNLOCK(bus); - /* default power_mask value */ bus->hw_power_state = USB_HW_POWER_CONTROL | @@ -390,18 +371,17 @@ usb_bus_attach(struct usb_proc_msg *pm) err = USB_ERR_NOMEM; } - USB_BUS_LOCK(bus); - if (err) { device_printf(bus->bdev, "Root HUB problem, error=%s\n", usbd_errstr(err)); } + USB_BUS_LOCK(bus); /* set softc - we are ready */ device_set_softc(dev, bus); - /* start watchdog */ usb_power_wdog(bus); + USB_BUS_UNLOCK(bus); } /*------------------------------------------------------------------------* @@ -419,21 +399,14 @@ usb_attach_sub(device_t dev, struct usb_ 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; - bus->explore_msg[1].hdr.pm_callback = &usb_bus_explore; - bus->explore_msg[1].bus = bus; - - bus->detach_msg[0].hdr.pm_callback = &usb_bus_detach; - bus->detach_msg[0].bus = bus; - bus->detach_msg[1].hdr.pm_callback = &usb_bus_detach; - bus->detach_msg[1].bus = bus; - - bus->attach_msg[0].hdr.pm_callback = &usb_bus_attach; - bus->attach_msg[0].bus = bus; - bus->attach_msg[1].hdr.pm_callback = &usb_bus_attach; - bus->attach_msg[1].bus = bus; + /* Initialise USB explore taskqueue and tasks */ + bus->explore_tq = taskqueue_create("usb_explore_taskq", M_WAITOK, + taskqueue_thread_enqueue, &bus->explore_tq); + taskqueue_start_threads(&bus->explore_tq, 1, USB_PRI_MED, + "USB explore taskq"); + TASK_INIT(&bus->attach_task, 0, usb_bus_attach, bus); + TASK_INIT(&bus->detach_task, 0, usb_bus_detach, bus); + TASK_INIT(&bus->explore_task, 0, usb_bus_explore, bus); /* Create USB explore and callback processes */ @@ -445,22 +418,13 @@ usb_attach_sub(device_t dev, struct usb_ &bus->bus_mtx, pname, USB_PRI_HIGH)) { printf("WARNING: Creation of USB non-Giant " "callback process failed.\n"); - } else if (usb_proc_create(&bus->explore_proc, - &bus->bus_mtx, pname, USB_PRI_MED)) { - printf("WARNING: Creation of USB explore " - "process failed.\n"); } else if (usb_proc_create(&bus->control_xfer_proc, &bus->bus_mtx, pname, USB_PRI_MED)) { printf("WARNING: Creation of USB control transfer " "process failed.\n"); } else { /* Get final attach going */ - USB_BUS_LOCK(bus); - if (usb_proc_msignal(&bus->explore_proc, - &bus->attach_msg[0], &bus->attach_msg[1])) { - /* ignore */ - } - USB_BUS_UNLOCK(bus); + taskqueue_enqueue(bus->explore_tq, &bus->attach_task); /* Do initial explore */ usb_needs_explore(bus, 1); Modified: user/weongyo/usb/sys/dev/usb/usb_bus.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_bus.h Sun Sep 12 00:12:18 2010 (r212487) +++ user/weongyo/usb/sys/dev/usb/usb_bus.h Sun Sep 12 00:49:16 2010 (r212488) @@ -27,6 +27,8 @@ #ifndef _USB_BUS_H_ #define _USB_BUS_H_ +#include <sys/taskqueue.h> + /* * The following structure defines the USB explore message sent to the USB * explore process. @@ -60,15 +62,15 @@ struct usb_bus { struct usb_process giant_callback_proc; struct usb_process non_giant_callback_proc; - /* Explore process */ - struct usb_process explore_proc; - /* Control request process */ struct usb_process control_xfer_proc; - struct usb_bus_msg explore_msg[2]; - struct usb_bus_msg detach_msg[2]; - struct usb_bus_msg attach_msg[2]; + /* Explore taskqueue */ + struct taskqueue *explore_tq; + struct task attach_task; + struct task detach_task; + struct task explore_task; + /* * This mutex protects the USB hardware: */ Modified: user/weongyo/usb/sys/dev/usb/usb_hub.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_hub.c Sun Sep 12 00:12:18 2010 (r212487) +++ user/weongyo/usb/sys/dev/usb/usb_hub.c Sun Sep 12 00:49:16 2010 (r212488) @@ -1619,10 +1619,7 @@ usb_needs_explore_locked(struct usb_bus if (do_probe) { bus->do_probe = 1; } - if (usb_proc_msignal(&bus->explore_proc, - &bus->explore_msg[0], &bus->explore_msg[1])) { - /* ignore */ - } + taskqueue_enqueue(bus->explore_tq, &bus->explore_task); } /*------------------------------------------------------------------------* Modified: user/weongyo/usb/sys/dev/usb/usb_transfer.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_transfer.c Sun Sep 12 00:12:18 2010 (r212487) +++ user/weongyo/usb/sys/dev/usb/usb_transfer.c Sun Sep 12 00:49:16 2010 (r212488) @@ -2997,7 +2997,7 @@ usbd_transfer_poll(struct usb_xfer **ppx /* Make sure cv_signal() and cv_broadcast() is not called */ udev->bus->control_xfer_proc.up_msleep = 0; - udev->bus->explore_proc.up_msleep = 0; + taskqueue_block(udev->bus->explore_tq); udev->bus->giant_callback_proc.up_msleep = 0; udev->bus->non_giant_callback_proc.up_msleep = 0;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201009120049.o8C0nGQm060045>