int EtherInit(unsigned char *myadr) { int iobase, dmachan, i; if (isapnp_finddev(ISAPNPID, &iobase, &dmachan)) { printf("cannot find PCNET\n"); return 0; } printf("printf using PCNET @ %x\n", iobase); lance_rap = iobase + 0x12; lance_rdp = iobase + 0x10; /* make sure it's stopped */ am7990_stop(); for (i = 0; i < 6; i++) myadr[i] = eth_myaddr[i] = inb(iobase + i); isa_dmacascade(dmachan); am7990_init(); strncpy(bi_netif.ifname, "le", sizeof(bi_netif.ifname)); bi_netif.bus = BI_BUS_ISA; bi_netif.addr.iobase = iobase; BI_ADD(&bi_netif, BTINFO_NETIF, sizeof(bi_netif)); return 1; }
void adv_isa_attach(device_t parent, device_t self, void *aux) { struct isa_attach_args *ia = aux; ASC_SOFTC *sc = device_private(self); bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; isa_chipset_tag_t ic = ia->ia_ic; int error; printf("\n"); sc->sc_dev = self; sc->sc_flags = 0x0; if (bus_space_map(iot, ia->ia_io[0].ir_addr, ASC_IOADR_GAP, 0, &ioh)) { aprint_error_dev(sc->sc_dev, "can't map i/o space\n"); return; } sc->sc_iot = iot; sc->sc_ioh = ioh; sc->sc_dmat = ia->ia_dmat; sc->bus_type = ASC_IS_ISA; sc->chip_version = ASC_GET_CHIP_VER_NO(iot, ioh); /* * Memo: * for EISA cards: * sc->chip_version = (ASC_CHIP_MIN_VER_EISA - 1) + ea->ea_pid[1]; */ /* * Initialize the board */ if (adv_init(sc)) { aprint_error_dev(sc->sc_dev, "adv_init failed\n"); return; } if ((error = isa_dmacascade(ic, ia->ia_drq[0].ir_drq)) != 0) { aprint_error_dev(sc->sc_dev, "unable to cascade DRQ, error = %d\n", error); return; } sc->sc_ih = isa_intr_establish(ic, ia->ia_irq[0].ir_irq, IST_EDGE, IPL_BIO, adv_intr, sc); if (sc->sc_ih == NULL) { aprint_error_dev(sc->sc_dev, "couldn't establish interrupt\n"); return; } adv_attach(sc); }
/* * Attach all the sub-devices we can find */ void uha_isa_attach(struct device *parent, struct device *self, void *aux) { struct isa_attach_args *ia = aux; struct uha_softc *sc = (void *)self; bus_space_tag_t iot = ia->ia_iot; bus_dma_tag_t dmat = ia->ia_dmat; bus_space_handle_t ioh; struct uha_probe_data upd; isa_chipset_tag_t ic = ia->ia_ic; int error; printf("\n"); if (bus_space_map(iot, ia->ia_io[0].ir_addr, UHA_ISA_IOSIZE, 0, &ioh)) { aprint_error_dev(&sc->sc_dev, "can't map i/o space\n"); return; } sc->sc_iot = iot; sc->sc_ioh = ioh; sc->sc_dmat = dmat; if (!u14_find(iot, ioh, &upd)) { aprint_error_dev(&sc->sc_dev, "u14_find failed\n"); return; } if (upd.sc_drq != -1) { sc->sc_dmaflags = 0; if ((error = isa_dmacascade(ic, upd.sc_drq)) != 0) { aprint_error_dev(&sc->sc_dev, "unable to cascade DRQ, error = %d\n", error); return; } } else { /* * We have a VLB controller, and can do 32-bit DMA. */ sc->sc_dmaflags = ISABUS_DMA_32BIT; } sc->sc_ih = isa_intr_establish(ic, upd.sc_irq, IST_EDGE, IPL_BIO, u14_intr, sc); if (sc->sc_ih == NULL) { aprint_error_dev(&sc->sc_dev, "couldn't establish interrupt\n"); return; } /* Save function pointers for later use. */ sc->start_mbox = u14_start_mbox; sc->poll = u14_poll; sc->init = u14_init; uha_attach(sc, &upd); }
static int wds_init(struct wds *wp) { struct wds_setup init; int base; int i; struct wds_cmd wc; base = wp->addr; outb(base + WDS_HCR, WDSH_DRQEN); isa_dmacascade(wp->drq); if ((inb(base + WDS_STAT) & (WDS_RDY)) != WDS_RDY) { for (i = 0; i < 10; i++) { if ((inb(base + WDS_STAT) & (WDS_RDY)) == WDS_RDY) break; DELAY(40000); } if ((inb(base + WDS_STAT) & (WDS_RDY)) != WDS_RDY) /* probe timeout */ return (1); } bzero(&init, sizeof init); init.cmd = WDSC_INIT; init.scsi_id = WDS_HBA_ID; init.buson_t = 24; init.busoff_t = 48; scsi_ulto3b(WDSTOPHYS(wp, &wp->dx->ombs), init.mbaddr); init.xx = 0; init.nomb = WDS_NOMB; init.nimb = WDS_NIMB; wds_wait(base + WDS_STAT, WDS_RDY, WDS_RDY); if (wds_cmd(base, (u_int8_t *) & init, sizeof init) != 0) { device_printf(wp->dev, "wds_cmd init failed\n"); return (1); } wds_wait(base + WDS_STAT, WDS_INIT, WDS_INIT); wds_wait(base + WDS_STAT, WDS_RDY, WDS_RDY); bzero(&wc, sizeof wc); wc.cmd = WDSC_DISUNSOL; if (wds_cmd(base, (char *) &wc, sizeof wc) != 0) { device_printf(wp->dev, "wds_cmd init2 failed\n"); return (1); } return (0); }
/* * Setup a DMA channel's bounce buffer. */ int isa_dma_init(int chan, u_int bouncebufsize, int flag __unused) { static int initted = 0; bus_addr_t boundary = chan >= 4 ? 0x20000 : 0x10000; if (!initted) { /* * Reset the DMA hardware. */ outb(DMA1_RESET, 0); outb(DMA2_RESET, 0); isa_dmacascade(4); initted = 1; } #ifdef DIAGNOSTIC if (chan & ~VALID_DMA_MASK) panic("isa_dma_init: channel out of range"); if (dma_tag[chan] || dma_map[chan]) panic("isa_dma_init: impossible request"); #endif if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/boundary, /*lowaddr*/BUS_SPACE_MAXADDR_24BIT, /*highaddr*/BUS_SPACE_MAXADDR, /*filter*/NULL, /*filterarg*/NULL, /*maxsize*/bouncebufsize, /*nsegments*/1, /*maxsegz*/0x3ffff, /*flags*/0, /*lockfunc*/busdma_lock_mutex, /*lockarg*/&Giant, &dma_tag[chan]) != 0) { panic("isa_dma_init: unable to create dma tag\n"); } if (bus_dmamap_create(dma_tag[chan], 0, &dma_map[chan])) { panic("isa_dma_init: unable to create dma map\n"); } return (0); }
/* * Attach all the sub-devices we can find */ void aha_isa_attach(device_t parent, device_t self, void *aux) { struct isa_attach_args *ia = aux; struct aha_softc *sc = device_private(self); bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; struct aha_probe_data apd; isa_chipset_tag_t ic = ia->ia_ic; int error; sc->sc_dev = self; printf("\n"); if (bus_space_map(iot, ia->ia_io[0].ir_addr, AHA_ISA_IOSIZE, 0, &ioh)) { aprint_error_dev(self, "can't map i/o space\n"); return; } sc->sc_iot = iot; sc->sc_ioh = ioh; sc->sc_dmat = ia->ia_dmat; if (!aha_find(iot, ioh, &apd)) { aprint_error_dev(self, "aha_find failed\n"); return; } if (apd.sc_drq != -1) { if ((error = isa_dmacascade(ic, apd.sc_drq)) != 0) { aprint_error_dev(self, "unable to cascade DRQ, error = %d\n", error); return; } } sc->sc_ih = isa_intr_establish(ic, apd.sc_irq, IST_EDGE, IPL_BIO, aha_intr, sc); if (sc->sc_ih == NULL) { aprint_error_dev(self, "couldn't establish interrupt\n"); return; } aha_attach(sc, &apd); }
static int adv_set_isa_dma_settings(struct adv_softc *adv) { u_int16_t cfg_lsw; u_int8_t value; if ((adv->isa_dma_channel >= 5) && (adv->isa_dma_channel <= 7)) { if (adv->isa_dma_channel == 7) value = 0x00; else value = adv->isa_dma_channel - 4; cfg_lsw = ADV_INW(adv, ADV_CONFIG_LSW) & ~ADV_CFG_LSW_ISA_DMA_CHANNEL; cfg_lsw |= value; ADV_OUTW(adv, ADV_CONFIG_LSW, cfg_lsw); adv->isa_dma_speed &= 0x07; adv_set_bank(adv, 1); ADV_OUTB(adv, ADV_DMA_SPEED, adv->isa_dma_speed); adv_set_bank(adv, 0); isa_dmacascade(adv->isa_dma_channel); } return (0); }
/* * Attach all the sub-devices we can find */ static int bt_isa_attach(device_t dev) { struct bt_softc *bt = device_get_softc(dev); bus_dma_filter_t *filter; void *filter_arg; bus_addr_t lowaddr; int error, drq; /* Initialise softc */ error = bt_isa_alloc_resources(dev, 0, ~0); if (error) { device_printf(dev, "can't allocate resources in bt_isa_attach\n"); return error; } /* Program the DMA channel for external control */ if ((drq = isa_get_drq(dev)) != -1) isa_dmacascade(drq); /* Allocate our parent dmatag */ filter = NULL; filter_arg = NULL; lowaddr = BUS_SPACE_MAXADDR_24BIT; /* XXX Should be a child of the ISA bus dma tag */ if (bus_dma_tag_create(/*parent*/NULL, /*alignemnt*/1, /*boundary*/0, lowaddr, /*highaddr*/BUS_SPACE_MAXADDR, filter, filter_arg, /*maxsize*/BUS_SPACE_MAXSIZE_32BIT, /*nsegments*/BUS_SPACE_UNRESTRICTED, /*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT, /*flags*/0, &bt->parent_dmat) != 0) { bt_isa_release_resources(dev); return (ENOMEM); } error = bt_init(dev); if (error) { bt_isa_release_resources(dev); return (ENOMEM); } if (lowaddr != BUS_SPACE_MAXADDR_32BIT) { /* DMA tag for our sense buffers */ if (bus_dma_tag_create(bt->parent_dmat, /*alignment*/1, /*boundary*/0, /*lowaddr*/BUS_SPACE_MAXADDR, /*highaddr*/BUS_SPACE_MAXADDR, /*filter*/NULL, /*filterarg*/NULL, bt->max_ccbs * sizeof(struct scsi_sense_data), /*nsegments*/1, /*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT, /*flags*/0, &bt->sense_dmat) != 0) { bt_isa_release_resources(dev); return (ENOMEM); } bt->init_level++; /* Allocation of sense buffers */ if (bus_dmamem_alloc(bt->sense_dmat, (void *)&bt->sense_buffers, BUS_DMA_NOWAIT, &bt->sense_dmamap) != 0) { bt_isa_release_resources(dev); return (ENOMEM); } bt->init_level++; /* And permanently map them */ bus_dmamap_load(bt->sense_dmat, bt->sense_dmamap, bt->sense_buffers, bt->max_ccbs * sizeof(*bt->sense_buffers), btmapsensebuffers, bt, /*flags*/0); bt->init_level++; } error = bt_attach(dev); if (error) { bt_isa_release_resources(dev); return (error); } return (0); }
/* * Attach all the sub-devices we can find */ static int aha_isa_attach(device_t dev) { struct aha_softc *aha = device_get_softc(dev); int error = ENOMEM; aha->dev = dev; aha->portrid = 0; aha->port = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT, &aha->portrid, AHA_NREGS, RF_ACTIVE); if (!aha->port) { device_printf(dev, "Unable to allocate I/O ports\n"); goto fail; } aha->irqrid = 0; aha->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &aha->irqrid, RF_ACTIVE); if (!aha->irq) { device_printf(dev, "Unable to allocate excluse use of irq\n"); goto fail; } aha->drqrid = 0; aha->drq = bus_alloc_resource_any(dev, SYS_RES_DRQ, &aha->drqrid, RF_ACTIVE); if (!aha->drq) { device_printf(dev, "Unable to allocate drq\n"); goto fail; } #if 0 /* is the drq ever unset? */ if (dev->id_drq != -1) isa_dmacascade(dev->id_drq); #endif isa_dmacascade(rman_get_start(aha->drq)); /* Allocate our parent dmatag */ if (bus_dma_tag_create( /* parent */ bus_get_dma_tag(dev), /* alignemnt */ 1, /* boundary */ 0, /* lowaddr */ BUS_SPACE_MAXADDR_24BIT, /* highaddr */ BUS_SPACE_MAXADDR, /* filter */ NULL, /* filterarg */ NULL, /* maxsize */ BUS_SPACE_MAXSIZE_24BIT, /* nsegments */ ~0, /* maxsegsz */ BUS_SPACE_MAXSIZE_24BIT, /* flags */ 0, /* lockfunc */ NULL, /* lockarg */ NULL, &aha->parent_dmat) != 0) { device_printf(dev, "dma tag create failed.\n"); goto fail; } if (aha_init(aha)) { device_printf(dev, "init failed\n"); goto fail; } /* * The 1542A and B look the same. So we guess based on * the firmware revision. It appears that only rev 0 is on * the A cards. */ if (aha->boardid <= BOARD_1542 && aha->fw_major == 0) { device_printf(dev, "154xA may not work\n"); aha->ccb_sg_opcode = INITIATOR_SG_CCB; aha->ccb_ccb_opcode = INITIATOR_CCB; } error = aha_attach(aha); if (error) { device_printf(dev, "attach failed\n"); goto fail; } error = bus_setup_intr(dev, aha->irq, INTR_TYPE_CAM|INTR_ENTROPY| INTR_MPSAFE, NULL, aha_intr, aha, &aha->ih); if (error) { device_printf(dev, "Unable to register interrupt handler\n"); aha_detach(aha); goto fail; } return (0); fail: ; aha_free(aha); bus_free_resource(dev, SYS_RES_IOPORT, aha->port); bus_free_resource(dev, SYS_RES_IRQ, aha->irq); bus_free_resource(dev, SYS_RES_DRQ, aha->drq); return (error); }
static int le_isa_attach(device_t dev) { struct le_isa_softc *lesc; struct lance_softc *sc; bus_size_t macstart, rap, rdp; int error, i, macstride; lesc = device_get_softc(dev); sc = &lesc->sc_am7990.lsc; lesc->sc_rrid = 0; switch (ISA_PNP_PROBE(device_get_parent(dev), dev, le_isa_ids)) { case 0: lesc->sc_rres = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &lesc->sc_rrid, RF_ACTIVE); rap = PCNET_RAP; rdp = PCNET_RDP; macstart = 0; macstride = 1; break; case ENOENT: for (i = 0; i < NELEM(le_isa_params); i++) { if (le_isa_probe_legacy(dev, &le_isa_params[i]) == 0) { lesc->sc_rres = bus_alloc_resource(dev, SYS_RES_IOPORT, &lesc->sc_rrid, 0, ~0, le_isa_params[i].iosize, RF_ACTIVE); rap = le_isa_params[i].rap; rdp = le_isa_params[i].rdp; macstart = le_isa_params[i].macstart; macstride = le_isa_params[i].macstride; goto found; } } /* FALLTHROUGH */ case ENXIO: default: device_printf(dev, "cannot determine chip\n"); error = ENXIO; goto fail_mtx; } found: if (lesc->sc_rres == NULL) { device_printf(dev, "cannot allocate registers\n"); error = ENXIO; goto fail_mtx; } lesc->sc_regt = rman_get_bustag(lesc->sc_rres); lesc->sc_regh = rman_get_bushandle(lesc->sc_rres); lesc->sc_rap = rap; lesc->sc_rdp = rdp; lesc->sc_drid = 0; if ((lesc->sc_dres = bus_alloc_resource_any(dev, SYS_RES_DRQ, &lesc->sc_drid, RF_ACTIVE)) == NULL) { device_printf(dev, "cannot allocate DMA channel\n"); error = ENXIO; goto fail_rres; } lesc->sc_irid = 0; if ((lesc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, &lesc->sc_irid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { device_printf(dev, "cannot allocate interrupt\n"); error = ENXIO; goto fail_dres; } error = bus_dma_tag_create( NULL, /* parent */ 1, 0, /* alignment, boundary */ BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ 0, /* nsegments */ BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ BUS_DMA_WAITOK, /* flags */ &lesc->sc_pdmat); if (error != 0) { device_printf(dev, "cannot allocate parent DMA tag\n"); goto fail_ires; } sc->sc_memsize = LE_ISA_MEMSIZE; /* * For Am79C90, Am79C961 and Am79C961A the init block must be 2-byte * aligned and the ring descriptors must be 8-byte aligned. */ error = bus_dma_tag_create( lesc->sc_pdmat, /* parent */ 8, 0, /* alignment, boundary */ BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ sc->sc_memsize, /* maxsize */ 1, /* nsegments */ sc->sc_memsize, /* maxsegsize */ BUS_DMA_WAITOK, /* flags */ &lesc->sc_dmat); if (error != 0) { device_printf(dev, "cannot allocate buffer DMA tag\n"); goto fail_pdtag; } error = bus_dmamem_alloc(lesc->sc_dmat, (void **)&sc->sc_mem, BUS_DMA_WAITOK | BUS_DMA_COHERENT, &lesc->sc_dmam); if (error != 0) { device_printf(dev, "cannot allocate DMA buffer memory\n"); goto fail_dtag; } sc->sc_addr = 0; error = bus_dmamap_load(lesc->sc_dmat, lesc->sc_dmam, sc->sc_mem, sc->sc_memsize, le_isa_dma_callback, sc, 0); if (error != 0 || sc->sc_addr == 0) { device_printf(dev, "cannot load DMA buffer map\n"); goto fail_dmem; } isa_dmacascade(rman_get_start(lesc->sc_dres)); sc->sc_flags = 0; sc->sc_conf3 = 0; /* * Extract the physical MAC address from the ROM. */ for (i = 0; i < sizeof(sc->sc_enaddr); i++) sc->sc_enaddr[i] = bus_space_read_1(lesc->sc_regt, lesc->sc_regh, macstart + i * macstride); sc->sc_copytodesc = lance_copytobuf_contig; sc->sc_copyfromdesc = lance_copyfrombuf_contig; sc->sc_copytobuf = lance_copytobuf_contig; sc->sc_copyfrombuf = lance_copyfrombuf_contig; sc->sc_zerobuf = lance_zerobuf_contig; sc->sc_rdcsr = le_isa_rdcsr; sc->sc_wrcsr = le_isa_wrcsr; sc->sc_hwreset = NULL; sc->sc_hwinit = NULL; sc->sc_hwintr = NULL; sc->sc_nocarrier = NULL; sc->sc_mediachange = NULL; sc->sc_mediastatus = NULL; sc->sc_supmedia = NULL; error = am7990_config(&lesc->sc_am7990, device_get_name(dev), device_get_unit(dev)); if (error != 0) { device_printf(dev, "cannot attach Am7990\n"); goto fail_dmap; } ifq_set_cpuid(&sc->ifp->if_snd, rman_get_cpuid(lesc->sc_ires)); error = bus_setup_intr(dev, lesc->sc_ires, INTR_MPSAFE, am7990_intr, sc, &lesc->sc_ih, sc->ifp->if_serializer); if (error != 0) { device_printf(dev, "cannot set up interrupt\n"); goto fail_am7990; } return (0); fail_am7990: am7990_detach(&lesc->sc_am7990); fail_dmap: bus_dmamap_unload(lesc->sc_dmat, lesc->sc_dmam); fail_dmem: bus_dmamem_free(lesc->sc_dmat, sc->sc_mem, lesc->sc_dmam); fail_dtag: bus_dma_tag_destroy(lesc->sc_dmat); fail_pdtag: bus_dma_tag_destroy(lesc->sc_pdmat); fail_ires: bus_release_resource(dev, SYS_RES_IRQ, lesc->sc_irid, lesc->sc_ires); fail_dres: bus_release_resource(dev, SYS_RES_DRQ, lesc->sc_drid, lesc->sc_dres); fail_rres: bus_release_resource(dev, SYS_RES_IOPORT, lesc->sc_rrid, lesc->sc_rres); fail_mtx: return (error); }
static int bt_mca_attach (device_t dev) { struct bt_softc * bt = device_get_softc(dev); int error = 0; /* Allocate resources */ if ((error = bt_mca_alloc_resources(dev, BT_MCA_ATTACH))) { device_printf(dev, "Unable to allocate resources in bt_mca_attach()\n"); return (error); } isa_dmacascade(rman_get_start(bt->drq)); /* Allocate a dmatag for our CCB DMA maps */ if (bus_dma_tag_create( /* parent */ NULL, /* alignemnt */ 1, /* boundary */ 0, /* lowaddr */ BUS_SPACE_MAXADDR_24BIT, /* highaddr */ BUS_SPACE_MAXADDR, /* filter */ btvlbouncefilter, /* filterarg */ bt, /* maxsize */ BUS_SPACE_MAXSIZE_32BIT, /* nsegments */ ~0, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, /* lockfunc */ NULL, /* lockarg */ NULL, &bt->parent_dmat) != 0) { bt_mca_release_resources(dev); return (ENOMEM); } if (bt_init(dev)) { bt_mca_release_resources(dev); return (ENOMEM); } /* DMA tag for our sense buffers */ if (bus_dma_tag_create( /* parent */ bt->parent_dmat, /* alignment */ 1, /* boundary */ 0, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ BUS_SPACE_MAXADDR, /* filter */ NULL, /* filterarg */ NULL, /* maxsize */ bt->max_ccbs * sizeof(struct scsi_sense_data), /* nsegments */ 1, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, /* lockfunc */ NULL, /* lockarg */ NULL, &bt->sense_dmat) != 0) { bt_mca_release_resources(dev); return (ENOMEM); } bt->init_level++; /* Allocation of sense buffers */ if (bus_dmamem_alloc(bt->sense_dmat, (void **)&bt->sense_buffers, BUS_DMA_NOWAIT, &bt->sense_dmamap) != 0) { bt_mca_release_resources(dev); return (ENOMEM); } bt->init_level++; /* And permanently map them */ bus_dmamap_load(bt->sense_dmat, bt->sense_dmamap, bt->sense_buffers, bt->max_ccbs * sizeof(*bt->sense_buffers), btmapsensebuffers, bt, /*flags*/0); bt->init_level++; if ((error = bt_attach(dev))) { bt_mca_release_resources(dev); return (error); } return (0); }
/* * Attach all the sub-devices we can find */ static int bt_isa_attach(device_t dev) { struct bt_softc *bt = device_get_softc(dev); bus_dma_filter_t *filter; void *filter_arg; bus_addr_t lowaddr; int error, drq; /* Initialise softc */ error = bt_isa_alloc_resources(dev, 0, ~0); if (error) { device_printf(dev, "can't allocate resources in bt_isa_attach\n"); return error; } /* Program the DMA channel for external control */ if ((drq = isa_get_drq(dev)) != -1) isa_dmacascade(drq); /* Allocate our parent dmatag */ filter = NULL; filter_arg = NULL; lowaddr = BUS_SPACE_MAXADDR_24BIT; if (bt->model[0] == '4') { /* * This is a VL adapter. Typically, VL devices have access * to the full 32bit address space. On BT-445S adapters * prior to revision E, there is a hardware bug that causes * corruption of transfers to/from addresses in the range of * the BIOS modulo 16MB. The only properly functioning * BT-445S Host Adapters have firmware version 3.37. * If we encounter one of these adapters and the BIOS is * installed, install a filter function for our bus_dma_map * that will catch these accesses and bounce them to a safe * region of memory. */ if (bt->bios_addr != 0 && strcmp(bt->model, "445S") == 0 && strcmp(bt->firmware_ver, "3.37") < 0) { filter = btvlbouncefilter; filter_arg = bt; } else { lowaddr = BUS_SPACE_MAXADDR_32BIT; } } /* XXX Should be a child of the ISA or VL bus dma tag */ if (bus_dma_tag_create( /* parent */ bus_get_dma_tag(dev), /* alignemnt */ 1, /* boundary */ 0, /* lowaddr */ lowaddr, /* highaddr */ BUS_SPACE_MAXADDR, /* filter */ filter, /* filterarg */ filter_arg, /* maxsize */ BUS_SPACE_MAXSIZE_32BIT, /* nsegments */ ~0, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, /* lockfunc */ NULL, /* lockarg */ NULL, &bt->parent_dmat) != 0) { bt_isa_release_resources(dev); return (ENOMEM); } error = bt_init(dev); if (error) { bt_isa_release_resources(dev); return (ENOMEM); } if (lowaddr != BUS_SPACE_MAXADDR_32BIT) { /* DMA tag for our sense buffers */ if (bus_dma_tag_create( /* parent */ bt->parent_dmat, /* alignment */ 1, /* boundary */ 0, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ BUS_SPACE_MAXADDR, /* filter */ NULL, /* filterarg */ NULL, /* maxsize */ bt->max_ccbs * sizeof(struct scsi_sense_data), /* nsegments */ 1, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, /* lockfunc */ NULL, /* lockarg */ NULL, &bt->sense_dmat) != 0) { bt_isa_release_resources(dev); return (ENOMEM); } bt->init_level++; /* Allocation of sense buffers */ if (bus_dmamem_alloc(bt->sense_dmat, (void **)&bt->sense_buffers, BUS_DMA_NOWAIT, &bt->sense_dmamap) != 0) { bt_isa_release_resources(dev); return (ENOMEM); } bt->init_level++; /* And permanently map them */ bus_dmamap_load(bt->sense_dmat, bt->sense_dmamap, bt->sense_buffers, bt->max_ccbs * sizeof(*bt->sense_buffers), btmapsensebuffers, bt, /*flags*/0); bt->init_level++; } error = bt_attach(dev); if (error) { bt_isa_release_resources(dev); return (error); } return (0); }
/* * Attach all the sub-devices we can find */ static int aha_isa_attach(device_t dev) { struct aha_softc **sc = device_get_softc(dev); struct aha_softc *aha; bus_dma_filter_t *filter; void *filter_arg; bus_addr_t lowaddr; void *ih; int error; aha = *sc; aha->portrid = 0; aha->port = bus_alloc_resource(dev, SYS_RES_IOPORT, &aha->portrid, 0, ~0, AHA_NREGS, RF_ACTIVE); if (!aha->port) { device_printf(dev, "Unable to allocate I/O ports\n"); return ENOMEM; } aha->irqrid = 0; aha->irq = bus_alloc_resource(dev, SYS_RES_IRQ, &aha->irqrid, 0, ~0, 1, RF_ACTIVE); if (!aha->irq) { device_printf(dev, "Unable to allocate excluse use of irq\n"); bus_release_resource(dev, SYS_RES_IOPORT, aha->portrid, aha->port); return ENOMEM; } aha->drqrid = 0; aha->drq = bus_alloc_resource(dev, SYS_RES_DRQ, &aha->drqrid, 0, ~0, 1, RF_ACTIVE); if (!aha->drq) { device_printf(dev, "Unable to allocate drq\n"); bus_release_resource(dev, SYS_RES_IOPORT, aha->portrid, aha->port); bus_release_resource(dev, SYS_RES_IRQ, aha->irqrid, aha->irq); return ENOMEM; } #if 0 /* is the drq ever unset? */ if (dev->id_drq != -1) isa_dmacascade(dev->id_drq); #endif isa_dmacascade(rman_get_start(aha->drq)); /* Allocate our parent dmatag */ filter = NULL; filter_arg = NULL; lowaddr = BUS_SPACE_MAXADDR_24BIT; if (bus_dma_tag_create(/*parent*/NULL, /*alignemnt*/1, /*boundary*/0, lowaddr, /*highaddr*/BUS_SPACE_MAXADDR, filter, filter_arg, /*maxsize*/BUS_SPACE_MAXSIZE_24BIT, /*nsegments*/BUS_SPACE_UNRESTRICTED, /*maxsegsz*/BUS_SPACE_MAXSIZE_24BIT, /*flags*/0, &aha->parent_dmat) != 0) { aha_free(aha); bus_release_resource(dev, SYS_RES_IOPORT, aha->portrid, aha->port); bus_release_resource(dev, SYS_RES_IRQ, aha->irqrid, aha->irq); bus_release_resource(dev, SYS_RES_DRQ, aha->drqrid, aha->drq); return (ENOMEM); } if (aha_init(aha)) { device_printf(dev, "init failed\n"); aha_free(aha); bus_release_resource(dev, SYS_RES_IOPORT, aha->portrid, aha->port); bus_release_resource(dev, SYS_RES_IRQ, aha->irqrid, aha->irq); bus_release_resource(dev, SYS_RES_DRQ, aha->drqrid, aha->drq); return (ENOMEM); } error = aha_attach(aha); if (error) { device_printf(dev, "attach failed\n"); aha_free(aha); bus_release_resource(dev, SYS_RES_IOPORT, aha->portrid, aha->port); bus_release_resource(dev, SYS_RES_IRQ, aha->irqrid, aha->irq); bus_release_resource(dev, SYS_RES_DRQ, aha->drqrid, aha->drq); return (error); } error = bus_setup_intr(dev, aha->irq, INTR_TYPE_CAM, aha_intr, aha, &ih); if (error) { device_printf(dev, "Unable to register interrupt handler\n"); aha_free(aha); bus_release_resource(dev, SYS_RES_IOPORT, aha->portrid, aha->port); bus_release_resource(dev, SYS_RES_IRQ, aha->irqrid, aha->irq); bus_release_resource(dev, SYS_RES_DRQ, aha->drqrid, aha->drq); return (error); } return (0); }
static int dpt_isa_attach (device_t dev) { dpt_softc_t * dpt; int error = 0; dpt = device_get_softc(dev); dpt->dev = dev; dpt_alloc(dev); dpt->io_rid = 0; dpt->io_type = SYS_RES_IOPORT; dpt->irq_rid = 0; error = dpt_alloc_resources(dev); if (error) { goto bad; } dpt->drq_rid = 0; dpt->drq_res = bus_alloc_resource_any(dev, SYS_RES_DRQ, &dpt->drq_rid, RF_ACTIVE); if (!dpt->drq_res) { device_printf(dev, "No DRQ!\n"); error = ENOMEM; goto bad; } isa_dma_acquire(rman_get_start(dpt->drq_res)); isa_dmacascade(rman_get_start(dpt->drq_res)); /* Allocate a dmatag representing the capabilities of this attachment */ if (bus_dma_tag_create( /* parent */ bus_get_dma_tag(dev), /* alignemnt */ 1, /* boundary */ 0, /* lowaddr */ BUS_SPACE_MAXADDR_32BIT, /* highaddr */ BUS_SPACE_MAXADDR, /* filter */ NULL, /* filterarg */ NULL, /* maxsize */ BUS_SPACE_MAXSIZE_32BIT, /* nsegments */ ~0, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, /* lockfunc */ NULL, /* lockarg */ NULL, &dpt->parent_dmat) != 0) { error = ENXIO; goto bad; } if (dpt_init(dpt) != 0) { error = ENXIO; goto bad; } /* Register with the XPT */ dpt_attach(dpt); if (bus_setup_intr(dev, dpt->irq_res, INTR_TYPE_CAM | INTR_ENTROPY | INTR_MPSAFE, NULL, dpt_intr, dpt, &dpt->ih)) { device_printf(dev, "Unable to register interrupt handler\n"); error = ENXIO; goto bad; } return (error); bad: if (dpt->drq_res) { isa_dma_release(rman_get_start(dpt->drq_res)); } dpt_release_resources(dev); if (dpt) dpt_free(dpt); return (error); }