This is a patch to make the Siemens Isurf 2.0 card work under NetBSD, got from Juergen Hannken-Illjes - hannken@eis.cs.tu-bs.de --- i4b/Makefile.inc.DIST Thu Sep 30 09:49:12 1999 +++ i4b/Makefile.inc Thu Aug 31 19:16:42 2000 @@ -43,5 +43,5 @@ .if (${BSDTYPE} == "NetBSD" || ${BSDTYPE} == "OpenBSD" || ${BSDTYPE} == "BSD/OS") # NetBSD requires this to do inplace builds -COPTS += -I.. +COPTS += -I$(.CURDIR)/.. .endif --- i4b/NetBSD/files.i4b.isa.DIST Wed Dec 16 14:39:46 1998 +++ i4b/NetBSD/files.i4b.isa Thu Aug 31 19:14:47 2000 @@ -26,2 +26,3 @@ file i4b/layer1/i4b_sws.c isapnp_isic file i4b/layer1/i4b_dynalink.c isapnp_isic +file i4b/layer1/i4b_siemens_isurf.c isapnp_isic --- i4b/layer1/i4b_siemens_isurf.c.DIST Thu Dec 2 19:22:59 1999 +++ i4b/layer1/i4b_siemens_isurf.c Thu Aug 31 19:27:25 2000 @@ -48,24 +48,46 @@ #include "opt_i4b.h" +#else + +#define NISIC 1 + +#endif + #if NISIC > 0 && defined(SIEMENS_ISURF2) #include -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 +#include +#include +#include + +#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 +#include +#endif + +#if defined(__FreeBSD__) +#if __FreeBSD__ >= 3 #include #else #include #endif -#include -#include -#include #include #include +#else +#include +#include +#endif + #include #include +#if defined(__FreeBSD__) #include #include +#else +#include +#include +#endif #include @@ -78,4 +100,8 @@ #include +#if !defined(__FreeBSD__) +void isic_attach_siemens_isurf __P((struct l1_softc *sc)); +#endif + /* masks for register encoded in base addr */ @@ -98,4 +124,5 @@ * Siemens I-Surf 2.0 PnP ISAC get fifo routine *---------------------------------------------------------------------------*/ +#if defined(__FreeBSD__) static void @@ -119,7 +146,33 @@ } +#else + +static void +siemens_isurf_read_fifo(struct l1_softc *sc, int what, void *buf, size_t size) +{ + bus_space_tag_t t = sc->sc_maps[0].t; + bus_space_handle_t h = sc->sc_maps[0].h; + switch (what) { + case ISIC_WHAT_ISAC: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_ISAC_OFF); + bus_space_read_multi_1(t, h, SIE_ISURF_OFF_RW, buf, size); + break; + case ISIC_WHAT_HSCXA: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_HSCXA_OFF); + bus_space_read_multi_1(t, h, SIE_ISURF_OFF_RW, buf, size); + break; + case ISIC_WHAT_HSCXB: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_HSCXB_OFF); + bus_space_read_multi_1(t, h, SIE_ISURF_OFF_RW, buf, size); + break; + } +} + +#endif + /*---------------------------------------------------------------------------* * Siemens I-Surf 2.0 PnP ISAC put fifo routine *---------------------------------------------------------------------------*/ +#if defined(__FreeBSD__) static void @@ -143,7 +196,33 @@ } +#else + +static void +siemens_isurf_write_fifo(struct l1_softc *sc, int what, const void *buf, size_t size) +{ + bus_space_tag_t t = sc->sc_maps[0].t; + bus_space_handle_t h = sc->sc_maps[0].h; + switch (what) { + case ISIC_WHAT_ISAC: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_ISAC_OFF); + bus_space_write_multi_1(t, h, SIE_ISURF_OFF_RW, (u_int8_t*)buf, size); + break; + case ISIC_WHAT_HSCXA: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_HSCXA_OFF); + bus_space_write_multi_1(t, h, SIE_ISURF_OFF_RW, (u_int8_t*)buf, size); + break; + case ISIC_WHAT_HSCXB: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_HSCXB_OFF); + bus_space_write_multi_1(t, h, SIE_ISURF_OFF_RW, (u_int8_t*)buf, size); + break; + } +} + +#endif + /*---------------------------------------------------------------------------* * Siemens I-Surf 2.0 PnP ISAC put register routine *---------------------------------------------------------------------------*/ +#if defined(__FreeBSD__) static void @@ -172,7 +251,37 @@ } +#else + +static void +siemens_isurf_write_reg(struct l1_softc *sc, int what, bus_size_t offs, u_int8_t data) +{ + bus_space_tag_t t = sc->sc_maps[0].t; + bus_space_handle_t h = sc->sc_maps[0].h; + switch (what) { + case ISIC_WHAT_ISAC: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_ISAC_OFF+offs); + bus_space_write_1(t, h, SIE_ISURF_OFF_RW, data); + break; + case ISIC_WHAT_HSCXA: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_HSCXA_OFF+offs); + bus_space_write_1(t, h, SIE_ISURF_OFF_RW, data); + break; + case ISIC_WHAT_HSCXB: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_HSCXB_OFF+offs); + bus_space_write_1(t, h, SIE_ISURF_OFF_RW, data); + break; + case ISIC_WHAT_IPAC: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_IPAC_OFF+offs); + bus_space_write_1(t, h, SIE_ISURF_OFF_RW, data); + break; + } +} + +#endif + /*---------------------------------------------------------------------------* * Siemens I-Surf 2.0 PnP ISAC get register routine *---------------------------------------------------------------------------*/ +#if defined(__FreeBSD__) static u_char @@ -201,7 +310,34 @@ } +#else + +static u_int8_t +siemens_isurf_read_reg(struct l1_softc *sc, int what, bus_size_t offs) +{ + bus_space_tag_t t = sc->sc_maps[0].t; + bus_space_handle_t h = sc->sc_maps[0].h; + switch (what) { + case ISIC_WHAT_ISAC: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_ISAC_OFF+offs); + return bus_space_read_1(t, h, SIE_ISURF_OFF_RW); + case ISIC_WHAT_HSCXA: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_HSCXA_OFF+offs); + return bus_space_read_1(t, h, SIE_ISURF_OFF_RW); + case ISIC_WHAT_HSCXB: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_HSCXB_OFF+offs); + return bus_space_read_1(t, h, SIE_ISURF_OFF_RW); + case ISIC_WHAT_IPAC: + bus_space_write_1(t, h, SIE_ISURF_OFF_ALE, IPAC_IPAC_OFF+offs); + return bus_space_read_1(t, h, SIE_ISURF_OFF_RW); + } + return 0; +} + +#endif + /*---------------------------------------------------------------------------* * isic_probe_siemens_isurf - probe for Siemens I-Surf 2.0 PnP *---------------------------------------------------------------------------*/ +#if defined(__FreeBSD__) int @@ -292,4 +428,5 @@ * isic_attach_siemens_isurf - attach for Siemens I-Surf 2.0 PnP *---------------------------------------------------------------------------*/ + int isic_attach_siemens_isurf(struct isa_device *dev, unsigned int iobase2) @@ -314,4 +451,43 @@ return(1); } + +#else + +void +isic_attach_siemens_isurf(struct l1_softc *sc) +{ + /* setup access routines */ + + sc->clearirq = NULL; + sc->readreg = siemens_isurf_read_reg; + sc->writereg = siemens_isurf_write_reg; + + sc->readfifo = siemens_isurf_read_fifo; + sc->writefifo = siemens_isurf_write_fifo; + + /* setup card type */ + + sc->sc_cardtyp = CARD_TYPEP_SIE_ISURF2; + + /* setup IOM bus type */ + + sc->sc_bustyp = BUS_TYPE_IOM2; + + /* setup chip type = IPAC ! */ + + sc->sc_ipac = 1; + sc->sc_bfifolen = IPAC_BFIFO_LEN; + + /* enable hscx/isac irq's */ + + IPAC_WRITE(IPAC_MASK, (IPAC_MASK_INT1 | IPAC_MASK_INT0)); + + IPAC_WRITE(IPAC_ACFG, 0); /* outputs are open drain */ + IPAC_WRITE(IPAC_AOE, /* aux 5..2 are inputs, 7, 6 outputs */ + (IPAC_AOE_OE5 | IPAC_AOE_OE4 | IPAC_AOE_OE3 | IPAC_AOE_OE2)); + IPAC_WRITE(IPAC_ATX, 0xff); /* set all output lines high */ +} + +#endif + #endif /* NISIC > 0 && defined(SIEMENS_ISURF2) */ -#endif /* FreeBSD */ --- i4b/layer1/isapnp_isic.c.DIST Thu Aug 24 13:48:57 2000 +++ i4b/layer1/isapnp_isic.c Thu Aug 31 19:18:26 2000 @@ -111,4 +111,5 @@ extern void isic_attach_sws __P((struct l1_softc *sc)); extern void isic_attach_Eqs1pi __P((struct l1_softc *sc)); +extern void isic_attach_siemens_isurf __P((struct l1_softc *sc)); struct isapnp_isic_card_desc { @@ -145,4 +146,8 @@ { "ASU1688", "Dynalink IS64PH", CARD_TYPEP_DYNALINK, generic_pnp_mapalloc, isic_attach_Dyn }, +#endif +#ifdef SIEMENS_ISURF2 + { "SIE0020", "Siemens I-Surf 2.0 PnP", CARD_TYPEP_SIE_ISURF2, + generic_pnp_mapalloc, isic_attach_siemens_isurf }, #endif };