/* * close the device.. only called if we are the LAST * occurence of an open device */ static int ssclose(dev_t dev, int flag, int mode, struct lwp *l) { struct ss_softc *ss = device_lookup_private(&ss_cd, SSUNIT(dev)); struct scsipi_periph *periph = ss->sc_periph; struct scsipi_adapter *adapt = periph->periph_channel->chan_adapter; int error; SC_DEBUG(ss->sc_periph, SCSIPI_DB1, ("closing\n")); if (SSMODE(dev) == MODE_REWIND) { if (ss->special && ss->special->rewind_scanner) { /* call special handler to rewind/abort scan */ error = (ss->special->rewind_scanner)(ss); if (error) return error; } else { /* XXX add code to restart a SCSI2 scanner, if any */ } ss->sio.scan_window_size = 0; ss->flags &= ~SSF_TRIGGERED; } scsipi_wait_drain(periph); scsipi_adapter_delref(adapt); periph->periph_flags &= ~PERIPH_OPEN; return 0; }
static int chclose(dev_t dev, int flags, int fmt, struct lwp *l) { struct ch_softc *sc = device_lookup_private(&ch_cd, CHUNIT(dev)); struct scsipi_periph *periph = sc->sc_periph; struct scsipi_adapter *adapt = periph->periph_channel->chan_adapter; scsipi_wait_drain(periph); scsipi_adapter_delref(adapt); sc->sc_events = 0; periph->periph_flags &= ~PERIPH_OPEN; return (0); }
static int ukclose(dev_t dev, int flag, int fmt, struct lwp *l) { struct uk_softc *uk = device_lookup_private(&uk_cd, minor(dev)); struct scsipi_periph *periph = uk->sc_periph; struct scsipi_adapter *adapt = periph->periph_channel->chan_adapter; SC_DEBUG(uk->sc_periph, SCSIPI_DB1, ("closing\n")); scsipi_wait_drain(periph); scsipi_adapter_delref(adapt); periph->periph_flags &= ~PERIPH_OPEN; return 0; }