/* * Match a supported board. */ static int dpt_isa_match(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; int i; if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ia->ia_ndrq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); if (ia->ia_io[0].ir_addr != ISA_UNKNOWN_PORT) return (dpt_isa_probe(ia, ia->ia_io[0].ir_addr)); for (i = 0; dpt_isa_iobases[i] != 0; i++) { if (dpt_isa_probe(ia, dpt_isa_iobases[i])) { ia->ia_io[0].ir_addr = dpt_isa_iobases[i]; return (1); } } return (0); }
int pcdisplay_match(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; int mono; if (ISA_DIRECT_CONFIG(ia)) return (0); /* If values are hardwired to something that they can't be, punt. */ if (ia->ia_nio < 1 || (ia->ia_io[0].ir_addr != ISA_UNKNOWN_PORT && ia->ia_io[0].ir_addr != 0x3d0 && ia->ia_io[0].ir_addr != 0x3b0)) return (0); if (ia->ia_niomem < 1 || (ia->ia_iomem[0].ir_addr != ISA_UNKNOWN_IOMEM && ia->ia_iomem[0].ir_addr != 0xb8000 && ia->ia_iomem[0].ir_addr != 0xb0000)) return (0); if (ia->ia_iomem[0].ir_size != 0 && ia->ia_iomem[0].ir_size != 0x8000) return (0); if (ia->ia_nirq > 0 && ia->ia_irq[0].ir_irq != ISA_UNKNOWN_IRQ) return (0); if (ia->ia_ndrq > 0 && ia->ia_drq[0].ir_drq != ISA_UNKNOWN_DRQ) return (0); if (pcdisplay_is_console(ia->ia_iot)) mono = pcdisplay_console_dc.mono; else if (ia->ia_io[0].ir_addr != 0x3b0 && ia->ia_iomem[0].ir_addr != 0xb0000 && pcdisplay_probe_col(ia->ia_iot, ia->ia_memt)) mono = 0; else if (ia->ia_io[0].ir_addr != 0x3d0 && ia->ia_iomem[0].ir_addr != 0xb8000 && pcdisplay_probe_mono(ia->ia_iot, ia->ia_memt)) mono = 1; else return (0); ia->ia_nio = 1; ia->ia_io[0].ir_addr = mono ? 0x3b0 : 0x3d0; ia->ia_io[0].ir_size = 0x10; ia->ia_niomem = 1; ia->ia_iomem[0].ir_size = mono ? 0xb0000 : 0xb8000; ia->ia_iomem[0].ir_size = 0x8000; ia->ia_nirq = 0; ia->ia_ndrq = 0; return (1); }
/* * Check the slots looking for a board we recognise * If we find one, note its address (slot) and call * the actual probe routine to check it out. */ int ahc_isa_probe(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; struct ahc_isa_slot *as; if (ahc_isa_slot_initialized == 0) { LIST_INIT(&ahc_isa_all_slots); ahc_isa_slot_initialized = 1; } if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); if (ia->ia_io[0].ir_addr != ISA_UNKNOWN_PORT) return (ahc_isa_match(ia, ia->ia_io[0].ir_addr)); /* * Find this bus's state. If we don't yet have a slot * marker, allocate and initialize one. */ for (as = ahc_isa_all_slots.lh_first; as != NULL; as = as->link.le_next) if (as->bus == device_unit(parent)) goto found_slot_marker; /* * Don't have one, so make one. */ as = (struct ahc_isa_slot *) malloc(sizeof(struct ahc_isa_slot), M_DEVBUF, M_NOWAIT); if (as == NULL) panic("ahc_isa_probe: can't allocate slot marker"); as->bus = device_unit(parent); as->slot = AHC_ISA_MIN_SLOT; LIST_INSERT_HEAD(&ahc_isa_all_slots, as, link); found_slot_marker: for (; as->slot <= AHC_ISA_MAX_SLOT; as->slot++) { if (ahc_isa_match(ia, EISA_SLOT_ADDR(as->slot) + AHC_ISA_SLOT_OFFSET)) { as->slot++; /* next slot to search */ return (1); } } /* No matching cards were found. */ return (0); }
/* * Probe for the SMSC Super I/O chip */ static int smsc_match(device_t parent, cfdata_t match, void *aux) { bus_space_handle_t ioh; struct isa_attach_args *ia = aux; int rv; uint8_t cr; /* Must supply an address */ if (ia->ia_nio < 1) return 0; if (ISA_DIRECT_CONFIG(ia)) return 0; if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return 0; if (bus_space_map(ia->ia_iot, ia->ia_io[0].ir_addr, 2, 0, &ioh)) return 0; /* To get the device ID we must enter config mode... */ bus_space_write_1(ia->ia_iot, ioh, SMSC_ADDR, SMSC_CONFIG_START); /* Then select the device id register */ cr = smsc_readreg(ia->ia_iot, ioh, SMSC_DEVICE_ID); /* Exit config mode, apparently this is important to do */ bus_space_write_1(ia->ia_iot, ioh, SMSC_ADDR, SMSC_CONFIG_END); switch (cr) { case SMSC_ID_47B397: case SMSC_ID_SCH5307NS: case SMSC_ID_SCH5317: rv = 1; break; default: rv = 0; break; } DPRINTF(("smsc: rv = %d, cr = %x\n", rv, cr)); bus_space_unmap(ia->ia_iot, ioh, 2); if (rv) { ia->ia_nio = 1; ia->ia_io[0].ir_size = 2; ia->ia_niomem = 0; ia->ia_nirq = 0; ia->ia_ndrq = 0; } return rv; }
int ne_isa_match(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t nict = ia->ia_iot; bus_space_handle_t nich; bus_space_tag_t asict; bus_space_handle_t asich; int rv = 0; if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* Disallow wildcarded values. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return (0); if (ia->ia_irq[0].ir_irq == ISA_UNKNOWN_IRQ) return (0); /* Make sure this is a valid NE[12]000 i/o address. */ if ((ia->ia_io[0].ir_addr & 0x1f) != 0) return (0); /* Map i/o space. */ if (bus_space_map(nict, ia->ia_io[0].ir_addr, NE2000_NPORTS, 0, &nich)) return (0); asict = nict; if (bus_space_subregion(nict, nich, NE2000_ASIC_OFFSET, NE2000_ASIC_NPORTS, &asich)) goto out; /* Look for an NE2000-compatible card. */ rv = ne2000_detect(nict, nich, asict, asich); if (rv) { ia->ia_nio = 1; ia->ia_io[0].ir_size = NE2000_NPORTS; ia->ia_nirq = 1; ia->ia_niomem = 0; ia->ia_ndrq = 0; } out: bus_space_unmap(nict, nich, NE2000_NPORTS); return (rv); }
/* * Check the slots looking for a board we recognise * If we find one, note it's address (slot) and call * the actual probe routine to check it out. */ int uha_isa_probe(struct device *parent, struct cfdata *match, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; struct uha_probe_data upd; int rv; if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ia->ia_ndrq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* Disallow wildcarded i/o address. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return (0); if (bus_space_map(iot, ia->ia_io[0].ir_addr, UHA_ISA_IOSIZE, 0, &ioh)) return (0); rv = u14_find(iot, ioh, &upd); bus_space_unmap(iot, ioh, UHA_ISA_IOSIZE); if (rv) { if (ia->ia_irq[0].ir_irq != ISA_UNKNOWN_IRQ && ia->ia_irq[0].ir_irq != upd.sc_irq) return (0); if (ia->ia_drq[0].ir_drq != ISA_UNKNOWN_DRQ && ia->ia_drq[0].ir_drq != upd.sc_drq) return (0); ia->ia_nio = 1; ia->ia_io[0].ir_size = UHA_ISA_IOSIZE; ia->ia_nirq = 1; ia->ia_irq[0].ir_irq = upd.sc_irq; ia->ia_ndrq = 1; ia->ia_drq[0].ir_drq = upd.sc_drq; ia->ia_niomem = 0; } return (rv); }
static int mmsprobe(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; int rv; if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* Disallow wildcarded i/o address. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return 0; if (ia->ia_irq[0].ir_irq == ISA_UNKNOWN_IRQ) return 0; /* Map the i/o space. */ if (bus_space_map(iot, ia->ia_io[0].ir_addr, MMS_NPORTS, 0, &ioh)) return 0; rv = 0; /* Read identification register to see if present */ if (bus_space_read_1(iot, ioh, MMS_IDENT) != 0xde) goto out; /* Seems it was there; reset. */ bus_space_write_1(iot, ioh, MMS_ADDR, 0x87); rv = 1; ia->ia_nio = 1; ia->ia_io[0].ir_size = MMS_NPORTS; ia->ia_nirq = 1; ia->ia_niomem = 0; ia->ia_ndrq = 0; out: bus_space_unmap(iot, ioh, MMS_NPORTS); return rv; }
int com_isa_probe(device_t parent, cfdata_t match, void *aux) { bus_space_tag_t iot; bus_space_handle_t ioh; int iobase; int rv = 1; struct isa_attach_args *ia = aux; if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* Disallow wildcarded i/o address. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return (0); /* Don't allow wildcarded IRQ. */ if (ia->ia_irq[0].ir_irq == ISA_UNKNOWN_IRQ) return (0); iot = ia->ia_iot; iobase = ia->ia_io[0].ir_addr; /* if it's in use as console, it's there. */ if (!com_is_console(iot, iobase, 0)) { if (bus_space_map(iot, iobase, COM_NPORTS, 0, &ioh)) { return 0; } rv = comprobe1(iot, ioh); bus_space_unmap(iot, ioh, COM_NPORTS); } if (rv) { ia->ia_nio = 1; ia->ia_io[0].ir_size = COM_NPORTS; ia->ia_nirq = 1; ia->ia_niomem = 0; ia->ia_ndrq = 0; } return (rv); }
int vga_isa_match(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; if (ISA_DIRECT_CONFIG(ia)) return (0); /* If values are hardwired to something that they can't be, punt. */ if (ia->ia_nio < 1 || (ia->ia_io[0].ir_addr != ISA_UNKNOWN_PORT && ia->ia_io[0].ir_addr != 0x3b0)) return (0); if (ia->ia_niomem < 1 || (ia->ia_iomem[0].ir_addr != ISA_UNKNOWN_IOMEM && ia->ia_iomem[0].ir_addr != 0xa0000)) return (0); if (ia->ia_iomem[0].ir_size != 0 && ia->ia_iomem[0].ir_size != 0x20000) return (0); if (ia->ia_nirq > 0 && ia->ia_irq[0].ir_irq != ISA_UNKNOWN_IRQ) return (0); if (ia->ia_ndrq > 0 && ia->ia_drq[0].ir_drq != ISA_UNKNOWN_DRQ) return (0); if (!vga_is_console(ia->ia_iot, WSDISPLAY_TYPE_ISAVGA) && !vga_common_probe(ia->ia_iot, ia->ia_memt)) return (0); ia->ia_nio = 1; ia->ia_io[0].ir_addr = 0x3b0; /* XXX mono 0x3b0 color 0x3c0 */ ia->ia_io[0].ir_size = 0x30; /* XXX 0x20 */ ia->ia_niomem = 1; ia->ia_iomem[0].ir_addr = 0xa0000; ia->ia_iomem[0].ir_size = 0x20000; ia->ia_nirq = 0; ia->ia_ndrq = 0; return (2); /* more than generic pcdisplay */ }
int cms_probe(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot; bus_space_handle_t ioh; int found = 0; int i; DPRINTF(("cms_probe():\n")); iot = ia->ia_iot; if (ia->ia_nio < 1) return 0; if (ISA_DIRECT_CONFIG(ia)) return 0; if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return 0; if (bus_space_map(iot, ia->ia_io[0].ir_addr, CMS_IOSIZE, 0, &ioh)) return 0; bus_space_write_1(iot, ioh, CMS_WREG, 0xaa); if (bus_space_read_1(iot, ioh, CMS_RREG) != 0xaa) goto out; for (i = 0; i < 8; i++) { if (bus_space_read_1(iot, ioh, CMS_MREG) != 0x7f) goto out; } found = 1; ia->ia_nio = 1; ia->ia_io[0].ir_size = CMS_IOSIZE; ia->ia_niomem = 0; ia->ia_nirq = 0; ia->ia_ndrq = 0; out: bus_space_unmap(iot, ioh, CMS_IOSIZE); return found; }
int mcdprobe(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; struct mcd_softc sc; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; int rv; if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* Disallow wildcarded i/o address. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return (0); if (ia->ia_irq[0].ir_irq == ISA_UNKNOWN_IRQ) return (0); /* Map i/o space */ if (bus_space_map(iot, ia->ia_io[0].ir_addr, MCD_NPORT, 0, &ioh)) return 0; sc.debug = 0; sc.probe = 1; rv = mcd_find(iot, ioh, &sc); bus_space_unmap(iot, ioh, MCD_NPORT); if (rv) { ia->ia_nio = 1; ia->ia_io[0].ir_size = MCD_NPORT; ia->ia_nirq = 1; ia->ia_niomem = 0; ia->ia_ndrq = 0; } return (rv); }
int wbsio_probe(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot; bus_space_handle_t ioh; uint8_t reg; /* Must supply an address */ if (ia->ia_nio < 1) return 0; if (ISA_DIRECT_CONFIG(ia)) return 0; if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return 0; /* Match by device ID */ iot = ia->ia_iot; if (bus_space_map(iot, ia->ia_io[0].ir_addr, WBSIO_IOSIZE, 0, &ioh)) return 0; wbsio_conf_enable(iot, ioh); reg = wbsio_conf_read(iot, ioh, WBSIO_ID); aprint_debug("wbsio_probe: id 0x%02x\n", reg); wbsio_conf_disable(iot, ioh); bus_space_unmap(iot, ioh, WBSIO_IOSIZE); switch (reg) { case WBSIO_ID_W83627HF: case WBSIO_ID_W83627THF: case WBSIO_ID_W83627EHF: case WBSIO_ID_W83627DHG: case WBSIO_ID_W83637HF: case WBSIO_ID_W83697HF: case WBSIO_ID_NCT6776F: ia->ia_nio = 1; ia->ia_io[0].ir_size = WBSIO_IOSIZE; ia->ia_niomem = 0; ia->ia_nirq = 0; ia->ia_ndrq = 0; return 1; } return 0; }
int npx_isa_probe(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_handle_t ioh; enum npx_type result; if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); if (bus_space_map(ia->ia_iot, 0xf0, 16, 0, &ioh) != 0) return (0); result = npxprobe1(ia->ia_iot, ioh, ia->ia_irq[0].ir_irq); bus_space_unmap(ia->ia_iot, ioh, 16); if (result != NPX_NONE) { /* * Remember our result -- we don't want to have to npxprobe1() * again (especially if we've zapped the IRQ). */ ia->ia_aux = (void *)(intptr_t)result; ia->ia_nio = 1; ia->ia_io[0].ir_addr = 0xf0; ia->ia_io[0].ir_size = 16; if (result != NPX_INTERRUPT) ia->ia_nirq = 0; /* zap the interrupt */ else ia->ia_nirq = 1; ia->ia_niomem = 0; ia->ia_ndrq = 0; return (1); } return (0); }
int rtii_probe(struct device *parent, struct cfdata *cf, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; u_int r; int iosize = 1, iobase; if (ISA_DIRECT_CONFIG(ia)) return 0; if (ia->ia_nio < 1) return 0; iobase = ia->ia_io[0].ir_addr; if (!RTII_BASE_VALID(iobase)) { printf("rtii: configured iobase 0x%x invalid\n", iobase); return 0; } if (bus_space_map(iot, iobase, iosize, 0, &ioh)) return 0; r = rtii_find(iot, ioh); bus_space_unmap(iot, ioh, iosize); if (r != 0) { ia->ia_nio = 1; ia->ia_io[0].ir_size = iosize; ia->ia_niomem = 0; ia->ia_nirq = 0; ia->ia_ndrq = 0; return (1); } return (0); }
static int itesio_isa_match(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_handle_t ioh; uint16_t cr; /* Must supply an address */ if (ia->ia_nio < 1) return 0; if (ISA_DIRECT_CONFIG(ia)) return 0; if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return 0; if (bus_space_map(ia->ia_iot, ia->ia_io[0].ir_addr, 2, 0, &ioh)) return 0; itesio_enter(ia->ia_iot, ioh); cr = (itesio_readreg(ia->ia_iot, ioh, ITESIO_CHIPID1) << 8); cr |= itesio_readreg(ia->ia_iot, ioh, ITESIO_CHIPID2); itesio_exit(ia->ia_iot, ioh); bus_space_unmap(ia->ia_iot, ioh, 2); switch (cr) { case ITESIO_ID8705: case ITESIO_ID8712: case ITESIO_ID8716: case ITESIO_ID8718: case ITESIO_ID8726: ia->ia_nio = 1; ia->ia_io[0].ir_size = 2; ia->ia_niomem = 0; ia->ia_nirq = 0; ia->ia_ndrq = 0; return 1; default: return 0; } }
int mcclock_isa_probe(device_t parent, cfdata_t cf, void *aux) { struct isa_attach_args *ia = aux; bus_space_handle_t ioh; if (ia->ia_nio < 1) return 0; if (ISA_DIRECT_CONFIG(ia)) return 0; if ((ia->ia_io[0].ir_addr != ISA_UNKNOWN_PORT) && (ia->ia_io[0].ir_addr != IO_RTC)) return 0; if (ia->ia_niomem > 0 && (ia->ia_iomem[0].ir_addr != ISA_UNKNOWN_IOMEM)) return 0; if (ia->ia_nirq > 0 && (ia->ia_irq[0].ir_irq != ISA_UNKNOWN_IRQ)) return 0; if (ia->ia_ndrq > 0 && (ia->ia_drq[0].ir_drq != ISA_UNKNOWN_DRQ)) return 0; if (bus_space_map(ia->ia_iot, IO_RTC, 2, 0, &ioh)) return 0; bus_space_unmap(ia->ia_iot, ioh, 2); ia->ia_io[0].ir_addr = IO_RTC; ia->ia_io[0].ir_size = 2; ia->ia_nio = 1; ia->ia_niomem = 0; ia->ia_nirq = 0; ia->ia_ndrq = 0; return 1; }
int satlinkprobe(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; int rv = 0; if (ia->ia_nio < 1) return (0); if (ia->ia_ndrq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* Don't allow wildcarding of iobase or drq. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return (0); if (ia->ia_drq[0].ir_drq == ISA_UNKNOWN_DRQ) return (0); if (bus_space_map(iot, ia->ia_io[0].ir_addr, SATLINK_IOSIZE, 0, &ioh)) return (0); /* * XXX Should check manufacturer ID here, or something. */ rv = 1; ia->ia_nio = 1; ia->ia_io[0].ir_size = SATLINK_IOSIZE; ia->ia_ndrq = 1; ia->ia_nirq = 0; ia->ia_niomem = 0; bus_space_unmap(iot, ioh, SATLINK_IOSIZE); return (rv); }
int lm_isa_match(device_t parent, cfdata_t match, void *aux) { bus_space_handle_t ioh; struct isa_attach_args *ia = aux; struct lm_isa_softc sc; int rv; /* Must supply an address */ if (ia->ia_nio < 1) return 0; if (ISA_DIRECT_CONFIG(ia)) return 0; if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return 0; if (bus_space_map(ia->ia_iot, ia->ia_io[0].ir_addr, 8, 0, &ioh)) return 0; /* Bus independent probe */ sc.lm_iot = ia->ia_iot; sc.lm_ioh = ioh; sc.lmsc.lm_writereg = lm_isa_writereg; sc.lmsc.lm_readreg = lm_isa_readreg; rv = lm_probe(&sc.lmsc); bus_space_unmap(ia->ia_iot, ioh, 8); if (rv) { ia->ia_nio = 1; ia->ia_io[0].ir_size = 8; ia->ia_niomem = 0; ia->ia_nirq = 0; ia->ia_ndrq = 0; } return rv; }
static int attimer_isa_match(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_handle_t att_ioh; if (ISA_DIRECT_CONFIG(ia)) return (0); /* If values are hardwired to something that they can't be, punt. */ if (ia->ia_nio < 1 || (ia->ia_io[0].ir_addr != ISA_UNKNOWN_PORT && ia->ia_io[0].ir_addr != IO_TIMER1)) return (0); if (ia->ia_niomem > 0 && (ia->ia_iomem[0].ir_addr != ISA_UNKNOWN_IOMEM)) return (0); if (ia->ia_nirq > 0 && (ia->ia_irq[0].ir_irq != ISA_UNKNOWN_IRQ)) return (0); if (ia->ia_ndrq > 0 && (ia->ia_drq[0].ir_drq != ISA_UNKNOWN_DRQ)) return (0); if (bus_space_map(ia->ia_iot, IO_TIMER1, 4, 0, &att_ioh)) return 0; bus_space_unmap(ia->ia_iot, att_ioh, 4); ia->ia_io[0].ir_addr = IO_TIMER1; ia->ia_io[0].ir_size = 4; ia->ia_nio = 1; ia->ia_niomem = 0; ia->ia_nirq = 0; ia->ia_ndrq = 0; return 1; }
int cecprobe(struct device *parent, struct cfdata *match, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; DPRINTF(DBG_CONFIG, ("cecprobe: called\n")); if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ia->ia_ndrq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); if (ia->ia_io[0].ir_addr == ISACF_PORT_DEFAULT) return (0); if (ia->ia_ndrq > 0 && ia->ia_drq[0].ir_drq == ISACF_DRQ_DEFAULT) ia->ia_ndrq = 0; if (bus_space_map(iot, ia->ia_io[0].ir_addr, CEC_IOSIZE, 0, &ioh)) return (0); /* XXX insert probe here */ ia->ia_io[0].ir_size = CEC_IOSIZE; ia->ia_niomem = 0; bus_space_unmap(iot, ioh, CEC_IOSIZE); return (1); }
static int aps_match(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; int iobase, i; uint8_t cr; /* Must supply an address */ if (ia->ia_nio < 1) return 0; if (ISA_DIRECT_CONFIG(ia)) return 0; if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return 0; iobase = ia->ia_io[0].ir_addr; if (bus_space_map(iot, iobase, APS_ADDR_SIZE, 0, &ioh)) { aprint_error("aps: can't map i/o space\n"); return 0; } /* See if this machine has APS */ bus_space_write_1(iot, ioh, APS_INIT, 0x13); bus_space_write_1(iot, ioh, APS_CMD, 0x01); /* ask again as the X40 is slightly deaf in one ear */ bus_space_read_1(iot, ioh, APS_CMD); bus_space_write_1(iot, ioh, APS_INIT, 0x13); bus_space_write_1(iot, ioh, APS_CMD, 0x01); if (!aps_mem_read_1(iot, ioh, APS_CMD, 0x00)) { bus_space_unmap(iot, ioh, APS_ADDR_SIZE); return 0; } /* * Observed values from Linux driver: * 0x01: T42 * 0x02: chip already initialised * 0x03: T41 */ for (i = 0; i < 10; i++) { cr = bus_space_read_1(iot, ioh, APS_STATE); if (cr > 0 && cr < 6) break; delay(5 * 1000); } bus_space_unmap(iot, ioh, APS_ADDR_SIZE); DPRINTF(("aps: state register 0x%x\n", cr)); if (cr < 1 || cr > 5) { DPRINTF(("aps0: unsupported state %d\n", cr)); return 0; } ia->ia_nio = 1; ia->ia_io[0].ir_size = APS_ADDR_SIZE; ia->ia_niomem = 0; ia->ia_nirq = 0; ia->ia_ndrq = 0; return 1; }
int moxa_isaprobe(struct device *parent, struct cfdata *self, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; int i, iobase, rv = 1; /* * Do the normal com probe for the first UART and assume * its presence, and the ability to map the other UARTS, * means there is a multiport board there. * XXX Needs more robustness. */ if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* Disallow wildcarded i/o address. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return (0); if (ia->ia_irq[0].ir_irq == ISA_UNKNOWN_IRQ) return (0); /* if the first port is in use as console, then it. */ if (com_is_console(iot, ia->ia_io[0].ir_addr, 0)) goto checkmappings; if (bus_space_map(iot, ia->ia_io[0].ir_addr, COM_NPORTS, 0, &ioh)) { rv = 0; goto out; } rv = comprobe1(iot, ioh); bus_space_unmap(iot, ioh, COM_NPORTS); if (rv == 0) goto out; checkmappings: for (i = 1, iobase = ia->ia_io[0].ir_addr; i < NSLAVES; i++) { iobase += COM_NPORTS; if (com_is_console(iot, iobase, 0)) continue; if (bus_space_map(iot, iobase, COM_NPORTS, 0, &ioh)) { rv = 0; goto out; } bus_space_unmap(iot, ioh, COM_NPORTS); } out: if (rv) { ia->ia_nio = 1; ia->ia_io[0].ir_size = NSLAVES * COM_NPORTS; ia->ia_nirq = 1; ia->ia_niomem = 0; ia->ia_ndrq = 0; } return (rv); }
int cs_isa_probe(struct device *parent, struct cfdata *cf, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_tag_t memt = ia->ia_memt; bus_space_handle_t ioh, memh; struct cs_softc sc; int rv = 0, have_io = 0, have_mem = 0; u_int16_t isa_cfg, isa_membase; int maddr, irq; if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* * Disallow wildcarded I/O base. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return (0); if (ia->ia_niomem > 0) maddr = ia->ia_iomem[0].ir_addr; else maddr = ISA_UNKNOWN_IOMEM; /* * Map the I/O space. */ if (bus_space_map(ia->ia_iot, ia->ia_io[0].ir_addr, CS8900_IOSIZE, 0, &ioh)) goto out; have_io = 1; memset(&sc, 0, sizeof sc); sc.sc_iot = iot; sc.sc_ioh = ioh; /* Verify that it's a Crystal product. */ if (CS_READ_PACKET_PAGE_IO(&sc, PKTPG_EISA_NUM) != EISA_NUM_CRYSTAL) goto out; /* * Verify that it's a supported chip. */ switch (CS_READ_PACKET_PAGE_IO(&sc, PKTPG_PRODUCT_ID) & PROD_ID_MASK) { case PROD_ID_CS8900: #ifdef notyet case PROD_ID_CS8920: case PROD_ID_CS8920M: #endif break; default: /* invalid product ID */ goto out; } /* * If the IRQ or memory address were not specified, read the * ISA_CFG EEPROM location. */ if (maddr == ISA_UNKNOWN_IOMEM || ia->ia_irq[0].ir_irq == ISA_UNKNOWN_IRQ) { if (cs_verify_eeprom(&sc) == CS_ERROR) { printf("cs_isa_probe: EEPROM bad or missing\n"); goto out; } if (cs_read_eeprom(&sc, EEPROM_ISA_CFG, &isa_cfg) == CS_ERROR) { printf("cs_isa_probe: unable to read ISA_CFG\n"); goto out; } } /* * If the IRQ wasn't specified, get it from the EEPROM. */ if (ia->ia_irq[0].ir_irq == ISA_UNKNOWN_IRQ) { irq = isa_cfg & ISA_CFG_IRQ_MASK; if (irq == 3) irq = 5; else irq += 10; } else irq = ia->ia_irq[0].ir_irq; /* * If the memory address wasn't specified, get it from the EEPROM. */ if (maddr == ISA_UNKNOWN_IOMEM) { if ((isa_cfg & ISA_CFG_MEM_MODE) == 0) { /* EEPROM says don't use memory mode. */ goto out; } if (cs_read_eeprom(&sc, EEPROM_MEM_BASE, &isa_membase) == CS_ERROR) { printf("cs_isa_probe: unable to read MEM_BASE\n"); goto out; } isa_membase &= MEM_BASE_MASK; maddr = (int)isa_membase << 8; } /* * We now have a valid mem address; attempt to map it. */ if (bus_space_map(ia->ia_memt, maddr, CS8900_MEMSIZE, 0, &memh)) { /* Can't map it; fall back on i/o-only mode. */ printf("cs_isa_probe: unable to map memory space\n"); maddr = ISA_UNKNOWN_IOMEM; } else have_mem = 1; ia->ia_nio = 1; ia->ia_io[0].ir_size = CS8900_IOSIZE; if (maddr == ISA_UNKNOWN_IOMEM) ia->ia_niomem = 0; else { ia->ia_niomem = 1; ia->ia_iomem[0].ir_addr = maddr; ia->ia_iomem[0].ir_size = CS8900_MEMSIZE; } ia->ia_nirq = 1; ia->ia_irq[0].ir_irq = irq; rv = 1; out: if (have_io) bus_space_unmap(iot, ioh, CS8900_IOSIZE); if (have_mem) bus_space_unmap(memt, memh, CS8900_MEMSIZE); return (rv); }
static int fdc_isa_probe(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot; bus_space_handle_t ioh, ctl_ioh, base_ioh; int rv, iobase; iot = ia->ia_iot; rv = 0; if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ia->ia_ndrq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* Disallow wildcarded I/O addresses. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return (0); /* Don't allow wildcarded IRQ/DRQ. */ if (ia->ia_irq[0].ir_irq == ISA_UNKNOWN_IRQ) return (0); if (ia->ia_drq[0].ir_drq == ISA_UNKNOWN_DRQ) return (0); /* Map the I/O space. */ iobase = ia->ia_io[0].ir_addr; if (bus_space_map(iot, iobase, 6 /* FDC_NPORT */, 0, &base_ioh)) return (0); if (bus_space_subregion(iot, base_ioh, 2, 4, &ioh)) { bus_space_unmap(iot, base_ioh, 6); return (0); } if (bus_space_map(iot, iobase + fdctl + 2, 1, 0, &ctl_ioh)) { bus_space_unmap(iot, base_ioh, 6); return (0); } /* Not needed for the rest of the probe. */ bus_space_unmap(iot, ctl_ioh, 1); /* reset */ bus_space_write_1(iot, ioh, fdout, 0); delay(100); bus_space_write_1(iot, ioh, fdout, FDO_FRST); /* see if it can handle a command */ if (out_fdc(iot, ioh, NE7CMD_SPECIFY) < 0) goto out; out_fdc(iot, ioh, 0xdf); out_fdc(iot, ioh, 2); rv = 1; ia->ia_nio = 1; ia->ia_io[0].ir_size = FDC_NPORT; ia->ia_nirq = 1; ia->ia_ndrq = 1; ia->ia_niomem = 0; out: bus_space_unmap(iot, base_ioh, 6 /* FDC_NPORT */); return (rv); }
/* * Probe card */ static int isic_isa_probe(device_t parent, cfdata_t cf, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t memt = ia->ia_memt, iot = ia->ia_iot; int flags = cf->cf_flags; struct isic_attach_args args; int ret = 0, iobase, iosize, maddr, msize; #if 0 printf("isic%d: enter isic_isa_probe\n", cf->cf_unit); #endif if (ia->ia_nio < 1) return (0); if (ia->ia_niomem < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* check irq */ if (ia->ia_irq[0].ir_irq == ISA_UNKNOWN_IRQ) { printf("isic%d: config error: no IRQ specified\n", cf->cf_unit); return 0; } iobase = ia->ia_io[0].ir_addr; iosize = ia->ia_io[0].ir_size; maddr = ia->ia_iomem[0].ir_addr; msize = ia->ia_iomem[0].ir_size; /* setup MI attach args */ memset(&args, 0, sizeof(args)); args.ia_flags = flags; /* if card type specified setup io map for that card */ switch(flags) { case FLAG_TELES_S0_8: case FLAG_TELES_S0_16: case FLAG_TELES_S0_163: case FLAG_AVM_A1: case FLAG_USR_ISDN_TA_INT: case FLAG_ITK_IX1: if (setup_io_map(flags, iot, memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], &iosize, &msize)) { ret = 0; goto done; } break; default: /* no io map now, will figure card type later */ break; } /* probe card */ switch(flags) { #ifdef ISICISA_DYNALINK #ifdef __bsdi__ case FLAG_DYNALINK: ret = isic_probe_Dyn(&args); break; #endif #endif #ifdef ISICISA_TEL_S0_8 case FLAG_TELES_S0_8: ret = isic_probe_s08(&args); break; #endif #ifdef ISICISA_TEL_S0_16 case FLAG_TELES_S0_16: ret = isic_probe_s016(&args); break; #endif #ifdef ISICISA_TEL_S0_16_3 case FLAG_TELES_S0_163: ret = isic_probe_s0163(&args); break; #endif #ifdef ISICISA_AVM_A1 case FLAG_AVM_A1: ret = isic_probe_avma1(&args); break; #endif #ifdef ISICISA_USR_STI case FLAG_USR_ISDN_TA_INT: ret = isic_probe_usrtai(&args); break; #endif #ifdef ISICISA_ITKIX1 case FLAG_ITK_IX1: ret = isic_probe_itkix1(&args); break; #endif default: /* No card type given, try to figure ... */ if (iobase == ISA_UNKNOWN_PORT) { ret = 0; #ifdef ISICISA_TEL_S0_8 /* only Teles S0/8 will work without IO */ args.ia_flags = FLAG_TELES_S0_8; if (setup_io_map(args.ia_flags, iot, memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], &iosize, &msize) == 0) { ret = isic_probe_s08(&args); } #endif /* ISICISA_TEL_S0_8 */ } else if (maddr == ISA_UNKNOWN_IOMEM) { ret = 0; #ifdef ISICISA_TEL_S0_16_3 /* no shared memory, only a 16.3 based card, AVM A1, the usr sportster or an ITK would work */ args.ia_flags = FLAG_TELES_S0_163; if (setup_io_map(args.ia_flags, iot, memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], &iosize, &msize) == 0) { ret = isic_probe_s0163(&args); if (ret) break; } #endif /* ISICISA_TEL_S0_16_3 */ #ifdef ISICISA_AVM_A1 args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); args.ia_flags = FLAG_AVM_A1; if (setup_io_map(args.ia_flags, iot, memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], &iosize, &msize) == 0) { ret = isic_probe_avma1(&args); if (ret) break; } #endif /* ISICISA_AVM_A1 */ #ifdef ISICISA_USR_STI args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); args.ia_flags = FLAG_USR_ISDN_TA_INT; if (setup_io_map(args.ia_flags, iot, memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], &iosize, &msize) == 0) { ret = isic_probe_usrtai(&args); if (ret) break; } #endif /* ISICISA_USR_STI */ #ifdef ISICISA_ITKIX1 args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); args.ia_flags = FLAG_ITK_IX1; if (setup_io_map(args.ia_flags, iot, memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], &iosize, &msize) == 0) { ret = isic_probe_itkix1(&args); if (ret) break; } #endif /* ISICISA_ITKIX1 */ } else { #ifdef ISICISA_TEL_S0_16_3 /* could be anything */ args.ia_flags = FLAG_TELES_S0_163; if (setup_io_map(args.ia_flags, iot, memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], &iosize, &msize) == 0) { ret = isic_probe_s0163(&args); if (ret) break; } #endif /* ISICISA_TEL_S0_16_3 */ #ifdef ISICISA_TEL_S0_16 args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); args.ia_flags = FLAG_TELES_S0_16; if (setup_io_map(args.ia_flags, iot, memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], &iosize, &msize) == 0) { ret = isic_probe_s016(&args); if (ret) break; } #endif /* ISICISA_TEL_S0_16 */ #ifdef ISICISA_AVM_A1 args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); args.ia_flags = FLAG_AVM_A1; if (setup_io_map(args.ia_flags, iot, memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], &iosize, &msize) == 0) { ret = isic_probe_avma1(&args); if (ret) break; } #endif /* ISICISA_AVM_A1 */ #ifdef ISICISA_TEL_S0_8 args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); args.ia_flags = FLAG_TELES_S0_8; if (setup_io_map(args.ia_flags, iot, memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], &iosize, &msize) == 0) { ret = isic_probe_s08(&args); } #endif /* ISICISA_TEL_S0_8 */ } break; } done: /* unmap resources */ args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); #if 0 printf("isic%d: exit isic_isa_probe, return = %d\n", cf->cf_unit, ret); #endif if (ret) { if (iosize != 0) { ia->ia_nio = 1; ia->ia_io[0].ir_addr = iobase; ia->ia_io[0].ir_size = iosize; } else ia->ia_nio = 0; if (msize != 0) { ia->ia_niomem = 1; ia->ia_iomem[0].ir_addr = maddr; ia->ia_iomem[0].ir_size = msize; } else ia->ia_niomem = 0; ia->ia_nirq = 1; ia->ia_ndrq = 0; } return ret; }
/* * Determine if the device is present. */ int fmv_isa_match(device_t parent, cfdata_t cf, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; int i, iobase, irq, rv = 0; uint8_t myea[ETHER_ADDR_LEN]; if (ia->ia_nio < 1) return 0; if (ia->ia_nirq < 1) return 0; if (ISA_DIRECT_CONFIG(ia)) return 0; /* Disallow wildcarded values. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return 0; /* * See if the sepcified address is valid for FMV-180 series. */ for (i = 0; i < NFMV_IOMAP; i++) if (fmv_iomap[i] == ia->ia_io[0].ir_addr) break; if (i == NFMV_IOMAP) { DPRINTF("%s: unknown iobase 0x%x\n", __func__, ia->ia_io[0].ir_addr); return 0; } /* Map i/o space. */ if (bus_space_map(iot, ia->ia_io[0].ir_addr, FMV_NPORTS, 0, &ioh)) { DPRINTF("%s: couldn't map iospace 0x%x\n", __func__, ia->ia_io[0].ir_addr); return 0; } if (fmv_find(iot, ioh, &iobase, &irq) == 0) { DPRINTF("%s: fmv_find failed\n", __func__); goto out; } if (iobase != ia->ia_io[0].ir_addr) { DPRINTF("%s: unexpected iobase in board: 0x%x\n", __func__, iobase); goto out; } if (fmv_detect(iot, ioh, myea) == 0) { /* XXX necessary? */ DPRINTF("%s: fmv_detect failed\n", __func__); goto out; } if (ia->ia_irq[0].ir_irq != ISA_UNKNOWN_IRQ) { if (ia->ia_irq[0].ir_irq != irq) { aprint_error("%s: irq mismatch; " "kernel configured %d != board configured %d\n", __func__, ia->ia_irq[0].ir_irq, irq); goto out; } } else ia->ia_irq[0].ir_irq = irq; ia->ia_nio = 1; ia->ia_io[0].ir_size = FMV_NPORTS; ia->ia_nirq = 1; ia->ia_niomem = 0; ia->ia_ndrq = 0; rv = 1; out: bus_space_unmap(iot, ioh, FMV_NPORTS); return rv; }
static int lemac_isa_find(lemac_softc_t *sc, const char *xname, struct isa_attach_args *ia, int attach) { bus_addr_t maddr; bus_size_t msiz; int rv = 0, irq; if (ia->ia_nio < 1) return (0); if (ia->ia_niomem < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* * Disallow wildcarded i/o addresses. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return 0; /* * Make sure this is a valid LEMAC address. */ if (ia->ia_io[0].ir_addr & (LEMAC_IOSIZE - 1)) return 0; sc->sc_iot = ia->ia_iot; if (bus_space_map(sc->sc_iot, ia->ia_io[0].ir_addr, LEMAC_IOSIZE, 0, &sc->sc_ioh)) { if (attach) printf(": can't map i/o space\n"); return 0; } /* * Read the Ethernet address from the EEPROM. * It must start with one of the DEC OUIs and pass the * DEC ethernet checksum test. */ if (lemac_port_check(sc->sc_iot, sc->sc_ioh) == 0) goto outio; /* * Get information about memory space and attempt to map it. */ lemac_info_get(sc->sc_iot, sc->sc_ioh, &maddr, &msiz, &irq); if (ia->ia_iomem[0].ir_addr != ISA_UNKNOWN_IOMEM && ia->ia_iomem[0].ir_addr != maddr) goto outio; if (attach) { if (msiz == 0) { printf(": memory configuration is invalid\n"); goto outio; } sc->sc_memt = ia->ia_memt; if (bus_space_map(ia->ia_memt, maddr, msiz, 0, &sc->sc_memh)) { printf(": can't map mem space\n"); goto outio; } } /* * Double-check IRQ configuration. */ if (ia->ia_irq[0].ir_irq != ISA_UNKNOWN_IRQ && ia->ia_irq[0].ir_irq != irq) printf("%s: overriding IRQ %d to %d\n", xname, ia->ia_irq[0].ir_irq, irq); if (attach) { sc->sc_ats = shutdownhook_establish(lemac_shutdown, sc); if (sc->sc_ats == NULL) { aprint_normal("\n"); aprint_error("%s: warning: can't establish shutdown hook\n", xname); } lemac_ifattach(sc); sc->sc_ih = isa_intr_establish(ia->ia_ic, irq, IST_EDGE, IPL_NET, lemac_intr, sc); } /* * I guess we've found one. */ rv = 1; ia->ia_nio = 1; ia->ia_io[0].ir_size = LEMAC_IOSIZE; ia->ia_niomem = 1; ia->ia_iomem[0].ir_addr = maddr; ia->ia_iomem[0].ir_size = msiz; ia->ia_nirq = 1; ia->ia_irq[0].ir_irq = irq; ia->ia_ndrq = 0; outio: if (rv == 0 || !attach) bus_space_unmap(sc->sc_iot, sc->sc_ioh, LEMAC_IOSIZE); return rv; }
int pcppi_match(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_handle_t ppi_ioh; int have_ppi, rv; u_int8_t v, nv; if (ISA_DIRECT_CONFIG(ia)) return (0); /* If values are hardwired to something that they can't be, punt. */ if (ia->ia_nio < 1 || (ia->ia_io[0].ir_addr != ISA_UNKNOWN_PORT && ia->ia_io[0].ir_addr != IO_PPI)) return (0); if (ia->ia_niomem > 0 && (ia->ia_iomem[0].ir_addr != ISA_UNKNOWN_IOMEM)) return (0); if (ia->ia_nirq > 0 && (ia->ia_irq[0].ir_irq != ISA_UNKNOWN_IRQ)) return (0); if (ia->ia_ndrq > 0 && (ia->ia_drq[0].ir_drq != ISA_UNKNOWN_DRQ)) return (0); rv = 0; have_ppi = 0; if (bus_space_map(ia->ia_iot, IO_PPI, 1, 0, &ppi_ioh)) goto lose; have_ppi = 1; /* * Check for existence of PPI. Realistically, this is either going to * be here or nothing is going to be here. * * We don't want to have any chance of changing speaker output (which * this test might, if it crashes in the middle, or something; * normally it's be to quick to produce anthing audible), but * many "combo chip" mock-PPI's don't seem to support the top bit * of Port B as a settable bit. The bottom bit has to be settable, * since the speaker driver hardware still uses it. */ v = bus_space_read_1(ia->ia_iot, ppi_ioh, 0); /* XXX */ bus_space_write_1(ia->ia_iot, ppi_ioh, 0, v ^ 0x01); /* XXX */ nv = bus_space_read_1(ia->ia_iot, ppi_ioh, 0); /* XXX */ if (((nv ^ v) & 0x01) == 0x01) rv = 1; bus_space_write_1(ia->ia_iot, ppi_ioh, 0, v); /* XXX */ nv = bus_space_read_1(ia->ia_iot, ppi_ioh, 0); /* XXX */ if (((nv ^ v) & 0x01) != 0x00) { rv = 0; goto lose; } /* * We assume that the programmable interval timer is there. */ lose: if (have_ppi) bus_space_unmap(ia->ia_iot, ppi_ioh, 1); if (rv) { ia->ia_io[0].ir_addr = IO_PPI; ia->ia_io[0].ir_size = 1; ia->ia_nio = 1; ia->ia_niomem = 0; ia->ia_nirq = 0; ia->ia_ndrq = 0; } return (rv); }
/* * Probe routine. * * See if the card is there and at the right place. * (XXX - cgd -- needs help) */ int elprobe(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; int iobase; u_int8_t station_addr[ETHER_ADDR_LEN]; u_int8_t i; int rval; rval = 0; if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); iobase = ia->ia_io[0].ir_addr; if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) return (0); if (ia->ia_irq[0].ir_irq == ISA_UNKNOWN_IRQ) return (0); /* First check the base. */ if (iobase < 0x200 || iobase > 0x3f0) return 0; /* Map i/o space. */ if (bus_space_map(iot, iobase, 16, 0, &ioh)) return 0; /* * Now attempt to grab the station address from the PROM and see if it * contains the 3com vendor code. */ DPRINTF(("Probing 3c501 at 0x%x...\n", iobase)); /* Reset the board. */ DPRINTF(("Resetting board...\n")); bus_space_write_1(iot, ioh, EL_AC, EL_AC_RESET); delay(5); bus_space_write_1(iot, ioh, EL_AC, 0); /* Now read the address. */ DPRINTF(("Reading station address...\n")); for (i = 0; i < ETHER_ADDR_LEN; i++) { bus_space_write_1(iot, ioh, EL_GPBL, i); station_addr[i] = bus_space_read_1(iot, ioh, EL_EAW); } DPRINTF(("Address is %s\n", ether_sprintf(station_addr))); /* * If the vendor code is ok, return a 1. We'll assume that whoever * configured this system is right about the IRQ. */ if (station_addr[0] != 0x02 || station_addr[1] != 0x60 || station_addr[2] != 0x8c) { DPRINTF(("Bad vendor code.\n")); goto out; } DPRINTF(("Vendor code ok.\n")); ia->ia_nio = 1; ia->ia_io[0].ir_size = 16; ia->ia_nirq = 1; ia->ia_niomem = 0; ia->ia_ndrq = 0; rval = 1; out: bus_space_unmap(iot, ioh, 16); return rval; }
int adv_isa_probe(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_tag_t iot = ia->ia_iot; bus_space_handle_t ioh; int port_index; int iobase, irq, drq; int rv = 0; if (ia->ia_nio < 1) return (0); if (ia->ia_nirq < 1) return (0); if (ia->ia_ndrq < 1) return (0); if (ISA_DIRECT_CONFIG(ia)) return (0); /* * If the I/O address is wildcarded, look for boards * in ascending order. */ if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) { for (port_index = 0; port_index < ASC_IOADR_TABLE_MAX_IX; port_index++) { iobase = asc_ioport[port_index]; if (iobase) { if (bus_space_map(iot, iobase, ASC_IOADR_GAP, 0, &ioh)) continue; rv = AscFindSignature(iot, ioh); if (rv) { ia->ia_io[0].ir_addr = iobase; break; } bus_space_unmap(iot, ioh, ASC_IOADR_GAP); } } if (rv == 0) return (0); } else { iobase = ia->ia_io[0].ir_addr; if (bus_space_map(iot, iobase, ASC_IOADR_GAP, 0, &ioh)) return (0); rv = AscFindSignature(iot, ioh); if (rv == 0) { bus_space_unmap(iot, ioh, ASC_IOADR_GAP); return (0); } } /* XXXJRT Probe routines should not have side-effects!! */ ASC_SET_CHIP_CONTROL(iot, ioh, ASC_CC_HALT); ASC_SET_CHIP_STATUS(iot, ioh, 0); irq = AscGetChipIRQ(iot, ioh, ASC_IS_ISA); drq = AscGetIsaDmaChannel(iot, ioh); /* Verify that the IRQ/DRQ match (or are wildcarded). */ if (ia->ia_irq[0].ir_irq != ISA_UNKNOWN_IRQ && ia->ia_irq[0].ir_irq != irq) { rv = 0; goto out; } if (ia->ia_drq[0].ir_drq != ISA_UNKNOWN_DRQ && ia->ia_drq[0].ir_drq != drq) { rv = 0; goto out; } ia->ia_nio = 1; ia->ia_io[0].ir_addr = iobase; ia->ia_io[0].ir_size = ASC_IOADR_GAP; ia->ia_nirq = 1; ia->ia_irq[0].ir_irq = irq; ia->ia_ndrq = 1; ia->ia_drq[0].ir_drq = drq; ia->ia_niomem = 0; out: bus_space_unmap(iot, ioh, ASC_IOADR_GAP); return rv; }