deva
struct deva *d_ahead; /* first attachment, if any */
struct deva **d_app; /* used for tacking on attachments */
struct deva *d_next; /* linked list */
struct deva *d_bsame; /* list on same base */
struct deva *i_atdeva;
extern struct deva *alldevas; /* list of all devbase attachment structures */
int deva_has_instances(struct deva *, int);
%type <deva> devattach_opt
struct deva *deva;
struct deva *alldevas; /* list of all devbase attachment structures */
deva_has_instances(struct deva *deva, int unit)
return (deva->d_ihead != NULL);
for (i = deva->d_ihead; i != NULL; i = i->i_asame)
struct deva *da;
struct deva *da;
struct deva *da;
struct deva *d;
selectbase(struct devbase *d, struct deva *da)
defdevattach(struct deva *deva, struct devbase *dev, struct nvlist *atlist,
struct deva *da;
if (deva == NULL)
deva = getdevattach(dev->d_name);
if (deva == &errdeva)
if (deva->d_isdef) {
error("redefinition of `%s'", deva->d_name);
deva->d_isdef = 1;
deva->d_attrs = attrs;
deva->d_atlist = atlist;
deva->d_devbase = dev;
*dev->d_app = deva;
dev->d_app = &deva->d_bsame;
struct deva *
struct deva *deva;
deva = ht_lookup(devatab, name);
if (deva == NULL) {
deva = emalloc(sizeof *deva);
deva->d_name = name;
deva->d_next = NULL;
deva->d_bsame = NULL;
deva->d_isdef = 0;
deva->d_devbase = NULL;
deva->d_atlist = NULL;
deva->d_attrs = NULL;
deva->d_ihead = NULL;
deva->d_ipp = &deva->d_ihead;
*nextdeva = deva;
nextdeva = &deva->d_next;
if (ht_insert(devatab, name, deva))
return (deva);
static struct deva errdeva;
static struct deva **nextdeva;
struct deva *iba; /* devbase attachment used */
static void selectbase(struct devbase *, struct deva *);
void defdevattach(struct deva *, struct devbase *,
struct deva *getdevattach(const char *name);