static void eisa_probe_nomatch(device_t dev, device_t child) { u_int32_t eisa_id = eisa_get_id(child); u_int8_t slot = eisa_get_slot(child); device_printf(dev, "%c%c%c%03x%01x (0x%08x) at slot %d (no driver attached)\n", EISA_MFCTR_CHAR0(eisa_id), EISA_MFCTR_CHAR1(eisa_id), EISA_MFCTR_CHAR2(eisa_id), EISA_PRODUCT_ID(eisa_id), EISA_REVISION_ID(eisa_id), eisa_id, slot); return; }
static int mainboard_probe(device_t dev) { char *idstring; eisa_id_t id = eisa_get_id(dev); if (eisa_get_slot(dev) != 0) return (ENXIO); idstring = (char *)malloc(8 + sizeof(" (System Board)") + 1, M_DEVBUF, M_NOWAIT); if (idstring == NULL) panic("Eisa probe unable to malloc"); sprintf(idstring, "%c%c%c%03x%01x (System Board)", EISA_MFCTR_CHAR0(id), EISA_MFCTR_CHAR1(id), EISA_MFCTR_CHAR2(id), EISA_PRODUCT_ID(id), EISA_REVISION_ID(id)); device_set_desc(dev, idstring); return (0); }
void ahc_linux_eisa_init(void) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) struct eisa_device_id *eid; struct aic7770_identity *id; int i; if (aic7xxx_probe_eisa_vl == 0) return; /* * Linux requires the EISA IDs to be specified in * the EISA ID string format. Perform the conversion * and setup a table with a NUL terminal entry. */ aic7770_driver.id_table = malloc(sizeof(struct eisa_device_id) * (ahc_num_aic7770_devs + 1), M_DEVBUF, M_NOWAIT); if (aic7770_driver.id_table == NULL) return; for (eid = (struct eisa_device_id *)aic7770_driver.id_table, id = aic7770_ident_table, i = 0; i < ahc_num_aic7770_devs; eid++, id++, i++) { sprintf(eid->sig, "%c%c%c%03X%01X", EISA_MFCTR_CHAR0(id->full_id), EISA_MFCTR_CHAR1(id->full_id), EISA_MFCTR_CHAR2(id->full_id), EISA_PRODUCT_ID(id->full_id), EISA_REVISION_ID(id->full_id)); eid->driver_data = i; } eid->sig[0] = 0; eisa_driver_register(&aic7770_driver); #else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) */ struct aic7770_identity *entry; u_int slot; u_int eisaBase; u_int i; if (aic7xxx_probe_eisa_vl == 0) return; eisaBase = 0x1000 + AHC_EISA_SLOT_OFFSET; for (slot = 1; slot < NUMSLOTS; eisaBase+=0x1000, slot++) { uint32_t eisa_id; size_t id_size; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) if (check_region(eisaBase, AHC_EISA_IOSIZE) != 0) continue; request_region(eisaBase, AHC_EISA_IOSIZE, "aic7xxx"); #else if (request_region(eisaBase, AHC_EISA_IOSIZE, "aic7xxx") == 0) continue; #endif eisa_id = 0; id_size = sizeof(eisa_id); for (i = 0; i < 4; i++) { /* VLcards require priming*/ outb(0x80 + i, eisaBase + IDOFFSET); eisa_id |= inb(eisaBase + IDOFFSET + i) << ((id_size-i-1) * 8); } release_region(eisaBase, AHC_EISA_IOSIZE); if (eisa_id & 0x80000000) continue; /* no EISA card in slot */ entry = aic7770_find_device(eisa_id); if (entry != NULL) aic7770_linux_config(entry, NULL, eisaBase); } #endif }