17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 552cac543Sramat * Common Development and Distribution License (the "License"). 652cac543Sramat * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22602ca9eaScth * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate #ifndef _SYS_AUTOCONF_H 277c478bd9Sstevel@tonic-gate #define _SYS_AUTOCONF_H 287c478bd9Sstevel@tonic-gate 297c478bd9Sstevel@tonic-gate 307c478bd9Sstevel@tonic-gate /* Derived from autoconf.h, SunOS 4.1.1 1.15 */ 317c478bd9Sstevel@tonic-gate 327c478bd9Sstevel@tonic-gate #ifdef __cplusplus 337c478bd9Sstevel@tonic-gate extern "C" { 347c478bd9Sstevel@tonic-gate #endif 357c478bd9Sstevel@tonic-gate 367c478bd9Sstevel@tonic-gate /* 377c478bd9Sstevel@tonic-gate * This defines a parallel structure to the devops list. 387c478bd9Sstevel@tonic-gate */ 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate #include <sys/dditypes.h> 417c478bd9Sstevel@tonic-gate #include <sys/devops.h> 427c478bd9Sstevel@tonic-gate #include <sys/mutex.h> 437c478bd9Sstevel@tonic-gate #include <sys/thread.h> 447c478bd9Sstevel@tonic-gate #include <sys/obpdefs.h> 457c478bd9Sstevel@tonic-gate #include <sys/systm.h> 467c478bd9Sstevel@tonic-gate 477c478bd9Sstevel@tonic-gate struct devnames { 487c478bd9Sstevel@tonic-gate char *dn_name; /* Name of this driver */ 497c478bd9Sstevel@tonic-gate int dn_flags; /* per-driver flags, see below */ 507c478bd9Sstevel@tonic-gate struct par_list *dn_pl; /* parent list, for making devinfos */ 517c478bd9Sstevel@tonic-gate kmutex_t dn_lock; /* Per driver lock (see below) */ 527c478bd9Sstevel@tonic-gate dev_info_t *dn_head; /* Head of instance list */ 537c478bd9Sstevel@tonic-gate int dn_instance; /* Next instance no. to assign */ 547c478bd9Sstevel@tonic-gate void *dn_inlist; /* instance # nodes for this driver */ 557c478bd9Sstevel@tonic-gate ddi_prop_list_t *dn_global_prop_ptr; /* per-driver global properties */ 567c478bd9Sstevel@tonic-gate kcondvar_t dn_wait; /* for ddi_hold_installed_driver */ 577c478bd9Sstevel@tonic-gate kthread_id_t dn_busy_thread; /* for debugging only */ 587c478bd9Sstevel@tonic-gate struct mperm *dn_mperm; /* minor permissions */ 597c478bd9Sstevel@tonic-gate struct mperm *dn_mperm_wild; /* default minor permission */ 607c478bd9Sstevel@tonic-gate struct mperm *dn_mperm_clone; /* minor permission, clone use */ 617c478bd9Sstevel@tonic-gate }; 627c478bd9Sstevel@tonic-gate 637c478bd9Sstevel@tonic-gate /* 647c478bd9Sstevel@tonic-gate * dn_lock is used to protect the driver initialization/loading 657c478bd9Sstevel@tonic-gate * from fini/unloading. It also protects each drivers devops 667c478bd9Sstevel@tonic-gate * reference count, the dn_flags, and the dn_head linked list of 677c478bd9Sstevel@tonic-gate * driver instances. The busy_changing bit is used to avoid 687c478bd9Sstevel@tonic-gate * recursive calls to ddi_hold_installed_driver to hold the 697c478bd9Sstevel@tonic-gate * same driver. 707c478bd9Sstevel@tonic-gate */ 717c478bd9Sstevel@tonic-gate 727c478bd9Sstevel@tonic-gate /* 737c478bd9Sstevel@tonic-gate * Defines for dn_flags. 747c478bd9Sstevel@tonic-gate */ 757c478bd9Sstevel@tonic-gate #define DN_CONF_PARSED 0x0001 767c478bd9Sstevel@tonic-gate #define DN_DRIVER_BUSY 0x0002 /* for ddi_hold_installed_driver */ 777c478bd9Sstevel@tonic-gate #define DN_DRIVER_HELD 0x0020 /* held via ddi_hold_installed_driver */ 787c478bd9Sstevel@tonic-gate #define DN_TAKEN_GETUDEV 0x0040 /* getudev() used this entry */ 797c478bd9Sstevel@tonic-gate #define DN_DRIVER_REMOVED 0x0080 /* driver entry removed */ 807c478bd9Sstevel@tonic-gate 81e099bf07Scth #define DN_FORCE_ATTACH 0x0100 /* DDI_FORCEATTACH prop */ 827c478bd9Sstevel@tonic-gate #define DN_LEAF_DRIVER 0x0200 /* this is a leaf driver */ 837c478bd9Sstevel@tonic-gate #define DN_NETWORK_DRIVER 0x0400 /* network interface driver */ 847c478bd9Sstevel@tonic-gate #define DN_NO_AUTODETACH 0x0800 /* no autodetach */ 857c478bd9Sstevel@tonic-gate #define DN_GLDV3_DRIVER 0x1000 /* gldv3 (Nemo) driver */ 8652cac543Sramat #define DN_PHCI_DRIVER 0x2000 /* pHCI driver */ 87e099bf07Scth #define DN_OPEN_RETURNS_EINTR 0x4000 /* DDI_OPEN_RETURNS_EINTR prop */ 88602ca9eaScth #define DN_SCSI_SIZE_CLEAN 0x8000 /* driver is scsi_size_clean() */ 897c478bd9Sstevel@tonic-gate 907c478bd9Sstevel@tonic-gate #ifdef _KERNEL 917c478bd9Sstevel@tonic-gate 927c478bd9Sstevel@tonic-gate /* 937c478bd9Sstevel@tonic-gate * Debugging flags and macros 947c478bd9Sstevel@tonic-gate */ 957c478bd9Sstevel@tonic-gate #define DDI_AUDIT 0x0001 967c478bd9Sstevel@tonic-gate #define DDI_DEBUG 0x0002 977c478bd9Sstevel@tonic-gate #define DDI_MTCONFIG 0x0004 987c478bd9Sstevel@tonic-gate #define DDI_DEBUG_BOOTMOD 0x0008 /* module loading to mount root */ 997c478bd9Sstevel@tonic-gate #define DDI_DEBUG_COMPAT 0x0010 /* ddi_hold_install_driver */ 1007c478bd9Sstevel@tonic-gate #define LDI_DBG_OPENCLOSE 0x0020 /* ldi open/close info */ 1017c478bd9Sstevel@tonic-gate #define LDI_DBG_ALLOCFREE 0x0040 /* ldi ident alloc/free info */ 1027c478bd9Sstevel@tonic-gate #define LDI_DBG_STREAMS 0x0080 /* ldi streams link/unlink */ 1037c478bd9Sstevel@tonic-gate #define LDI_DBG_EVENTCB 0x0100 /* ldi event callback info */ 1047c478bd9Sstevel@tonic-gate #define DDI_INTR_API 0x0200 /* interrupt interface messages */ 1057c478bd9Sstevel@tonic-gate #define DDI_INTR_IMPL 0x0400 /* interrupt implementation msgs */ 1067c478bd9Sstevel@tonic-gate #define DDI_INTR_NEXUS 0x0800 /* interrupt messages from nexuses */ 10725e8c5aaSvikram #define DDI_DBG_RETIRE 0x1000 /* Retire related messages */ 10825e8c5aaSvikram #define DDI_DBG_RTR_VRBOSE 0x2000 /* Verbose Retire messages */ 10925e8c5aaSvikram #define DDI_DBG_RTR_TRACE 0x4000 /* Trace Retire messages */ 11025e8c5aaSvikram #define LDI_EV_DEBUG 0x8000 /* LDI events debug messages */ 11125e8c5aaSvikram #define LDI_EV_TRACE 0x10000 /* LDI events trace messages */ 1127c478bd9Sstevel@tonic-gate 1137c478bd9Sstevel@tonic-gate extern int ddidebug; 1147c478bd9Sstevel@tonic-gate 1157c478bd9Sstevel@tonic-gate #ifdef DEBUG 1167c478bd9Sstevel@tonic-gate #define NDI_CONFIG_DEBUG(args) if (ddidebug & DDI_DEBUG) cmn_err args 1177c478bd9Sstevel@tonic-gate #define BMDPRINTF(args) if (ddidebug & DDI_DEBUG_BOOTMOD) printf args 1187c478bd9Sstevel@tonic-gate #define DCOMPATPRINTF(args) if (ddidebug & DDI_DEBUG_COMPAT) cmn_err args 1197c478bd9Sstevel@tonic-gate #define LDI_OPENCLOSE(args) if (ddidebug & LDI_DBG_OPENCLOSE) cmn_err args 1207c478bd9Sstevel@tonic-gate #define LDI_ALLOCFREE(args) if (ddidebug & LDI_DBG_ALLOCFREE) cmn_err args 1217c478bd9Sstevel@tonic-gate #define LDI_STREAMS_LNK(args) if (ddidebug & LDI_DBG_STREAMS) cmn_err args 1227c478bd9Sstevel@tonic-gate #define LDI_EVENTCB(args) if (ddidebug & LDI_DBG_EVENTCB) cmn_err args 1237c478bd9Sstevel@tonic-gate #define DDI_INTR_APIDBG(args) if (ddidebug & DDI_INTR_API) cmn_err args 1247c478bd9Sstevel@tonic-gate #define DDI_INTR_IMPLDBG(args) if (ddidebug & DDI_INTR_IMPL) cmn_err args 1257c478bd9Sstevel@tonic-gate #define DDI_INTR_NEXDBG(args) if (ddidebug & DDI_INTR_NEXUS) cmn_err args 12625e8c5aaSvikram #define RIO_DEBUG(args) if (ddidebug & DDI_DBG_RETIRE) cmn_err args 12725e8c5aaSvikram #define RIO_VERBOSE(args) if (ddidebug & DDI_DBG_RTR_VRBOSE) cmn_err args 12825e8c5aaSvikram #define RIO_TRACE(args) if (ddidebug & DDI_DBG_RTR_TRACE) cmn_err args 12925e8c5aaSvikram #define LDI_EVDBG(args) if (ddidebug & LDI_EV_DEBUG) cmn_err args 13025e8c5aaSvikram #define LDI_EVTRC(args) if (ddidebug & LDI_EV_TRACE) cmn_err args 1317c478bd9Sstevel@tonic-gate #else 1327c478bd9Sstevel@tonic-gate #define NDI_CONFIG_DEBUG(args) 1337c478bd9Sstevel@tonic-gate #define BMDPRINTF(args) 1347c478bd9Sstevel@tonic-gate #define DCOMPATPRINTF(args) 1357c478bd9Sstevel@tonic-gate #define LDI_OPENCLOSE(args) 1367c478bd9Sstevel@tonic-gate #define LDI_ALLOCFREE(args) 1377c478bd9Sstevel@tonic-gate #define LDI_STREAMS_LNK(args) 1387c478bd9Sstevel@tonic-gate #define LDI_EVENTCB(args) 1397c478bd9Sstevel@tonic-gate #define DDI_INTR_APIDBG(args) 1407c478bd9Sstevel@tonic-gate #define DDI_INTR_IMPLDBG(args) 1417c478bd9Sstevel@tonic-gate #define DDI_INTR_NEXDBG(args) 14225e8c5aaSvikram #define RIO_DEBUG(args) if (ddidebug & DDI_DBG_RETIRE) cmn_err args 14325e8c5aaSvikram #define RIO_VERBOSE(args) if (ddidebug & DDI_DBG_RTR_VRBOSE) cmn_err args 14425e8c5aaSvikram #define RIO_TRACE(args) if (ddidebug & DDI_DBG_RTR_TRACE) cmn_err args 14525e8c5aaSvikram #define LDI_EVDBG(args) if (ddidebug & LDI_EV_DEBUG) cmn_err args 14625e8c5aaSvikram #define LDI_EVTRC(args) if (ddidebug & LDI_EV_TRACE) cmn_err args 1477c478bd9Sstevel@tonic-gate #endif 1487c478bd9Sstevel@tonic-gate 1497c478bd9Sstevel@tonic-gate 1507c478bd9Sstevel@tonic-gate /* 1517c478bd9Sstevel@tonic-gate * DDI configuration logs 1527c478bd9Sstevel@tonic-gate */ 1537c478bd9Sstevel@tonic-gate #define DDI_STACK_DEPTH 14 1547c478bd9Sstevel@tonic-gate 1557c478bd9Sstevel@tonic-gate typedef struct devinfo_audit { 1567c478bd9Sstevel@tonic-gate dev_info_t *da_devinfo; /* address of devinfo node */ 1577c478bd9Sstevel@tonic-gate hrtime_t da_timestamp; /* audit time */ 1587c478bd9Sstevel@tonic-gate kthread_id_t da_thread; /* thread of transaction */ 1597c478bd9Sstevel@tonic-gate struct devinfo_audit *da_lastlog; /* last log of state change */ 1607c478bd9Sstevel@tonic-gate ddi_node_state_t da_node_state; /* devinfo state at log time */ 1617c478bd9Sstevel@tonic-gate int da_device_state; /* device state */ 1627c478bd9Sstevel@tonic-gate int da_depth; 1637c478bd9Sstevel@tonic-gate pc_t da_stack[DDI_STACK_DEPTH]; 1647c478bd9Sstevel@tonic-gate } devinfo_audit_t; 1657c478bd9Sstevel@tonic-gate 1667c478bd9Sstevel@tonic-gate typedef struct { 1677c478bd9Sstevel@tonic-gate kmutex_t dh_lock; 1687c478bd9Sstevel@tonic-gate int dh_max; 1697c478bd9Sstevel@tonic-gate int dh_curr; 1707c478bd9Sstevel@tonic-gate int dh_hits; 1717c478bd9Sstevel@tonic-gate devinfo_audit_t dh_entry[1]; 1727c478bd9Sstevel@tonic-gate } devinfo_log_header_t; 1737c478bd9Sstevel@tonic-gate 1747c478bd9Sstevel@tonic-gate struct di_cache { 1757c478bd9Sstevel@tonic-gate uint32_t cache_valid; /* no lock needed - field atomic updt */ 1767c478bd9Sstevel@tonic-gate kmutex_t cache_lock; /* protects fields below */ 1777c478bd9Sstevel@tonic-gate void *cache_data; 1787c478bd9Sstevel@tonic-gate size_t cache_size; 1797c478bd9Sstevel@tonic-gate }; 1807c478bd9Sstevel@tonic-gate 1817c478bd9Sstevel@tonic-gate extern struct di_cache di_cache; 1827c478bd9Sstevel@tonic-gate extern int di_cache_debug; 183facf4a8dSllai1 extern volatile ulong_t devtree_gen; 1847c478bd9Sstevel@tonic-gate 1857c478bd9Sstevel@tonic-gate /* 1867c478bd9Sstevel@tonic-gate * Special dev_info nodes 1877c478bd9Sstevel@tonic-gate */ 1887c478bd9Sstevel@tonic-gate #define PSEUDO_PATH "/"DEVI_PSEUDO_NEXNAME 1897c478bd9Sstevel@tonic-gate #define CLONE_PATH PSEUDO_PATH"/clone@0" 1907c478bd9Sstevel@tonic-gate 1917c478bd9Sstevel@tonic-gate #define DI_CACHE_FILE "/etc/devices/snapshot_cache" 1927c478bd9Sstevel@tonic-gate #define DI_CACHE_TEMP DI_CACHE_FILE".tmp" 1937c478bd9Sstevel@tonic-gate 1947c478bd9Sstevel@tonic-gate extern dev_info_t *options_dip; 1957c478bd9Sstevel@tonic-gate extern dev_info_t *pseudo_dip; 1967c478bd9Sstevel@tonic-gate extern dev_info_t *clone_dip; 1977c478bd9Sstevel@tonic-gate extern major_t clone_major; 1987c478bd9Sstevel@tonic-gate extern major_t mm_major; 199*62a24de0SChris Horne extern major_t nulldriver_major; 2007c478bd9Sstevel@tonic-gate 2017c478bd9Sstevel@tonic-gate extern struct devnames *devnamesp; 2027c478bd9Sstevel@tonic-gate extern struct devnames orphanlist; 2037c478bd9Sstevel@tonic-gate 2047c478bd9Sstevel@tonic-gate extern struct dev_ops nodev_ops, mod_nodev_ops; 2057c478bd9Sstevel@tonic-gate 2067c478bd9Sstevel@tonic-gate /* 2077c478bd9Sstevel@tonic-gate * Obsolete interface, no longer used, to be removed. 2087c478bd9Sstevel@tonic-gate * Retained only for driver compatibility. 2097c478bd9Sstevel@tonic-gate */ 2107c478bd9Sstevel@tonic-gate extern krwlock_t devinfo_tree_lock; /* obsolete */ 2117c478bd9Sstevel@tonic-gate 2127c478bd9Sstevel@tonic-gate /* 2137c478bd9Sstevel@tonic-gate * Acquires dn_lock, as above. 2147c478bd9Sstevel@tonic-gate */ 2157c478bd9Sstevel@tonic-gate #define LOCK_DEV_OPS(lp) mutex_enter((lp)) 2167c478bd9Sstevel@tonic-gate #define UNLOCK_DEV_OPS(lp) mutex_exit((lp)) 2177c478bd9Sstevel@tonic-gate 2187c478bd9Sstevel@tonic-gate /* 2197c478bd9Sstevel@tonic-gate * Not to be used without obtaining the per-driver lock. 2207c478bd9Sstevel@tonic-gate */ 2217c478bd9Sstevel@tonic-gate #define INCR_DEV_OPS_REF(opsp) (opsp)->devo_refcnt++ 2227c478bd9Sstevel@tonic-gate #define DECR_DEV_OPS_REF(opsp) (opsp)->devo_refcnt-- 2237c478bd9Sstevel@tonic-gate #define CB_DRV_INSTALLED(opsp) ((opsp) != &nodev_ops && \ 2247c478bd9Sstevel@tonic-gate (opsp) != &mod_nodev_ops) 2257c478bd9Sstevel@tonic-gate #define DRV_UNLOADABLE(opsp) ((opsp)->devo_refcnt == 0) 2267c478bd9Sstevel@tonic-gate #define DEV_OPS_HELD(opsp) ((opsp)->devo_refcnt > 0) 2277c478bd9Sstevel@tonic-gate #define NEXUS_DRV(opsp) ((opsp)->devo_bus_ops != NULL) 2287c478bd9Sstevel@tonic-gate #define NETWORK_DRV(major) (devnamesp[major].dn_flags & DN_NETWORK_DRIVER) 2297c478bd9Sstevel@tonic-gate #define GLDV3_DRV(major) (devnamesp[major].dn_flags & DN_GLDV3_DRIVER) 2307c478bd9Sstevel@tonic-gate 2317c478bd9Sstevel@tonic-gate extern void impl_rem_dev_props(dev_info_t *); 2327c478bd9Sstevel@tonic-gate extern void add_class(char *, char *); 2337c478bd9Sstevel@tonic-gate 2347c478bd9Sstevel@tonic-gate struct bind; 2357c478bd9Sstevel@tonic-gate extern int make_mbind(char *, int, char *, struct bind **); 2367c478bd9Sstevel@tonic-gate extern void delete_mbind(char *, struct bind **); 2377c478bd9Sstevel@tonic-gate 2387c478bd9Sstevel@tonic-gate extern void configure(void); 2397c478bd9Sstevel@tonic-gate #if defined(__sparc) 2407c478bd9Sstevel@tonic-gate extern void setcputype(void); 2417c478bd9Sstevel@tonic-gate #endif 2427c478bd9Sstevel@tonic-gate extern void devtree_freeze(void); 2437c478bd9Sstevel@tonic-gate extern void reset_leaves(void); 24419397407SSherry Moore extern void quiesce_devices(dev_info_t *, void *); 2457c478bd9Sstevel@tonic-gate 2467c478bd9Sstevel@tonic-gate extern void setup_ddi(void); 2477c478bd9Sstevel@tonic-gate extern void setup_ddi_poststartup(void); 2487c478bd9Sstevel@tonic-gate extern void impl_ddi_callback_init(void); 2497c478bd9Sstevel@tonic-gate extern void impl_fix_props(dev_info_t *, dev_info_t *, char *, int, caddr_t); 2507c478bd9Sstevel@tonic-gate extern int impl_check_cpu(dev_info_t *); 2517c478bd9Sstevel@tonic-gate extern int check_status(int, char *, dev_info_t *); 2527c478bd9Sstevel@tonic-gate 2537c478bd9Sstevel@tonic-gate extern int exclude_settrap(int); 2547c478bd9Sstevel@tonic-gate extern int exclude_level(int); 2557c478bd9Sstevel@tonic-gate 2567c478bd9Sstevel@tonic-gate extern major_t path_to_major(char *); 2577c478bd9Sstevel@tonic-gate extern void i_ddi_node_cache_init(void); 258fa9e4066Sahrens extern dev_info_t *i_ddi_alloc_node(dev_info_t *, char *, pnode_t, int, 2597c478bd9Sstevel@tonic-gate ddi_prop_t *, int); 2607c478bd9Sstevel@tonic-gate extern void i_ddi_forceattach_drivers(void); 2617c478bd9Sstevel@tonic-gate extern int i_ddi_io_initialized(void); 2627c478bd9Sstevel@tonic-gate extern dev_info_t *i_ddi_create_branch(dev_info_t *, int); 2637c478bd9Sstevel@tonic-gate extern void i_ddi_add_devimap(dev_info_t *dip); 2647c478bd9Sstevel@tonic-gate extern void i_ddi_di_cache_invalidate(int kmflag); 2657c478bd9Sstevel@tonic-gate extern void i_ddi_di_cache_free(struct di_cache *cache); 2667c478bd9Sstevel@tonic-gate 267facf4a8dSllai1 /* devname_state - for /dev to denote reconfig and system available */ 268facf4a8dSllai1 #define DS_RECONFIG 0x01 /* reconfig boot */ 269facf4a8dSllai1 #define DS_SYSAVAIL 0x02 /* implicit reconfig enabled */ 270facf4a8dSllai1 271facf4a8dSllai1 extern int i_ddi_sysavail(void); 272facf4a8dSllai1 extern int i_ddi_reconfig(void); 273facf4a8dSllai1 extern void i_ddi_set_sysavail(void); 274facf4a8dSllai1 extern void i_ddi_set_reconfig(void); 275facf4a8dSllai1 27625e8c5aaSvikram /* I/O retire related */ 27725e8c5aaSvikram extern int e_ddi_retire_device(char *path, char **cons_array); 27825e8c5aaSvikram extern int e_ddi_unretire_device(char *path); 27925e8c5aaSvikram extern int e_ddi_mark_retiring(dev_info_t *dip, void *arg); 28025e8c5aaSvikram extern int e_ddi_retire_notify(dev_info_t *dip, void *arg); 28125e8c5aaSvikram extern int e_ddi_retire_finalize(dev_info_t *dip, void *arg); 28225e8c5aaSvikram extern void e_ddi_degrade_finalize(dev_info_t *dip); 28325e8c5aaSvikram extern void e_ddi_undegrade_finalize(dev_info_t *dip); 28425e8c5aaSvikram 28519397407SSherry Moore extern int check_driver_quiesce(dev_info_t *dip, void *arg); 28619397407SSherry Moore 2877c478bd9Sstevel@tonic-gate #endif /* _KERNEL */ 2887c478bd9Sstevel@tonic-gate 2897c478bd9Sstevel@tonic-gate #ifdef __cplusplus 2907c478bd9Sstevel@tonic-gate } 2917c478bd9Sstevel@tonic-gate #endif 2927c478bd9Sstevel@tonic-gate 2937c478bd9Sstevel@tonic-gate #endif /* _SYS_AUTOCONF_H */ 294