static int iifun(int slot, int sr) { isa_intr_info_t *iinfo_p; int s; iinfo_p = &iinfo[slot]; /* * Disable the interrupts */ if (slot == 0) { single_inst_bclr_b(MFP->mf_imrb, IB_ISA1); } else { single_inst_bclr_b(MFP->mf_imra, IA_ISA2); } if ((sr & PSL_IPL) >= (iinfo_p->ipl & PSL_IPL)) { /* * We're running at a too high priority now. */ add_sicallback((si_farg)iifun, (void*)slot, 0); } else { s = splx(iinfo_p->ipl); if (slot == 0) { do { MFP->mf_iprb = (u_int8_t)~IB_ISA1; (void) (iinfo_p->ifunc)(iinfo_p->iarg); } while (MFP->mf_iprb & IB_ISA1); single_inst_bset_b(MFP->mf_imrb, IB_ISA1); } else { do { MFP->mf_ipra = (u_int8_t)~IA_ISA2; (void) (iinfo_p->ifunc)(iinfo_p->iarg); } while (MFP->mf_ipra & IA_ISA2); single_inst_bset_b(MFP->mf_imra, IA_ISA2); } splx(s); } return 1; }
void * isa_intr_establish(isa_chipset_tag_t ic, int irq, int type, int level, int (*ih_fun)(void *), void *ih_arg) { isa_intr_info_t *iinfo_p; struct intrhand *ihand; int slot; /* * The Hades only supports edge triggered interrupts! */ if (type != IST_EDGE) return NULL; slot = SLOTNR(irq); iinfo_p = &iinfo[slot]; if (iinfo_p->slot >= 0) panic("isa_intr_establish: interrupt was already established"); ihand = intr_establish((slot == 0) ? 3 : 15, USER_VEC, 0, (hw_ifun_t)iifun, (void *)slot); if (ihand != NULL) { iinfo_p->slot = slot; iinfo_p->ipl = level; iinfo_p->ifunc = ih_fun; iinfo_p->iarg = ih_arg; iinfo_p->ihand = ihand; /* * Enable (unmask) the interrupt */ if (slot == 0) { single_inst_bset_b(MFP->mf_imrb, IB_ISA1); single_inst_bset_b(MFP->mf_ierb, IB_ISA1); } else { single_inst_bset_b(MFP->mf_imra, IA_ISA2); single_inst_bset_b(MFP->mf_iera, IA_ISA2); } return(iinfo_p); } return NULL; }
void drscattach(struct device *pdp, struct device *dp, void *auxp) { struct siop_softc *sc = (struct siop_softc *)dp; struct zbus_args *zap; siop_regmap_p rp; struct scsipi_adapter *adapt = &sc->sc_adapter; struct scsipi_channel *chan = &sc->sc_channel; printf("\n"); zap = auxp; sc->sc_siopp = rp = (siop_regmap_p)(DRCCADDR+PAGE_SIZE*DRSCSIPG); /* * CTEST7 = TT1 */ sc->sc_clock_freq = 50; /* Clock = 50MHz */ sc->sc_ctest7 = 0x02; alloc_sicallback(); /* * Fill in the scsipi_adapter. */ memset(adapt, 0, sizeof(*adapt)); adapt->adapt_dev = &sc->sc_dev; adapt->adapt_nchannels = 1; adapt->adapt_openings = 7; adapt->adapt_max_periph = 1; adapt->adapt_request = siop_scsipi_request; adapt->adapt_minphys = siop_minphys; /* * Fill in the scsipi_channel. */ memset(chan, 0, sizeof(*chan)); chan->chan_adapter = adapt; chan->chan_bustype = &scsi_bustype; chan->chan_channel = 0; chan->chan_ntargets = 8; chan->chan_nluns = 8; chan->chan_id = 7; siopinitialize(sc); #if 0 sc->sc_isr.isr_intr = drsc_dmaintr; sc->sc_isr.isr_arg = sc; sc->sc_isr.isr_ipl = 4; add_isr(&sc->sc_isr); #else drsc_softc = sc; single_inst_bclr_b(*draco_intpen, DRIRQ_SCSI); single_inst_bset_b(*draco_intena, DRIRQ_SCSI); #endif /* * attach all scsi units on us */ config_found(dp, chan, scsiprint); }
void drscattach(device_t parent, device_t self, void *aux) { struct siop_softc *sc = device_private(self); siop_regmap_p rp; struct scsipi_adapter *adapt = &sc->sc_adapter; struct scsipi_channel *chan = &sc->sc_channel; printf("\n"); sc->sc_dev = self; sc->sc_siopp = rp = (siop_regmap_p)(DRCCADDR+PAGE_SIZE*DRSCSIPG); /* * CTEST7 = TT1 */ sc->sc_clock_freq = 50; /* Clock = 50MHz */ sc->sc_ctest7 = 0x02; sc->sc_siop_si = softint_establish(SOFTINT_BIO, (void (*)(void *))siopintr, sc); /* * Fill in the scsipi_adapter. */ memset(adapt, 0, sizeof(*adapt)); adapt->adapt_dev = self; adapt->adapt_nchannels = 1; adapt->adapt_openings = 7; adapt->adapt_max_periph = 1; adapt->adapt_request = siop_scsipi_request; adapt->adapt_minphys = siop_minphys; /* * Fill in the scsipi_channel. */ memset(chan, 0, sizeof(*chan)); chan->chan_adapter = adapt; chan->chan_bustype = &scsi_bustype; chan->chan_channel = 0; chan->chan_ntargets = 8; chan->chan_nluns = 8; chan->chan_id = 7; siopinitialize(sc); #if 0 sc->sc_isr.isr_intr = drsc_dmaintr; sc->sc_isr.isr_arg = sc; sc->sc_isr.isr_ipl = 4; add_isr(&sc->sc_isr); #else drsc_softc = sc; single_inst_bclr_b(*draco_intpen, DRIRQ_SCSI); single_inst_bset_b(*draco_intena, DRIRQ_SCSI); #endif /* * attach all scsi units on us */ config_found(self, chan, scsiprint); }