/*---------------------------------------------------------------------------* * probe for ISA non-PnP cards *---------------------------------------------------------------------------*/ static int isic_isa_probe(device_t dev) { int ret = ENXIO; if(isa_get_vendorid(dev)) /* no PnP probes here */ return ENXIO; switch(device_get_flags(dev)) { #ifdef TEL_S0_16 case CARD_TYPEP_16: ret = isic_probe_s016(dev); break; #endif #ifdef TEL_S0_8 case CARD_TYPEP_8: ret = isic_probe_s08(dev); break; #endif #ifdef ELSA_PCC16 case CARD_TYPEP_PCC16: ret = isic_probe_Epcc16(dev); break; #endif #ifdef TEL_S0_16_3 case CARD_TYPEP_16_3: ret = isic_probe_s0163(dev); break; #endif #ifdef AVM_A1 case CARD_TYPEP_AVMA1: ret = isic_probe_avma1(dev); break; #endif #ifdef USR_STI case CARD_TYPEP_USRTA: ret = isic_probe_usrtai(dev); break; #endif #ifdef ITKIX1 case CARD_TYPEP_ITKIX1: ret = isic_probe_itkix1(dev); break; #endif default: kprintf("isic%d: probe, unknown flag: %d\n", device_get_unit(dev), device_get_flags(dev)); break; } return(ret); }
/*---------------------------------------------------------------------------* * isic - non-pnp device driver probe routine *---------------------------------------------------------------------------*/ static int isicprobe(struct isa_device *dev) { int ret = 0; if(dev->id_unit != next_isic_unit) { printf("isicprobe: Error: new unit (%d) != next_isic_unit (%d)!\n", dev->id_unit, next_isic_unit); return(0); } switch(dev->id_flags) { #ifdef TEL_S0_8 case FLAG_TELES_S0_8: ret = isic_probe_s08(dev); break; #endif #ifdef TEL_S0_16 case FLAG_TELES_S0_16: ret = isic_probe_s016(dev); break; #endif #ifdef TEL_S0_16_3 case FLAG_TELES_S0_163: ret = isic_probe_s0163(dev); break; #endif #ifdef AVM_A1 case FLAG_AVM_A1: ret = isic_probe_avma1(dev); break; #endif #ifdef USR_STI case FLAG_USR_ISDN_TA_INT: ret = isic_probe_usrtai(dev); break; #endif #ifdef ITKIX1 case FLAG_ITK_IX1: ret = isic_probe_itkix1(dev); break; #endif default: break; } return(ret); }
/* * 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; }
/* * Attach the card */ static void isic_isa_attach(device_t parent, device_t self, void *aux) { struct isic_softc *sc = device_private(self); struct isa_attach_args *ia = aux; int flags = device_cfdata(self)->cf_flags; int ret = 0, iobase, iosize, maddr, msize; struct isic_attach_args args; if (ia->ia_nio > 0) { iobase = ia->ia_io[0].ir_addr; iosize = ia->ia_io[0].ir_size; } else { iobase = ISA_UNKNOWN_PORT; iosize = 0; } if (ia->ia_niomem > 0) { maddr = ia->ia_iomem[0].ir_addr; msize = ia->ia_iomem[0].ir_size; } else { maddr = ISA_UNKNOWN_IOMEM; msize = 0; } /* Setup parameters */ sc->sc_dev = self; sc->sc_irq = ia->ia_irq[0].ir_irq; sc->sc_maddr = maddr; sc->sc_num_mappings = 0; sc->sc_maps = NULL; 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: setup_io_map(flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &(sc->sc_num_mappings), NULL, NULL, NULL); MALLOC_MAPS(sc); setup_io_map(flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &(sc->sc_num_mappings), &(sc->sc_maps[0]), NULL, NULL); break; default: /* No card type given, try to figure ... */ /* setup MI attach args */ memset(&args, 0, sizeof(args)); args.ia_flags = flags; /* Probe cards */ 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; setup_io_map(args.ia_flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], NULL, NULL); ret = isic_probe_s08(&args); if (ret) goto found; args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); #endif /* ISICISA_TEL_S0_8 */ } else if (maddr == ISA_UNKNOWN_IOMEM) { /* no shared memory, only a 16.3 based card, AVM A1, the usr sportster or an ITK would work */ ret = 0; #ifdef ISICISA_TEL_S0_16_3 args.ia_flags = FLAG_TELES_S0_163; setup_io_map(args.ia_flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], NULL, NULL); ret = isic_probe_s0163(&args); if (ret) goto found; args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); #endif /* ISICISA_TEL_S0_16_3 */ #ifdef ISICISA_AVM_A1 args.ia_flags = FLAG_AVM_A1; setup_io_map(args.ia_flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], NULL, NULL); ret = isic_probe_avma1(&args); if (ret) goto found; args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); #endif /* ISICISA_AVM_A1 */ #ifdef ISICISA_USR_STI args.ia_flags = FLAG_USR_ISDN_TA_INT; setup_io_map(args.ia_flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], NULL, NULL); ret = isic_probe_usrtai(&args); if (ret) goto found; args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); #endif /* ISICISA_USR_STI */ #ifdef ISICISA_ITKIX1 args.ia_flags = FLAG_ITK_IX1; setup_io_map(args.ia_flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], NULL, NULL); ret = isic_probe_itkix1(&args); if (ret) goto found; args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); #endif /* ISICISA_ITKIX1 */ } else { /* could be anything */ ret = 0; #ifdef ISICISA_TEL_S0_16_3 args.ia_flags = FLAG_TELES_S0_163; setup_io_map(args.ia_flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], NULL, NULL); ret = isic_probe_s0163(&args); if (ret) goto found; args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); #endif /* ISICISA_TEL_S0_16_3 */ #ifdef ISICISA_TEL_S0_16 args.ia_flags = FLAG_TELES_S0_16; setup_io_map(args.ia_flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], NULL, NULL); ret = isic_probe_s016(&args); if (ret) goto found; args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); #endif /* ISICISA_TEL_S0_16 */ #ifdef ISICISA_AVM_A1 args.ia_flags = FLAG_AVM_A1; setup_io_map(args.ia_flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], NULL, NULL); ret = isic_probe_avma1(&args); if (ret) goto found; args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); #endif /* ISICISA_AVM_A1 */ #ifdef ISICISA_TEL_S0_8 args.ia_flags = FLAG_TELES_S0_8; setup_io_map(args.ia_flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &args.ia_num_mappings, &args.ia_maps[0], NULL, NULL); ret = isic_probe_s08(&args); if (ret) goto found; args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); #endif /* ISICISA_TEL_S0_8 */ } break; found: flags = args.ia_flags; sc->sc_num_mappings = args.ia_num_mappings; args_unmap(&args.ia_num_mappings, &args.ia_maps[0]); if (ret) { MALLOC_MAPS(sc); setup_io_map(flags, ia->ia_iot, ia->ia_memt, iobase, maddr, &(sc->sc_num_mappings), &(sc->sc_maps[0]), NULL, NULL); } else { printf(": could not determine card type - not configured!\n"); return; } break; } /* MI initialization of card */ isicattach(flags, sc); /* * Try to get a level-triggered interrupt first. If that doesn't * work (like on NetBSD/Atari, try to establish an edge triggered * interrupt. */ if (isa_intr_establish(ia->ia_ic, ia->ia_irq[0].ir_irq, IST_LEVEL, IPL_NET, isicintr, sc) == NULL) { if(isa_intr_establish(ia->ia_ic, ia->ia_irq[0].ir_irq, IST_EDGE, IPL_NET, isicintr, sc) == NULL) { args_unmap(&(sc->sc_num_mappings), &(sc->sc_maps[0])); free((sc)->sc_maps, M_DEVBUF); } else { /* * XXX: This is a hack that probably needs to be * solved by setting an interrupt type in the sc * structure. I don't feel familiar enough with the * code to do this currently. Feel free to contact * me about it ([email protected]). */ isicintr(sc); } } }