/* * If we failed to allocate uba resources, put us on a queue to wait * until there is available resources. Resources to compete about * are map registers and BDPs. This is normally only a problem on * Unibus systems, Qbus systems have more map registers than usable. */ void uba_enqueue(struct uba_unit *uu) { struct uba_softc *uh; int s; uh = device_private(device_parent(uu->uu_dev)); s = spluba(); SIMPLEQ_INSERT_TAIL(&uh->uh_resq, uu, uu_resq); splx(s); }
/* * Generate a reset on uba number uban. Then * call each device that asked to be called during attach, * giving it a chance to clean up so as to be able to continue. */ void ubareset(struct uba_softc *uh) { struct uba_reset *ur; int s; s = spluba(); SIMPLEQ_INIT(&uh->uh_resq); printf("%s: reset", device_xname(uh->uh_dev)); (*uh->uh_ubainit)(uh); ur = SIMPLEQ_FIRST(&uh->uh_resetq); if (ur) do { printf(" %s", device_xname(ur->ur_dev)); (*ur->ur_reset)(ur->ur_dev); } while ((ur = SIMPLEQ_NEXT(ur, ur_resetq))); printf("\n"); splx(s); }
/* ARGSUSED */ int raclose(dev_t dev, int flags, int fmt, struct lwp *l) { struct ra_softc *ra = mscp_device_lookup(dev); int mask = (1 << DISKPART(dev)); mutex_enter(&ra->ra_disk.dk_openlock); switch (fmt) { case S_IFCHR: ra->ra_disk.dk_copenmask &= ~mask; break; case S_IFBLK: ra->ra_disk.dk_bopenmask &= ~mask; break; } ra->ra_disk.dk_openmask = ra->ra_disk.dk_copenmask | ra->ra_disk.dk_bopenmask; /* * Should wait for I/O to complete on this partition even if * others are open, but wait for work on blkflush(). */ #if notyet if (ra->ra_openpart == 0) { s = spluba(); while (bufq_peek(udautab[unit]) != NULL) (void) tsleep(&udautab[unit], PZERO - 1, "raclose", 0); splx(s); ra->ra_state = DK_CLOSED; ra->ra_wlabel = 0; } #endif mutex_exit(&ra->ra_disk.dk_openlock); return (0); }