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

Cache object: a69e57bc9695871e652fe8877ac392b1


[ 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.