/*---------------------------------------------------------------------------* * isic_attach_avm_pnp - attach Fritz!Card PnP *---------------------------------------------------------------------------*/ int isic_attach_avm_pnp(struct isa_device *dev, unsigned int iobase2) { struct isic_softc *sc; u_int v; int unit; unit = dev->id_unit; sc = &isic_sc[unit]; /* this thing doesn't have an HSCX, so fake the base addresses */ /* put the unit number into the lower byte - HACK */ HSCX_A_BASE = (caddr_t)(HSCX0FAKE + unit); HSCX_B_BASE = (caddr_t)(HSCX1FAKE + unit); /* reset the card */ /* the Linux driver does this to clear any pending ISAC interrupts */ v = 0; v = ISAC_READ(I_STAR); v = ISAC_READ(I_MODE); v = ISAC_READ(I_ADF2); v = ISAC_READ(I_ISTA); if (v & ISAC_ISTA_EXI) { v = ISAC_READ(I_EXIR); } v = ISAC_READ(I_CIRR); ISAC_WRITE(I_MASK, 0xff); /* the Linux driver does this to clear any pending HSCX interrupts */ v = hscx_read_reg(0, HSCX_STAT, sc); v = hscx_read_reg(0, HSCX_STAT+1, sc); v = hscx_read_reg(0, HSCX_STAT+2, sc); v = hscx_read_reg(0, HSCX_STAT+3, sc); v = hscx_read_reg(1, HSCX_STAT, sc); v = hscx_read_reg(1, HSCX_STAT+1, sc); v = hscx_read_reg(1, HSCX_STAT+2, sc); v = hscx_read_reg(1, HSCX_STAT+3, sc); outb(sc->sc_port + STAT0_OFFSET, ASL_RESET_ALL|ASL_TIMERDISABLE); DELAY(SEC_DELAY/100); /* 10 ms */ outb(sc->sc_port + STAT0_OFFSET, ASL_TIMERRESET|ASL_ENABLE_INT|ASL_TIMERDISABLE); DELAY(SEC_DELAY/100); /* 10 ms */ outb(sc->sc_port + STAT1_OFFSET, ASL1_ENABLE_IOM+(ffs(sc->sc_irq)-1)); DELAY(SEC_DELAY/100); /* 10 ms */ printf("isic%d: ISAC %s (IOM-%c)\n", unit, "2085 Version A1/A2 or 2086/2186 Version 1.1", sc->sc_bustyp == BUS_TYPE_IOM1 ? '1' : '2'); /* init the ISAC */ isic_isac_init(sc); /* init the "HSCX" */ avm_pnp_bchannel_setup(sc->sc_unit, HSCX_CH_A, BPROT_NONE, 0); avm_pnp_bchannel_setup(sc->sc_unit, HSCX_CH_B, BPROT_NONE, 0); /* can't use the normal B-Channel stuff */ avm_pnp_init_linktab(sc); /* set trace level */ sc->sc_trace = TRACE_OFF; sc->sc_state = ISAC_IDLE; sc->sc_ibuf = NULL; sc->sc_ib = NULL; sc->sc_ilen = 0; sc->sc_obuf = NULL; sc->sc_op = NULL; sc->sc_ol = 0; sc->sc_freeflag = 0; sc->sc_obuf2 = NULL; sc->sc_freeflag2 = 0; #if defined(__FreeBSD__) && __FreeBSD__ >=3 callout_handle_init(&sc->sc_T3_callout); callout_handle_init(&sc->sc_T4_callout); #endif /* init higher protocol layers */ MPH_Status_Ind(sc->sc_unit, STI_ATTACH, sc->sc_cardtyp); return(0); }
/*---------------------------------------------------------------------------* * L0 -> L1 status indication from hardware *---------------------------------------------------------------------------*/ int i4b_l1_mph_status_ind(int drv_unit, int status, int parm, struct i4b_l1mux_func *l1mux_func_p) { int *tab; /* * in case the status STI_ATTACH is sent from the hardware, the * driver has just attached itself and we need to initialize * the tables and assorted variables. */ if(status == STI_ATTACH) { if (l1mux_func_p == NULL) panic("i4b_l1_mph_status_ind: i4b_l1mux_func pointer is NULL\n"); if(numl1units < MAXL1UNITS) { if((tab = getl1tab(L0DRVR(drv_unit))) == NULL) panic("i4b_l1_mph_status_ind: unknown driver type %d\n", L0DRVR(drv_unit)); tab[L0UNIT(drv_unit)] = numl1units; l1drvunittab[numl1units] = drv_unit; l1mux_func[L0DRVR(drv_unit)] = l1mux_func_p; switch(L0DRVR(drv_unit)) { #if NISIC > 0 case L1DRVR_ISIC: kprintf("isic%d: passive stack unit %d\n", L0UNIT(drv_unit), numl1units); break; #endif #if NIWIC > 0 case L1DRVR_IWIC: kprintf("iwic%d: passive stack unit %d\n", L0UNIT(drv_unit), numl1units); break; #endif #if NIFPI > 0 case L1DRVR_IFPI: kprintf("ifpi%d: passive stack unit %d\n", L0UNIT(drv_unit), numl1units); break; #endif #if NIFPI2 > 0 case L1DRVR_IFPI2: kprintf("ifpi2-%d: passive stack unit %d\n", L0UNIT(drv_unit), numl1units); break; #endif #if NIFPNP > 0 case L1DRVR_IFPNP: kprintf("ifpnp%d: passive stack unit %d\n", L0UNIT(drv_unit), numl1units); break; #endif #if NIHFC > 0 case L1DRVR_IHFC: kprintf("ihfc%d: passive stack unit %d\n", L0UNIT(drv_unit), numl1units); break; #endif #if NITJC > 0 case L1DRVR_ITJC: kprintf("itjc%d: passive stack unit %d\n", L0UNIT(drv_unit), numl1units); break; #endif } NDBGL1(L1_PRIM, "ATTACH drv %d, drvunit %d -> unit %d", L0DRVR(drv_unit), L0UNIT(drv_unit), numl1units); numl1units++; } } if((tab = getl1tab(L0DRVR(drv_unit))) == NULL) panic("i4b_l1_mph_status_ind: unknown driver type %d\n", L0DRVR(drv_unit)); NDBGL1(L1_PRIM, "(drv %d / drvunit %d) -> unit %d\n", L0DRVR(drv_unit), L0UNIT(drv_unit), tab[L0UNIT(drv_unit)]); return(MPH_Status_Ind(tab[L0UNIT(drv_unit)], status, parm)); }
int isicattach(int flags, struct isic_softc *sc) #endif /* __FreeBSD__ */ { int ret = 0; char *drvid; #ifdef __FreeBSD__ struct isic_softc *sc = &isic_sc[dev->id_unit]; #define PARM dev #define PARM2 dev, iobase2 #define FLAGS dev->id_flags #else #define PARM sc #define PARM2 sc #define FLAGS flags #endif static char *ISACversion[] = { "2085 Version A1/A2 or 2086/2186 Version 1.1", "2085 Version B1", "2085 Version B2", "2085 Version V2.3 (B3)", "Unknown Version" }; static char *HSCXversion[] = { "82525 Version A1", "Unknown (0x01)", "82525 Version A2", "Unknown (0x03)", "82525 Version A3", "82525 or 21525 Version 2.1", "Unknown Version" }; /* done in bus specific attach code for other OS */ #ifdef __FreeBSD__ if(dev->id_unit != next_isic_unit) { printf("isicattach: Error: new unit (%d) != next_isic_unit (%d)!\n", dev->id_unit, next_isic_unit); return(0); } sc->sc_unit = dev->id_unit; #else isic_sc[sc->sc_unit] = sc; #endif /* card dependent setup */ switch(FLAGS) { #ifdef DYNALINK case FLAG_DYNALINK: ret = isic_attach_Dyn(PARM2); break; #endif #ifdef TEL_S0_8 case FLAG_TELES_S0_8: ret = isic_attach_s08(PARM); break; #endif #ifdef TEL_S0_16 case FLAG_TELES_S0_16: ret = isic_attach_s016(PARM); break; #endif #ifdef TEL_S0_16_3 case FLAG_TELES_S0_163: ret = isic_attach_s0163(PARM); break; #endif #ifdef AVM_A1 case FLAG_AVM_A1: ret = isic_attach_avma1(PARM); break; #endif #ifdef USR_STI case FLAG_USR_ISDN_TA_INT: ret = isic_attach_usrtai(PARM); break; #endif #ifdef ITKIX1 case FLAG_ITK_IX1: ret = isic_attach_itkix1(PARM); break; #endif /* ====================================================================== * Only P&P cards follow below!!! */ #ifdef __FreeBSD__ /* we've already splitted all non-ISA stuff out of this ISA specific part for the other OS */ #ifdef AVM_PCMCIA case FLAG_AVM_A1_PCMCIA: ret = isic_attach_fritzpcmcia(PARM); break; #endif #ifndef __FreeBSD__ #ifdef TEL_S0_16_3_P case FLAG_TELES_S0_163_PnP: ret = isic_attach_s0163P(PARM2); break; #endif #endif #ifdef CRTX_S0_P case FLAG_CREATIX_S0_PnP: ret = isic_attach_Cs0P(PARM2); break; #endif #ifdef DRN_NGO case FLAG_DRN_NGO: ret = isic_attach_drnngo(PARM2); break; #endif #ifdef SEDLBAUER case FLAG_SWS: ret = isic_attach_sws(PARM); break; #endif #ifdef ELSA_QS1ISA case FLAG_ELSA_QS1P_ISA: ret = isic_attach_Eqs1pi(PARM2); break; #endif #endif /* __FreeBSD__ / P&P specific part */ /* --- XXX - don't know how to handle this - should be removed!!!! ---- */ #ifdef amiga case FLAG_BLMASTER: ret = 1; /* full detection was done in caller */ break; #endif /* ------------------------------------------------------------------- */ default: break; } if(ret == 0) return(0); sc->sc_isac_version = 0; sc->sc_isac_version = ((ISAC_READ(I_RBCH)) >> 5) & 0x03; switch(sc->sc_isac_version) { case ISAC_VA: case ISAC_VB1: case ISAC_VB2: case ISAC_VB3: break; default: printf(ISIC_FMT "Error, ISAC version %d unknown!\n", ISIC_PARM, sc->sc_isac_version); return(0); break; } sc->sc_hscx_version = HSCX_READ(0, H_VSTR) & 0xf; switch(sc->sc_hscx_version) { case HSCX_VA1: case HSCX_VA2: case HSCX_VA3: case HSCX_V21: break; default: printf(ISIC_FMT "Error, HSCX version %d unknown!\n", ISIC_PARM, sc->sc_hscx_version); return(0); break; }; /* ISAC setup */ isic_isac_init(sc); /* HSCX setup */ isic_bchannel_setup(sc->sc_unit, HSCX_CH_A, BPROT_NONE, 0); isic_bchannel_setup(sc->sc_unit, HSCX_CH_B, BPROT_NONE, 0); /* setup linktab */ isic_init_linktab(sc); /* set trace level */ sc->sc_trace = TRACE_OFF; sc->sc_state = ISAC_IDLE; sc->sc_ibuf = NULL; sc->sc_ib = NULL; sc->sc_ilen = 0; sc->sc_obuf = NULL; sc->sc_op = NULL; sc->sc_ol = 0; sc->sc_freeflag = 0; sc->sc_obuf2 = NULL; sc->sc_freeflag2 = 0; #if defined(__FreeBSD__) && __FreeBSD__ >=3 callout_handle_init(&sc->sc_T3_callout); callout_handle_init(&sc->sc_T4_callout); #endif /* init higher protocol layers */ MPH_Status_Ind(sc->sc_unit, STI_ATTACH, sc->sc_cardtyp); /* announce manufacturer and card type */ switch(FLAGS) { case FLAG_TELES_S0_8: drvid = "Teles S0/8 or Niccy 1008"; break; case FLAG_TELES_S0_16: drvid = "Teles S0/16, Creatix ISDN S0-16 or Niccy 1016"; break; case FLAG_TELES_S0_163: drvid = "Teles S0/16.3"; break; case FLAG_AVM_A1: drvid = "AVM A1 or AVM Fritz!Card"; break; case FLAG_AVM_A1_PCMCIA: drvid = "AVM PCMCIA Fritz!Card"; break; case FLAG_TELES_S0_163_PnP: drvid = "Teles S0/PnP"; break; case FLAG_CREATIX_S0_PnP: drvid = "Creatix ISDN S0-16 P&P"; break; case FLAG_USR_ISDN_TA_INT: drvid = "USRobotics Sportster ISDN TA intern"; break; case FLAG_DRN_NGO: drvid = "Dr. Neuhaus NICCY Go@"; break; case FLAG_DYNALINK: drvid = "Dynalink IS64PH"; break; case FLAG_SWS: drvid = "Sedlbauer WinSpeed"; break; case FLAG_BLMASTER: /* board announcement was done by caller */ drvid = (char *)0; break; case FLAG_ELSA_QS1P_ISA: drvid = "ELSA QuickStep 1000pro (ISA)"; break; case FLAG_ITK_IX1: drvid = "ITK ix1 micro"; break; default: drvid = "ERROR, unknown flag used"; break; } #ifndef __FreeBSD__ printf("\n"); #endif if (drvid) printf(ISIC_FMT "%s\n", ISIC_PARM, drvid); /* announce chip versions */ if(sc->sc_isac_version >= ISAC_UNKN) { printf(ISIC_FMT "ISAC Version UNKNOWN (VN=0x%x)" TERMFMT, ISIC_PARM, sc->sc_isac_version); sc->sc_isac_version = ISAC_UNKN; } else { printf(ISIC_FMT "ISAC %s (IOM-%c)" TERMFMT, ISIC_PARM, ISACversion[sc->sc_isac_version], sc->sc_bustyp == BUS_TYPE_IOM1 ? '1' : '2'); } #ifdef __FreeBSD__ printf("(Addr=0x%lx)\n", (u_long)ISAC_BASE); #endif if(sc->sc_hscx_version >= HSCX_UNKN) { printf(ISIC_FMT "HSCX Version UNKNOWN (VN=0x%x)" TERMFMT, ISIC_PARM, sc->sc_hscx_version); sc->sc_hscx_version = HSCX_UNKN; } else { printf(ISIC_FMT "HSCX %s" TERMFMT, ISIC_PARM, HSCXversion[sc->sc_hscx_version]); } #ifdef __FreeBSD__ printf("(AddrA=0x%lx, AddrB=0x%lx)\n", (u_long)HSCX_A_BASE, (u_long)HSCX_B_BASE); next_isic_unit++; #if defined(__FreeBSD_version) && __FreeBSD_version >= 300003 /* set the interrupt handler - no need to change isa_device.h */ dev->id_intr = (inthand2_t *)isicintr; #endif #endif /* __FreeBSD__ */ return(1); #undef PARM #undef FLAGS }