static int bt_mca_probe (device_t dev) { const char * desc; mca_id_t id = mca_get_id(dev); struct bt_probe_info info; u_int32_t iobase = 0; u_int32_t iosize = 0; u_int8_t drq = 0; u_int8_t irq = 0; u_int8_t pos; int result; desc = mca_match_id(id, bt_mca_devs); if (!desc) return (ENXIO); device_set_desc(dev, desc); pos = (mca_pos_read(dev, BT_MCA_IOPORT_POS1) & BT_MCA_IOPORT_MASK1) | (mca_pos_read(dev, BT_MCA_IOPORT_POS2) & BT_MCA_IOPORT_MASK2); iobase = BT_MCA_IOPORT(pos); iosize = BT_MCA_IOPORT_SIZE; pos = mca_pos_read(dev, BT_MCA_DRQ_POS); drq = BT_MCA_DRQ(pos); pos = mca_pos_read(dev, BT_MCA_IRQ_POS); irq = BT_MCA_IRQ(pos); bt_mark_probed_iop(iobase); mca_add_iospace(dev, iobase, iosize); /* And allocate them */ bt_mca_alloc_resources(dev, BT_MCA_PROBE); if (bt_port_probe(dev, &info) != 0) { printf("bt_mca_probe: Probe failed for " "card at slot %d\n", mca_get_slot(dev) + 1); result = ENXIO; } else { mca_add_drq(dev, drq); mca_add_irq(dev, irq); result = BUS_PROBE_DEFAULT; } bt_mca_release_resources(dev); return (result); }
static int bt_eisa_probe(device_t dev) { const char *desc; u_long iobase; struct bt_probe_info info; u_long port; u_long iosize; u_int ioconf; int result; int shared; desc = bt_match(eisa_get_id(dev)); if (!desc) return (ENXIO); device_set_desc(dev, desc); iobase = (eisa_get_slot(dev) * EISA_SLOT_SIZE); if (eisa_get_id(dev) == EISA_DEVICE_ID_AMI_4801) { u_int ioconf1; iobase += AMI_EISA_SLOT_OFFSET; iosize = AMI_EISA_IOSIZE; ioconf1 = inb(iobase + AMI_EISA_IOCONF1); /* Determine "ISA" I/O port */ switch (ioconf1 & AMI_PORTADDR) { case AMI_PORT_330: port = 0x330; break; case AMI_PORT_334: port = 0x334; break; case AMI_PORT_230: port = 0x230; break; case AMI_PORT_234: port = 0x234; break; case AMI_PORT_134: port = 0x134; break; case AMI_PORT_130: port = 0x130; break; default: /* Disabled */ printf("bt: AMI EISA Adapter at " "slot %d has a disabled I/O " "port. Cannot attach.\n", eisa_get_slot(dev)); return (ENXIO); } shared = (inb(iobase + AMI_EISA_IOCONF1) & AMI_IRQ_LEVEL) ? EISA_TRIGGER_LEVEL : EISA_TRIGGER_EDGE; } else { iobase += BT_EISA_SLOT_OFFSET; iosize = BT_EISA_IOSIZE; ioconf = inb(iobase + EISA_IOCONF); /* Determine "ISA" I/O port */ switch (ioconf & PORTADDR) { case PORT_330: port = 0x330; break; case PORT_334: port = 0x334; break; case PORT_230: port = 0x230; break; case PORT_234: port = 0x234; break; case PORT_130: port = 0x130; break; case PORT_134: port = 0x134; break; default: /* Disabled */ printf("bt: Buslogic EISA Adapter at " "slot %d has a disabled I/O " "port. Cannot attach.\n", eisa_get_slot(dev)); return (ENXIO); } shared = (inb(iobase + EISA_IRQ_TYPE) & LEVEL) ? EISA_TRIGGER_LEVEL : EISA_TRIGGER_EDGE; } bt_mark_probed_iop(port); /* Tell parent where our resources are going to be */ eisa_add_iospace(dev, iobase, iosize, RESVADDR_NONE); eisa_add_iospace(dev, port, BT_IOSIZE, RESVADDR_NONE); /* And allocate them */ bt_eisa_alloc_resources(dev); if (bt_port_probe(dev, &info) != 0) { printf("bt_eisa_probe: Probe failed for " "card at slot 0x%x\n", eisa_get_slot(dev)); result = ENXIO; } else { eisa_add_intr(dev, info.irq, shared); result = 0; } bt_eisa_release_resources(dev); return (result); }
/* * Check if the device can be found at the port given * and if so, set it up ready for further work * as an argument, takes the isa_device structure from * autoconf.c */ static int bt_isa_probe(device_t dev) { /* * find unit and check we have that many defined */ int port_index; int max_port_index; /* No pnp support */ if (isa_get_vendorid(dev)) return (ENXIO); port_index = 0; max_port_index = BT_NUM_ISAPORTS - 1; /* * Bound our board search if the user has * specified an exact port. */ bt_find_probe_range(isa_get_port(dev), &port_index, &max_port_index); if (port_index < 0) return (ENXIO); /* Attempt to find an adapter */ for (;port_index <= max_port_index; port_index++) { struct bt_probe_info info; u_int ioport; ioport = bt_iop_from_bio(port_index); /* * Ensure this port has not already been claimed already * by a PCI, EISA or ISA adapter. */ if (bt_check_probed_iop(ioport) != 0) continue; /* Initialise the softc for use during probing */ if (bt_isa_alloc_resources(dev, ioport, ioport + BT_NREGS -1) != 0) continue; /* We're going to attempt to probe it now, so mark it probed */ bt_mark_probed_bio(port_index); if (bt_port_probe(dev, &info) != 0) { if (bootverbose) kprintf("bt_isa_probe: Probe failed at 0x%x\n", ioport); bt_isa_release_resources(dev); continue; } bt_isa_release_resources(dev); bus_set_resource(dev, SYS_RES_DRQ, 0, info.drq, 1, -1); bus_set_resource(dev, SYS_RES_IRQ, 0, info.irq, 1, machintr_legacy_intr_cpuid(info.irq)); return (0); } return (ENXIO); }