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