The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kern/subr_bus.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 1997,1998,2003 Doug Rabson
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  */
   26 
   27 #include <sys/cdefs.h>
   28 __FBSDID("$FreeBSD: releng/11.1/sys/kern/subr_bus.c 308401 2016-11-07 08:36:06Z hselasky $");
   29 
   30 #include "opt_bus.h"
   31 
   32 #include <sys/param.h>
   33 #include <sys/conf.h>
   34 #include <sys/filio.h>
   35 #include <sys/lock.h>
   36 #include <sys/kernel.h>
   37 #include <sys/kobj.h>
   38 #include <sys/limits.h>
   39 #include <sys/malloc.h>
   40 #include <sys/module.h>
   41 #include <sys/mutex.h>
   42 #include <sys/poll.h>
   43 #include <sys/priv.h>
   44 #include <sys/proc.h>
   45 #include <sys/condvar.h>
   46 #include <sys/queue.h>
   47 #include <machine/bus.h>
   48 #include <sys/random.h>
   49 #include <sys/rman.h>
   50 #include <sys/selinfo.h>
   51 #include <sys/signalvar.h>
   52 #include <sys/smp.h>
   53 #include <sys/sysctl.h>
   54 #include <sys/systm.h>
   55 #include <sys/uio.h>
   56 #include <sys/bus.h>
   57 #include <sys/interrupt.h>
   58 #include <sys/cpuset.h>
   59 
   60 #include <net/vnet.h>
   61 
   62 #include <machine/cpu.h>
   63 #include <machine/stdarg.h>
   64 
   65 #include <vm/uma.h>
   66 #include <vm/vm.h>
   67 
   68 SYSCTL_NODE(_hw, OID_AUTO, bus, CTLFLAG_RW, NULL, NULL);
   69 SYSCTL_ROOT_NODE(OID_AUTO, dev, CTLFLAG_RW, NULL, NULL);
   70 
   71 /*
   72  * Used to attach drivers to devclasses.
   73  */
   74 typedef struct driverlink *driverlink_t;
   75 struct driverlink {
   76         kobj_class_t    driver;
   77         TAILQ_ENTRY(driverlink) link;   /* list of drivers in devclass */
   78         int             pass;
   79         TAILQ_ENTRY(driverlink) passlink;
   80 };
   81 
   82 /*
   83  * Forward declarations
   84  */
   85 typedef TAILQ_HEAD(devclass_list, devclass) devclass_list_t;
   86 typedef TAILQ_HEAD(driver_list, driverlink) driver_list_t;
   87 typedef TAILQ_HEAD(device_list, device) device_list_t;
   88 
   89 struct devclass {
   90         TAILQ_ENTRY(devclass) link;
   91         devclass_t      parent;         /* parent in devclass hierarchy */
   92         driver_list_t   drivers;     /* bus devclasses store drivers for bus */
   93         char            *name;
   94         device_t        *devices;       /* array of devices indexed by unit */
   95         int             maxunit;        /* size of devices array */
   96         int             flags;
   97 #define DC_HAS_CHILDREN         1
   98 
   99         struct sysctl_ctx_list sysctl_ctx;
  100         struct sysctl_oid *sysctl_tree;
  101 };
  102 
  103 /**
  104  * @brief Implementation of device.
  105  */
  106 struct device {
  107         /*
  108          * A device is a kernel object. The first field must be the
  109          * current ops table for the object.
  110          */
  111         KOBJ_FIELDS;
  112 
  113         /*
  114          * Device hierarchy.
  115          */
  116         TAILQ_ENTRY(device)     link;   /**< list of devices in parent */
  117         TAILQ_ENTRY(device)     devlink; /**< global device list membership */
  118         device_t        parent;         /**< parent of this device  */
  119         device_list_t   children;       /**< list of child devices */
  120 
  121         /*
  122          * Details of this device.
  123          */
  124         driver_t        *driver;        /**< current driver */
  125         devclass_t      devclass;       /**< current device class */
  126         int             unit;           /**< current unit number */
  127         char*           nameunit;       /**< name+unit e.g. foodev0 */
  128         char*           desc;           /**< driver specific description */
  129         int             busy;           /**< count of calls to device_busy() */
  130         device_state_t  state;          /**< current device state  */
  131         uint32_t        devflags;       /**< api level flags for device_get_flags() */
  132         u_int           flags;          /**< internal device flags  */
  133         u_int   order;                  /**< order from device_add_child_ordered() */
  134         void    *ivars;                 /**< instance variables  */
  135         void    *softc;                 /**< current driver's variables  */
  136 
  137         struct sysctl_ctx_list sysctl_ctx; /**< state for sysctl variables  */
  138         struct sysctl_oid *sysctl_tree; /**< state for sysctl variables */
  139 };
  140 
  141 static MALLOC_DEFINE(M_BUS, "bus", "Bus data structures");
  142 static MALLOC_DEFINE(M_BUS_SC, "bus-sc", "Bus data structures, softc");
  143 
  144 static void devctl2_init(void);
  145 
  146 #ifdef BUS_DEBUG
  147 
  148 static int bus_debug = 1;
  149 SYSCTL_INT(_debug, OID_AUTO, bus_debug, CTLFLAG_RWTUN, &bus_debug, 0,
  150     "Bus debug level");
  151 
  152 #define PDEBUG(a)       if (bus_debug) {printf("%s:%d: ", __func__, __LINE__), printf a; printf("\n");}
  153 #define DEVICENAME(d)   ((d)? device_get_name(d): "no device")
  154 #define DRIVERNAME(d)   ((d)? d->name : "no driver")
  155 #define DEVCLANAME(d)   ((d)? d->name : "no devclass")
  156 
  157 /**
  158  * Produce the indenting, indent*2 spaces plus a '.' ahead of that to
  159  * prevent syslog from deleting initial spaces
  160  */
  161 #define indentprintf(p) do { int iJ; printf("."); for (iJ=0; iJ<indent; iJ++) printf("  "); printf p ; } while (0)
  162 
  163 static void print_device_short(device_t dev, int indent);
  164 static void print_device(device_t dev, int indent);
  165 void print_device_tree_short(device_t dev, int indent);
  166 void print_device_tree(device_t dev, int indent);
  167 static void print_driver_short(driver_t *driver, int indent);
  168 static void print_driver(driver_t *driver, int indent);
  169 static void print_driver_list(driver_list_t drivers, int indent);
  170 static void print_devclass_short(devclass_t dc, int indent);
  171 static void print_devclass(devclass_t dc, int indent);
  172 void print_devclass_list_short(void);
  173 void print_devclass_list(void);
  174 
  175 #else
  176 /* Make the compiler ignore the function calls */
  177 #define PDEBUG(a)                       /* nop */
  178 #define DEVICENAME(d)                   /* nop */
  179 #define DRIVERNAME(d)                   /* nop */
  180 #define DEVCLANAME(d)                   /* nop */
  181 
  182 #define print_device_short(d,i)         /* nop */
  183 #define print_device(d,i)               /* nop */
  184 #define print_device_tree_short(d,i)    /* nop */
  185 #define print_device_tree(d,i)          /* nop */
  186 #define print_driver_short(d,i)         /* nop */
  187 #define print_driver(d,i)               /* nop */
  188 #define print_driver_list(d,i)          /* nop */
  189 #define print_devclass_short(d,i)       /* nop */
  190 #define print_devclass(d,i)             /* nop */
  191 #define print_devclass_list_short()     /* nop */
  192 #define print_devclass_list()           /* nop */
  193 #endif
  194 
  195 /*
  196  * dev sysctl tree
  197  */
  198 
  199 enum {
  200         DEVCLASS_SYSCTL_PARENT,
  201 };
  202 
  203 static int
  204 devclass_sysctl_handler(SYSCTL_HANDLER_ARGS)
  205 {
  206         devclass_t dc = (devclass_t)arg1;
  207         const char *value;
  208 
  209         switch (arg2) {
  210         case DEVCLASS_SYSCTL_PARENT:
  211                 value = dc->parent ? dc->parent->name : "";
  212                 break;
  213         default:
  214                 return (EINVAL);
  215         }
  216         return (SYSCTL_OUT_STR(req, value));
  217 }
  218 
  219 static void
  220 devclass_sysctl_init(devclass_t dc)
  221 {
  222 
  223         if (dc->sysctl_tree != NULL)
  224                 return;
  225         sysctl_ctx_init(&dc->sysctl_ctx);
  226         dc->sysctl_tree = SYSCTL_ADD_NODE(&dc->sysctl_ctx,
  227             SYSCTL_STATIC_CHILDREN(_dev), OID_AUTO, dc->name,
  228             CTLFLAG_RD, NULL, "");
  229         SYSCTL_ADD_PROC(&dc->sysctl_ctx, SYSCTL_CHILDREN(dc->sysctl_tree),
  230             OID_AUTO, "%parent", CTLTYPE_STRING | CTLFLAG_RD,
  231             dc, DEVCLASS_SYSCTL_PARENT, devclass_sysctl_handler, "A",
  232             "parent class");
  233 }
  234 
  235 enum {
  236         DEVICE_SYSCTL_DESC,
  237         DEVICE_SYSCTL_DRIVER,
  238         DEVICE_SYSCTL_LOCATION,
  239         DEVICE_SYSCTL_PNPINFO,
  240         DEVICE_SYSCTL_PARENT,
  241 };
  242 
  243 static int
  244 device_sysctl_handler(SYSCTL_HANDLER_ARGS)
  245 {
  246         device_t dev = (device_t)arg1;
  247         const char *value;
  248         char *buf;
  249         int error;
  250 
  251         buf = NULL;
  252         switch (arg2) {
  253         case DEVICE_SYSCTL_DESC:
  254                 value = dev->desc ? dev->desc : "";
  255                 break;
  256         case DEVICE_SYSCTL_DRIVER:
  257                 value = dev->driver ? dev->driver->name : "";
  258                 break;
  259         case DEVICE_SYSCTL_LOCATION:
  260                 value = buf = malloc(1024, M_BUS, M_WAITOK | M_ZERO);
  261                 bus_child_location_str(dev, buf, 1024);
  262                 break;
  263         case DEVICE_SYSCTL_PNPINFO:
  264                 value = buf = malloc(1024, M_BUS, M_WAITOK | M_ZERO);
  265                 bus_child_pnpinfo_str(dev, buf, 1024);
  266                 break;
  267         case DEVICE_SYSCTL_PARENT:
  268                 value = dev->parent ? dev->parent->nameunit : "";
  269                 break;
  270         default:
  271                 return (EINVAL);
  272         }
  273         error = SYSCTL_OUT_STR(req, value);
  274         if (buf != NULL)
  275                 free(buf, M_BUS);
  276         return (error);
  277 }
  278 
  279 static void
  280 device_sysctl_init(device_t dev)
  281 {
  282         devclass_t dc = dev->devclass;
  283         int domain;
  284 
  285         if (dev->sysctl_tree != NULL)
  286                 return;
  287         devclass_sysctl_init(dc);
  288         sysctl_ctx_init(&dev->sysctl_ctx);
  289         dev->sysctl_tree = SYSCTL_ADD_NODE(&dev->sysctl_ctx,
  290             SYSCTL_CHILDREN(dc->sysctl_tree), OID_AUTO,
  291             dev->nameunit + strlen(dc->name),
  292             CTLFLAG_RD, NULL, "");
  293         SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
  294             OID_AUTO, "%desc", CTLTYPE_STRING | CTLFLAG_RD,
  295             dev, DEVICE_SYSCTL_DESC, device_sysctl_handler, "A",
  296             "device description");
  297         SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
  298             OID_AUTO, "%driver", CTLTYPE_STRING | CTLFLAG_RD,
  299             dev, DEVICE_SYSCTL_DRIVER, device_sysctl_handler, "A",
  300             "device driver name");
  301         SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
  302             OID_AUTO, "%location", CTLTYPE_STRING | CTLFLAG_RD,
  303             dev, DEVICE_SYSCTL_LOCATION, device_sysctl_handler, "A",
  304             "device location relative to parent");
  305         SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
  306             OID_AUTO, "%pnpinfo", CTLTYPE_STRING | CTLFLAG_RD,
  307             dev, DEVICE_SYSCTL_PNPINFO, device_sysctl_handler, "A",
  308             "device identification");
  309         SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
  310             OID_AUTO, "%parent", CTLTYPE_STRING | CTLFLAG_RD,
  311             dev, DEVICE_SYSCTL_PARENT, device_sysctl_handler, "A",
  312             "parent device");
  313         if (bus_get_domain(dev, &domain) == 0)
  314                 SYSCTL_ADD_INT(&dev->sysctl_ctx,
  315                     SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%domain",
  316                     CTLFLAG_RD, NULL, domain, "NUMA domain");
  317 }
  318 
  319 static void
  320 device_sysctl_update(device_t dev)
  321 {
  322         devclass_t dc = dev->devclass;
  323 
  324         if (dev->sysctl_tree == NULL)
  325                 return;
  326         sysctl_rename_oid(dev->sysctl_tree, dev->nameunit + strlen(dc->name));
  327 }
  328 
  329 static void
  330 device_sysctl_fini(device_t dev)
  331 {
  332         if (dev->sysctl_tree == NULL)
  333                 return;
  334         sysctl_ctx_free(&dev->sysctl_ctx);
  335         dev->sysctl_tree = NULL;
  336 }
  337 
  338 /*
  339  * /dev/devctl implementation
  340  */
  341 
  342 /*
  343  * This design allows only one reader for /dev/devctl.  This is not desirable
  344  * in the long run, but will get a lot of hair out of this implementation.
  345  * Maybe we should make this device a clonable device.
  346  *
  347  * Also note: we specifically do not attach a device to the device_t tree
  348  * to avoid potential chicken and egg problems.  One could argue that all
  349  * of this belongs to the root node.  One could also further argue that the
  350  * sysctl interface that we have not might more properly be an ioctl
  351  * interface, but at this stage of the game, I'm not inclined to rock that
  352  * boat.
  353  *
  354  * I'm also not sure that the SIGIO support is done correctly or not, as
  355  * I copied it from a driver that had SIGIO support that likely hasn't been
  356  * tested since 3.4 or 2.2.8!
  357  */
  358 
  359 /* Deprecated way to adjust queue length */
  360 static int sysctl_devctl_disable(SYSCTL_HANDLER_ARGS);
  361 SYSCTL_PROC(_hw_bus, OID_AUTO, devctl_disable, CTLTYPE_INT | CTLFLAG_RWTUN |
  362     CTLFLAG_MPSAFE, NULL, 0, sysctl_devctl_disable, "I",
  363     "devctl disable -- deprecated");
  364 
  365 #define DEVCTL_DEFAULT_QUEUE_LEN 1000
  366 static int sysctl_devctl_queue(SYSCTL_HANDLER_ARGS);
  367 static int devctl_queue_length = DEVCTL_DEFAULT_QUEUE_LEN;
  368 SYSCTL_PROC(_hw_bus, OID_AUTO, devctl_queue, CTLTYPE_INT | CTLFLAG_RWTUN |
  369     CTLFLAG_MPSAFE, NULL, 0, sysctl_devctl_queue, "I", "devctl queue length");
  370 
  371 static d_open_t         devopen;
  372 static d_close_t        devclose;
  373 static d_read_t         devread;
  374 static d_ioctl_t        devioctl;
  375 static d_poll_t         devpoll;
  376 static d_kqfilter_t     devkqfilter;
  377 
  378 static struct cdevsw dev_cdevsw = {
  379         .d_version =    D_VERSION,
  380         .d_open =       devopen,
  381         .d_close =      devclose,
  382         .d_read =       devread,
  383         .d_ioctl =      devioctl,
  384         .d_poll =       devpoll,
  385         .d_kqfilter =   devkqfilter,
  386         .d_name =       "devctl",
  387 };
  388 
  389 struct dev_event_info
  390 {
  391         char *dei_data;
  392         TAILQ_ENTRY(dev_event_info) dei_link;
  393 };
  394 
  395 TAILQ_HEAD(devq, dev_event_info);
  396 
  397 static struct dev_softc
  398 {
  399         int     inuse;
  400         int     nonblock;
  401         int     queued;
  402         int     async;
  403         struct mtx mtx;
  404         struct cv cv;
  405         struct selinfo sel;
  406         struct devq devq;
  407         struct sigio *sigio;
  408 } devsoftc;
  409 
  410 static void     filt_devctl_detach(struct knote *kn);
  411 static int      filt_devctl_read(struct knote *kn, long hint);
  412 
  413 struct filterops devctl_rfiltops = {
  414         .f_isfd = 1,
  415         .f_detach = filt_devctl_detach,
  416         .f_event = filt_devctl_read,
  417 };
  418 
  419 static struct cdev *devctl_dev;
  420 
  421 static void
  422 devinit(void)
  423 {
  424         devctl_dev = make_dev_credf(MAKEDEV_ETERNAL, &dev_cdevsw, 0, NULL,
  425             UID_ROOT, GID_WHEEL, 0600, "devctl");
  426         mtx_init(&devsoftc.mtx, "dev mtx", "devd", MTX_DEF);
  427         cv_init(&devsoftc.cv, "dev cv");
  428         TAILQ_INIT(&devsoftc.devq);
  429         knlist_init_mtx(&devsoftc.sel.si_note, &devsoftc.mtx);
  430         devctl2_init();
  431 }
  432 
  433 static int
  434 devopen(struct cdev *dev, int oflags, int devtype, struct thread *td)
  435 {
  436 
  437         mtx_lock(&devsoftc.mtx);
  438         if (devsoftc.inuse) {
  439                 mtx_unlock(&devsoftc.mtx);
  440                 return (EBUSY);
  441         }
  442         /* move to init */
  443         devsoftc.inuse = 1;
  444         mtx_unlock(&devsoftc.mtx);
  445         return (0);
  446 }
  447 
  448 static int
  449 devclose(struct cdev *dev, int fflag, int devtype, struct thread *td)
  450 {
  451 
  452         mtx_lock(&devsoftc.mtx);
  453         devsoftc.inuse = 0;
  454         devsoftc.nonblock = 0;
  455         devsoftc.async = 0;
  456         cv_broadcast(&devsoftc.cv);
  457         funsetown(&devsoftc.sigio);
  458         mtx_unlock(&devsoftc.mtx);
  459         return (0);
  460 }
  461 
  462 /*
  463  * The read channel for this device is used to report changes to
  464  * userland in realtime.  We are required to free the data as well as
  465  * the n1 object because we allocate them separately.  Also note that
  466  * we return one record at a time.  If you try to read this device a
  467  * character at a time, you will lose the rest of the data.  Listening
  468  * programs are expected to cope.
  469  */
  470 static int
  471 devread(struct cdev *dev, struct uio *uio, int ioflag)
  472 {
  473         struct dev_event_info *n1;
  474         int rv;
  475 
  476         mtx_lock(&devsoftc.mtx);
  477         while (TAILQ_EMPTY(&devsoftc.devq)) {
  478                 if (devsoftc.nonblock) {
  479                         mtx_unlock(&devsoftc.mtx);
  480                         return (EAGAIN);
  481                 }
  482                 rv = cv_wait_sig(&devsoftc.cv, &devsoftc.mtx);
  483                 if (rv) {
  484                         /*
  485                          * Need to translate ERESTART to EINTR here? -- jake
  486                          */
  487                         mtx_unlock(&devsoftc.mtx);
  488                         return (rv);
  489                 }
  490         }
  491         n1 = TAILQ_FIRST(&devsoftc.devq);
  492         TAILQ_REMOVE(&devsoftc.devq, n1, dei_link);
  493         devsoftc.queued--;
  494         mtx_unlock(&devsoftc.mtx);
  495         rv = uiomove(n1->dei_data, strlen(n1->dei_data), uio);
  496         free(n1->dei_data, M_BUS);
  497         free(n1, M_BUS);
  498         return (rv);
  499 }
  500 
  501 static  int
  502 devioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread *td)
  503 {
  504         switch (cmd) {
  505 
  506         case FIONBIO:
  507                 if (*(int*)data)
  508                         devsoftc.nonblock = 1;
  509                 else
  510                         devsoftc.nonblock = 0;
  511                 return (0);
  512         case FIOASYNC:
  513                 if (*(int*)data)
  514                         devsoftc.async = 1;
  515                 else
  516                         devsoftc.async = 0;
  517                 return (0);
  518         case FIOSETOWN:
  519                 return fsetown(*(int *)data, &devsoftc.sigio);
  520         case FIOGETOWN:
  521                 *(int *)data = fgetown(&devsoftc.sigio);
  522                 return (0);
  523 
  524                 /* (un)Support for other fcntl() calls. */
  525         case FIOCLEX:
  526         case FIONCLEX:
  527         case FIONREAD:
  528         default:
  529                 break;
  530         }
  531         return (ENOTTY);
  532 }
  533 
  534 static  int
  535 devpoll(struct cdev *dev, int events, struct thread *td)
  536 {
  537         int     revents = 0;
  538 
  539         mtx_lock(&devsoftc.mtx);
  540         if (events & (POLLIN | POLLRDNORM)) {
  541                 if (!TAILQ_EMPTY(&devsoftc.devq))
  542                         revents = events & (POLLIN | POLLRDNORM);
  543                 else
  544                         selrecord(td, &devsoftc.sel);
  545         }
  546         mtx_unlock(&devsoftc.mtx);
  547 
  548         return (revents);
  549 }
  550 
  551 static int
  552 devkqfilter(struct cdev *dev, struct knote *kn)
  553 {
  554         int error;
  555 
  556         if (kn->kn_filter == EVFILT_READ) {
  557                 kn->kn_fop = &devctl_rfiltops;
  558                 knlist_add(&devsoftc.sel.si_note, kn, 0);
  559                 error = 0;
  560         } else
  561                 error = EINVAL;
  562         return (error);
  563 }
  564 
  565 static void
  566 filt_devctl_detach(struct knote *kn)
  567 {
  568 
  569         knlist_remove(&devsoftc.sel.si_note, kn, 0);
  570 }
  571 
  572 static int
  573 filt_devctl_read(struct knote *kn, long hint)
  574 {
  575         kn->kn_data = devsoftc.queued;
  576         return (kn->kn_data != 0);
  577 }
  578 
  579 /**
  580  * @brief Return whether the userland process is running
  581  */
  582 boolean_t
  583 devctl_process_running(void)
  584 {
  585         return (devsoftc.inuse == 1);
  586 }
  587 
  588 /**
  589  * @brief Queue data to be read from the devctl device
  590  *
  591  * Generic interface to queue data to the devctl device.  It is
  592  * assumed that @p data is properly formatted.  It is further assumed
  593  * that @p data is allocated using the M_BUS malloc type.
  594  */
  595 void
  596 devctl_queue_data_f(char *data, int flags)
  597 {
  598         struct dev_event_info *n1 = NULL, *n2 = NULL;
  599 
  600         if (strlen(data) == 0)
  601                 goto out;
  602         if (devctl_queue_length == 0)
  603                 goto out;
  604         n1 = malloc(sizeof(*n1), M_BUS, flags);
  605         if (n1 == NULL)
  606                 goto out;
  607         n1->dei_data = data;
  608         mtx_lock(&devsoftc.mtx);
  609         if (devctl_queue_length == 0) {
  610                 mtx_unlock(&devsoftc.mtx);
  611                 free(n1->dei_data, M_BUS);
  612                 free(n1, M_BUS);
  613                 return;
  614         }
  615         /* Leave at least one spot in the queue... */
  616         while (devsoftc.queued > devctl_queue_length - 1) {
  617                 n2 = TAILQ_FIRST(&devsoftc.devq);
  618                 TAILQ_REMOVE(&devsoftc.devq, n2, dei_link);
  619                 free(n2->dei_data, M_BUS);
  620                 free(n2, M_BUS);
  621                 devsoftc.queued--;
  622         }
  623         TAILQ_INSERT_TAIL(&devsoftc.devq, n1, dei_link);
  624         devsoftc.queued++;
  625         cv_broadcast(&devsoftc.cv);
  626         KNOTE_LOCKED(&devsoftc.sel.si_note, 0);
  627         mtx_unlock(&devsoftc.mtx);
  628         selwakeup(&devsoftc.sel);
  629         if (devsoftc.async && devsoftc.sigio != NULL)
  630                 pgsigio(&devsoftc.sigio, SIGIO, 0);
  631         return;
  632 out:
  633         /*
  634          * We have to free data on all error paths since the caller
  635          * assumes it will be free'd when this item is dequeued.
  636          */
  637         free(data, M_BUS);
  638         return;
  639 }
  640 
  641 void
  642 devctl_queue_data(char *data)
  643 {
  644 
  645         devctl_queue_data_f(data, M_NOWAIT);
  646 }
  647 
  648 /**
  649  * @brief Send a 'notification' to userland, using standard ways
  650  */
  651 void
  652 devctl_notify_f(const char *system, const char *subsystem, const char *type,
  653     const char *data, int flags)
  654 {
  655         int len = 0;
  656         char *msg;
  657 
  658         if (system == NULL)
  659                 return;         /* BOGUS!  Must specify system. */
  660         if (subsystem == NULL)
  661                 return;         /* BOGUS!  Must specify subsystem. */
  662         if (type == NULL)
  663                 return;         /* BOGUS!  Must specify type. */
  664         len += strlen(" system=") + strlen(system);
  665         len += strlen(" subsystem=") + strlen(subsystem);
  666         len += strlen(" type=") + strlen(type);
  667         /* add in the data message plus newline. */
  668         if (data != NULL)
  669                 len += strlen(data);
  670         len += 3;       /* '!', '\n', and NUL */
  671         msg = malloc(len, M_BUS, flags);
  672         if (msg == NULL)
  673                 return;         /* Drop it on the floor */
  674         if (data != NULL)
  675                 snprintf(msg, len, "!system=%s subsystem=%s type=%s %s\n",
  676                     system, subsystem, type, data);
  677         else
  678                 snprintf(msg, len, "!system=%s subsystem=%s type=%s\n",
  679                     system, subsystem, type);
  680         devctl_queue_data_f(msg, flags);
  681 }
  682 
  683 void
  684 devctl_notify(const char *system, const char *subsystem, const char *type,
  685     const char *data)
  686 {
  687 
  688         devctl_notify_f(system, subsystem, type, data, M_NOWAIT);
  689 }
  690 
  691 /*
  692  * Common routine that tries to make sending messages as easy as possible.
  693  * We allocate memory for the data, copy strings into that, but do not
  694  * free it unless there's an error.  The dequeue part of the driver should
  695  * free the data.  We don't send data when the device is disabled.  We do
  696  * send data, even when we have no listeners, because we wish to avoid
  697  * races relating to startup and restart of listening applications.
  698  *
  699  * devaddq is designed to string together the type of event, with the
  700  * object of that event, plus the plug and play info and location info
  701  * for that event.  This is likely most useful for devices, but less
  702  * useful for other consumers of this interface.  Those should use
  703  * the devctl_queue_data() interface instead.
  704  */
  705 static void
  706 devaddq(const char *type, const char *what, device_t dev)
  707 {
  708         char *data = NULL;
  709         char *loc = NULL;
  710         char *pnp = NULL;
  711         const char *parstr;
  712 
  713         if (!devctl_queue_length)/* Rare race, but lost races safely discard */
  714                 return;
  715         data = malloc(1024, M_BUS, M_NOWAIT);
  716         if (data == NULL)
  717                 goto bad;
  718 
  719         /* get the bus specific location of this device */
  720         loc = malloc(1024, M_BUS, M_NOWAIT);
  721         if (loc == NULL)
  722                 goto bad;
  723         *loc = '\0';
  724         bus_child_location_str(dev, loc, 1024);
  725 
  726         /* Get the bus specific pnp info of this device */
  727         pnp = malloc(1024, M_BUS, M_NOWAIT);
  728         if (pnp == NULL)
  729                 goto bad;
  730         *pnp = '\0';
  731         bus_child_pnpinfo_str(dev, pnp, 1024);
  732 
  733         /* Get the parent of this device, or / if high enough in the tree. */
  734         if (device_get_parent(dev) == NULL)
  735                 parstr = ".";   /* Or '/' ? */
  736         else
  737                 parstr = device_get_nameunit(device_get_parent(dev));
  738         /* String it all together. */
  739         snprintf(data, 1024, "%s%s at %s %s on %s\n", type, what, loc, pnp,
  740           parstr);
  741         free(loc, M_BUS);
  742         free(pnp, M_BUS);
  743         devctl_queue_data(data);
  744         return;
  745 bad:
  746         free(pnp, M_BUS);
  747         free(loc, M_BUS);
  748         free(data, M_BUS);
  749         return;
  750 }
  751 
  752 /*
  753  * A device was added to the tree.  We are called just after it successfully
  754  * attaches (that is, probe and attach success for this device).  No call
  755  * is made if a device is merely parented into the tree.  See devnomatch
  756  * if probe fails.  If attach fails, no notification is sent (but maybe
  757  * we should have a different message for this).
  758  */
  759 static void
  760 devadded(device_t dev)
  761 {
  762         devaddq("+", device_get_nameunit(dev), dev);
  763 }
  764 
  765 /*
  766  * A device was removed from the tree.  We are called just before this
  767  * happens.
  768  */
  769 static void
  770 devremoved(device_t dev)
  771 {
  772         devaddq("-", device_get_nameunit(dev), dev);
  773 }
  774 
  775 /*
  776  * Called when there's no match for this device.  This is only called
  777  * the first time that no match happens, so we don't keep getting this
  778  * message.  Should that prove to be undesirable, we can change it.
  779  * This is called when all drivers that can attach to a given bus
  780  * decline to accept this device.  Other errors may not be detected.
  781  */
  782 static void
  783 devnomatch(device_t dev)
  784 {
  785         devaddq("?", "", dev);
  786 }
  787 
  788 static int
  789 sysctl_devctl_disable(SYSCTL_HANDLER_ARGS)
  790 {
  791         struct dev_event_info *n1;
  792         int dis, error;
  793 
  794         dis = (devctl_queue_length == 0);
  795         error = sysctl_handle_int(oidp, &dis, 0, req);
  796         if (error || !req->newptr)
  797                 return (error);
  798         if (mtx_initialized(&devsoftc.mtx))
  799                 mtx_lock(&devsoftc.mtx);
  800         if (dis) {
  801                 while (!TAILQ_EMPTY(&devsoftc.devq)) {
  802                         n1 = TAILQ_FIRST(&devsoftc.devq);
  803                         TAILQ_REMOVE(&devsoftc.devq, n1, dei_link);
  804                         free(n1->dei_data, M_BUS);
  805                         free(n1, M_BUS);
  806                 }
  807                 devsoftc.queued = 0;
  808                 devctl_queue_length = 0;
  809         } else {
  810                 devctl_queue_length = DEVCTL_DEFAULT_QUEUE_LEN;
  811         }
  812         if (mtx_initialized(&devsoftc.mtx))
  813                 mtx_unlock(&devsoftc.mtx);
  814         return (0);
  815 }
  816 
  817 static int
  818 sysctl_devctl_queue(SYSCTL_HANDLER_ARGS)
  819 {
  820         struct dev_event_info *n1;
  821         int q, error;
  822 
  823         q = devctl_queue_length;
  824         error = sysctl_handle_int(oidp, &q, 0, req);
  825         if (error || !req->newptr)
  826                 return (error);
  827         if (q < 0)
  828                 return (EINVAL);
  829         if (mtx_initialized(&devsoftc.mtx))
  830                 mtx_lock(&devsoftc.mtx);
  831         devctl_queue_length = q;
  832         while (devsoftc.queued > devctl_queue_length) {
  833                 n1 = TAILQ_FIRST(&devsoftc.devq);
  834                 TAILQ_REMOVE(&devsoftc.devq, n1, dei_link);
  835                 free(n1->dei_data, M_BUS);
  836                 free(n1, M_BUS);
  837                 devsoftc.queued--;
  838         }
  839         if (mtx_initialized(&devsoftc.mtx))
  840                 mtx_unlock(&devsoftc.mtx);
  841         return (0);
  842 }
  843 
  844 /**
  845  * @brief safely quotes strings that might have double quotes in them.
  846  *
  847  * The devctl protocol relies on quoted strings having matching quotes.
  848  * This routine quotes any internal quotes so the resulting string
  849  * is safe to pass to snprintf to construct, for example pnp info strings.
  850  * Strings are always terminated with a NUL, but may be truncated if longer
  851  * than @p len bytes after quotes.
  852  *
  853  * @param dst   Buffer to hold the string. Must be at least @p len bytes long
  854  * @param src   Original buffer.
  855  * @param len   Length of buffer pointed to by @dst, including trailing NUL
  856  */
  857 void
  858 devctl_safe_quote(char *dst, const char *src, size_t len)
  859 {
  860         char *walker = dst, *ep = dst + len - 1;
  861 
  862         if (len == 0)
  863                 return;
  864         while (src != NULL && walker < ep)
  865         {
  866                 if (*src == '"' || *src == '\\') {
  867                         if (ep - walker < 2)
  868                                 break;
  869                         *walker++ = '\\';
  870                 }
  871                 *walker++ = *src++;
  872         }
  873         *walker = '\0';
  874 }
  875 
  876 /* End of /dev/devctl code */
  877 
  878 static TAILQ_HEAD(,device)      bus_data_devices;
  879 static int bus_data_generation = 1;
  880 
  881 static kobj_method_t null_methods[] = {
  882         KOBJMETHOD_END
  883 };
  884 
  885 DEFINE_CLASS(null, null_methods, 0);
  886 
  887 /*
  888  * Bus pass implementation
  889  */
  890 
  891 static driver_list_t passes = TAILQ_HEAD_INITIALIZER(passes);
  892 int bus_current_pass = BUS_PASS_ROOT;
  893 
  894 /**
  895  * @internal
  896  * @brief Register the pass level of a new driver attachment
  897  *
  898  * Register a new driver attachment's pass level.  If no driver
  899  * attachment with the same pass level has been added, then @p new
  900  * will be added to the global passes list.
  901  *
  902  * @param new           the new driver attachment
  903  */
  904 static void
  905 driver_register_pass(struct driverlink *new)
  906 {
  907         struct driverlink *dl;
  908 
  909         /* We only consider pass numbers during boot. */
  910         if (bus_current_pass == BUS_PASS_DEFAULT)
  911                 return;
  912 
  913         /*
  914          * Walk the passes list.  If we already know about this pass
  915          * then there is nothing to do.  If we don't, then insert this
  916          * driver link into the list.
  917          */
  918         TAILQ_FOREACH(dl, &passes, passlink) {
  919                 if (dl->pass < new->pass)
  920                         continue;
  921                 if (dl->pass == new->pass)
  922                         return;
  923                 TAILQ_INSERT_BEFORE(dl, new, passlink);
  924                 return;
  925         }
  926         TAILQ_INSERT_TAIL(&passes, new, passlink);
  927 }
  928 
  929 /**
  930  * @brief Raise the current bus pass
  931  *
  932  * Raise the current bus pass level to @p pass.  Call the BUS_NEW_PASS()
  933  * method on the root bus to kick off a new device tree scan for each
  934  * new pass level that has at least one driver.
  935  */
  936 void
  937 bus_set_pass(int pass)
  938 {
  939         struct driverlink *dl;
  940 
  941         if (bus_current_pass > pass)
  942                 panic("Attempt to lower bus pass level");
  943 
  944         TAILQ_FOREACH(dl, &passes, passlink) {
  945                 /* Skip pass values below the current pass level. */
  946                 if (dl->pass <= bus_current_pass)
  947                         continue;
  948 
  949                 /*
  950                  * Bail once we hit a driver with a pass level that is
  951                  * too high.
  952                  */
  953                 if (dl->pass > pass)
  954                         break;
  955 
  956                 /*
  957                  * Raise the pass level to the next level and rescan
  958                  * the tree.
  959                  */
  960                 bus_current_pass = dl->pass;
  961                 BUS_NEW_PASS(root_bus);
  962         }
  963 
  964         /*
  965          * If there isn't a driver registered for the requested pass,
  966          * then bus_current_pass might still be less than 'pass'.  Set
  967          * it to 'pass' in that case.
  968          */
  969         if (bus_current_pass < pass)
  970                 bus_current_pass = pass;
  971         KASSERT(bus_current_pass == pass, ("Failed to update bus pass level"));
  972 }
  973 
  974 /*
  975  * Devclass implementation
  976  */
  977 
  978 static devclass_list_t devclasses = TAILQ_HEAD_INITIALIZER(devclasses);
  979 
  980 /**
  981  * @internal
  982  * @brief Find or create a device class
  983  *
  984  * If a device class with the name @p classname exists, return it,
  985  * otherwise if @p create is non-zero create and return a new device
  986  * class.
  987  *
  988  * If @p parentname is non-NULL, the parent of the devclass is set to
  989  * the devclass of that name.
  990  *
  991  * @param classname     the devclass name to find or create
  992  * @param parentname    the parent devclass name or @c NULL
  993  * @param create        non-zero to create a devclass
  994  */
  995 static devclass_t
  996 devclass_find_internal(const char *classname, const char *parentname,
  997                        int create)
  998 {
  999         devclass_t dc;
 1000 
 1001         PDEBUG(("looking for %s", classname));
 1002         if (!classname)
 1003                 return (NULL);
 1004 
 1005         TAILQ_FOREACH(dc, &devclasses, link) {
 1006                 if (!strcmp(dc->name, classname))
 1007                         break;
 1008         }
 1009 
 1010         if (create && !dc) {
 1011                 PDEBUG(("creating %s", classname));
 1012                 dc = malloc(sizeof(struct devclass) + strlen(classname) + 1,
 1013                     M_BUS, M_NOWAIT | M_ZERO);
 1014                 if (!dc)
 1015                         return (NULL);
 1016                 dc->parent = NULL;
 1017                 dc->name = (char*) (dc + 1);
 1018                 strcpy(dc->name, classname);
 1019                 TAILQ_INIT(&dc->drivers);
 1020                 TAILQ_INSERT_TAIL(&devclasses, dc, link);
 1021 
 1022                 bus_data_generation_update();
 1023         }
 1024 
 1025         /*
 1026          * If a parent class is specified, then set that as our parent so
 1027          * that this devclass will support drivers for the parent class as
 1028          * well.  If the parent class has the same name don't do this though
 1029          * as it creates a cycle that can trigger an infinite loop in
 1030          * device_probe_child() if a device exists for which there is no
 1031          * suitable driver.
 1032          */
 1033         if (parentname && dc && !dc->parent &&
 1034             strcmp(classname, parentname) != 0) {
 1035                 dc->parent = devclass_find_internal(parentname, NULL, TRUE);
 1036                 dc->parent->flags |= DC_HAS_CHILDREN;
 1037         }
 1038 
 1039         return (dc);
 1040 }
 1041 
 1042 /**
 1043  * @brief Create a device class
 1044  *
 1045  * If a device class with the name @p classname exists, return it,
 1046  * otherwise create and return a new device class.
 1047  *
 1048  * @param classname     the devclass name to find or create
 1049  */
 1050 devclass_t
 1051 devclass_create(const char *classname)
 1052 {
 1053         return (devclass_find_internal(classname, NULL, TRUE));
 1054 }
 1055 
 1056 /**
 1057  * @brief Find a device class
 1058  *
 1059  * If a device class with the name @p classname exists, return it,
 1060  * otherwise return @c NULL.
 1061  *
 1062  * @param classname     the devclass name to find
 1063  */
 1064 devclass_t
 1065 devclass_find(const char *classname)
 1066 {
 1067         return (devclass_find_internal(classname, NULL, FALSE));
 1068 }
 1069 
 1070 /**
 1071  * @brief Register that a device driver has been added to a devclass
 1072  *
 1073  * Register that a device driver has been added to a devclass.  This
 1074  * is called by devclass_add_driver to accomplish the recursive
 1075  * notification of all the children classes of dc, as well as dc.
 1076  * Each layer will have BUS_DRIVER_ADDED() called for all instances of
 1077  * the devclass.
 1078  *
 1079  * We do a full search here of the devclass list at each iteration
 1080  * level to save storing children-lists in the devclass structure.  If
 1081  * we ever move beyond a few dozen devices doing this, we may need to
 1082  * reevaluate...
 1083  *
 1084  * @param dc            the devclass to edit
 1085  * @param driver        the driver that was just added
 1086  */
 1087 static void
 1088 devclass_driver_added(devclass_t dc, driver_t *driver)
 1089 {
 1090         devclass_t parent;
 1091         int i;
 1092 
 1093         /*
 1094          * Call BUS_DRIVER_ADDED for any existing busses in this class.
 1095          */
 1096         for (i = 0; i < dc->maxunit; i++)
 1097                 if (dc->devices[i] && device_is_attached(dc->devices[i]))
 1098                         BUS_DRIVER_ADDED(dc->devices[i], driver);
 1099 
 1100         /*
 1101          * Walk through the children classes.  Since we only keep a
 1102          * single parent pointer around, we walk the entire list of
 1103          * devclasses looking for children.  We set the
 1104          * DC_HAS_CHILDREN flag when a child devclass is created on
 1105          * the parent, so we only walk the list for those devclasses
 1106          * that have children.
 1107          */
 1108         if (!(dc->flags & DC_HAS_CHILDREN))
 1109                 return;
 1110         parent = dc;
 1111         TAILQ_FOREACH(dc, &devclasses, link) {
 1112                 if (dc->parent == parent)
 1113                         devclass_driver_added(dc, driver);
 1114         }
 1115 }
 1116 
 1117 /**
 1118  * @brief Add a device driver to a device class
 1119  *
 1120  * Add a device driver to a devclass. This is normally called
 1121  * automatically by DRIVER_MODULE(). The BUS_DRIVER_ADDED() method of
 1122  * all devices in the devclass will be called to allow them to attempt
 1123  * to re-probe any unmatched children.
 1124  *
 1125  * @param dc            the devclass to edit
 1126  * @param driver        the driver to register
 1127  */
 1128 int
 1129 devclass_add_driver(devclass_t dc, driver_t *driver, int pass, devclass_t *dcp)
 1130 {
 1131         driverlink_t dl;
 1132         const char *parentname;
 1133 
 1134         PDEBUG(("%s", DRIVERNAME(driver)));
 1135 
 1136         /* Don't allow invalid pass values. */
 1137         if (pass <= BUS_PASS_ROOT)
 1138                 return (EINVAL);
 1139 
 1140         dl = malloc(sizeof *dl, M_BUS, M_NOWAIT|M_ZERO);
 1141         if (!dl)
 1142                 return (ENOMEM);
 1143 
 1144         /*
 1145          * Compile the driver's methods. Also increase the reference count
 1146          * so that the class doesn't get freed when the last instance
 1147          * goes. This means we can safely use static methods and avoids a
 1148          * double-free in devclass_delete_driver.
 1149          */
 1150         kobj_class_compile((kobj_class_t) driver);
 1151 
 1152         /*
 1153          * If the driver has any base classes, make the
 1154          * devclass inherit from the devclass of the driver's
 1155          * first base class. This will allow the system to
 1156          * search for drivers in both devclasses for children
 1157          * of a device using this driver.
 1158          */
 1159         if (driver->baseclasses)
 1160                 parentname = driver->baseclasses[0]->name;
 1161         else
 1162                 parentname = NULL;
 1163         *dcp = devclass_find_internal(driver->name, parentname, TRUE);
 1164 
 1165         dl->driver = driver;
 1166         TAILQ_INSERT_TAIL(&dc->drivers, dl, link);
 1167         driver->refs++;         /* XXX: kobj_mtx */
 1168         dl->pass = pass;
 1169         driver_register_pass(dl);
 1170 
 1171         devclass_driver_added(dc, driver);
 1172         bus_data_generation_update();
 1173         return (0);
 1174 }
 1175 
 1176 /**
 1177  * @brief Register that a device driver has been deleted from a devclass
 1178  *
 1179  * Register that a device driver has been removed from a devclass.
 1180  * This is called by devclass_delete_driver to accomplish the
 1181  * recursive notification of all the children classes of busclass, as
 1182  * well as busclass.  Each layer will attempt to detach the driver
 1183  * from any devices that are children of the bus's devclass.  The function
 1184  * will return an error if a device fails to detach.
 1185  *
 1186  * We do a full search here of the devclass list at each iteration
 1187  * level to save storing children-lists in the devclass structure.  If
 1188  * we ever move beyond a few dozen devices doing this, we may need to
 1189  * reevaluate...
 1190  *
 1191  * @param busclass      the devclass of the parent bus
 1192  * @param dc            the devclass of the driver being deleted
 1193  * @param driver        the driver being deleted
 1194  */
 1195 static int
 1196 devclass_driver_deleted(devclass_t busclass, devclass_t dc, driver_t *driver)
 1197 {
 1198         devclass_t parent;
 1199         device_t dev;
 1200         int error, i;
 1201 
 1202         /*
 1203          * Disassociate from any devices.  We iterate through all the
 1204          * devices in the devclass of the driver and detach any which are
 1205          * using the driver and which have a parent in the devclass which
 1206          * we are deleting from.
 1207          *
 1208          * Note that since a driver can be in multiple devclasses, we
 1209          * should not detach devices which are not children of devices in
 1210          * the affected devclass.
 1211          */
 1212         for (i = 0; i < dc->maxunit; i++) {
 1213                 if (dc->devices[i]) {
 1214                         dev = dc->devices[i];
 1215                         if (dev->driver == driver && dev->parent &&
 1216                             dev->parent->devclass == busclass) {
 1217                                 if ((error = device_detach(dev)) != 0)
 1218                                         return (error);
 1219                                 BUS_PROBE_NOMATCH(dev->parent, dev);
 1220                                 devnomatch(dev);
 1221                                 dev->flags |= DF_DONENOMATCH;
 1222                         }
 1223                 }
 1224         }
 1225 
 1226         /*
 1227          * Walk through the children classes.  Since we only keep a
 1228          * single parent pointer around, we walk the entire list of
 1229          * devclasses looking for children.  We set the
 1230          * DC_HAS_CHILDREN flag when a child devclass is created on
 1231          * the parent, so we only walk the list for those devclasses
 1232          * that have children.
 1233          */
 1234         if (!(busclass->flags & DC_HAS_CHILDREN))
 1235                 return (0);
 1236         parent = busclass;
 1237         TAILQ_FOREACH(busclass, &devclasses, link) {
 1238                 if (busclass->parent == parent) {
 1239                         error = devclass_driver_deleted(busclass, dc, driver);
 1240                         if (error)
 1241                                 return (error);
 1242                 }
 1243         }
 1244         return (0);
 1245 }
 1246 
 1247 /**
 1248  * @brief Delete a device driver from a device class
 1249  *
 1250  * Delete a device driver from a devclass. This is normally called
 1251  * automatically by DRIVER_MODULE().
 1252  *
 1253  * If the driver is currently attached to any devices,
 1254  * devclass_delete_driver() will first attempt to detach from each
 1255  * device. If one of the detach calls fails, the driver will not be
 1256  * deleted.
 1257  *
 1258  * @param dc            the devclass to edit
 1259  * @param driver        the driver to unregister
 1260  */
 1261 int
 1262 devclass_delete_driver(devclass_t busclass, driver_t *driver)
 1263 {
 1264         devclass_t dc = devclass_find(driver->name);
 1265         driverlink_t dl;
 1266         int error;
 1267 
 1268         PDEBUG(("%s from devclass %s", driver->name, DEVCLANAME(busclass)));
 1269 
 1270         if (!dc)
 1271                 return (0);
 1272 
 1273         /*
 1274          * Find the link structure in the bus' list of drivers.
 1275          */
 1276         TAILQ_FOREACH(dl, &busclass->drivers, link) {
 1277                 if (dl->driver == driver)
 1278                         break;
 1279         }
 1280 
 1281         if (!dl) {
 1282                 PDEBUG(("%s not found in %s list", driver->name,
 1283                     busclass->name));
 1284                 return (ENOENT);
 1285         }
 1286 
 1287         error = devclass_driver_deleted(busclass, dc, driver);
 1288         if (error != 0)
 1289                 return (error);
 1290 
 1291         TAILQ_REMOVE(&busclass->drivers, dl, link);
 1292         free(dl, M_BUS);
 1293 
 1294         /* XXX: kobj_mtx */
 1295         driver->refs--;
 1296         if (driver->refs == 0)
 1297                 kobj_class_free((kobj_class_t) driver);
 1298 
 1299         bus_data_generation_update();
 1300         return (0);
 1301 }
 1302 
 1303 /**
 1304  * @brief Quiesces a set of device drivers from a device class
 1305  *
 1306  * Quiesce a device driver from a devclass. This is normally called
 1307  * automatically by DRIVER_MODULE().
 1308  *
 1309  * If the driver is currently attached to any devices,
 1310  * devclass_quiesece_driver() will first attempt to quiesce each
 1311  * device.
 1312  *
 1313  * @param dc            the devclass to edit
 1314  * @param driver        the driver to unregister
 1315  */
 1316 static int
 1317 devclass_quiesce_driver(devclass_t busclass, driver_t *driver)
 1318 {
 1319         devclass_t dc = devclass_find(driver->name);
 1320         driverlink_t dl;
 1321         device_t dev;
 1322         int i;
 1323         int error;
 1324 
 1325         PDEBUG(("%s from devclass %s", driver->name, DEVCLANAME(busclass)));
 1326 
 1327         if (!dc)
 1328                 return (0);
 1329 
 1330         /*
 1331          * Find the link structure in the bus' list of drivers.
 1332          */
 1333         TAILQ_FOREACH(dl, &busclass->drivers, link) {
 1334                 if (dl->driver == driver)
 1335                         break;
 1336         }
 1337 
 1338         if (!dl) {
 1339                 PDEBUG(("%s not found in %s list", driver->name,
 1340                     busclass->name));
 1341                 return (ENOENT);
 1342         }
 1343 
 1344         /*
 1345          * Quiesce all devices.  We iterate through all the devices in
 1346          * the devclass of the driver and quiesce any which are using
 1347          * the driver and which have a parent in the devclass which we
 1348          * are quiescing.
 1349          *
 1350          * Note that since a driver can be in multiple devclasses, we
 1351          * should not quiesce devices which are not children of
 1352          * devices in the affected devclass.
 1353          */
 1354         for (i = 0; i < dc->maxunit; i++) {
 1355                 if (dc->devices[i]) {
 1356                         dev = dc->devices[i];
 1357                         if (dev->driver == driver && dev->parent &&
 1358                             dev->parent->devclass == busclass) {
 1359                                 if ((error = device_quiesce(dev)) != 0)
 1360                                         return (error);
 1361                         }
 1362                 }
 1363         }
 1364 
 1365         return (0);
 1366 }
 1367 
 1368 /**
 1369  * @internal
 1370  */
 1371 static driverlink_t
 1372 devclass_find_driver_internal(devclass_t dc, const char *classname)
 1373 {
 1374         driverlink_t dl;
 1375 
 1376         PDEBUG(("%s in devclass %s", classname, DEVCLANAME(dc)));
 1377 
 1378         TAILQ_FOREACH(dl, &dc->drivers, link) {
 1379                 if (!strcmp(dl->driver->name, classname))
 1380                         return (dl);
 1381         }
 1382 
 1383         PDEBUG(("not found"));
 1384         return (NULL);
 1385 }
 1386 
 1387 /**
 1388  * @brief Return the name of the devclass
 1389  */
 1390 const char *
 1391 devclass_get_name(devclass_t dc)
 1392 {
 1393         return (dc->name);
 1394 }
 1395 
 1396 /**
 1397  * @brief Find a device given a unit number
 1398  *
 1399  * @param dc            the devclass to search
 1400  * @param unit          the unit number to search for
 1401  *
 1402  * @returns             the device with the given unit number or @c
 1403  *                      NULL if there is no such device
 1404  */
 1405 device_t
 1406 devclass_get_device(devclass_t dc, int unit)
 1407 {
 1408         if (dc == NULL || unit < 0 || unit >= dc->maxunit)
 1409                 return (NULL);
 1410         return (dc->devices[unit]);
 1411 }
 1412 
 1413 /**
 1414  * @brief Find the softc field of a device given a unit number
 1415  *
 1416  * @param dc            the devclass to search
 1417  * @param unit          the unit number to search for
 1418  *
 1419  * @returns             the softc field of the device with the given
 1420  *                      unit number or @c NULL if there is no such
 1421  *                      device
 1422  */
 1423 void *
 1424 devclass_get_softc(devclass_t dc, int unit)
 1425 {
 1426         device_t dev;
 1427 
 1428         dev = devclass_get_device(dc, unit);
 1429         if (!dev)
 1430                 return (NULL);
 1431 
 1432         return (device_get_softc(dev));
 1433 }
 1434 
 1435 /**
 1436  * @brief Get a list of devices in the devclass
 1437  *
 1438  * An array containing a list of all the devices in the given devclass
 1439  * is allocated and returned in @p *devlistp. The number of devices
 1440  * in the array is returned in @p *devcountp. The caller should free
 1441  * the array using @c free(p, M_TEMP), even if @p *devcountp is 0.
 1442  *
 1443  * @param dc            the devclass to examine
 1444  * @param devlistp      points at location for array pointer return
 1445  *                      value
 1446  * @param devcountp     points at location for array size return value
 1447  *
 1448  * @retval 0            success
 1449  * @retval ENOMEM       the array allocation failed
 1450  */
 1451 int
 1452 devclass_get_devices(devclass_t dc, device_t **devlistp, int *devcountp)
 1453 {
 1454         int count, i;
 1455         device_t *list;
 1456 
 1457         count = devclass_get_count(dc);
 1458         list = malloc(count * sizeof(device_t), M_TEMP, M_NOWAIT|M_ZERO);
 1459         if (!list)
 1460                 return (ENOMEM);
 1461 
 1462         count = 0;
 1463         for (i = 0; i < dc->maxunit; i++) {
 1464                 if (dc->devices[i]) {
 1465                         list[count] = dc->devices[i];
 1466                         count++;
 1467                 }
 1468         }
 1469 
 1470         *devlistp = list;
 1471         *devcountp = count;
 1472 
 1473         return (0);
 1474 }
 1475 
 1476 /**
 1477  * @brief Get a list of drivers in the devclass
 1478  *
 1479  * An array containing a list of pointers to all the drivers in the
 1480  * given devclass is allocated and returned in @p *listp.  The number
 1481  * of drivers in the array is returned in @p *countp. The caller should
 1482  * free the array using @c free(p, M_TEMP).
 1483  *
 1484  * @param dc            the devclass to examine
 1485  * @param listp         gives location for array pointer return value
 1486  * @param countp        gives location for number of array elements
 1487  *                      return value
 1488  *
 1489  * @retval 0            success
 1490  * @retval ENOMEM       the array allocation failed
 1491  */
 1492 int
 1493 devclass_get_drivers(devclass_t dc, driver_t ***listp, int *countp)
 1494 {
 1495         driverlink_t dl;
 1496         driver_t **list;
 1497         int count;
 1498 
 1499         count = 0;
 1500         TAILQ_FOREACH(dl, &dc->drivers, link)
 1501                 count++;
 1502         list = malloc(count * sizeof(driver_t *), M_TEMP, M_NOWAIT);
 1503         if (list == NULL)
 1504                 return (ENOMEM);
 1505 
 1506         count = 0;
 1507         TAILQ_FOREACH(dl, &dc->drivers, link) {
 1508                 list[count] = dl->driver;
 1509                 count++;
 1510         }
 1511         *listp = list;
 1512         *countp = count;
 1513 
 1514         return (0);
 1515 }
 1516 
 1517 /**
 1518  * @brief Get the number of devices in a devclass
 1519  *
 1520  * @param dc            the devclass to examine
 1521  */
 1522 int
 1523 devclass_get_count(devclass_t dc)
 1524 {
 1525         int count, i;
 1526 
 1527         count = 0;
 1528         for (i = 0; i < dc->maxunit; i++)
 1529                 if (dc->devices[i])
 1530                         count++;
 1531         return (count);
 1532 }
 1533 
 1534 /**
 1535  * @brief Get the maximum unit number used in a devclass
 1536  *
 1537  * Note that this is one greater than the highest currently-allocated
 1538  * unit.  If a null devclass_t is passed in, -1 is returned to indicate
 1539  * that not even the devclass has been allocated yet.
 1540  *
 1541  * @param dc            the devclass to examine
 1542  */
 1543 int
 1544 devclass_get_maxunit(devclass_t dc)
 1545 {
 1546         if (dc == NULL)
 1547                 return (-1);
 1548         return (dc->maxunit);
 1549 }
 1550 
 1551 /**
 1552  * @brief Find a free unit number in a devclass
 1553  *
 1554  * This function searches for the first unused unit number greater
 1555  * that or equal to @p unit.
 1556  *
 1557  * @param dc            the devclass to examine
 1558  * @param unit          the first unit number to check
 1559  */
 1560 int
 1561 devclass_find_free_unit(devclass_t dc, int unit)
 1562 {
 1563         if (dc == NULL)
 1564                 return (unit);
 1565         while (unit < dc->maxunit && dc->devices[unit] != NULL)
 1566                 unit++;
 1567         return (unit);
 1568 }
 1569 
 1570 /**
 1571  * @brief Set the parent of a devclass
 1572  *
 1573  * The parent class is normally initialised automatically by
 1574  * DRIVER_MODULE().
 1575  *
 1576  * @param dc            the devclass to edit
 1577  * @param pdc           the new parent devclass
 1578  */
 1579 void
 1580 devclass_set_parent(devclass_t dc, devclass_t pdc)
 1581 {
 1582         dc->parent = pdc;
 1583 }
 1584 
 1585 /**
 1586  * @brief Get the parent of a devclass
 1587  *
 1588  * @param dc            the devclass to examine
 1589  */
 1590 devclass_t
 1591 devclass_get_parent(devclass_t dc)
 1592 {
 1593         return (dc->parent);
 1594 }
 1595 
 1596 struct sysctl_ctx_list *
 1597 devclass_get_sysctl_ctx(devclass_t dc)
 1598 {
 1599         return (&dc->sysctl_ctx);
 1600 }
 1601 
 1602 struct sysctl_oid *
 1603 devclass_get_sysctl_tree(devclass_t dc)
 1604 {
 1605         return (dc->sysctl_tree);
 1606 }
 1607 
 1608 /**
 1609  * @internal
 1610  * @brief Allocate a unit number
 1611  *
 1612  * On entry, @p *unitp is the desired unit number (or @c -1 if any
 1613  * will do). The allocated unit number is returned in @p *unitp.
 1614 
 1615  * @param dc            the devclass to allocate from
 1616  * @param unitp         points at the location for the allocated unit
 1617  *                      number
 1618  *
 1619  * @retval 0            success
 1620  * @retval EEXIST       the requested unit number is already allocated
 1621  * @retval ENOMEM       memory allocation failure
 1622  */
 1623 static int
 1624 devclass_alloc_unit(devclass_t dc, device_t dev, int *unitp)
 1625 {
 1626         const char *s;
 1627         int unit = *unitp;
 1628 
 1629         PDEBUG(("unit %d in devclass %s", unit, DEVCLANAME(dc)));
 1630 
 1631         /* Ask the parent bus if it wants to wire this device. */
 1632         if (unit == -1)
 1633                 BUS_HINT_DEVICE_UNIT(device_get_parent(dev), dev, dc->name,
 1634                     &unit);
 1635 
 1636         /* If we were given a wired unit number, check for existing device */
 1637         /* XXX imp XXX */
 1638         if (unit != -1) {
 1639                 if (unit >= 0 && unit < dc->maxunit &&
 1640                     dc->devices[unit] != NULL) {
 1641                         if (bootverbose)
 1642                                 printf("%s: %s%d already exists; skipping it\n",
 1643                                     dc->name, dc->name, *unitp);
 1644                         return (EEXIST);
 1645                 }
 1646         } else {
 1647                 /* Unwired device, find the next available slot for it */
 1648                 unit = 0;
 1649                 for (unit = 0;; unit++) {
 1650                         /* If there is an "at" hint for a unit then skip it. */
 1651                         if (resource_string_value(dc->name, unit, "at", &s) ==
 1652                             0)
 1653                                 continue;
 1654 
 1655                         /* If this device slot is already in use, skip it. */
 1656                         if (unit < dc->maxunit && dc->devices[unit] != NULL)
 1657                                 continue;
 1658 
 1659                         break;
 1660                 }
 1661         }
 1662 
 1663         /*
 1664          * We've selected a unit beyond the length of the table, so let's
 1665          * extend the table to make room for all units up to and including
 1666          * this one.
 1667          */
 1668         if (unit >= dc->maxunit) {
 1669                 device_t *newlist, *oldlist;
 1670                 int newsize;
 1671 
 1672                 oldlist = dc->devices;
 1673                 newsize = roundup((unit + 1), MINALLOCSIZE / sizeof(device_t));
 1674                 newlist = malloc(sizeof(device_t) * newsize, M_BUS, M_NOWAIT);
 1675                 if (!newlist)
 1676                         return (ENOMEM);
 1677                 if (oldlist != NULL)
 1678                         bcopy(oldlist, newlist, sizeof(device_t) * dc->maxunit);
 1679                 bzero(newlist + dc->maxunit,
 1680                     sizeof(device_t) * (newsize - dc->maxunit));
 1681                 dc->devices = newlist;
 1682                 dc->maxunit = newsize;
 1683                 if (oldlist != NULL)
 1684                         free(oldlist, M_BUS);
 1685         }
 1686         PDEBUG(("now: unit %d in devclass %s", unit, DEVCLANAME(dc)));
 1687 
 1688         *unitp = unit;
 1689         return (0);
 1690 }
 1691 
 1692 /**
 1693  * @internal
 1694  * @brief Add a device to a devclass
 1695  *
 1696  * A unit number is allocated for the device (using the device's
 1697  * preferred unit number if any) and the device is registered in the
 1698  * devclass. This allows the device to be looked up by its unit
 1699  * number, e.g. by decoding a dev_t minor number.
 1700  *
 1701  * @param dc            the devclass to add to
 1702  * @param dev           the device to add
 1703  *
 1704  * @retval 0            success
 1705  * @retval EEXIST       the requested unit number is already allocated
 1706  * @retval ENOMEM       memory allocation failure
 1707  */
 1708 static int
 1709 devclass_add_device(devclass_t dc, device_t dev)
 1710 {
 1711         int buflen, error;
 1712 
 1713         PDEBUG(("%s in devclass %s", DEVICENAME(dev), DEVCLANAME(dc)));
 1714 
 1715         buflen = snprintf(NULL, 0, "%s%d$", dc->name, INT_MAX);
 1716         if (buflen < 0)
 1717                 return (ENOMEM);
 1718         dev->nameunit = malloc(buflen, M_BUS, M_NOWAIT|M_ZERO);
 1719         if (!dev->nameunit)
 1720                 return (ENOMEM);
 1721 
 1722         if ((error = devclass_alloc_unit(dc, dev, &dev->unit)) != 0) {
 1723                 free(dev->nameunit, M_BUS);
 1724                 dev->nameunit = NULL;
 1725                 return (error);
 1726         }
 1727         dc->devices[dev->unit] = dev;
 1728         dev->devclass = dc;
 1729         snprintf(dev->nameunit, buflen, "%s%d", dc->name, dev->unit);
 1730 
 1731         return (0);
 1732 }
 1733 
 1734 /**
 1735  * @internal
 1736  * @brief Delete a device from a devclass
 1737  *
 1738  * The device is removed from the devclass's device list and its unit
 1739  * number is freed.
 1740 
 1741  * @param dc            the devclass to delete from
 1742  * @param dev           the device to delete
 1743  *
 1744  * @retval 0            success
 1745  */
 1746 static int
 1747 devclass_delete_device(devclass_t dc, device_t dev)
 1748 {
 1749         if (!dc || !dev)
 1750                 return (0);
 1751 
 1752         PDEBUG(("%s in devclass %s", DEVICENAME(dev), DEVCLANAME(dc)));
 1753 
 1754         if (dev->devclass != dc || dc->devices[dev->unit] != dev)
 1755                 panic("devclass_delete_device: inconsistent device class");
 1756         dc->devices[dev->unit] = NULL;
 1757         if (dev->flags & DF_WILDCARD)
 1758                 dev->unit = -1;
 1759         dev->devclass = NULL;
 1760         free(dev->nameunit, M_BUS);
 1761         dev->nameunit = NULL;
 1762 
 1763         return (0);
 1764 }
 1765 
 1766 /**
 1767  * @internal
 1768  * @brief Make a new device and add it as a child of @p parent
 1769  *
 1770  * @param parent        the parent of the new device
 1771  * @param name          the devclass name of the new device or @c NULL
 1772  *                      to leave the devclass unspecified
 1773  * @parem unit          the unit number of the new device of @c -1 to
 1774  *                      leave the unit number unspecified
 1775  *
 1776  * @returns the new device
 1777  */
 1778 static device_t
 1779 make_device(device_t parent, const char *name, int unit)
 1780 {
 1781         device_t dev;
 1782         devclass_t dc;
 1783 
 1784         PDEBUG(("%s at %s as unit %d", name, DEVICENAME(parent), unit));
 1785 
 1786         if (name) {
 1787                 dc = devclass_find_internal(name, NULL, TRUE);
 1788                 if (!dc) {
 1789                         printf("make_device: can't find device class %s\n",
 1790                             name);
 1791                         return (NULL);
 1792                 }
 1793         } else {
 1794                 dc = NULL;
 1795         }
 1796 
 1797         dev = malloc(sizeof(struct device), M_BUS, M_NOWAIT|M_ZERO);
 1798         if (!dev)
 1799                 return (NULL);
 1800 
 1801         dev->parent = parent;
 1802         TAILQ_INIT(&dev->children);
 1803         kobj_init((kobj_t) dev, &null_class);
 1804         dev->driver = NULL;
 1805         dev->devclass = NULL;
 1806         dev->unit = unit;
 1807         dev->nameunit = NULL;
 1808         dev->desc = NULL;
 1809         dev->busy = 0;
 1810         dev->devflags = 0;
 1811         dev->flags = DF_ENABLED;
 1812         dev->order = 0;
 1813         if (unit == -1)
 1814                 dev->flags |= DF_WILDCARD;
 1815         if (name) {
 1816                 dev->flags |= DF_FIXEDCLASS;
 1817                 if (devclass_add_device(dc, dev)) {
 1818                         kobj_delete((kobj_t) dev, M_BUS);
 1819                         return (NULL);
 1820                 }
 1821         }
 1822         dev->ivars = NULL;
 1823         dev->softc = NULL;
 1824 
 1825         dev->state = DS_NOTPRESENT;
 1826 
 1827         TAILQ_INSERT_TAIL(&bus_data_devices, dev, devlink);
 1828         bus_data_generation_update();
 1829 
 1830         return (dev);
 1831 }
 1832 
 1833 /**
 1834  * @internal
 1835  * @brief Print a description of a device.
 1836  */
 1837 static int
 1838 device_print_child(device_t dev, device_t child)
 1839 {
 1840         int retval = 0;
 1841 
 1842         if (device_is_alive(child))
 1843                 retval += BUS_PRINT_CHILD(dev, child);
 1844         else
 1845                 retval += device_printf(child, " not found\n");
 1846 
 1847         return (retval);
 1848 }
 1849 
 1850 /**
 1851  * @brief Create a new device
 1852  *
 1853  * This creates a new device and adds it as a child of an existing
 1854  * parent device. The new device will be added after the last existing
 1855  * child with order zero.
 1856  *
 1857  * @param dev           the device which will be the parent of the
 1858  *                      new child device
 1859  * @param name          devclass name for new device or @c NULL if not
 1860  *                      specified
 1861  * @param unit          unit number for new device or @c -1 if not
 1862  *                      specified
 1863  *
 1864  * @returns             the new device
 1865  */
 1866 device_t
 1867 device_add_child(device_t dev, const char *name, int unit)
 1868 {
 1869         return (device_add_child_ordered(dev, 0, name, unit));
 1870 }
 1871 
 1872 /**
 1873  * @brief Create a new device
 1874  *
 1875  * This creates a new device and adds it as a child of an existing
 1876  * parent device. The new device will be added after the last existing
 1877  * child with the same order.
 1878  *
 1879  * @param dev           the device which will be the parent of the
 1880  *                      new child device
 1881  * @param order         a value which is used to partially sort the
 1882  *                      children of @p dev - devices created using
 1883  *                      lower values of @p order appear first in @p
 1884  *                      dev's list of children
 1885  * @param name          devclass name for new device or @c NULL if not
 1886  *                      specified
 1887  * @param unit          unit number for new device or @c -1 if not
 1888  *                      specified
 1889  *
 1890  * @returns             the new device
 1891  */
 1892 device_t
 1893 device_add_child_ordered(device_t dev, u_int order, const char *name, int unit)
 1894 {
 1895         device_t child;
 1896         device_t place;
 1897 
 1898         PDEBUG(("%s at %s with order %u as unit %d",
 1899             name, DEVICENAME(dev), order, unit));
 1900         KASSERT(name != NULL || unit == -1,
 1901             ("child device with wildcard name and specific unit number"));
 1902 
 1903         child = make_device(dev, name, unit);
 1904         if (child == NULL)
 1905                 return (child);
 1906         child->order = order;
 1907 
 1908         TAILQ_FOREACH(place, &dev->children, link) {
 1909                 if (place->order > order)
 1910                         break;
 1911         }
 1912 
 1913         if (place) {
 1914                 /*
 1915                  * The device 'place' is the first device whose order is
 1916                  * greater than the new child.
 1917                  */
 1918                 TAILQ_INSERT_BEFORE(place, child, link);
 1919         } else {
 1920                 /*
 1921                  * The new child's order is greater or equal to the order of
 1922                  * any existing device. Add the child to the tail of the list.
 1923                  */
 1924                 TAILQ_INSERT_TAIL(&dev->children, child, link);
 1925         }
 1926 
 1927         bus_data_generation_update();
 1928         return (child);
 1929 }
 1930 
 1931 /**
 1932  * @brief Delete a device
 1933  *
 1934  * This function deletes a device along with all of its children. If
 1935  * the device currently has a driver attached to it, the device is
 1936  * detached first using device_detach().
 1937  *
 1938  * @param dev           the parent device
 1939  * @param child         the device to delete
 1940  *
 1941  * @retval 0            success
 1942  * @retval non-zero     a unit error code describing the error
 1943  */
 1944 int
 1945 device_delete_child(device_t dev, device_t child)
 1946 {
 1947         int error;
 1948         device_t grandchild;
 1949 
 1950         PDEBUG(("%s from %s", DEVICENAME(child), DEVICENAME(dev)));
 1951 
 1952         /* detach parent before deleting children, if any */
 1953         if ((error = device_detach(child)) != 0)
 1954                 return (error);
 1955         
 1956         /* remove children second */
 1957         while ((grandchild = TAILQ_FIRST(&child->children)) != NULL) {
 1958                 error = device_delete_child(child, grandchild);
 1959                 if (error)
 1960                         return (error);
 1961         }
 1962 
 1963         if (child->devclass)
 1964                 devclass_delete_device(child->devclass, child);
 1965         if (child->parent)
 1966                 BUS_CHILD_DELETED(dev, child);
 1967         TAILQ_REMOVE(&dev->children, child, link);
 1968         TAILQ_REMOVE(&bus_data_devices, child, devlink);
 1969         kobj_delete((kobj_t) child, M_BUS);
 1970 
 1971         bus_data_generation_update();
 1972         return (0);
 1973 }
 1974 
 1975 /**
 1976  * @brief Delete all children devices of the given device, if any.
 1977  *
 1978  * This function deletes all children devices of the given device, if
 1979  * any, using the device_delete_child() function for each device it
 1980  * finds. If a child device cannot be deleted, this function will
 1981  * return an error code.
 1982  *
 1983  * @param dev           the parent device
 1984  *
 1985  * @retval 0            success
 1986  * @retval non-zero     a device would not detach
 1987  */
 1988 int
 1989 device_delete_children(device_t dev)
 1990 {
 1991         device_t child;
 1992         int error;
 1993 
 1994         PDEBUG(("Deleting all children of %s", DEVICENAME(dev)));
 1995 
 1996         error = 0;
 1997 
 1998         while ((child = TAILQ_FIRST(&dev->children)) != NULL) {
 1999                 error = device_delete_child(dev, child);
 2000                 if (error) {
 2001                         PDEBUG(("Failed deleting %s", DEVICENAME(child)));
 2002                         break;
 2003                 }
 2004         }
 2005         return (error);
 2006 }
 2007 
 2008 /**
 2009  * @brief Find a device given a unit number
 2010  *
 2011  * This is similar to devclass_get_devices() but only searches for
 2012  * devices which have @p dev as a parent.
 2013  *
 2014  * @param dev           the parent device to search
 2015  * @param unit          the unit number to search for.  If the unit is -1,
 2016  *                      return the first child of @p dev which has name
 2017  *                      @p classname (that is, the one with the lowest unit.)
 2018  *
 2019  * @returns             the device with the given unit number or @c
 2020  *                      NULL if there is no such device
 2021  */
 2022 device_t
 2023 device_find_child(device_t dev, const char *classname, int unit)
 2024 {
 2025         devclass_t dc;
 2026         device_t child;
 2027 
 2028         dc = devclass_find(classname);
 2029         if (!dc)
 2030                 return (NULL);
 2031 
 2032         if (unit != -1) {
 2033                 child = devclass_get_device(dc, unit);
 2034                 if (child && child->parent == dev)
 2035                         return (child);
 2036         } else {
 2037                 for (unit = 0; unit < devclass_get_maxunit(dc); unit++) {
 2038                         child = devclass_get_device(dc, unit);
 2039                         if (child && child->parent == dev)
 2040                                 return (child);
 2041                 }
 2042         }
 2043         return (NULL);
 2044 }
 2045 
 2046 /**
 2047  * @internal
 2048  */
 2049 static driverlink_t
 2050 first_matching_driver(devclass_t dc, device_t dev)
 2051 {
 2052         if (dev->devclass)
 2053                 return (devclass_find_driver_internal(dc, dev->devclass->name));
 2054         return (TAILQ_FIRST(&dc->drivers));
 2055 }
 2056 
 2057 /**
 2058  * @internal
 2059  */
 2060 static driverlink_t
 2061 next_matching_driver(devclass_t dc, device_t dev, driverlink_t last)
 2062 {
 2063         if (dev->devclass) {
 2064                 driverlink_t dl;
 2065                 for (dl = TAILQ_NEXT(last, link); dl; dl = TAILQ_NEXT(dl, link))
 2066                         if (!strcmp(dev->devclass->name, dl->driver->name))
 2067                                 return (dl);
 2068                 return (NULL);
 2069         }
 2070         return (TAILQ_NEXT(last, link));
 2071 }
 2072 
 2073 /**
 2074  * @internal
 2075  */
 2076 int
 2077 device_probe_child(device_t dev, device_t child)
 2078 {
 2079         devclass_t dc;
 2080         driverlink_t best = NULL;
 2081         driverlink_t dl;
 2082         int result, pri = 0;
 2083         int hasclass = (child->devclass != NULL);
 2084 
 2085         GIANT_REQUIRED;
 2086 
 2087         dc = dev->devclass;
 2088         if (!dc)
 2089                 panic("device_probe_child: parent device has no devclass");
 2090 
 2091         /*
 2092          * If the state is already probed, then return.  However, don't
 2093          * return if we can rebid this object.
 2094          */
 2095         if (child->state == DS_ALIVE && (child->flags & DF_REBID) == 0)
 2096                 return (0);
 2097 
 2098         for (; dc; dc = dc->parent) {
 2099                 for (dl = first_matching_driver(dc, child);
 2100                      dl;
 2101                      dl = next_matching_driver(dc, child, dl)) {
 2102                         /* If this driver's pass is too high, then ignore it. */
 2103                         if (dl->pass > bus_current_pass)
 2104                                 continue;
 2105 
 2106                         PDEBUG(("Trying %s", DRIVERNAME(dl->driver)));
 2107                         result = device_set_driver(child, dl->driver);
 2108                         if (result == ENOMEM)
 2109                                 return (result);
 2110                         else if (result != 0)
 2111                                 continue;
 2112                         if (!hasclass) {
 2113                                 if (device_set_devclass(child,
 2114                                     dl->driver->name) != 0) {
 2115                                         char const * devname =
 2116                                             device_get_name(child);
 2117                                         if (devname == NULL)
 2118                                                 devname = "(unknown)";
 2119                                         printf("driver bug: Unable to set "
 2120                                             "devclass (class: %s "
 2121                                             "devname: %s)\n",
 2122                                             dl->driver->name,
 2123                                             devname);
 2124                                         (void)device_set_driver(child, NULL);
 2125                                         continue;
 2126                                 }
 2127                         }
 2128 
 2129                         /* Fetch any flags for the device before probing. */
 2130                         resource_int_value(dl->driver->name, child->unit,
 2131                             "flags", &child->devflags);
 2132 
 2133                         result = DEVICE_PROBE(child);
 2134 
 2135                         /* Reset flags and devclass before the next probe. */
 2136                         child->devflags = 0;
 2137                         if (!hasclass)
 2138                                 (void)device_set_devclass(child, NULL);
 2139 
 2140                         /*
 2141                          * If the driver returns SUCCESS, there can be
 2142                          * no higher match for this device.
 2143                          */
 2144                         if (result == 0) {
 2145                                 best = dl;
 2146                                 pri = 0;
 2147                                 break;
 2148                         }
 2149 
 2150                         /*
 2151                          * Reset DF_QUIET in case this driver doesn't
 2152                          * end up as the best driver.
 2153                          */
 2154                         device_verbose(child);
 2155 
 2156                         /*
 2157                          * Probes that return BUS_PROBE_NOWILDCARD or lower
 2158                          * only match on devices whose driver was explicitly
 2159                          * specified.
 2160                          */
 2161                         if (result <= BUS_PROBE_NOWILDCARD &&
 2162                             !(child->flags & DF_FIXEDCLASS)) {
 2163                                 result = ENXIO;
 2164                         }
 2165 
 2166                         /*
 2167                          * The driver returned an error so it
 2168                          * certainly doesn't match.
 2169                          */
 2170                         if (result > 0) {
 2171                                 (void)device_set_driver(child, NULL);
 2172                                 continue;
 2173                         }
 2174 
 2175                         /*
 2176                          * A priority lower than SUCCESS, remember the
 2177                          * best matching driver. Initialise the value
 2178                          * of pri for the first match.
 2179                          */
 2180                         if (best == NULL || result > pri) {
 2181                                 best = dl;
 2182                                 pri = result;
 2183                                 continue;
 2184                         }
 2185                 }
 2186                 /*
 2187                  * If we have an unambiguous match in this devclass,
 2188                  * don't look in the parent.
 2189                  */
 2190                 if (best && pri == 0)
 2191                         break;
 2192         }
 2193 
 2194         /*
 2195          * If we found a driver, change state and initialise the devclass.
 2196          */
 2197         /* XXX What happens if we rebid and got no best? */
 2198         if (best) {
 2199                 /*
 2200                  * If this device was attached, and we were asked to
 2201                  * rescan, and it is a different driver, then we have
 2202                  * to detach the old driver and reattach this new one.
 2203                  * Note, we don't have to check for DF_REBID here
 2204                  * because if the state is > DS_ALIVE, we know it must
 2205                  * be.
 2206                  *
 2207                  * This assumes that all DF_REBID drivers can have
 2208                  * their probe routine called at any time and that
 2209                  * they are idempotent as well as completely benign in
 2210                  * normal operations.
 2211                  *
 2212                  * We also have to make sure that the detach
 2213                  * succeeded, otherwise we fail the operation (or
 2214                  * maybe it should just fail silently?  I'm torn).
 2215                  */
 2216                 if (child->state > DS_ALIVE && best->driver != child->driver)
 2217                         if ((result = device_detach(dev)) != 0)
 2218                                 return (result);
 2219 
 2220                 /* Set the winning driver, devclass, and flags. */
 2221                 if (!child->devclass) {
 2222                         result = device_set_devclass(child, best->driver->name);
 2223                         if (result != 0)
 2224                                 return (result);
 2225                 }
 2226                 result = device_set_driver(child, best->driver);
 2227                 if (result != 0)
 2228                         return (result);
 2229                 resource_int_value(best->driver->name, child->unit,
 2230                     "flags", &child->devflags);
 2231 
 2232                 if (pri < 0) {
 2233                         /*
 2234                          * A bit bogus. Call the probe method again to make
 2235                          * sure that we have the right description.
 2236                          */
 2237                         DEVICE_PROBE(child);
 2238 #if 0
 2239                         child->flags |= DF_REBID;
 2240 #endif
 2241                 } else
 2242                         child->flags &= ~DF_REBID;
 2243                 child->state = DS_ALIVE;
 2244 
 2245                 bus_data_generation_update();
 2246                 return (0);
 2247         }
 2248 
 2249         return (ENXIO);
 2250 }
 2251 
 2252 /**
 2253  * @brief Return the parent of a device
 2254  */
 2255 device_t
 2256 device_get_parent(device_t dev)
 2257 {
 2258         return (dev->parent);
 2259 }
 2260 
 2261 /**
 2262  * @brief Get a list of children of a device
 2263  *
 2264  * An array containing a list of all the children of the given device
 2265  * is allocated and returned in @p *devlistp. The number of devices
 2266  * in the array is returned in @p *devcountp. The caller should free
 2267  * the array using @c free(p, M_TEMP).
 2268  *
 2269  * @param dev           the device to examine
 2270  * @param devlistp      points at location for array pointer return
 2271  *                      value
 2272  * @param devcountp     points at location for array size return value
 2273  *
 2274  * @retval 0            success
 2275  * @retval ENOMEM       the array allocation failed
 2276  */
 2277 int
 2278 device_get_children(device_t dev, device_t **devlistp, int *devcountp)
 2279 {
 2280         int count;
 2281         device_t child;
 2282         device_t *list;
 2283 
 2284         count = 0;
 2285         TAILQ_FOREACH(child, &dev->children, link) {
 2286                 count++;
 2287         }
 2288         if (count == 0) {
 2289                 *devlistp = NULL;
 2290                 *devcountp = 0;
 2291                 return (0);
 2292         }
 2293 
 2294         list = malloc(count * sizeof(device_t), M_TEMP, M_NOWAIT|M_ZERO);
 2295         if (!list)
 2296                 return (ENOMEM);
 2297 
 2298         count = 0;
 2299         TAILQ_FOREACH(child, &dev->children, link) {
 2300                 list[count] = child;
 2301                 count++;
 2302         }
 2303 
 2304         *devlistp = list;
 2305         *devcountp = count;
 2306 
 2307         return (0);
 2308 }
 2309 
 2310 /**
 2311  * @brief Return the current driver for the device or @c NULL if there
 2312  * is no driver currently attached
 2313  */
 2314 driver_t *
 2315 device_get_driver(device_t dev)
 2316 {
 2317         return (dev->driver);
 2318 }
 2319 
 2320 /**
 2321  * @brief Return the current devclass for the device or @c NULL if
 2322  * there is none.
 2323  */
 2324 devclass_t
 2325 device_get_devclass(device_t dev)
 2326 {
 2327         return (dev->devclass);
 2328 }
 2329 
 2330 /**
 2331  * @brief Return the name of the device's devclass or @c NULL if there
 2332  * is none.
 2333  */
 2334 const char *
 2335 device_get_name(device_t dev)
 2336 {
 2337         if (dev != NULL && dev->devclass)
 2338                 return (devclass_get_name(dev->devclass));
 2339         return (NULL);
 2340 }
 2341 
 2342 /**
 2343  * @brief Return a string containing the device's devclass name
 2344  * followed by an ascii representation of the device's unit number
 2345  * (e.g. @c "foo2").
 2346  */
 2347 const char *
 2348 device_get_nameunit(device_t dev)
 2349 {
 2350         return (dev->nameunit);
 2351 }
 2352 
 2353 /**
 2354  * @brief Return the device's unit number.
 2355  */
 2356 int
 2357 device_get_unit(device_t dev)
 2358 {
 2359         return (dev->unit);
 2360 }
 2361 
 2362 /**
 2363  * @brief Return the device's description string
 2364  */
 2365 const char *
 2366 device_get_desc(device_t dev)
 2367 {
 2368         return (dev->desc);
 2369 }
 2370 
 2371 /**
 2372  * @brief Return the device's flags
 2373  */
 2374 uint32_t
 2375 device_get_flags(device_t dev)
 2376 {
 2377         return (dev->devflags);
 2378 }
 2379 
 2380 struct sysctl_ctx_list *
 2381 device_get_sysctl_ctx(device_t dev)
 2382 {
 2383         return (&dev->sysctl_ctx);
 2384 }
 2385 
 2386 struct sysctl_oid *
 2387 device_get_sysctl_tree(device_t dev)
 2388 {
 2389         return (dev->sysctl_tree);
 2390 }
 2391 
 2392 /**
 2393  * @brief Print the name of the device followed by a colon and a space
 2394  *
 2395  * @returns the number of characters printed
 2396  */
 2397 int
 2398 device_print_prettyname(device_t dev)
 2399 {
 2400         const char *name = device_get_name(dev);
 2401 
 2402         if (name == NULL)
 2403                 return (printf("unknown: "));
 2404         return (printf("%s%d: ", name, device_get_unit(dev)));
 2405 }
 2406 
 2407 /**
 2408  * @brief Print the name of the device followed by a colon, a space
 2409  * and the result of calling vprintf() with the value of @p fmt and
 2410  * the following arguments.
 2411  *
 2412  * @returns the number of characters printed
 2413  */
 2414 int
 2415 device_printf(device_t dev, const char * fmt, ...)
 2416 {
 2417         va_list ap;
 2418         int retval;
 2419 
 2420         retval = device_print_prettyname(dev);
 2421         va_start(ap, fmt);
 2422         retval += vprintf(fmt, ap);
 2423         va_end(ap);
 2424         return (retval);
 2425 }
 2426 
 2427 /**
 2428  * @internal
 2429  */
 2430 static void
 2431 device_set_desc_internal(device_t dev, const char* desc, int copy)
 2432 {
 2433         if (dev->desc && (dev->flags & DF_DESCMALLOCED)) {
 2434                 free(dev->desc, M_BUS);
 2435                 dev->flags &= ~DF_DESCMALLOCED;
 2436                 dev->desc = NULL;
 2437         }
 2438 
 2439         if (copy && desc) {
 2440                 dev->desc = malloc(strlen(desc) + 1, M_BUS, M_NOWAIT);
 2441                 if (dev->desc) {
 2442                         strcpy(dev->desc, desc);
 2443                         dev->flags |= DF_DESCMALLOCED;
 2444                 }
 2445         } else {
 2446                 /* Avoid a -Wcast-qual warning */
 2447                 dev->desc = (char *)(uintptr_t) desc;
 2448         }
 2449 
 2450         bus_data_generation_update();
 2451 }
 2452 
 2453 /**
 2454  * @brief Set the device's description
 2455  *
 2456  * The value of @c desc should be a string constant that will not
 2457  * change (at least until the description is changed in a subsequent
 2458  * call to device_set_desc() or device_set_desc_copy()).
 2459  */
 2460 void
 2461 device_set_desc(device_t dev, const char* desc)
 2462 {
 2463         device_set_desc_internal(dev, desc, FALSE);
 2464 }
 2465 
 2466 /**
 2467  * @brief Set the device's description
 2468  *
 2469  * The string pointed to by @c desc is copied. Use this function if
 2470  * the device description is generated, (e.g. with sprintf()).
 2471  */
 2472 void
 2473 device_set_desc_copy(device_t dev, const char* desc)
 2474 {
 2475         device_set_desc_internal(dev, desc, TRUE);
 2476 }
 2477 
 2478 /**
 2479  * @brief Set the device's flags
 2480  */
 2481 void
 2482 device_set_flags(device_t dev, uint32_t flags)
 2483 {
 2484         dev->devflags = flags;
 2485 }
 2486 
 2487 /**
 2488  * @brief Return the device's softc field
 2489  *
 2490  * The softc is allocated and zeroed when a driver is attached, based
 2491  * on the size field of the driver.
 2492  */
 2493 void *
 2494 device_get_softc(device_t dev)
 2495 {
 2496         return (dev->softc);
 2497 }
 2498 
 2499 /**
 2500  * @brief Set the device's softc field
 2501  *
 2502  * Most drivers do not need to use this since the softc is allocated
 2503  * automatically when the driver is attached.
 2504  */
 2505 void
 2506 device_set_softc(device_t dev, void *softc)
 2507 {
 2508         if (dev->softc && !(dev->flags & DF_EXTERNALSOFTC))
 2509                 free(dev->softc, M_BUS_SC);
 2510         dev->softc = softc;
 2511         if (dev->softc)
 2512                 dev->flags |= DF_EXTERNALSOFTC;
 2513         else
 2514                 dev->flags &= ~DF_EXTERNALSOFTC;
 2515 }
 2516 
 2517 /**
 2518  * @brief Free claimed softc
 2519  *
 2520  * Most drivers do not need to use this since the softc is freed
 2521  * automatically when the driver is detached.
 2522  */
 2523 void
 2524 device_free_softc(void *softc)
 2525 {
 2526         free(softc, M_BUS_SC);
 2527 }
 2528 
 2529 /**
 2530  * @brief Claim softc
 2531  *
 2532  * This function can be used to let the driver free the automatically
 2533  * allocated softc using "device_free_softc()". This function is
 2534  * useful when the driver is refcounting the softc and the softc
 2535  * cannot be freed when the "device_detach" method is called.
 2536  */
 2537 void
 2538 device_claim_softc(device_t dev)
 2539 {
 2540         if (dev->softc)
 2541                 dev->flags |= DF_EXTERNALSOFTC;
 2542         else
 2543                 dev->flags &= ~DF_EXTERNALSOFTC;
 2544 }
 2545 
 2546 /**
 2547  * @brief Get the device's ivars field
 2548  *
 2549  * The ivars field is used by the parent device to store per-device
 2550  * state (e.g. the physical location of the device or a list of
 2551  * resources).
 2552  */
 2553 void *
 2554 device_get_ivars(device_t dev)
 2555 {
 2556 
 2557         KASSERT(dev != NULL, ("device_get_ivars(NULL, ...)"));
 2558         return (dev->ivars);
 2559 }
 2560 
 2561 /**
 2562  * @brief Set the device's ivars field
 2563  */
 2564 void
 2565 device_set_ivars(device_t dev, void * ivars)
 2566 {
 2567 
 2568         KASSERT(dev != NULL, ("device_set_ivars(NULL, ...)"));
 2569         dev->ivars = ivars;
 2570 }
 2571 
 2572 /**
 2573  * @brief Return the device's state
 2574  */
 2575 device_state_t
 2576 device_get_state(device_t dev)
 2577 {
 2578         return (dev->state);
 2579 }
 2580 
 2581 /**
 2582  * @brief Set the DF_ENABLED flag for the device
 2583  */
 2584 void
 2585 device_enable(device_t dev)
 2586 {
 2587         dev->flags |= DF_ENABLED;
 2588 }
 2589 
 2590 /**
 2591  * @brief Clear the DF_ENABLED flag for the device
 2592  */
 2593 void
 2594 device_disable(device_t dev)
 2595 {
 2596         dev->flags &= ~DF_ENABLED;
 2597 }
 2598 
 2599 /**
 2600  * @brief Increment the busy counter for the device
 2601  */
 2602 void
 2603 device_busy(device_t dev)
 2604 {
 2605         if (dev->state < DS_ATTACHING)
 2606                 panic("device_busy: called for unattached device");
 2607         if (dev->busy == 0 && dev->parent)
 2608                 device_busy(dev->parent);
 2609         dev->busy++;
 2610         if (dev->state == DS_ATTACHED)
 2611                 dev->state = DS_BUSY;
 2612 }
 2613 
 2614 /**
 2615  * @brief Decrement the busy counter for the device
 2616  */
 2617 void
 2618 device_unbusy(device_t dev)
 2619 {
 2620         if (dev->busy != 0 && dev->state != DS_BUSY &&
 2621             dev->state != DS_ATTACHING)
 2622                 panic("device_unbusy: called for non-busy device %s",
 2623                     device_get_nameunit(dev));
 2624         dev->busy--;
 2625         if (dev->busy == 0) {
 2626                 if (dev->parent)
 2627                         device_unbusy(dev->parent);
 2628                 if (dev->state == DS_BUSY)
 2629                         dev->state = DS_ATTACHED;
 2630         }
 2631 }
 2632 
 2633 /**
 2634  * @brief Set the DF_QUIET flag for the device
 2635  */
 2636 void
 2637 device_quiet(device_t dev)
 2638 {
 2639         dev->flags |= DF_QUIET;
 2640 }
 2641 
 2642 /**
 2643  * @brief Clear the DF_QUIET flag for the device
 2644  */
 2645 void
 2646 device_verbose(device_t dev)
 2647 {
 2648         dev->flags &= ~DF_QUIET;
 2649 }
 2650 
 2651 /**
 2652  * @brief Return non-zero if the DF_QUIET flag is set on the device
 2653  */
 2654 int
 2655 device_is_quiet(device_t dev)
 2656 {
 2657         return ((dev->flags & DF_QUIET) != 0);
 2658 }
 2659 
 2660 /**
 2661  * @brief Return non-zero if the DF_ENABLED flag is set on the device
 2662  */
 2663 int
 2664 device_is_enabled(device_t dev)
 2665 {
 2666         return ((dev->flags & DF_ENABLED) != 0);
 2667 }
 2668 
 2669 /**
 2670  * @brief Return non-zero if the device was successfully probed
 2671  */
 2672 int
 2673 device_is_alive(device_t dev)
 2674 {
 2675         return (dev->state >= DS_ALIVE);
 2676 }
 2677 
 2678 /**
 2679  * @brief Return non-zero if the device currently has a driver
 2680  * attached to it
 2681  */
 2682 int
 2683 device_is_attached(device_t dev)
 2684 {
 2685         return (dev->state >= DS_ATTACHED);
 2686 }
 2687 
 2688 /**
 2689  * @brief Return non-zero if the device is currently suspended.
 2690  */
 2691 int
 2692 device_is_suspended(device_t dev)
 2693 {
 2694         return ((dev->flags & DF_SUSPENDED) != 0);
 2695 }
 2696 
 2697 /**
 2698  * @brief Set the devclass of a device
 2699  * @see devclass_add_device().
 2700  */
 2701 int
 2702 device_set_devclass(device_t dev, const char *classname)
 2703 {
 2704         devclass_t dc;
 2705         int error;
 2706 
 2707         if (!classname) {
 2708                 if (dev->devclass)
 2709                         devclass_delete_device(dev->devclass, dev);
 2710                 return (0);
 2711         }
 2712 
 2713         if (dev->devclass) {
 2714                 printf("device_set_devclass: device class already set\n");
 2715                 return (EINVAL);
 2716         }
 2717 
 2718         dc = devclass_find_internal(classname, NULL, TRUE);
 2719         if (!dc)
 2720                 return (ENOMEM);
 2721 
 2722         error = devclass_add_device(dc, dev);
 2723 
 2724         bus_data_generation_update();
 2725         return (error);
 2726 }
 2727 
 2728 /**
 2729  * @brief Set the devclass of a device and mark the devclass fixed.
 2730  * @see device_set_devclass()
 2731  */
 2732 int
 2733 device_set_devclass_fixed(device_t dev, const char *classname)
 2734 {
 2735         int error;
 2736 
 2737         if (classname == NULL)
 2738                 return (EINVAL);
 2739 
 2740         error = device_set_devclass(dev, classname);
 2741         if (error)
 2742                 return (error);
 2743         dev->flags |= DF_FIXEDCLASS;
 2744         return (0);
 2745 }
 2746 
 2747 /**
 2748  * @brief Set the driver of a device
 2749  *
 2750  * @retval 0            success
 2751  * @retval EBUSY        the device already has a driver attached
 2752  * @retval ENOMEM       a memory allocation failure occurred
 2753  */
 2754 int
 2755 device_set_driver(device_t dev, driver_t *driver)
 2756 {
 2757         if (dev->state >= DS_ATTACHED)
 2758                 return (EBUSY);
 2759 
 2760         if (dev->driver == driver)
 2761                 return (0);
 2762 
 2763         if (dev->softc && !(dev->flags & DF_EXTERNALSOFTC)) {
 2764                 free(dev->softc, M_BUS_SC);
 2765                 dev->softc = NULL;
 2766         }
 2767         device_set_desc(dev, NULL);
 2768         kobj_delete((kobj_t) dev, NULL);
 2769         dev->driver = driver;
 2770         if (driver) {
 2771                 kobj_init((kobj_t) dev, (kobj_class_t) driver);
 2772                 if (!(dev->flags & DF_EXTERNALSOFTC) && driver->size > 0) {
 2773                         dev->softc = malloc(driver->size, M_BUS_SC,
 2774                             M_NOWAIT | M_ZERO);
 2775                         if (!dev->softc) {
 2776                                 kobj_delete((kobj_t) dev, NULL);
 2777                                 kobj_init((kobj_t) dev, &null_class);
 2778                                 dev->driver = NULL;
 2779                                 return (ENOMEM);
 2780                         }
 2781                 }
 2782         } else {
 2783                 kobj_init((kobj_t) dev, &null_class);
 2784         }
 2785 
 2786         bus_data_generation_update();
 2787         return (0);
 2788 }
 2789 
 2790 /**
 2791  * @brief Probe a device, and return this status.
 2792  *
 2793  * This function is the core of the device autoconfiguration
 2794  * system. Its purpose is to select a suitable driver for a device and
 2795  * then call that driver to initialise the hardware appropriately. The
 2796  * driver is selected by calling the DEVICE_PROBE() method of a set of
 2797  * candidate drivers and then choosing the driver which returned the
 2798  * best value. This driver is then attached to the device using
 2799  * device_attach().
 2800  *
 2801  * The set of suitable drivers is taken from the list of drivers in
 2802  * the parent device's devclass. If the device was originally created
 2803  * with a specific class name (see device_add_child()), only drivers
 2804  * with that name are probed, otherwise all drivers in the devclass
 2805  * are probed. If no drivers return successful probe values in the
 2806  * parent devclass, the search continues in the parent of that
 2807  * devclass (see devclass_get_parent()) if any.
 2808  *
 2809  * @param dev           the device to initialise
 2810  *
 2811  * @retval 0            success
 2812  * @retval ENXIO        no driver was found
 2813  * @retval ENOMEM       memory allocation failure
 2814  * @retval non-zero     some other unix error code
 2815  * @retval -1           Device already attached
 2816  */
 2817 int
 2818 device_probe(device_t dev)
 2819 {
 2820         int error;
 2821 
 2822         GIANT_REQUIRED;
 2823 
 2824         if (dev->state >= DS_ALIVE && (dev->flags & DF_REBID) == 0)
 2825                 return (-1);
 2826 
 2827         if (!(dev->flags & DF_ENABLED)) {
 2828                 if (bootverbose && device_get_name(dev) != NULL) {
 2829                         device_print_prettyname(dev);
 2830                         printf("not probed (disabled)\n");
 2831                 }
 2832                 return (-1);
 2833         }
 2834         if ((error = device_probe_child(dev->parent, dev)) != 0) {
 2835                 if (bus_current_pass == BUS_PASS_DEFAULT &&
 2836                     !(dev->flags & DF_DONENOMATCH)) {
 2837                         BUS_PROBE_NOMATCH(dev->parent, dev);
 2838                         devnomatch(dev);
 2839                         dev->flags |= DF_DONENOMATCH;
 2840                 }
 2841                 return (error);
 2842         }
 2843         return (0);
 2844 }
 2845 
 2846 /**
 2847  * @brief Probe a device and attach a driver if possible
 2848  *
 2849  * calls device_probe() and attaches if that was successful.
 2850  */
 2851 int
 2852 device_probe_and_attach(device_t dev)
 2853 {
 2854         int error;
 2855 
 2856         GIANT_REQUIRED;
 2857 
 2858         error = device_probe(dev);
 2859         if (error == -1)
 2860                 return (0);
 2861         else if (error != 0)
 2862                 return (error);
 2863 
 2864         CURVNET_SET_QUIET(vnet0);
 2865         error = device_attach(dev);
 2866         CURVNET_RESTORE();
 2867         return error;
 2868 }
 2869 
 2870 /**
 2871  * @brief Attach a device driver to a device
 2872  *
 2873  * This function is a wrapper around the DEVICE_ATTACH() driver
 2874  * method. In addition to calling DEVICE_ATTACH(), it initialises the
 2875  * device's sysctl tree, optionally prints a description of the device
 2876  * and queues a notification event for user-based device management
 2877  * services.
 2878  *
 2879  * Normally this function is only called internally from
 2880  * device_probe_and_attach().
 2881  *
 2882  * @param dev           the device to initialise
 2883  *
 2884  * @retval 0            success
 2885  * @retval ENXIO        no driver was found
 2886  * @retval ENOMEM       memory allocation failure
 2887  * @retval non-zero     some other unix error code
 2888  */
 2889 int
 2890 device_attach(device_t dev)
 2891 {
 2892         uint64_t attachtime;
 2893         int error;
 2894 
 2895         if (resource_disabled(dev->driver->name, dev->unit)) {
 2896                 device_disable(dev);
 2897                 if (bootverbose)
 2898                          device_printf(dev, "disabled via hints entry\n");
 2899                 return (ENXIO);
 2900         }
 2901 
 2902         device_sysctl_init(dev);
 2903         if (!device_is_quiet(dev))
 2904                 device_print_child(dev->parent, dev);
 2905         attachtime = get_cyclecount();
 2906         dev->state = DS_ATTACHING;
 2907         if ((error = DEVICE_ATTACH(dev)) != 0) {
 2908                 printf("device_attach: %s%d attach returned %d\n",
 2909                     dev->driver->name, dev->unit, error);
 2910                 if (!(dev->flags & DF_FIXEDCLASS))
 2911                         devclass_delete_device(dev->devclass, dev);
 2912                 (void)device_set_driver(dev, NULL);
 2913                 device_sysctl_fini(dev);
 2914                 KASSERT(dev->busy == 0, ("attach failed but busy"));
 2915                 dev->state = DS_NOTPRESENT;
 2916                 return (error);
 2917         }
 2918         attachtime = get_cyclecount() - attachtime;
 2919         /*
 2920          * 4 bits per device is a reasonable value for desktop and server
 2921          * hardware with good get_cyclecount() implementations, but WILL
 2922          * need to be adjusted on other platforms.
 2923          */
 2924 #define RANDOM_PROBE_BIT_GUESS  4
 2925         if (bootverbose)
 2926                 printf("random: harvesting attach, %zu bytes (%d bits) from %s%d\n",
 2927                     sizeof(attachtime), RANDOM_PROBE_BIT_GUESS,
 2928                     dev->driver->name, dev->unit);
 2929         random_harvest_direct(&attachtime, sizeof(attachtime),
 2930             RANDOM_PROBE_BIT_GUESS, RANDOM_ATTACH);
 2931         device_sysctl_update(dev);
 2932         if (dev->busy)
 2933                 dev->state = DS_BUSY;
 2934         else
 2935                 dev->state = DS_ATTACHED;
 2936         dev->flags &= ~DF_DONENOMATCH;
 2937         devadded(dev);
 2938         return (0);
 2939 }
 2940 
 2941 /**
 2942  * @brief Detach a driver from a device
 2943  *
 2944  * This function is a wrapper around the DEVICE_DETACH() driver
 2945  * method. If the call to DEVICE_DETACH() succeeds, it calls
 2946  * BUS_CHILD_DETACHED() for the parent of @p dev, queues a
 2947  * notification event for user-based device management services and
 2948  * cleans up the device's sysctl tree.
 2949  *
 2950  * @param dev           the device to un-initialise
 2951  *
 2952  * @retval 0            success
 2953  * @retval ENXIO        no driver was found
 2954  * @retval ENOMEM       memory allocation failure
 2955  * @retval non-zero     some other unix error code
 2956  */
 2957 int
 2958 device_detach(device_t dev)
 2959 {
 2960         int error;
 2961 
 2962         GIANT_REQUIRED;
 2963 
 2964         PDEBUG(("%s", DEVICENAME(dev)));
 2965         if (dev->state == DS_BUSY)
 2966                 return (EBUSY);
 2967         if (dev->state != DS_ATTACHED)
 2968                 return (0);
 2969 
 2970         if ((error = DEVICE_DETACH(dev)) != 0)
 2971                 return (error);
 2972         devremoved(dev);
 2973         if (!device_is_quiet(dev))
 2974                 device_printf(dev, "detached\n");
 2975         if (dev->parent)
 2976                 BUS_CHILD_DETACHED(dev->parent, dev);
 2977 
 2978         if (!(dev->flags & DF_FIXEDCLASS))
 2979                 devclass_delete_device(dev->devclass, dev);
 2980 
 2981         device_verbose(dev);
 2982         dev->state = DS_NOTPRESENT;
 2983         (void)device_set_driver(dev, NULL);
 2984         device_sysctl_fini(dev);
 2985 
 2986         return (0);
 2987 }
 2988 
 2989 /**
 2990  * @brief Tells a driver to quiesce itself.
 2991  *
 2992  * This function is a wrapper around the DEVICE_QUIESCE() driver
 2993  * method. If the call to DEVICE_QUIESCE() succeeds.
 2994  *
 2995  * @param dev           the device to quiesce
 2996  *
 2997  * @retval 0            success
 2998  * @retval ENXIO        no driver was found
 2999  * @retval ENOMEM       memory allocation failure
 3000  * @retval non-zero     some other unix error code
 3001  */
 3002 int
 3003 device_quiesce(device_t dev)
 3004 {
 3005 
 3006         PDEBUG(("%s", DEVICENAME(dev)));
 3007         if (dev->state == DS_BUSY)
 3008                 return (EBUSY);
 3009         if (dev->state != DS_ATTACHED)
 3010                 return (0);
 3011 
 3012         return (DEVICE_QUIESCE(dev));
 3013 }
 3014 
 3015 /**
 3016  * @brief Notify a device of system shutdown
 3017  *
 3018  * This function calls the DEVICE_SHUTDOWN() driver method if the
 3019  * device currently has an attached driver.
 3020  *
 3021  * @returns the value returned by DEVICE_SHUTDOWN()
 3022  */
 3023 int
 3024 device_shutdown(device_t dev)
 3025 {
 3026         if (dev->state < DS_ATTACHED)
 3027                 return (0);
 3028         return (DEVICE_SHUTDOWN(dev));
 3029 }
 3030 
 3031 /**
 3032  * @brief Set the unit number of a device
 3033  *
 3034  * This function can be used to override the unit number used for a
 3035  * device (e.g. to wire a device to a pre-configured unit number).
 3036  */
 3037 int
 3038 device_set_unit(device_t dev, int unit)
 3039 {
 3040         devclass_t dc;
 3041         int err;
 3042 
 3043         dc = device_get_devclass(dev);
 3044         if (unit < dc->maxunit && dc->devices[unit])
 3045                 return (EBUSY);
 3046         err = devclass_delete_device(dc, dev);
 3047         if (err)
 3048                 return (err);
 3049         dev->unit = unit;
 3050         err = devclass_add_device(dc, dev);
 3051         if (err)
 3052                 return (err);
 3053 
 3054         bus_data_generation_update();
 3055         return (0);
 3056 }
 3057 
 3058 /*======================================*/
 3059 /*
 3060  * Some useful method implementations to make life easier for bus drivers.
 3061  */
 3062 
 3063 void
 3064 resource_init_map_request_impl(struct resource_map_request *args, size_t sz)
 3065 {
 3066 
 3067         bzero(args, sz);
 3068         args->size = sz;
 3069         args->memattr = VM_MEMATTR_UNCACHEABLE;
 3070 }
 3071 
 3072 /**
 3073  * @brief Initialise a resource list.
 3074  *
 3075  * @param rl            the resource list to initialise
 3076  */
 3077 void
 3078 resource_list_init(struct resource_list *rl)
 3079 {
 3080         STAILQ_INIT(rl);
 3081 }
 3082 
 3083 /**
 3084  * @brief Reclaim memory used by a resource list.
 3085  *
 3086  * This function frees the memory for all resource entries on the list
 3087  * (if any).
 3088  *
 3089  * @param rl            the resource list to free
 3090  */
 3091 void
 3092 resource_list_free(struct resource_list *rl)
 3093 {
 3094         struct resource_list_entry *rle;
 3095 
 3096         while ((rle = STAILQ_FIRST(rl)) != NULL) {
 3097                 if (rle->res)
 3098                         panic("resource_list_free: resource entry is busy");
 3099                 STAILQ_REMOVE_HEAD(rl, link);
 3100                 free(rle, M_BUS);
 3101         }
 3102 }
 3103 
 3104 /**
 3105  * @brief Add a resource entry.
 3106  *
 3107  * This function adds a resource entry using the given @p type, @p
 3108  * start, @p end and @p count values. A rid value is chosen by
 3109  * searching sequentially for the first unused rid starting at zero.
 3110  *
 3111  * @param rl            the resource list to edit
 3112  * @param type          the resource entry type (e.g. SYS_RES_MEMORY)
 3113  * @param start         the start address of the resource
 3114  * @param end           the end address of the resource
 3115  * @param count         XXX end-start+1
 3116  */
 3117 int
 3118 resource_list_add_next(struct resource_list *rl, int type, rman_res_t start,
 3119     rman_res_t end, rman_res_t count)
 3120 {
 3121         int rid;
 3122 
 3123         rid = 0;
 3124         while (resource_list_find(rl, type, rid) != NULL)
 3125                 rid++;
 3126         resource_list_add(rl, type, rid, start, end, count);
 3127         return (rid);
 3128 }
 3129 
 3130 /**
 3131  * @brief Add or modify a resource entry.
 3132  *
 3133  * If an existing entry exists with the same type and rid, it will be
 3134  * modified using the given values of @p start, @p end and @p
 3135  * count. If no entry exists, a new one will be created using the
 3136  * given values.  The resource list entry that matches is then returned.
 3137  *
 3138  * @param rl            the resource list to edit
 3139  * @param type          the resource entry type (e.g. SYS_RES_MEMORY)
 3140  * @param rid           the resource identifier
 3141  * @param start         the start address of the resource
 3142  * @param end           the end address of the resource
 3143  * @param count         XXX end-start+1
 3144  */
 3145 struct resource_list_entry *
 3146 resource_list_add(struct resource_list *rl, int type, int rid,
 3147     rman_res_t start, rman_res_t end, rman_res_t count)
 3148 {
 3149         struct resource_list_entry *rle;
 3150 
 3151         rle = resource_list_find(rl, type, rid);
 3152         if (!rle) {
 3153                 rle = malloc(sizeof(struct resource_list_entry), M_BUS,
 3154                     M_NOWAIT);
 3155                 if (!rle)
 3156                         panic("resource_list_add: can't record entry");
 3157                 STAILQ_INSERT_TAIL(rl, rle, link);
 3158                 rle->type = type;
 3159                 rle->rid = rid;
 3160                 rle->res = NULL;
 3161                 rle->flags = 0;
 3162         }
 3163 
 3164         if (rle->res)
 3165                 panic("resource_list_add: resource entry is busy");
 3166 
 3167         rle->start = start;
 3168         rle->end = end;
 3169         rle->count = count;
 3170         return (rle);
 3171 }
 3172 
 3173 /**
 3174  * @brief Determine if a resource entry is busy.
 3175  *
 3176  * Returns true if a resource entry is busy meaning that it has an
 3177  * associated resource that is not an unallocated "reserved" resource.
 3178  *
 3179  * @param rl            the resource list to search
 3180  * @param type          the resource entry type (e.g. SYS_RES_MEMORY)
 3181  * @param rid           the resource identifier
 3182  *
 3183  * @returns Non-zero if the entry is busy, zero otherwise.
 3184  */
 3185 int
 3186 resource_list_busy(struct resource_list *rl, int type, int rid)
 3187 {
 3188         struct resource_list_entry *rle;
 3189 
 3190         rle = resource_list_find(rl, type, rid);
 3191         if (rle == NULL || rle->res == NULL)
 3192                 return (0);
 3193         if ((rle->flags & (RLE_RESERVED | RLE_ALLOCATED)) == RLE_RESERVED) {
 3194                 KASSERT(!(rman_get_flags(rle->res) & RF_ACTIVE),
 3195                     ("reserved resource is active"));
 3196                 return (0);
 3197         }
 3198         return (1);
 3199 }
 3200 
 3201 /**
 3202  * @brief Determine if a resource entry is reserved.
 3203  *
 3204  * Returns true if a resource entry is reserved meaning that it has an
 3205  * associated "reserved" resource.  The resource can either be
 3206  * allocated or unallocated.
 3207  *
 3208  * @param rl            the resource list to search
 3209  * @param type          the resource entry type (e.g. SYS_RES_MEMORY)
 3210  * @param rid           the resource identifier
 3211  *
 3212  * @returns Non-zero if the entry is reserved, zero otherwise.
 3213  */
 3214 int
 3215 resource_list_reserved(struct resource_list *rl, int type, int rid)
 3216 {
 3217         struct resource_list_entry *rle;
 3218 
 3219         rle = resource_list_find(rl, type, rid);
 3220         if (rle != NULL && rle->flags & RLE_RESERVED)
 3221                 return (1);
 3222         return (0);
 3223 }
 3224 
 3225 /**
 3226  * @brief Find a resource entry by type and rid.
 3227  *
 3228  * @param rl            the resource list to search
 3229  * @param type          the resource entry type (e.g. SYS_RES_MEMORY)
 3230  * @param rid           the resource identifier
 3231  *
 3232  * @returns the resource entry pointer or NULL if there is no such
 3233  * entry.
 3234  */
 3235 struct resource_list_entry *
 3236 resource_list_find(struct resource_list *rl, int type, int rid)
 3237 {
 3238         struct resource_list_entry *rle;
 3239 
 3240         STAILQ_FOREACH(rle, rl, link) {
 3241                 if (rle->type == type && rle->rid == rid)
 3242                         return (rle);
 3243         }
 3244         return (NULL);
 3245 }
 3246 
 3247 /**
 3248  * @brief Delete a resource entry.
 3249  *
 3250  * @param rl            the resource list to edit
 3251  * @param type          the resource entry type (e.g. SYS_RES_MEMORY)
 3252  * @param rid           the resource identifier
 3253  */
 3254 void
 3255 resource_list_delete(struct resource_list *rl, int type, int rid)
 3256 {
 3257         struct resource_list_entry *rle = resource_list_find(rl, type, rid);
 3258 
 3259         if (rle) {
 3260                 if (rle->res != NULL)
 3261                         panic("resource_list_delete: resource has not been released");
 3262                 STAILQ_REMOVE(rl, rle, resource_list_entry, link);
 3263                 free(rle, M_BUS);
 3264         }
 3265 }
 3266 
 3267 /**
 3268  * @brief Allocate a reserved resource
 3269  *
 3270  * This can be used by busses to force the allocation of resources
 3271  * that are always active in the system even if they are not allocated
 3272  * by a driver (e.g. PCI BARs).  This function is usually called when
 3273  * adding a new child to the bus.  The resource is allocated from the
 3274  * parent bus when it is reserved.  The resource list entry is marked
 3275  * with RLE_RESERVED to note that it is a reserved resource.
 3276  *
 3277  * Subsequent attempts to allocate the resource with
 3278  * resource_list_alloc() will succeed the first time and will set
 3279  * RLE_ALLOCATED to note that it has been allocated.  When a reserved
 3280  * resource that has been allocated is released with
 3281  * resource_list_release() the resource RLE_ALLOCATED is cleared, but
 3282  * the actual resource remains allocated.  The resource can be released to
 3283  * the parent bus by calling resource_list_unreserve().
 3284  *
 3285  * @param rl            the resource list to allocate from
 3286  * @param bus           the parent device of @p child
 3287  * @param child         the device for which the resource is being reserved
 3288  * @param type          the type of resource to allocate
 3289  * @param rid           a pointer to the resource identifier
 3290  * @param start         hint at the start of the resource range - pass
 3291  *                      @c 0 for any start address
 3292  * @param end           hint at the end of the resource range - pass
 3293  *                      @c ~0 for any end address
 3294  * @param count         hint at the size of range required - pass @c 1
 3295  *                      for any size
 3296  * @param flags         any extra flags to control the resource
 3297  *                      allocation - see @c RF_XXX flags in
 3298  *                      <sys/rman.h> for details
 3299  *
 3300  * @returns             the resource which was allocated or @c NULL if no
 3301  *                      resource could be allocated
 3302  */
 3303 struct resource *
 3304 resource_list_reserve(struct resource_list *rl, device_t bus, device_t child,
 3305     int type, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
 3306 {
 3307         struct resource_list_entry *rle = NULL;
 3308         int passthrough = (device_get_parent(child) != bus);
 3309         struct resource *r;
 3310 
 3311         if (passthrough)
 3312                 panic(
 3313     "resource_list_reserve() should only be called for direct children");
 3314         if (flags & RF_ACTIVE)
 3315                 panic(
 3316     "resource_list_reserve() should only reserve inactive resources");
 3317 
 3318         r = resource_list_alloc(rl, bus, child, type, rid, start, end, count,
 3319             flags);
 3320         if (r != NULL) {
 3321                 rle = resource_list_find(rl, type, *rid);
 3322                 rle->flags |= RLE_RESERVED;
 3323         }
 3324         return (r);
 3325 }
 3326 
 3327 /**
 3328  * @brief Helper function for implementing BUS_ALLOC_RESOURCE()
 3329  *
 3330  * Implement BUS_ALLOC_RESOURCE() by looking up a resource from the list
 3331  * and passing the allocation up to the parent of @p bus. This assumes
 3332  * that the first entry of @c device_get_ivars(child) is a struct
 3333  * resource_list. This also handles 'passthrough' allocations where a
 3334  * child is a remote descendant of bus by passing the allocation up to
 3335  * the parent of bus.
 3336  *
 3337  * Typically, a bus driver would store a list of child resources
 3338  * somewhere in the child device's ivars (see device_get_ivars()) and
 3339  * its implementation of BUS_ALLOC_RESOURCE() would find that list and
 3340  * then call resource_list_alloc() to perform the allocation.
 3341  *
 3342  * @param rl            the resource list to allocate from
 3343  * @param bus           the parent device of @p child
 3344  * @param child         the device which is requesting an allocation
 3345  * @param type          the type of resource to allocate
 3346  * @param rid           a pointer to the resource identifier
 3347  * @param start         hint at the start of the resource range - pass
 3348  *                      @c 0 for any start address
 3349  * @param end           hint at the end of the resource range - pass
 3350  *                      @c ~0 for any end address
 3351  * @param count         hint at the size of range required - pass @c 1
 3352  *                      for any size
 3353  * @param flags         any extra flags to control the resource
 3354  *                      allocation - see @c RF_XXX flags in
 3355  *                      <sys/rman.h> for details
 3356  *
 3357  * @returns             the resource which was allocated or @c NULL if no
 3358  *                      resource could be allocated
 3359  */
 3360 struct resource *
 3361 resource_list_alloc(struct resource_list *rl, device_t bus, device_t child,
 3362     int type, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
 3363 {
 3364         struct resource_list_entry *rle = NULL;
 3365         int passthrough = (device_get_parent(child) != bus);
 3366         int isdefault = RMAN_IS_DEFAULT_RANGE(start, end);
 3367 
 3368         if (passthrough) {
 3369                 return (BUS_ALLOC_RESOURCE(device_get_parent(bus), child,
 3370                     type, rid, start, end, count, flags));
 3371         }
 3372 
 3373         rle = resource_list_find(rl, type, *rid);
 3374 
 3375         if (!rle)
 3376                 return (NULL);          /* no resource of that type/rid */
 3377 
 3378         if (rle->res) {
 3379                 if (rle->flags & RLE_RESERVED) {
 3380                         if (rle->flags & RLE_ALLOCATED)
 3381                                 return (NULL);
 3382                         if ((flags & RF_ACTIVE) &&
 3383                             bus_activate_resource(child, type, *rid,
 3384                             rle->res) != 0)
 3385                                 return (NULL);
 3386                         rle->flags |= RLE_ALLOCATED;
 3387                         return (rle->res);
 3388                 }
 3389                 device_printf(bus,
 3390                     "resource entry %#x type %d for child %s is busy\n", *rid,
 3391                     type, device_get_nameunit(child));
 3392                 return (NULL);
 3393         }
 3394 
 3395         if (isdefault) {
 3396                 start = rle->start;
 3397                 count = ulmax(count, rle->count);
 3398                 end = ulmax(rle->end, start + count - 1);
 3399         }
 3400 
 3401         rle->res = BUS_ALLOC_RESOURCE(device_get_parent(bus), child,
 3402             type, rid, start, end, count, flags);
 3403 
 3404         /*
 3405          * Record the new range.
 3406          */
 3407         if (rle->res) {
 3408                 rle->start = rman_get_start(rle->res);
 3409                 rle->end = rman_get_end(rle->res);
 3410                 rle->count = count;
 3411         }
 3412 
 3413         return (rle->res);
 3414 }
 3415 
 3416 /**
 3417  * @brief Helper function for implementing BUS_RELEASE_RESOURCE()
 3418  *
 3419  * Implement BUS_RELEASE_RESOURCE() using a resource list. Normally
 3420  * used with resource_list_alloc().
 3421  *
 3422  * @param rl            the resource list which was allocated from
 3423  * @param bus           the parent device of @p child
 3424  * @param child         the device which is requesting a release
 3425  * @param type          the type of resource to release
 3426  * @param rid           the resource identifier
 3427  * @param res           the resource to release
 3428  *
 3429  * @retval 0            success
 3430  * @retval non-zero     a standard unix error code indicating what
 3431  *                      error condition prevented the operation
 3432  */
 3433 int
 3434 resource_list_release(struct resource_list *rl, device_t bus, device_t child,
 3435     int type, int rid, struct resource *res)
 3436 {
 3437         struct resource_list_entry *rle = NULL;
 3438         int passthrough = (device_get_parent(child) != bus);
 3439         int error;
 3440 
 3441         if (passthrough) {
 3442                 return (BUS_RELEASE_RESOURCE(device_get_parent(bus), child,
 3443                     type, rid, res));
 3444         }
 3445 
 3446         rle = resource_list_find(rl, type, rid);
 3447 
 3448         if (!rle)
 3449                 panic("resource_list_release: can't find resource");
 3450         if (!rle->res)
 3451                 panic("resource_list_release: resource entry is not busy");
 3452         if (rle->flags & RLE_RESERVED) {
 3453                 if (rle->flags & RLE_ALLOCATED) {
 3454                         if (rman_get_flags(res) & RF_ACTIVE) {
 3455                                 error = bus_deactivate_resource(child, type,
 3456                                     rid, res);
 3457                                 if (error)
 3458                                         return (error);
 3459                         }
 3460                         rle->flags &= ~RLE_ALLOCATED;
 3461                         return (0);
 3462                 }
 3463                 return (EINVAL);
 3464         }
 3465 
 3466         error = BUS_RELEASE_RESOURCE(device_get_parent(bus), child,
 3467             type, rid, res);
 3468         if (error)
 3469                 return (error);
 3470 
 3471         rle->res = NULL;
 3472         return (0);
 3473 }
 3474 
 3475 /**
 3476  * @brief Release all active resources of a given type
 3477  *
 3478  * Release all active resources of a specified type.  This is intended
 3479  * to be used to cleanup resources leaked by a driver after detach or
 3480  * a failed attach.
 3481  *
 3482  * @param rl            the resource list which was allocated from
 3483  * @param bus           the parent device of @p child
 3484  * @param child         the device whose active resources are being released
 3485  * @param type          the type of resources to release
 3486  *
 3487  * @retval 0            success
 3488  * @retval EBUSY        at least one resource was active
 3489  */
 3490 int
 3491 resource_list_release_active(struct resource_list *rl, device_t bus,
 3492     device_t child, int type)
 3493 {
 3494         struct resource_list_entry *rle;
 3495         int error, retval;
 3496 
 3497         retval = 0;
 3498         STAILQ_FOREACH(rle, rl, link) {
 3499                 if (rle->type != type)
 3500                         continue;
 3501                 if (rle->res == NULL)
 3502                         continue;
 3503                 if ((rle->flags & (RLE_RESERVED | RLE_ALLOCATED)) ==
 3504                     RLE_RESERVED)
 3505                         continue;
 3506                 retval = EBUSY;
 3507                 error = resource_list_release(rl, bus, child, type,
 3508                     rman_get_rid(rle->res), rle->res);
 3509                 if (error != 0)
 3510                         device_printf(bus,
 3511                             "Failed to release active resource: %d\n", error);
 3512         }
 3513         return (retval);
 3514 }
 3515 
 3516 
 3517 /**
 3518  * @brief Fully release a reserved resource
 3519  *
 3520  * Fully releases a resource reserved via resource_list_reserve().
 3521  *
 3522  * @param rl            the resource list which was allocated from
 3523  * @param bus           the parent device of @p child
 3524  * @param child         the device whose reserved resource is being released
 3525  * @param type          the type of resource to release
 3526  * @param rid           the resource identifier
 3527  * @param res           the resource to release
 3528  *
 3529  * @retval 0            success
 3530  * @retval non-zero     a standard unix error code indicating what
 3531  *                      error condition prevented the operation
 3532  */
 3533 int
 3534 resource_list_unreserve(struct resource_list *rl, device_t bus, device_t child,
 3535     int type, int rid)
 3536 {
 3537         struct resource_list_entry *rle = NULL;
 3538         int passthrough = (device_get_parent(child) != bus);
 3539 
 3540         if (passthrough)
 3541                 panic(
 3542     "resource_list_unreserve() should only be called for direct children");
 3543 
 3544         rle = resource_list_find(rl, type, rid);
 3545 
 3546         if (!rle)
 3547                 panic("resource_list_unreserve: can't find resource");
 3548         if (!(rle->flags & RLE_RESERVED))
 3549                 return (EINVAL);
 3550         if (rle->flags & RLE_ALLOCATED)
 3551                 return (EBUSY);
 3552         rle->flags &= ~RLE_RESERVED;
 3553         return (resource_list_release(rl, bus, child, type, rid, rle->res));
 3554 }
 3555 
 3556 /**
 3557  * @brief Print a description of resources in a resource list
 3558  *
 3559  * Print all resources of a specified type, for use in BUS_PRINT_CHILD().
 3560  * The name is printed if at least one resource of the given type is available.
 3561  * The format is used to print resource start and end.
 3562  *
 3563  * @param rl            the resource list to print
 3564  * @param name          the name of @p type, e.g. @c "memory"
 3565  * @param type          type type of resource entry to print
 3566  * @param format        printf(9) format string to print resource
 3567  *                      start and end values
 3568  *
 3569  * @returns             the number of characters printed
 3570  */
 3571 int
 3572 resource_list_print_type(struct resource_list *rl, const char *name, int type,
 3573     const char *format)
 3574 {
 3575         struct resource_list_entry *rle;
 3576         int printed, retval;
 3577 
 3578         printed = 0;
 3579         retval = 0;
 3580         /* Yes, this is kinda cheating */
 3581         STAILQ_FOREACH(rle, rl, link) {
 3582                 if (rle->type == type) {
 3583                         if (printed == 0)
 3584                                 retval += printf(" %s ", name);
 3585                         else
 3586                                 retval += printf(",");
 3587                         printed++;
 3588                         retval += printf(format, rle->start);
 3589                         if (rle->count > 1) {
 3590                                 retval += printf("-");
 3591                                 retval += printf(format, rle->start +
 3592                                                  rle->count - 1);
 3593                         }
 3594                 }
 3595         }
 3596         return (retval);
 3597 }
 3598 
 3599 /**
 3600  * @brief Releases all the resources in a list.
 3601  *
 3602  * @param rl            The resource list to purge.
 3603  *
 3604  * @returns             nothing
 3605  */
 3606 void
 3607 resource_list_purge(struct resource_list *rl)
 3608 {
 3609         struct resource_list_entry *rle;
 3610 
 3611         while ((rle = STAILQ_FIRST(rl)) != NULL) {
 3612                 if (rle->res)
 3613                         bus_release_resource(rman_get_device(rle->res),
 3614                             rle->type, rle->rid, rle->res);
 3615                 STAILQ_REMOVE_HEAD(rl, link);
 3616                 free(rle, M_BUS);
 3617         }
 3618 }
 3619 
 3620 device_t
 3621 bus_generic_add_child(device_t dev, u_int order, const char *name, int unit)
 3622 {
 3623 
 3624         return (device_add_child_ordered(dev, order, name, unit));
 3625 }
 3626 
 3627 /**
 3628  * @brief Helper function for implementing DEVICE_PROBE()
 3629  *
 3630  * This function can be used to help implement the DEVICE_PROBE() for
 3631  * a bus (i.e. a device which has other devices attached to it). It
 3632  * calls the DEVICE_IDENTIFY() method of each driver in the device's
 3633  * devclass.
 3634  */
 3635 int
 3636 bus_generic_probe(device_t dev)
 3637 {
 3638         devclass_t dc = dev->devclass;
 3639         driverlink_t dl;
 3640 
 3641         TAILQ_FOREACH(dl, &dc->drivers, link) {
 3642                 /*
 3643                  * If this driver's pass is too high, then ignore it.
 3644                  * For most drivers in the default pass, this will
 3645                  * never be true.  For early-pass drivers they will
 3646                  * only call the identify routines of eligible drivers
 3647                  * when this routine is called.  Drivers for later
 3648                  * passes should have their identify routines called
 3649                  * on early-pass busses during BUS_NEW_PASS().
 3650                  */
 3651                 if (dl->pass > bus_current_pass)
 3652                         continue;
 3653                 DEVICE_IDENTIFY(dl->driver, dev);
 3654         }
 3655 
 3656         return (0);
 3657 }
 3658 
 3659 /**
 3660  * @brief Helper function for implementing DEVICE_ATTACH()
 3661  *
 3662  * This function can be used to help implement the DEVICE_ATTACH() for
 3663  * a bus. It calls device_probe_and_attach() for each of the device's
 3664  * children.
 3665  */
 3666 int
 3667 bus_generic_attach(device_t dev)
 3668 {
 3669         device_t child;
 3670 
 3671         TAILQ_FOREACH(child, &dev->children, link) {
 3672                 device_probe_and_attach(child);
 3673         }
 3674 
 3675         return (0);
 3676 }
 3677 
 3678 /**
 3679  * @brief Helper function for implementing DEVICE_DETACH()
 3680  *
 3681  * This function can be used to help implement the DEVICE_DETACH() for
 3682  * a bus. It calls device_detach() for each of the device's
 3683  * children.
 3684  */
 3685 int
 3686 bus_generic_detach(device_t dev)
 3687 {
 3688         device_t child;
 3689         int error;
 3690 
 3691         if (dev->state != DS_ATTACHED)
 3692                 return (EBUSY);
 3693 
 3694         TAILQ_FOREACH(child, &dev->children, link) {
 3695                 if ((error = device_detach(child)) != 0)
 3696                         return (error);
 3697         }
 3698 
 3699         return (0);
 3700 }
 3701 
 3702 /**
 3703  * @brief Helper function for implementing DEVICE_SHUTDOWN()
 3704  *
 3705  * This function can be used to help implement the DEVICE_SHUTDOWN()
 3706  * for a bus. It calls device_shutdown() for each of the device's
 3707  * children.
 3708  */
 3709 int
 3710 bus_generic_shutdown(device_t dev)
 3711 {
 3712         device_t child;
 3713 
 3714         TAILQ_FOREACH(child, &dev->children, link) {
 3715                 device_shutdown(child);
 3716         }
 3717 
 3718         return (0);
 3719 }
 3720 
 3721 /**
 3722  * @brief Default function for suspending a child device.
 3723  *
 3724  * This function is to be used by a bus's DEVICE_SUSPEND_CHILD().
 3725  */
 3726 int
 3727 bus_generic_suspend_child(device_t dev, device_t child)
 3728 {
 3729         int     error;
 3730 
 3731         error = DEVICE_SUSPEND(child);
 3732 
 3733         if (error == 0)
 3734                 child->flags |= DF_SUSPENDED;
 3735 
 3736         return (error);
 3737 }
 3738 
 3739 /**
 3740  * @brief Default function for resuming a child device.
 3741  *
 3742  * This function is to be used by a bus's DEVICE_RESUME_CHILD().
 3743  */
 3744 int
 3745 bus_generic_resume_child(device_t dev, device_t child)
 3746 {
 3747 
 3748         DEVICE_RESUME(child);
 3749         child->flags &= ~DF_SUSPENDED;
 3750 
 3751         return (0);
 3752 }
 3753 
 3754 /**
 3755  * @brief Helper function for implementing DEVICE_SUSPEND()
 3756  *
 3757  * This function can be used to help implement the DEVICE_SUSPEND()
 3758  * for a bus. It calls DEVICE_SUSPEND() for each of the device's
 3759  * children. If any call to DEVICE_SUSPEND() fails, the suspend
 3760  * operation is aborted and any devices which were suspended are
 3761  * resumed immediately by calling their DEVICE_RESUME() methods.
 3762  */
 3763 int
 3764 bus_generic_suspend(device_t dev)
 3765 {
 3766         int             error;
 3767         device_t        child, child2;
 3768 
 3769         TAILQ_FOREACH(child, &dev->children, link) {
 3770                 error = BUS_SUSPEND_CHILD(dev, child);
 3771                 if (error) {
 3772                         for (child2 = TAILQ_FIRST(&dev->children);
 3773                              child2 && child2 != child;
 3774                              child2 = TAILQ_NEXT(child2, link))
 3775                                 BUS_RESUME_CHILD(dev, child2);
 3776                         return (error);
 3777                 }
 3778         }
 3779         return (0);
 3780 }
 3781 
 3782 /**
 3783  * @brief Helper function for implementing DEVICE_RESUME()
 3784  *
 3785  * This function can be used to help implement the DEVICE_RESUME() for
 3786  * a bus. It calls DEVICE_RESUME() on each of the device's children.
 3787  */
 3788 int
 3789 bus_generic_resume(device_t dev)
 3790 {
 3791         device_t        child;
 3792 
 3793         TAILQ_FOREACH(child, &dev->children, link) {
 3794                 BUS_RESUME_CHILD(dev, child);
 3795                 /* if resume fails, there's nothing we can usefully do... */
 3796         }
 3797         return (0);
 3798 }
 3799 
 3800 /**
 3801  * @brief Helper function for implementing BUS_PRINT_CHILD().
 3802  *
 3803  * This function prints the first part of the ascii representation of
 3804  * @p child, including its name, unit and description (if any - see
 3805  * device_set_desc()).
 3806  *
 3807  * @returns the number of characters printed
 3808  */
 3809 int
 3810 bus_print_child_header(device_t dev, device_t child)
 3811 {
 3812         int     retval = 0;
 3813 
 3814         if (device_get_desc(child)) {
 3815                 retval += device_printf(child, "<%s>", device_get_desc(child));
 3816         } else {
 3817                 retval += printf("%s", device_get_nameunit(child));
 3818         }
 3819 
 3820         return (retval);
 3821 }
 3822 
 3823 /**
 3824  * @brief Helper function for implementing BUS_PRINT_CHILD().
 3825  *
 3826  * This function prints the last part of the ascii representation of
 3827  * @p child, which consists of the string @c " on " followed by the
 3828  * name and unit of the @p dev.
 3829  *
 3830  * @returns the number of characters printed
 3831  */
 3832 int
 3833 bus_print_child_footer(device_t dev, device_t child)
 3834 {
 3835         return (printf(" on %s\n", device_get_nameunit(dev)));
 3836 }
 3837 
 3838 /**
 3839  * @brief Helper function for implementing BUS_PRINT_CHILD().
 3840  *
 3841  * This function prints out the VM domain for the given device.
 3842  *
 3843  * @returns the number of characters printed
 3844  */
 3845 int
 3846 bus_print_child_domain(device_t dev, device_t child)
 3847 {
 3848         int domain;
 3849 
 3850         /* No domain? Don't print anything */
 3851         if (BUS_GET_DOMAIN(dev, child, &domain) != 0)
 3852                 return (0);
 3853 
 3854         return (printf(" numa-domain %d", domain));
 3855 }
 3856 
 3857 /**
 3858  * @brief Helper function for implementing BUS_PRINT_CHILD().
 3859  *
 3860  * This function simply calls bus_print_child_header() followed by
 3861  * bus_print_child_footer().
 3862  *
 3863  * @returns the number of characters printed
 3864  */
 3865 int
 3866 bus_generic_print_child(device_t dev, device_t child)
 3867 {
 3868         int     retval = 0;
 3869 
 3870         retval += bus_print_child_header(dev, child);
 3871         retval += bus_print_child_domain(dev, child);
 3872         retval += bus_print_child_footer(dev, child);
 3873 
 3874         return (retval);
 3875 }
 3876 
 3877 /**
 3878  * @brief Stub function for implementing BUS_READ_IVAR().
 3879  *
 3880  * @returns ENOENT
 3881  */
 3882 int
 3883 bus_generic_read_ivar(device_t dev, device_t child, int index,
 3884     uintptr_t * result)
 3885 {
 3886         return (ENOENT);
 3887 }
 3888 
 3889 /**
 3890  * @brief Stub function for implementing BUS_WRITE_IVAR().
 3891  *
 3892  * @returns ENOENT
 3893  */
 3894 int
 3895 bus_generic_write_ivar(device_t dev, device_t child, int index,
 3896     uintptr_t value)
 3897 {
 3898         return (ENOENT);
 3899 }
 3900 
 3901 /**
 3902  * @brief Stub function for implementing BUS_GET_RESOURCE_LIST().
 3903  *
 3904  * @returns NULL
 3905  */
 3906 struct resource_list *
 3907 bus_generic_get_resource_list(device_t dev, device_t child)
 3908 {
 3909         return (NULL);
 3910 }
 3911 
 3912 /**
 3913  * @brief Helper function for implementing BUS_DRIVER_ADDED().
 3914  *
 3915  * This implementation of BUS_DRIVER_ADDED() simply calls the driver's
 3916  * DEVICE_IDENTIFY() method to allow it to add new children to the bus
 3917  * and then calls device_probe_and_attach() for each unattached child.
 3918  */
 3919 void
 3920 bus_generic_driver_added(device_t dev, driver_t *driver)
 3921 {
 3922         device_t child;
 3923 
 3924         DEVICE_IDENTIFY(driver, dev);
 3925         TAILQ_FOREACH(child, &dev->children, link) {
 3926                 if (child->state == DS_NOTPRESENT ||
 3927                     (child->flags & DF_REBID))
 3928                         device_probe_and_attach(child);
 3929         }
 3930 }
 3931 
 3932 /**
 3933  * @brief Helper function for implementing BUS_NEW_PASS().
 3934  *
 3935  * This implementing of BUS_NEW_PASS() first calls the identify
 3936  * routines for any drivers that probe at the current pass.  Then it
 3937  * walks the list of devices for this bus.  If a device is already
 3938  * attached, then it calls BUS_NEW_PASS() on that device.  If the
 3939  * device is not already attached, it attempts to attach a driver to
 3940  * it.
 3941  */
 3942 void
 3943 bus_generic_new_pass(device_t dev)
 3944 {
 3945         driverlink_t dl;
 3946         devclass_t dc;
 3947         device_t child;
 3948 
 3949         dc = dev->devclass;
 3950         TAILQ_FOREACH(dl, &dc->drivers, link) {
 3951                 if (dl->pass == bus_current_pass)
 3952                         DEVICE_IDENTIFY(dl->driver, dev);
 3953         }
 3954         TAILQ_FOREACH(child, &dev->children, link) {
 3955                 if (child->state >= DS_ATTACHED)
 3956                         BUS_NEW_PASS(child);
 3957                 else if (child->state == DS_NOTPRESENT)
 3958                         device_probe_and_attach(child);
 3959         }
 3960 }
 3961 
 3962 /**
 3963  * @brief Helper function for implementing BUS_SETUP_INTR().
 3964  *
 3965  * This simple implementation of BUS_SETUP_INTR() simply calls the
 3966  * BUS_SETUP_INTR() method of the parent of @p dev.
 3967  */
 3968 int
 3969 bus_generic_setup_intr(device_t dev, device_t child, struct resource *irq,
 3970     int flags, driver_filter_t *filter, driver_intr_t *intr, void *arg,
 3971     void **cookiep)
 3972 {
 3973         /* Propagate up the bus hierarchy until someone handles it. */
 3974         if (dev->parent)
 3975                 return (BUS_SETUP_INTR(dev->parent, child, irq, flags,
 3976                     filter, intr, arg, cookiep));
 3977         return (EINVAL);
 3978 }
 3979 
 3980 /**
 3981  * @brief Helper function for implementing BUS_TEARDOWN_INTR().
 3982  *
 3983  * This simple implementation of BUS_TEARDOWN_INTR() simply calls the
 3984  * BUS_TEARDOWN_INTR() method of the parent of @p dev.
 3985  */
 3986 int
 3987 bus_generic_teardown_intr(device_t dev, device_t child, struct resource *irq,
 3988     void *cookie)
 3989 {
 3990         /* Propagate up the bus hierarchy until someone handles it. */
 3991         if (dev->parent)
 3992                 return (BUS_TEARDOWN_INTR(dev->parent, child, irq, cookie));
 3993         return (EINVAL);
 3994 }
 3995 
 3996 /**
 3997  * @brief Helper function for implementing BUS_ADJUST_RESOURCE().
 3998  *
 3999  * This simple implementation of BUS_ADJUST_RESOURCE() simply calls the
 4000  * BUS_ADJUST_RESOURCE() method of the parent of @p dev.
 4001  */
 4002 int
 4003 bus_generic_adjust_resource(device_t dev, device_t child, int type,
 4004     struct resource *r, rman_res_t start, rman_res_t end)
 4005 {
 4006         /* Propagate up the bus hierarchy until someone handles it. */
 4007         if (dev->parent)
 4008                 return (BUS_ADJUST_RESOURCE(dev->parent, child, type, r, start,
 4009                     end));
 4010         return (EINVAL);
 4011 }
 4012 
 4013 /**
 4014  * @brief Helper function for implementing BUS_ALLOC_RESOURCE().
 4015  *
 4016  * This simple implementation of BUS_ALLOC_RESOURCE() simply calls the
 4017  * BUS_ALLOC_RESOURCE() method of the parent of @p dev.
 4018  */
 4019 struct resource *
 4020 bus_generic_alloc_resource(device_t dev, device_t child, int type, int *rid,
 4021     rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
 4022 {
 4023         /* Propagate up the bus hierarchy until someone handles it. */
 4024         if (dev->parent)
 4025                 return (BUS_ALLOC_RESOURCE(dev->parent, child, type, rid,
 4026                     start, end, count, flags));
 4027         return (NULL);
 4028 }
 4029 
 4030 /**
 4031  * @brief Helper function for implementing BUS_RELEASE_RESOURCE().
 4032  *
 4033  * This simple implementation of BUS_RELEASE_RESOURCE() simply calls the
 4034  * BUS_RELEASE_RESOURCE() method of the parent of @p dev.
 4035  */
 4036 int
 4037 bus_generic_release_resource(device_t dev, device_t child, int type, int rid,
 4038     struct resource *r)
 4039 {
 4040         /* Propagate up the bus hierarchy until someone handles it. */
 4041         if (dev->parent)
 4042                 return (BUS_RELEASE_RESOURCE(dev->parent, child, type, rid,
 4043                     r));
 4044         return (EINVAL);
 4045 }
 4046 
 4047 /**
 4048  * @brief Helper function for implementing BUS_ACTIVATE_RESOURCE().
 4049  *
 4050  * This simple implementation of BUS_ACTIVATE_RESOURCE() simply calls the
 4051  * BUS_ACTIVATE_RESOURCE() method of the parent of @p dev.
 4052  */
 4053 int
 4054 bus_generic_activate_resource(device_t dev, device_t child, int type, int rid,
 4055     struct resource *r)
 4056 {
 4057         /* Propagate up the bus hierarchy until someone handles it. */
 4058         if (dev->parent)
 4059                 return (BUS_ACTIVATE_RESOURCE(dev->parent, child, type, rid,
 4060                     r));
 4061         return (EINVAL);
 4062 }
 4063 
 4064 /**
 4065  * @brief Helper function for implementing BUS_DEACTIVATE_RESOURCE().
 4066  *
 4067  * This simple implementation of BUS_DEACTIVATE_RESOURCE() simply calls the
 4068  * BUS_DEACTIVATE_RESOURCE() method of the parent of @p dev.
 4069  */
 4070 int
 4071 bus_generic_deactivate_resource(device_t dev, device_t child, int type,
 4072     int rid, struct resource *r)
 4073 {
 4074         /* Propagate up the bus hierarchy until someone handles it. */
 4075         if (dev->parent)
 4076                 return (BUS_DEACTIVATE_RESOURCE(dev->parent, child, type, rid,
 4077                     r));
 4078         return (EINVAL);
 4079 }
 4080 
 4081 /**
 4082  * @brief Helper function for implementing BUS_MAP_RESOURCE().
 4083  *
 4084  * This simple implementation of BUS_MAP_RESOURCE() simply calls the
 4085  * BUS_MAP_RESOURCE() method of the parent of @p dev.
 4086  */
 4087 int
 4088 bus_generic_map_resource(device_t dev, device_t child, int type,
 4089     struct resource *r, struct resource_map_request *args,
 4090     struct resource_map *map)
 4091 {
 4092         /* Propagate up the bus hierarchy until someone handles it. */
 4093         if (dev->parent)
 4094                 return (BUS_MAP_RESOURCE(dev->parent, child, type, r, args,
 4095                     map));
 4096         return (EINVAL);
 4097 }
 4098 
 4099 /**
 4100  * @brief Helper function for implementing BUS_UNMAP_RESOURCE().
 4101  *
 4102  * This simple implementation of BUS_UNMAP_RESOURCE() simply calls the
 4103  * BUS_UNMAP_RESOURCE() method of the parent of @p dev.
 4104  */
 4105 int
 4106 bus_generic_unmap_resource(device_t dev, device_t child, int type,
 4107     struct resource *r, struct resource_map *map)
 4108 {
 4109         /* Propagate up the bus hierarchy until someone handles it. */
 4110         if (dev->parent)
 4111                 return (BUS_UNMAP_RESOURCE(dev->parent, child, type, r, map));
 4112         return (EINVAL);
 4113 }
 4114 
 4115 /**
 4116  * @brief Helper function for implementing BUS_BIND_INTR().
 4117  *
 4118  * This simple implementation of BUS_BIND_INTR() simply calls the
 4119  * BUS_BIND_INTR() method of the parent of @p dev.
 4120  */
 4121 int
 4122 bus_generic_bind_intr(device_t dev, device_t child, struct resource *irq,
 4123     int cpu)
 4124 {
 4125 
 4126         /* Propagate up the bus hierarchy until someone handles it. */
 4127         if (dev->parent)
 4128                 return (BUS_BIND_INTR(dev->parent, child, irq, cpu));
 4129         return (EINVAL);
 4130 }
 4131 
 4132 /**
 4133  * @brief Helper function for implementing BUS_CONFIG_INTR().
 4134  *
 4135  * This simple implementation of BUS_CONFIG_INTR() simply calls the
 4136  * BUS_CONFIG_INTR() method of the parent of @p dev.
 4137  */
 4138 int
 4139 bus_generic_config_intr(device_t dev, int irq, enum intr_trigger trig,
 4140     enum intr_polarity pol)
 4141 {
 4142 
 4143         /* Propagate up the bus hierarchy until someone handles it. */
 4144         if (dev->parent)
 4145                 return (BUS_CONFIG_INTR(dev->parent, irq, trig, pol));
 4146         return (EINVAL);
 4147 }
 4148 
 4149 /**
 4150  * @brief Helper function for implementing BUS_DESCRIBE_INTR().
 4151  *
 4152  * This simple implementation of BUS_DESCRIBE_INTR() simply calls the
 4153  * BUS_DESCRIBE_INTR() method of the parent of @p dev.
 4154  */
 4155 int
 4156 bus_generic_describe_intr(device_t dev, device_t child, struct resource *irq,
 4157     void *cookie, const char *descr)
 4158 {
 4159 
 4160         /* Propagate up the bus hierarchy until someone handles it. */
 4161         if (dev->parent)
 4162                 return (BUS_DESCRIBE_INTR(dev->parent, child, irq, cookie,
 4163                     descr));
 4164         return (EINVAL);
 4165 }
 4166 
 4167 /**
 4168  * @brief Helper function for implementing BUS_GET_CPUS().
 4169  *
 4170  * This simple implementation of BUS_GET_CPUS() simply calls the
 4171  * BUS_GET_CPUS() method of the parent of @p dev.
 4172  */
 4173 int
 4174 bus_generic_get_cpus(device_t dev, device_t child, enum cpu_sets op,
 4175     size_t setsize, cpuset_t *cpuset)
 4176 {
 4177 
 4178         /* Propagate up the bus hierarchy until someone handles it. */
 4179         if (dev->parent != NULL)
 4180                 return (BUS_GET_CPUS(dev->parent, child, op, setsize, cpuset));
 4181         return (EINVAL);
 4182 }
 4183 
 4184 /**
 4185  * @brief Helper function for implementing BUS_GET_DMA_TAG().
 4186  *
 4187  * This simple implementation of BUS_GET_DMA_TAG() simply calls the
 4188  * BUS_GET_DMA_TAG() method of the parent of @p dev.
 4189  */
 4190 bus_dma_tag_t
 4191 bus_generic_get_dma_tag(device_t dev, device_t child)
 4192 {
 4193 
 4194         /* Propagate up the bus hierarchy until someone handles it. */
 4195         if (dev->parent != NULL)
 4196                 return (BUS_GET_DMA_TAG(dev->parent, child));
 4197         return (NULL);
 4198 }
 4199 
 4200 /**
 4201  * @brief Helper function for implementing BUS_GET_BUS_TAG().
 4202  *
 4203  * This simple implementation of BUS_GET_BUS_TAG() simply calls the
 4204  * BUS_GET_BUS_TAG() method of the parent of @p dev.
 4205  */
 4206 bus_space_tag_t
 4207 bus_generic_get_bus_tag(device_t dev, device_t child)
 4208 {
 4209 
 4210         /* Propagate up the bus hierarchy until someone handles it. */
 4211         if (dev->parent != NULL)
 4212                 return (BUS_GET_BUS_TAG(dev->parent, child));
 4213         return ((bus_space_tag_t)0);
 4214 }
 4215 
 4216 /**
 4217  * @brief Helper function for implementing BUS_GET_RESOURCE().
 4218  *
 4219  * This implementation of BUS_GET_RESOURCE() uses the
 4220  * resource_list_find() function to do most of the work. It calls
 4221  * BUS_GET_RESOURCE_LIST() to find a suitable resource list to
 4222  * search.
 4223  */
 4224 int
 4225 bus_generic_rl_get_resource(device_t dev, device_t child, int type, int rid,
 4226     rman_res_t *startp, rman_res_t *countp)
 4227 {
 4228         struct resource_list *          rl = NULL;
 4229         struct resource_list_entry *    rle = NULL;
 4230 
 4231         rl = BUS_GET_RESOURCE_LIST(dev, child);
 4232         if (!rl)
 4233                 return (EINVAL);
 4234 
 4235         rle = resource_list_find(rl, type, rid);
 4236         if (!rle)
 4237                 return (ENOENT);
 4238 
 4239         if (startp)
 4240                 *startp = rle->start;
 4241         if (countp)
 4242                 *countp = rle->count;
 4243 
 4244         return (0);
 4245 }
 4246 
 4247 /**
 4248  * @brief Helper function for implementing BUS_SET_RESOURCE().
 4249  *
 4250  * This implementation of BUS_SET_RESOURCE() uses the
 4251  * resource_list_add() function to do most of the work. It calls
 4252  * BUS_GET_RESOURCE_LIST() to find a suitable resource list to
 4253  * edit.
 4254  */
 4255 int
 4256 bus_generic_rl_set_resource(device_t dev, device_t child, int type, int rid,
 4257     rman_res_t start, rman_res_t count)
 4258 {
 4259         struct resource_list *          rl = NULL;
 4260 
 4261         rl = BUS_GET_RESOURCE_LIST(dev, child);
 4262         if (!rl)
 4263                 return (EINVAL);
 4264 
 4265         resource_list_add(rl, type, rid, start, (start + count - 1), count);
 4266 
 4267         return (0);
 4268 }
 4269 
 4270 /**
 4271  * @brief Helper function for implementing BUS_DELETE_RESOURCE().
 4272  *
 4273  * This implementation of BUS_DELETE_RESOURCE() uses the
 4274  * resource_list_delete() function to do most of the work. It calls
 4275  * BUS_GET_RESOURCE_LIST() to find a suitable resource list to
 4276  * edit.
 4277  */
 4278 void
 4279 bus_generic_rl_delete_resource(device_t dev, device_t child, int type, int rid)
 4280 {
 4281         struct resource_list *          rl = NULL;
 4282 
 4283         rl = BUS_GET_RESOURCE_LIST(dev, child);
 4284         if (!rl)
 4285                 return;
 4286 
 4287         resource_list_delete(rl, type, rid);
 4288 
 4289         return;
 4290 }
 4291 
 4292 /**
 4293  * @brief Helper function for implementing BUS_RELEASE_RESOURCE().
 4294  *
 4295  * This implementation of BUS_RELEASE_RESOURCE() uses the
 4296  * resource_list_release() function to do most of the work. It calls
 4297  * BUS_GET_RESOURCE_LIST() to find a suitable resource list.
 4298  */
 4299 int
 4300 bus_generic_rl_release_resource(device_t dev, device_t child, int type,
 4301     int rid, struct resource *r)
 4302 {
 4303         struct resource_list *          rl = NULL;
 4304 
 4305         if (device_get_parent(child) != dev)
 4306                 return (BUS_RELEASE_RESOURCE(device_get_parent(dev), child,
 4307                     type, rid, r));
 4308 
 4309         rl = BUS_GET_RESOURCE_LIST(dev, child);
 4310         if (!rl)
 4311                 return (EINVAL);
 4312 
 4313         return (resource_list_release(rl, dev, child, type, rid, r));
 4314 }
 4315 
 4316 /**
 4317  * @brief Helper function for implementing BUS_ALLOC_RESOURCE().
 4318  *
 4319  * This implementation of BUS_ALLOC_RESOURCE() uses the
 4320  * resource_list_alloc() function to do most of the work. It calls
 4321  * BUS_GET_RESOURCE_LIST() to find a suitable resource list.
 4322  */
 4323 struct resource *
 4324 bus_generic_rl_alloc_resource(device_t dev, device_t child, int type,
 4325     int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
 4326 {
 4327         struct resource_list *          rl = NULL;
 4328 
 4329         if (device_get_parent(child) != dev)
 4330                 return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
 4331                     type, rid, start, end, count, flags));
 4332 
 4333         rl = BUS_GET_RESOURCE_LIST(dev, child);
 4334         if (!rl)
 4335                 return (NULL);
 4336 
 4337         return (resource_list_alloc(rl, dev, child, type, rid,
 4338             start, end, count, flags));
 4339 }
 4340 
 4341 /**
 4342  * @brief Helper function for implementing BUS_CHILD_PRESENT().
 4343  *
 4344  * This simple implementation of BUS_CHILD_PRESENT() simply calls the
 4345  * BUS_CHILD_PRESENT() method of the parent of @p dev.
 4346  */
 4347 int
 4348 bus_generic_child_present(device_t dev, device_t child)
 4349 {
 4350         return (BUS_CHILD_PRESENT(device_get_parent(dev), dev));
 4351 }
 4352 
 4353 int
 4354 bus_generic_get_domain(device_t dev, device_t child, int *domain)
 4355 {
 4356 
 4357         if (dev->parent)
 4358                 return (BUS_GET_DOMAIN(dev->parent, dev, domain));
 4359 
 4360         return (ENOENT);
 4361 }
 4362 
 4363 /**
 4364  * @brief Helper function for implementing BUS_RESCAN().
 4365  *
 4366  * This null implementation of BUS_RESCAN() always fails to indicate
 4367  * the bus does not support rescanning.
 4368  */
 4369 int
 4370 bus_null_rescan(device_t dev)
 4371 {
 4372 
 4373         return (ENXIO);
 4374 }
 4375 
 4376 /*
 4377  * Some convenience functions to make it easier for drivers to use the
 4378  * resource-management functions.  All these really do is hide the
 4379  * indirection through the parent's method table, making for slightly
 4380  * less-wordy code.  In the future, it might make sense for this code
 4381  * to maintain some sort of a list of resources allocated by each device.
 4382  */
 4383 
 4384 int
 4385 bus_alloc_resources(device_t dev, struct resource_spec *rs,
 4386     struct resource **res)
 4387 {
 4388         int i;
 4389 
 4390         for (i = 0; rs[i].type != -1; i++)
 4391                 res[i] = NULL;
 4392         for (i = 0; rs[i].type != -1; i++) {
 4393                 res[i] = bus_alloc_resource_any(dev,
 4394                     rs[i].type, &rs[i].rid, rs[i].flags);
 4395                 if (res[i] == NULL && !(rs[i].flags & RF_OPTIONAL)) {
 4396                         bus_release_resources(dev, rs, res);
 4397                         return (ENXIO);
 4398                 }
 4399         }
 4400         return (0);
 4401 }
 4402 
 4403 void
 4404 bus_release_resources(device_t dev, const struct resource_spec *rs,
 4405     struct resource **res)
 4406 {
 4407         int i;
 4408 
 4409         for (i = 0; rs[i].type != -1; i++)
 4410                 if (res[i] != NULL) {
 4411                         bus_release_resource(
 4412                             dev, rs[i].type, rs[i].rid, res[i]);
 4413                         res[i] = NULL;
 4414                 }
 4415 }
 4416 
 4417 /**
 4418  * @brief Wrapper function for BUS_ALLOC_RESOURCE().
 4419  *
 4420  * This function simply calls the BUS_ALLOC_RESOURCE() method of the
 4421  * parent of @p dev.
 4422  */
 4423 struct resource *
 4424 bus_alloc_resource(device_t dev, int type, int *rid, rman_res_t start,
 4425     rman_res_t end, rman_res_t count, u_int flags)
 4426 {
 4427         struct resource *res;
 4428 
 4429         if (dev->parent == NULL)
 4430                 return (NULL);
 4431         res = BUS_ALLOC_RESOURCE(dev->parent, dev, type, rid, start, end,
 4432             count, flags);
 4433         return (res);
 4434 }
 4435 
 4436 /**
 4437  * @brief Wrapper function for BUS_ADJUST_RESOURCE().
 4438  *
 4439  * This function simply calls the BUS_ADJUST_RESOURCE() method of the
 4440  * parent of @p dev.
 4441  */
 4442 int
 4443 bus_adjust_resource(device_t dev, int type, struct resource *r, rman_res_t start,
 4444     rman_res_t end)
 4445 {
 4446         if (dev->parent == NULL)
 4447                 return (EINVAL);
 4448         return (BUS_ADJUST_RESOURCE(dev->parent, dev, type, r, start, end));
 4449 }
 4450 
 4451 /**
 4452  * @brief Wrapper function for BUS_ACTIVATE_RESOURCE().
 4453  *
 4454  * This function simply calls the BUS_ACTIVATE_RESOURCE() method of the
 4455  * parent of @p dev.
 4456  */
 4457 int
 4458 bus_activate_resource(device_t dev, int type, int rid, struct resource *r)
 4459 {
 4460         if (dev->parent == NULL)
 4461                 return (EINVAL);
 4462         return (BUS_ACTIVATE_RESOURCE(dev->parent, dev, type, rid, r));
 4463 }
 4464 
 4465 /**
 4466  * @brief Wrapper function for BUS_DEACTIVATE_RESOURCE().
 4467  *
 4468  * This function simply calls the BUS_DEACTIVATE_RESOURCE() method of the
 4469  * parent of @p dev.
 4470  */
 4471 int
 4472 bus_deactivate_resource(device_t dev, int type, int rid, struct resource *r)
 4473 {
 4474         if (dev->parent == NULL)
 4475                 return (EINVAL);
 4476         return (BUS_DEACTIVATE_RESOURCE(dev->parent, dev, type, rid, r));
 4477 }
 4478 
 4479 /**
 4480  * @brief Wrapper function for BUS_MAP_RESOURCE().
 4481  *
 4482  * This function simply calls the BUS_MAP_RESOURCE() method of the
 4483  * parent of @p dev.
 4484  */
 4485 int
 4486 bus_map_resource(device_t dev, int type, struct resource *r,
 4487     struct resource_map_request *args, struct resource_map *map)
 4488 {
 4489         if (dev->parent == NULL)
 4490                 return (EINVAL);
 4491         return (BUS_MAP_RESOURCE(dev->parent, dev, type, r, args, map));
 4492 }
 4493 
 4494 /**
 4495  * @brief Wrapper function for BUS_UNMAP_RESOURCE().
 4496  *
 4497  * This function simply calls the BUS_UNMAP_RESOURCE() method of the
 4498  * parent of @p dev.
 4499  */
 4500 int
 4501 bus_unmap_resource(device_t dev, int type, struct resource *r,
 4502     struct resource_map *map)
 4503 {
 4504         if (dev->parent == NULL)
 4505                 return (EINVAL);
 4506         return (BUS_UNMAP_RESOURCE(dev->parent, dev, type, r, map));
 4507 }
 4508 
 4509 /**
 4510  * @brief Wrapper function for BUS_RELEASE_RESOURCE().
 4511  *
 4512  * This function simply calls the BUS_RELEASE_RESOURCE() method of the
 4513  * parent of @p dev.
 4514  */
 4515 int
 4516 bus_release_resource(device_t dev, int type, int rid, struct resource *r)
 4517 {
 4518         int rv;
 4519 
 4520         if (dev->parent == NULL)
 4521                 return (EINVAL);
 4522         rv = BUS_RELEASE_RESOURCE(dev->parent, dev, type, rid, r);
 4523         return (rv);
 4524 }
 4525 
 4526 /**
 4527  * @brief Wrapper function for BUS_SETUP_INTR().
 4528  *
 4529  * This function simply calls the BUS_SETUP_INTR() method of the
 4530  * parent of @p dev.
 4531  */
 4532 int
 4533 bus_setup_intr(device_t dev, struct resource *r, int flags,
 4534     driver_filter_t filter, driver_intr_t handler, void *arg, void **cookiep)
 4535 {
 4536         int error;
 4537 
 4538         if (dev->parent == NULL)
 4539                 return (EINVAL);
 4540         error = BUS_SETUP_INTR(dev->parent, dev, r, flags, filter, handler,
 4541             arg, cookiep);
 4542         if (error != 0)
 4543                 return (error);
 4544         if (handler != NULL && !(flags & INTR_MPSAFE))
 4545                 device_printf(dev, "[GIANT-LOCKED]\n");
 4546         return (0);
 4547 }
 4548 
 4549 /**
 4550  * @brief Wrapper function for BUS_TEARDOWN_INTR().
 4551  *
 4552  * This function simply calls the BUS_TEARDOWN_INTR() method of the
 4553  * parent of @p dev.
 4554  */
 4555 int
 4556 bus_teardown_intr(device_t dev, struct resource *r, void *cookie)
 4557 {
 4558         if (dev->parent == NULL)
 4559                 return (EINVAL);
 4560         return (BUS_TEARDOWN_INTR(dev->parent, dev, r, cookie));
 4561 }
 4562 
 4563 /**
 4564  * @brief Wrapper function for BUS_BIND_INTR().
 4565  *
 4566  * This function simply calls the BUS_BIND_INTR() method of the
 4567  * parent of @p dev.
 4568  */
 4569 int
 4570 bus_bind_intr(device_t dev, struct resource *r, int cpu)
 4571 {
 4572         if (dev->parent == NULL)
 4573                 return (EINVAL);
 4574         return (BUS_BIND_INTR(dev->parent, dev, r, cpu));
 4575 }
 4576 
 4577 /**
 4578  * @brief Wrapper function for BUS_DESCRIBE_INTR().
 4579  *
 4580  * This function first formats the requested description into a
 4581  * temporary buffer and then calls the BUS_DESCRIBE_INTR() method of
 4582  * the parent of @p dev.
 4583  */
 4584 int
 4585 bus_describe_intr(device_t dev, struct resource *irq, void *cookie,
 4586     const char *fmt, ...)
 4587 {
 4588         va_list ap;
 4589         char descr[MAXCOMLEN + 1];
 4590 
 4591         if (dev->parent == NULL)
 4592                 return (EINVAL);
 4593         va_start(ap, fmt);
 4594         vsnprintf(descr, sizeof(descr), fmt, ap);
 4595         va_end(ap);
 4596         return (BUS_DESCRIBE_INTR(dev->parent, dev, irq, cookie, descr));
 4597 }
 4598 
 4599 /**
 4600  * @brief Wrapper function for BUS_SET_RESOURCE().
 4601  *
 4602  * This function simply calls the BUS_SET_RESOURCE() method of the
 4603  * parent of @p dev.
 4604  */
 4605 int
 4606 bus_set_resource(device_t dev, int type, int rid,
 4607     rman_res_t start, rman_res_t count)
 4608 {
 4609         return (BUS_SET_RESOURCE(device_get_parent(dev), dev, type, rid,
 4610             start, count));
 4611 }
 4612 
 4613 /**
 4614  * @brief Wrapper function for BUS_GET_RESOURCE().
 4615  *
 4616  * This function simply calls the BUS_GET_RESOURCE() method of the
 4617  * parent of @p dev.
 4618  */
 4619 int
 4620 bus_get_resource(device_t dev, int type, int rid,
 4621     rman_res_t *startp, rman_res_t *countp)
 4622 {
 4623         return (BUS_GET_RESOURCE(device_get_parent(dev), dev, type, rid,
 4624             startp, countp));
 4625 }
 4626 
 4627 /**
 4628  * @brief Wrapper function for BUS_GET_RESOURCE().
 4629  *
 4630  * This function simply calls the BUS_GET_RESOURCE() method of the
 4631  * parent of @p dev and returns the start value.
 4632  */
 4633 rman_res_t
 4634 bus_get_resource_start(device_t dev, int type, int rid)
 4635 {
 4636         rman_res_t start;
 4637         rman_res_t count;
 4638         int error;
 4639 
 4640         error = BUS_GET_RESOURCE(device_get_parent(dev), dev, type, rid,
 4641             &start, &count);
 4642         if (error)
 4643                 return (0);
 4644         return (start);
 4645 }
 4646 
 4647 /**
 4648  * @brief Wrapper function for BUS_GET_RESOURCE().
 4649  *
 4650  * This function simply calls the BUS_GET_RESOURCE() method of the
 4651  * parent of @p dev and returns the count value.
 4652  */
 4653 rman_res_t
 4654 bus_get_resource_count(device_t dev, int type, int rid)
 4655 {
 4656         rman_res_t start;
 4657         rman_res_t count;
 4658         int error;
 4659 
 4660         error = BUS_GET_RESOURCE(device_get_parent(dev), dev, type, rid,
 4661             &start, &count);
 4662         if (error)
 4663                 return (0);
 4664         return (count);
 4665 }
 4666 
 4667 /**
 4668  * @brief Wrapper function for BUS_DELETE_RESOURCE().
 4669  *
 4670  * This function simply calls the BUS_DELETE_RESOURCE() method of the
 4671  * parent of @p dev.
 4672  */
 4673 void
 4674 bus_delete_resource(device_t dev, int type, int rid)
 4675 {
 4676         BUS_DELETE_RESOURCE(device_get_parent(dev), dev, type, rid);
 4677 }
 4678 
 4679 /**
 4680  * @brief Wrapper function for BUS_CHILD_PRESENT().
 4681  *
 4682  * This function simply calls the BUS_CHILD_PRESENT() method of the
 4683  * parent of @p dev.
 4684  */
 4685 int
 4686 bus_child_present(device_t child)
 4687 {
 4688         return (BUS_CHILD_PRESENT(device_get_parent(child), child));
 4689 }
 4690 
 4691 /**
 4692  * @brief Wrapper function for BUS_CHILD_PNPINFO_STR().
 4693  *
 4694  * This function simply calls the BUS_CHILD_PNPINFO_STR() method of the
 4695  * parent of @p dev.
 4696  */
 4697 int
 4698 bus_child_pnpinfo_str(device_t child, char *buf, size_t buflen)
 4699 {
 4700         device_t parent;
 4701 
 4702         parent = device_get_parent(child);
 4703         if (parent == NULL) {
 4704                 *buf = '\0';
 4705                 return (0);
 4706         }
 4707         return (BUS_CHILD_PNPINFO_STR(parent, child, buf, buflen));
 4708 }
 4709 
 4710 /**
 4711  * @brief Wrapper function for BUS_CHILD_LOCATION_STR().
 4712  *
 4713  * This function simply calls the BUS_CHILD_LOCATION_STR() method of the
 4714  * parent of @p dev.
 4715  */
 4716 int
 4717 bus_child_location_str(device_t child, char *buf, size_t buflen)
 4718 {
 4719         device_t parent;
 4720 
 4721         parent = device_get_parent(child);
 4722         if (parent == NULL) {
 4723                 *buf = '\0';
 4724                 return (0);
 4725         }
 4726         return (BUS_CHILD_LOCATION_STR(parent, child, buf, buflen));
 4727 }
 4728 
 4729 /**
 4730  * @brief Wrapper function for BUS_GET_CPUS().
 4731  *
 4732  * This function simply calls the BUS_GET_CPUS() method of the
 4733  * parent of @p dev.
 4734  */
 4735 int
 4736 bus_get_cpus(device_t dev, enum cpu_sets op, size_t setsize, cpuset_t *cpuset)
 4737 {
 4738         device_t parent;
 4739 
 4740         parent = device_get_parent(dev);
 4741         if (parent == NULL)
 4742                 return (EINVAL);
 4743         return (BUS_GET_CPUS(parent, dev, op, setsize, cpuset));
 4744 }
 4745 
 4746 /**
 4747  * @brief Wrapper function for BUS_GET_DMA_TAG().
 4748  *
 4749  * This function simply calls the BUS_GET_DMA_TAG() method of the
 4750  * parent of @p dev.
 4751  */
 4752 bus_dma_tag_t
 4753 bus_get_dma_tag(device_t dev)
 4754 {
 4755         device_t parent;
 4756 
 4757         parent = device_get_parent(dev);
 4758         if (parent == NULL)
 4759                 return (NULL);
 4760         return (BUS_GET_DMA_TAG(parent, dev));
 4761 }
 4762 
 4763 /**
 4764  * @brief Wrapper function for BUS_GET_BUS_TAG().
 4765  *
 4766  * This function simply calls the BUS_GET_BUS_TAG() method of the
 4767  * parent of @p dev.
 4768  */
 4769 bus_space_tag_t
 4770 bus_get_bus_tag(device_t dev)
 4771 {
 4772         device_t parent;
 4773 
 4774         parent = device_get_parent(dev);
 4775         if (parent == NULL)
 4776                 return ((bus_space_tag_t)0);
 4777         return (BUS_GET_BUS_TAG(parent, dev));
 4778 }
 4779 
 4780 /**
 4781  * @brief Wrapper function for BUS_GET_DOMAIN().
 4782  *
 4783  * This function simply calls the BUS_GET_DOMAIN() method of the
 4784  * parent of @p dev.
 4785  */
 4786 int
 4787 bus_get_domain(device_t dev, int *domain)
 4788 {
 4789         return (BUS_GET_DOMAIN(device_get_parent(dev), dev, domain));
 4790 }
 4791 
 4792 /* Resume all devices and then notify userland that we're up again. */
 4793 static int
 4794 root_resume(device_t dev)
 4795 {
 4796         int error;
 4797 
 4798         error = bus_generic_resume(dev);
 4799         if (error == 0)
 4800                 devctl_notify("kern", "power", "resume", NULL);
 4801         return (error);
 4802 }
 4803 
 4804 static int
 4805 root_print_child(device_t dev, device_t child)
 4806 {
 4807         int     retval = 0;
 4808 
 4809         retval += bus_print_child_header(dev, child);
 4810         retval += printf("\n");
 4811 
 4812         return (retval);
 4813 }
 4814 
 4815 static int
 4816 root_setup_intr(device_t dev, device_t child, struct resource *irq, int flags,
 4817     driver_filter_t *filter, driver_intr_t *intr, void *arg, void **cookiep)
 4818 {
 4819         /*
 4820          * If an interrupt mapping gets to here something bad has happened.
 4821          */
 4822         panic("root_setup_intr");
 4823 }
 4824 
 4825 /*
 4826  * If we get here, assume that the device is permanent and really is
 4827  * present in the system.  Removable bus drivers are expected to intercept
 4828  * this call long before it gets here.  We return -1 so that drivers that
 4829  * really care can check vs -1 or some ERRNO returned higher in the food
 4830  * chain.
 4831  */
 4832 static int
 4833 root_child_present(device_t dev, device_t child)
 4834 {
 4835         return (-1);
 4836 }
 4837 
 4838 static int
 4839 root_get_cpus(device_t dev, device_t child, enum cpu_sets op, size_t setsize,
 4840     cpuset_t *cpuset)
 4841 {
 4842 
 4843         switch (op) {
 4844         case INTR_CPUS:
 4845                 /* Default to returning the set of all CPUs. */
 4846                 if (setsize != sizeof(cpuset_t))
 4847                         return (EINVAL);
 4848                 *cpuset = all_cpus;
 4849                 return (0);
 4850         default:
 4851                 return (EINVAL);
 4852         }
 4853 }
 4854 
 4855 static kobj_method_t root_methods[] = {
 4856         /* Device interface */
 4857         KOBJMETHOD(device_shutdown,     bus_generic_shutdown),
 4858         KOBJMETHOD(device_suspend,      bus_generic_suspend),
 4859         KOBJMETHOD(device_resume,       root_resume),
 4860 
 4861         /* Bus interface */
 4862         KOBJMETHOD(bus_print_child,     root_print_child),
 4863         KOBJMETHOD(bus_read_ivar,       bus_generic_read_ivar),
 4864         KOBJMETHOD(bus_write_ivar,      bus_generic_write_ivar),
 4865         KOBJMETHOD(bus_setup_intr,      root_setup_intr),
 4866         KOBJMETHOD(bus_child_present,   root_child_present),
 4867         KOBJMETHOD(bus_get_cpus,        root_get_cpus),
 4868 
 4869         KOBJMETHOD_END
 4870 };
 4871 
 4872 static driver_t root_driver = {
 4873         "root",
 4874         root_methods,
 4875         1,                      /* no softc */
 4876 };
 4877 
 4878 device_t        root_bus;
 4879 devclass_t      root_devclass;
 4880 
 4881 static int
 4882 root_bus_module_handler(module_t mod, int what, void* arg)
 4883 {
 4884         switch (what) {
 4885         case MOD_LOAD:
 4886                 TAILQ_INIT(&bus_data_devices);
 4887                 kobj_class_compile((kobj_class_t) &root_driver);
 4888                 root_bus = make_device(NULL, "root", 0);
 4889                 root_bus->desc = "System root bus";
 4890                 kobj_init((kobj_t) root_bus, (kobj_class_t) &root_driver);
 4891                 root_bus->driver = &root_driver;
 4892                 root_bus->state = DS_ATTACHED;
 4893                 root_devclass = devclass_find_internal("root", NULL, FALSE);
 4894                 devinit();
 4895                 return (0);
 4896 
 4897         case MOD_SHUTDOWN:
 4898                 device_shutdown(root_bus);
 4899                 return (0);
 4900         default:
 4901                 return (EOPNOTSUPP);
 4902         }
 4903 
 4904         return (0);
 4905 }
 4906 
 4907 static moduledata_t root_bus_mod = {
 4908         "rootbus",
 4909         root_bus_module_handler,
 4910         NULL
 4911 };
 4912 DECLARE_MODULE(rootbus, root_bus_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);
 4913 
 4914 /**
 4915  * @brief Automatically configure devices
 4916  *
 4917  * This function begins the autoconfiguration process by calling
 4918  * device_probe_and_attach() for each child of the @c root0 device.
 4919  */
 4920 void
 4921 root_bus_configure(void)
 4922 {
 4923 
 4924         PDEBUG(("."));
 4925 
 4926         /* Eventually this will be split up, but this is sufficient for now. */
 4927         bus_set_pass(BUS_PASS_DEFAULT);
 4928 }
 4929 
 4930 /**
 4931  * @brief Module handler for registering device drivers
 4932  *
 4933  * This module handler is used to automatically register device
 4934  * drivers when modules are loaded. If @p what is MOD_LOAD, it calls
 4935  * devclass_add_driver() for the driver described by the
 4936  * driver_module_data structure pointed to by @p arg
 4937  */
 4938 int
 4939 driver_module_handler(module_t mod, int what, void *arg)
 4940 {
 4941         struct driver_module_data *dmd;
 4942         devclass_t bus_devclass;
 4943         kobj_class_t driver;
 4944         int error, pass;
 4945 
 4946         dmd = (struct driver_module_data *)arg;
 4947         bus_devclass = devclass_find_internal(dmd->dmd_busname, NULL, TRUE);
 4948         error = 0;
 4949 
 4950         switch (what) {
 4951         case MOD_LOAD:
 4952                 if (dmd->dmd_chainevh)
 4953                         error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
 4954 
 4955                 pass = dmd->dmd_pass;
 4956                 driver = dmd->dmd_driver;
 4957                 PDEBUG(("Loading module: driver %s on bus %s (pass %d)",
 4958                     DRIVERNAME(driver), dmd->dmd_busname, pass));
 4959                 error = devclass_add_driver(bus_devclass, driver, pass,
 4960                     dmd->dmd_devclass);
 4961                 break;
 4962 
 4963         case MOD_UNLOAD:
 4964                 PDEBUG(("Unloading module: driver %s from bus %s",
 4965                     DRIVERNAME(dmd->dmd_driver),
 4966                     dmd->dmd_busname));
 4967                 error = devclass_delete_driver(bus_devclass,
 4968                     dmd->dmd_driver);
 4969 
 4970                 if (!error && dmd->dmd_chainevh)
 4971                         error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
 4972                 break;
 4973         case MOD_QUIESCE:
 4974                 PDEBUG(("Quiesce module: driver %s from bus %s",
 4975                     DRIVERNAME(dmd->dmd_driver),
 4976                     dmd->dmd_busname));
 4977                 error = devclass_quiesce_driver(bus_devclass,
 4978                     dmd->dmd_driver);
 4979 
 4980                 if (!error && dmd->dmd_chainevh)
 4981                         error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
 4982                 break;
 4983         default:
 4984                 error = EOPNOTSUPP;
 4985                 break;
 4986         }
 4987 
 4988         return (error);
 4989 }
 4990 
 4991 /**
 4992  * @brief Enumerate all hinted devices for this bus.
 4993  *
 4994  * Walks through the hints for this bus and calls the bus_hinted_child
 4995  * routine for each one it fines.  It searches first for the specific
 4996  * bus that's being probed for hinted children (eg isa0), and then for
 4997  * generic children (eg isa).
 4998  *
 4999  * @param       dev     bus device to enumerate
 5000  */
 5001 void
 5002 bus_enumerate_hinted_children(device_t bus)
 5003 {
 5004         int i;
 5005         const char *dname, *busname;
 5006         int dunit;
 5007 
 5008         /*
 5009          * enumerate all devices on the specific bus
 5010          */
 5011         busname = device_get_nameunit(bus);
 5012         i = 0;
 5013         while (resource_find_match(&i, &dname, &dunit, "at", busname) == 0)
 5014                 BUS_HINTED_CHILD(bus, dname, dunit);
 5015 
 5016         /*
 5017          * and all the generic ones.
 5018          */
 5019         busname = device_get_name(bus);
 5020         i = 0;
 5021         while (resource_find_match(&i, &dname, &dunit, "at", busname) == 0)
 5022                 BUS_HINTED_CHILD(bus, dname, dunit);
 5023 }
 5024 
 5025 #ifdef BUS_DEBUG
 5026 
 5027 /* the _short versions avoid iteration by not calling anything that prints
 5028  * more than oneliners. I love oneliners.
 5029  */
 5030 
 5031 static void
 5032 print_device_short(device_t dev, int indent)
 5033 {
 5034         if (!dev)
 5035                 return;
 5036 
 5037         indentprintf(("device %d: <%s> %sparent,%schildren,%s%s%s%s%s,%sivars,%ssoftc,busy=%d\n",
 5038             dev->unit, dev->desc,
 5039             (dev->parent? "":"no "),
 5040             (TAILQ_EMPTY(&dev->children)? "no ":""),
 5041             (dev->flags&DF_ENABLED? "enabled,":"disabled,"),
 5042             (dev->flags&DF_FIXEDCLASS? "fixed,":""),
 5043             (dev->flags&DF_WILDCARD? "wildcard,":""),
 5044             (dev->flags&DF_DESCMALLOCED? "descmalloced,":""),
 5045             (dev->flags&DF_REBID? "rebiddable,":""),
 5046             (dev->ivars? "":"no "),
 5047             (dev->softc? "":"no "),
 5048             dev->busy));
 5049 }
 5050 
 5051 static void
 5052 print_device(device_t dev, int indent)
 5053 {
 5054         if (!dev)
 5055                 return;
 5056 
 5057         print_device_short(dev, indent);
 5058 
 5059         indentprintf(("Parent:\n"));
 5060         print_device_short(dev->parent, indent+1);
 5061         indentprintf(("Driver:\n"));
 5062         print_driver_short(dev->driver, indent+1);
 5063         indentprintf(("Devclass:\n"));
 5064         print_devclass_short(dev->devclass, indent+1);
 5065 }
 5066 
 5067 void
 5068 print_device_tree_short(device_t dev, int indent)
 5069 /* print the device and all its children (indented) */
 5070 {
 5071         device_t child;
 5072 
 5073         if (!dev)
 5074                 return;
 5075 
 5076         print_device_short(dev, indent);
 5077 
 5078         TAILQ_FOREACH(child, &dev->children, link) {
 5079                 print_device_tree_short(child, indent+1);
 5080         }
 5081 }
 5082 
 5083 void
 5084 print_device_tree(device_t dev, int indent)
 5085 /* print the device and all its children (indented) */
 5086 {
 5087         device_t child;
 5088 
 5089         if (!dev)
 5090                 return;
 5091 
 5092         print_device(dev, indent);
 5093 
 5094         TAILQ_FOREACH(child, &dev->children, link) {
 5095                 print_device_tree(child, indent+1);
 5096         }
 5097 }
 5098 
 5099 static void
 5100 print_driver_short(driver_t *driver, int indent)
 5101 {
 5102         if (!driver)
 5103                 return;
 5104 
 5105         indentprintf(("driver %s: softc size = %zd\n",
 5106             driver->name, driver->size));
 5107 }
 5108 
 5109 static void
 5110 print_driver(driver_t *driver, int indent)
 5111 {
 5112         if (!driver)
 5113                 return;
 5114 
 5115         print_driver_short(driver, indent);
 5116 }
 5117 
 5118 static void
 5119 print_driver_list(driver_list_t drivers, int indent)
 5120 {
 5121         driverlink_t driver;
 5122 
 5123         TAILQ_FOREACH(driver, &drivers, link) {
 5124                 print_driver(driver->driver, indent);
 5125         }
 5126 }
 5127 
 5128 static void
 5129 print_devclass_short(devclass_t dc, int indent)
 5130 {
 5131         if ( !dc )
 5132                 return;
 5133 
 5134         indentprintf(("devclass %s: max units = %d\n", dc->name, dc->maxunit));
 5135 }
 5136 
 5137 static void
 5138 print_devclass(devclass_t dc, int indent)
 5139 {
 5140         int i;
 5141 
 5142         if ( !dc )
 5143                 return;
 5144 
 5145         print_devclass_short(dc, indent);
 5146         indentprintf(("Drivers:\n"));
 5147         print_driver_list(dc->drivers, indent+1);
 5148 
 5149         indentprintf(("Devices:\n"));
 5150         for (i = 0; i < dc->maxunit; i++)
 5151                 if (dc->devices[i])
 5152                         print_device(dc->devices[i], indent+1);
 5153 }
 5154 
 5155 void
 5156 print_devclass_list_short(void)
 5157 {
 5158         devclass_t dc;
 5159 
 5160         printf("Short listing of devclasses, drivers & devices:\n");
 5161         TAILQ_FOREACH(dc, &devclasses, link) {
 5162                 print_devclass_short(dc, 0);
 5163         }
 5164 }
 5165 
 5166 void
 5167 print_devclass_list(void)
 5168 {
 5169         devclass_t dc;
 5170 
 5171         printf("Full listing of devclasses, drivers & devices:\n");
 5172         TAILQ_FOREACH(dc, &devclasses, link) {
 5173                 print_devclass(dc, 0);
 5174         }
 5175 }
 5176 
 5177 #endif
 5178 
 5179 /*
 5180  * User-space access to the device tree.
 5181  *
 5182  * We implement a small set of nodes:
 5183  *
 5184  * hw.bus                       Single integer read method to obtain the
 5185  *                              current generation count.
 5186  * hw.bus.devices               Reads the entire device tree in flat space.
 5187  * hw.bus.rman                  Resource manager interface
 5188  *
 5189  * We might like to add the ability to scan devclasses and/or drivers to
 5190  * determine what else is currently loaded/available.
 5191  */
 5192 
 5193 static int
 5194 sysctl_bus(SYSCTL_HANDLER_ARGS)
 5195 {
 5196         struct u_businfo        ubus;
 5197 
 5198         ubus.ub_version = BUS_USER_VERSION;
 5199         ubus.ub_generation = bus_data_generation;
 5200 
 5201         return (SYSCTL_OUT(req, &ubus, sizeof(ubus)));
 5202 }
 5203 SYSCTL_NODE(_hw_bus, OID_AUTO, info, CTLFLAG_RW, sysctl_bus,
 5204     "bus-related data");
 5205 
 5206 static int
 5207 sysctl_devices(SYSCTL_HANDLER_ARGS)
 5208 {
 5209         int                     *name = (int *)arg1;
 5210         u_int                   namelen = arg2;
 5211         int                     index;
 5212         struct device           *dev;
 5213         struct u_device         udev;   /* XXX this is a bit big */
 5214         int                     error;
 5215 
 5216         if (namelen != 2)
 5217                 return (EINVAL);
 5218 
 5219         if (bus_data_generation_check(name[0]))
 5220                 return (EINVAL);
 5221 
 5222         index = name[1];
 5223 
 5224         /*
 5225          * Scan the list of devices, looking for the requested index.
 5226          */
 5227         TAILQ_FOREACH(dev, &bus_data_devices, devlink) {
 5228                 if (index-- == 0)
 5229                         break;
 5230         }
 5231         if (dev == NULL)
 5232                 return (ENOENT);
 5233 
 5234         /*
 5235          * Populate the return array.
 5236          */
 5237         bzero(&udev, sizeof(udev));
 5238         udev.dv_handle = (uintptr_t)dev;
 5239         udev.dv_parent = (uintptr_t)dev->parent;
 5240         if (dev->nameunit != NULL)
 5241                 strlcpy(udev.dv_name, dev->nameunit, sizeof(udev.dv_name));
 5242         if (dev->desc != NULL)
 5243                 strlcpy(udev.dv_desc, dev->desc, sizeof(udev.dv_desc));
 5244         if (dev->driver != NULL && dev->driver->name != NULL)
 5245                 strlcpy(udev.dv_drivername, dev->driver->name,
 5246                     sizeof(udev.dv_drivername));
 5247         bus_child_pnpinfo_str(dev, udev.dv_pnpinfo, sizeof(udev.dv_pnpinfo));
 5248         bus_child_location_str(dev, udev.dv_location, sizeof(udev.dv_location));
 5249         udev.dv_devflags = dev->devflags;
 5250         udev.dv_flags = dev->flags;
 5251         udev.dv_state = dev->state;
 5252         error = SYSCTL_OUT(req, &udev, sizeof(udev));
 5253         return (error);
 5254 }
 5255 
 5256 SYSCTL_NODE(_hw_bus, OID_AUTO, devices, CTLFLAG_RD, sysctl_devices,
 5257     "system device tree");
 5258 
 5259 int
 5260 bus_data_generation_check(int generation)
 5261 {
 5262         if (generation != bus_data_generation)
 5263                 return (1);
 5264 
 5265         /* XXX generate optimised lists here? */
 5266         return (0);
 5267 }
 5268 
 5269 void
 5270 bus_data_generation_update(void)
 5271 {
 5272         bus_data_generation++;
 5273 }
 5274 
 5275 int
 5276 bus_free_resource(device_t dev, int type, struct resource *r)
 5277 {
 5278         if (r == NULL)
 5279                 return (0);
 5280         return (bus_release_resource(dev, type, rman_get_rid(r), r));
 5281 }
 5282 
 5283 device_t
 5284 device_lookup_by_name(const char *name)
 5285 {
 5286         device_t dev;
 5287 
 5288         TAILQ_FOREACH(dev, &bus_data_devices, devlink) {
 5289                 if (dev->nameunit != NULL && strcmp(dev->nameunit, name) == 0)
 5290                         return (dev);
 5291         }
 5292         return (NULL);
 5293 }
 5294 
 5295 /*
 5296  * /dev/devctl2 implementation.  The existing /dev/devctl device has
 5297  * implicit semantics on open, so it could not be reused for this.
 5298  * Another option would be to call this /dev/bus?
 5299  */
 5300 static int
 5301 find_device(struct devreq *req, device_t *devp)
 5302 {
 5303         device_t dev;
 5304 
 5305         /*
 5306          * First, ensure that the name is nul terminated.
 5307          */
 5308         if (memchr(req->dr_name, '\0', sizeof(req->dr_name)) == NULL)
 5309                 return (EINVAL);
 5310 
 5311         /*
 5312          * Second, try to find an attached device whose name matches
 5313          * 'name'.
 5314          */
 5315         dev = device_lookup_by_name(req->dr_name);
 5316         if (dev != NULL) {
 5317                 *devp = dev;
 5318                 return (0);
 5319         }
 5320 
 5321         /* Finally, give device enumerators a chance. */
 5322         dev = NULL;
 5323         EVENTHANDLER_INVOKE(dev_lookup, req->dr_name, &dev);
 5324         if (dev == NULL)
 5325                 return (ENOENT);
 5326         *devp = dev;
 5327         return (0);
 5328 }
 5329 
 5330 static bool
 5331 driver_exists(device_t bus, const char *driver)
 5332 {
 5333         devclass_t dc;
 5334 
 5335         for (dc = bus->devclass; dc != NULL; dc = dc->parent) {
 5336                 if (devclass_find_driver_internal(dc, driver) != NULL)
 5337                         return (true);
 5338         }
 5339         return (false);
 5340 }
 5341 
 5342 static int
 5343 devctl2_ioctl(struct cdev *cdev, u_long cmd, caddr_t data, int fflag,
 5344     struct thread *td)
 5345 {
 5346         struct devreq *req;
 5347         device_t dev;
 5348         int error, old;
 5349 
 5350         /* Locate the device to control. */
 5351         mtx_lock(&Giant);
 5352         req = (struct devreq *)data;
 5353         switch (cmd) {
 5354         case DEV_ATTACH:
 5355         case DEV_DETACH:
 5356         case DEV_ENABLE:
 5357         case DEV_DISABLE:
 5358         case DEV_SUSPEND:
 5359         case DEV_RESUME:
 5360         case DEV_SET_DRIVER:
 5361         case DEV_CLEAR_DRIVER:
 5362         case DEV_RESCAN:
 5363         case DEV_DELETE:
 5364                 error = priv_check(td, PRIV_DRIVER);
 5365                 if (error == 0)
 5366                         error = find_device(req, &dev);
 5367                 break;
 5368         default:
 5369                 error = ENOTTY;
 5370                 break;
 5371         }
 5372         if (error) {
 5373                 mtx_unlock(&Giant);
 5374                 return (error);
 5375         }
 5376 
 5377         /* Perform the requested operation. */
 5378         switch (cmd) {
 5379         case DEV_ATTACH:
 5380                 if (device_is_attached(dev) && (dev->flags & DF_REBID) == 0)
 5381                         error = EBUSY;
 5382                 else if (!device_is_enabled(dev))
 5383                         error = ENXIO;
 5384                 else
 5385                         error = device_probe_and_attach(dev);
 5386                 break;
 5387         case DEV_DETACH:
 5388                 if (!device_is_attached(dev)) {
 5389                         error = ENXIO;
 5390                         break;
 5391                 }
 5392                 if (!(req->dr_flags & DEVF_FORCE_DETACH)) {
 5393                         error = device_quiesce(dev);
 5394                         if (error)
 5395                                 break;
 5396                 }
 5397                 error = device_detach(dev);
 5398                 break;
 5399         case DEV_ENABLE:
 5400                 if (device_is_enabled(dev)) {
 5401                         error = EBUSY;
 5402                         break;
 5403                 }
 5404 
 5405                 /*
 5406                  * If the device has been probed but not attached (e.g.
 5407                  * when it has been disabled by a loader hint), just
 5408                  * attach the device rather than doing a full probe.
 5409                  */
 5410                 device_enable(dev);
 5411                 if (device_is_alive(dev)) {
 5412                         /*
 5413                          * If the device was disabled via a hint, clear
 5414                          * the hint.
 5415                          */
 5416                         if (resource_disabled(dev->driver->name, dev->unit))
 5417                                 resource_unset_value(dev->driver->name,
 5418                                     dev->unit, "disabled");
 5419                         error = device_attach(dev);
 5420                 } else
 5421                         error = device_probe_and_attach(dev);
 5422                 break;
 5423         case DEV_DISABLE:
 5424                 if (!device_is_enabled(dev)) {
 5425                         error = ENXIO;
 5426                         break;
 5427                 }
 5428 
 5429                 if (!(req->dr_flags & DEVF_FORCE_DETACH)) {
 5430                         error = device_quiesce(dev);
 5431                         if (error)
 5432                                 break;
 5433                 }
 5434 
 5435                 /*
 5436                  * Force DF_FIXEDCLASS on around detach to preserve
 5437                  * the existing name.
 5438                  */
 5439                 old = dev->flags;
 5440                 dev->flags |= DF_FIXEDCLASS;
 5441                 error = device_detach(dev);
 5442                 if (!(old & DF_FIXEDCLASS))
 5443                         dev->flags &= ~DF_FIXEDCLASS;
 5444                 if (error == 0)
 5445                         device_disable(dev);
 5446                 break;
 5447         case DEV_SUSPEND:
 5448                 if (device_is_suspended(dev)) {
 5449                         error = EBUSY;
 5450                         break;
 5451                 }
 5452                 if (device_get_parent(dev) == NULL) {
 5453                         error = EINVAL;
 5454                         break;
 5455                 }
 5456                 error = BUS_SUSPEND_CHILD(device_get_parent(dev), dev);
 5457                 break;
 5458         case DEV_RESUME:
 5459                 if (!device_is_suspended(dev)) {
 5460                         error = EINVAL;
 5461                         break;
 5462                 }
 5463                 if (device_get_parent(dev) == NULL) {
 5464                         error = EINVAL;
 5465                         break;
 5466                 }
 5467                 error = BUS_RESUME_CHILD(device_get_parent(dev), dev);
 5468                 break;
 5469         case DEV_SET_DRIVER: {
 5470                 devclass_t dc;
 5471                 char driver[128];
 5472 
 5473                 error = copyinstr(req->dr_data, driver, sizeof(driver), NULL);
 5474                 if (error)
 5475                         break;
 5476                 if (driver[0] == '\0') {
 5477                         error = EINVAL;
 5478                         break;
 5479                 }
 5480                 if (dev->devclass != NULL &&
 5481                     strcmp(driver, dev->devclass->name) == 0)
 5482                         /* XXX: Could possibly force DF_FIXEDCLASS on? */
 5483                         break;
 5484 
 5485                 /*
 5486                  * Scan drivers for this device's bus looking for at
 5487                  * least one matching driver.
 5488                  */
 5489                 if (dev->parent == NULL) {
 5490                         error = EINVAL;
 5491                         break;
 5492                 }
 5493                 if (!driver_exists(dev->parent, driver)) {
 5494                         error = ENOENT;
 5495                         break;
 5496                 }
 5497                 dc = devclass_create(driver);
 5498                 if (dc == NULL) {
 5499                         error = ENOMEM;
 5500                         break;
 5501                 }
 5502 
 5503                 /* Detach device if necessary. */
 5504                 if (device_is_attached(dev)) {
 5505                         if (req->dr_flags & DEVF_SET_DRIVER_DETACH)
 5506                                 error = device_detach(dev);
 5507                         else
 5508                                 error = EBUSY;
 5509                         if (error)
 5510                                 break;
 5511                 }
 5512 
 5513                 /* Clear any previously-fixed device class and unit. */
 5514                 if (dev->flags & DF_FIXEDCLASS)
 5515                         devclass_delete_device(dev->devclass, dev);
 5516                 dev->flags |= DF_WILDCARD;
 5517                 dev->unit = -1;
 5518 
 5519                 /* Force the new device class. */
 5520                 error = devclass_add_device(dc, dev);
 5521                 if (error)
 5522                         break;
 5523                 dev->flags |= DF_FIXEDCLASS;
 5524                 error = device_probe_and_attach(dev);
 5525                 break;
 5526         }
 5527         case DEV_CLEAR_DRIVER:
 5528                 if (!(dev->flags & DF_FIXEDCLASS)) {
 5529                         error = 0;
 5530                         break;
 5531                 }
 5532                 if (device_is_attached(dev)) {
 5533                         if (req->dr_flags & DEVF_CLEAR_DRIVER_DETACH)
 5534                                 error = device_detach(dev);
 5535                         else
 5536                                 error = EBUSY;
 5537                         if (error)
 5538                                 break;
 5539                 }
 5540 
 5541                 dev->flags &= ~DF_FIXEDCLASS;
 5542                 dev->flags |= DF_WILDCARD;
 5543                 devclass_delete_device(dev->devclass, dev);
 5544                 error = device_probe_and_attach(dev);
 5545                 break;
 5546         case DEV_RESCAN:
 5547                 if (!device_is_attached(dev)) {
 5548                         error = ENXIO;
 5549                         break;
 5550                 }
 5551                 error = BUS_RESCAN(dev);
 5552                 break;
 5553         case DEV_DELETE: {
 5554                 device_t parent;
 5555 
 5556                 parent = device_get_parent(dev);
 5557                 if (parent == NULL) {
 5558                         error = EINVAL;
 5559                         break;
 5560                 }
 5561                 if (!(req->dr_flags & DEVF_FORCE_DELETE)) {
 5562                         if (bus_child_present(dev) != 0) {
 5563                                 error = EBUSY;
 5564                                 break;
 5565                         }
 5566                 }
 5567                 
 5568                 error = device_delete_child(parent, dev);
 5569                 break;
 5570         }
 5571         }
 5572         mtx_unlock(&Giant);
 5573         return (error);
 5574 }
 5575 
 5576 static struct cdevsw devctl2_cdevsw = {
 5577         .d_version =    D_VERSION,
 5578         .d_ioctl =      devctl2_ioctl,
 5579         .d_name =       "devctl2",
 5580 };
 5581 
 5582 static void
 5583 devctl2_init(void)
 5584 {
 5585 
 5586         make_dev_credf(MAKEDEV_ETERNAL, &devctl2_cdevsw, 0, NULL,
 5587             UID_ROOT, GID_WHEEL, 0600, "devctl2");
 5588 }

Cache object: 8225d3a85f248f26fa051dacfcdd9f81


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.