static void sec_attach(device_t parent, device_t self, void *aux) { struct podulebus_attach_args *pa = aux; struct sec_softc *sc = device_private(self); int i; sc->sc_sbic.sc_dev = self; /* Set up bus spaces */ sc->sc_pod_t = pa->pa_fast_t; bus_space_map(pa->pa_fast_t, pa->pa_fast_base, 0x1000, 0, &sc->sc_pod_h); sc->sc_mod_t = pa->pa_mod_t; bus_space_map(pa->pa_mod_t, pa->pa_mod_base, 0x1000, 0, &sc->sc_mod_h); sc->sc_sbic.sc_regt = sc->sc_mod_t; bus_space_subregion(sc->sc_mod_t, sc->sc_mod_h, SEC_SBIC + 0, 1, &sc->sc_sbic.sc_asr_regh); bus_space_subregion(sc->sc_mod_t, sc->sc_mod_h, SEC_SBIC + 1, 1, &sc->sc_sbic.sc_data_regh); sc->sc_sbic.sc_id = 7; sc->sc_sbic.sc_clkfreq = SEC_CLKFREQ; sc->sc_sbic.sc_dmamode = SBIC_CTL_BURST_DMA; sc->sc_sbic.sc_adapter.adapt_request = wd33c93_scsi_request; sc->sc_sbic.sc_adapter.adapt_minphys = minphys; sc->sc_sbic.sc_dmasetup = sec_dmasetup; sc->sc_sbic.sc_dmago = sec_dmago; sc->sc_sbic.sc_dmastop = sec_dmastop; sc->sc_sbic.sc_reset = sec_reset; sc->sc_mpr = 0; bus_space_write_1(sc->sc_pod_t, sc->sc_pod_h, SEC_MPR, sc->sc_mpr); for (i = 0; i < SEC_NPAGES; i++) { sec_setpage(sc, i); bus_space_set_region_2(sc->sc_mod_t, sc->sc_mod_h, SEC_SRAM, 0, SEC_PAGESIZE / 2); } wd33c93_attach(&sc->sc_sbic); evcnt_attach_dynamic(&sc->sc_intrcnt, EVCNT_TYPE_INTR, NULL, device_xname(self), "intr"); sc->sc_ih = podulebus_irq_establish(pa->pa_ih, IPL_BIO, sec_intr, sc, &sc->sc_intrcnt); sec_cli(sc); sc->sc_mpr |= SEC_MPR_IE; bus_space_write_1(sc->sc_pod_t, sc->sc_pod_h, SEC_MPR, sc->sc_mpr); pmf_device_register1(sc->sc_sbic.sc_dev, NULL, NULL, sec_shutdown); }
/* * Attach the wdsc driver */ void wdsc_attach(struct device *parent, struct device *self, void *aux) { struct wdsc_softc *wsc = (struct wdsc_softc *)self; struct wd33c93_softc *sc = &wsc->sc_wd33c93; struct hpc_attach_args *haa = aux; int err; sc->sc_regt = haa->ha_st; wsc->sc_dmat = haa->ha_dmat; wsc->sc_hpcdma.hpc = haa->hpc_regs; if ((err = bus_space_subregion(haa->ha_st, haa->ha_sh, haa->ha_devoff + 3, 1, &sc->sc_asr_regh)) != 0) { printf(": unable to map asr reg, err=%d\n", err); return; } if ((err = bus_space_subregion(haa->ha_st, haa->ha_sh, haa->ha_devoff + 3 + 4, 1, &sc->sc_data_regh)) != 0) { printf(": unable to map data reg, err=%d\n", err); return; } if (bus_dmamap_create(wsc->sc_dmat, MAXPHYS, wsc->sc_hpcdma.hpc->scsi_dma_segs, wsc->sc_hpcdma.hpc->scsi_dma_segs_size, wsc->sc_hpcdma.hpc->scsi_dma_segs_size, BUS_DMA_WAITOK, &wsc->sc_dmamap) != 0) { printf(": failed to create dmamap\n"); return; } sc->sc_dmasetup = wdsc_dmasetup; sc->sc_dmago = wdsc_dmago; sc->sc_dmastop = wdsc_dmastop; sc->sc_reset = wdsc_reset; sc->sc_id = 0; /* Host ID = 0 */ sc->sc_clkfreq = 200; /* 20MHz */ sc->sc_dmamode = SBIC_CTL_BURST_DMA; if (hpc_intr_establish(haa->ha_irq, IPL_BIO, wd33c93_intr, wsc, self->dv_xname) == NULL) { printf(": unable to establish interrupt!\n"); return; } hpcdma_init(haa, &wsc->sc_hpcdma, wsc->sc_hpcdma.hpc->scsi_dma_segs); wd33c93_attach(sc, &wdsc_switch); }