/* * 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); }
/* * 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(struct device *parent, void *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_iobase != IOBASEUNK) return (ahc_isa_match(ia, ia->ia_iobase)); /* * Find this bus's state. If we don't yet have a slot * marker, allocate and initialize one. */ LIST_FOREACH(as, &ahc_isa_all_slots, link) if (as->bus == parent->dv_unit) 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 = parent->dv_unit; 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); }