diff options
| author | maxv <maxv@NetBSD.org> | 2018-09-22 16:22:22 +0000 |
|---|---|---|
| committer | maxv <maxv@NetBSD.org> | 2018-09-22 16:22:22 +0000 |
| commit | d61bc29f01e46e18c9d563fe266eac697d214719 (patch) | |
| tree | 9ad38a0d1b8679462320a4d09c4761207191416e /sys/dev | |
| parent | fe5080333796cfe779161fa64f61313743d7ccef (diff) | |
Remove isic(4). It is part of ISDN, which we are now retiring.
Diffstat (limited to 'sys/dev')
42 files changed, 5 insertions, 15974 deletions
diff --git a/sys/dev/DEVNAMES b/sys/dev/DEVNAMES index 6896866d32a..549fabd917b 100644 --- a/sys/dev/DEVNAMES +++ b/sys/dev/DEVNAMES @@ -1,4 +1,4 @@ -# $NetBSD: DEVNAMES,v 1.316 2018/09/22 12:41:00 maxv Exp $ +# $NetBSD: DEVNAMES,v 1.317 2018/09/22 16:22:23 maxv Exp $ # # This file contains all used device names and defined attributes in # alphabetical order. New devices added to the system somewhere should first @@ -105,8 +105,6 @@ asc vax asiop amiga Attribute asiop amigappc Attribute ast MI -aster amiga -aster amigappc ata MI Attribute ata_dma MI Attribute ata_hl MI Attribute @@ -686,7 +684,6 @@ isdnbchan MI isdnctl MI isdntel MI isdntrc MI -isic MI ismt amd64 ismt i386 isp MI diff --git a/sys/dev/ic/hscx.c b/sys/dev/ic/hscx.c deleted file mode 100644 index 2cc90183bf9..00000000000 --- a/sys/dev/ic/hscx.c +++ /dev/null @@ -1,673 +0,0 @@ -/* - * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * i4b - Siemens HSCX chip (B-channel) handling - * -------------------------------------------- - * - * $Id: hscx.c,v 1.16 2012/10/27 17:18:20 chs Exp $ - * - * last edit-date: [Fri Jan 5 11:36:10 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hscx.c,v 1.16 2012/10/27 17:18:20 chs Exp $"); - -#include <sys/param.h> -#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#ifndef __bsdi__ -#include <sys/bus.h> -#endif -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#include <machine/i4b_trace.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_trace.h> -#endif - -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_mbuf.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -/*---------------------------------------------------------------------------* - * HSCX IRQ Handler - *---------------------------------------------------------------------------*/ -void -isic_hscx_irq(register struct isic_softc *sc, u_char ista, int h_chan, u_char ex_irq) -{ - register l1_bchan_state_t *chan = &sc->sc_chan[h_chan]; - u_char exir = 0; - int activity = -1; - u_char cmd = 0; - - NDBGL1(L1_H_IRQ, "%#x", ista); - - if(ex_irq) - { - /* get channel extended irq reg */ - - exir = HSCX_READ(h_chan, H_EXIR); - - if(exir & HSCX_EXIR_RFO) - { - chan->stat_RFO++; - NDBGL1(L1_H_XFRERR, "ex_irq: receive data overflow"); - } - - if((exir & HSCX_EXIR_XDU) && (chan->bprot != BPROT_NONE))/* xmit data underrun */ - { - chan->stat_XDU++; - NDBGL1(L1_H_XFRERR, "ex_irq: xmit data underrun"); - isic_hscx_cmd(sc, h_chan, HSCX_CMDR_XRES); - - if (chan->out_mbuf_head != NULL) /* don't continue to transmit this buffer */ - { - i4b_Bfreembuf(chan->out_mbuf_head); - chan->out_mbuf_cur = chan->out_mbuf_head = NULL; - } - } - - } - - /* rx message end, end of frame */ - - if(ista & HSCX_ISTA_RME) - { - register int fifo_data_len; - u_char rsta; - int error = 0; - - rsta = HSCX_READ(h_chan, H_RSTA); - - if((rsta & 0xf0) != 0xa0) - { - if((rsta & HSCX_RSTA_VFR) == 0) - { - chan->stat_VFR++; - cmd |= (HSCX_CMDR_RHR); - NDBGL1(L1_H_XFRERR, "received invalid Frame"); - error++; - } - - if(rsta & HSCX_RSTA_RDO) - { - chan->stat_RDO++; - NDBGL1(L1_H_XFRERR, "receive data overflow"); - error++; - } - - if((rsta & HSCX_RSTA_CRC) == 0) - { - chan->stat_CRC++; - cmd |= (HSCX_CMDR_RHR); - NDBGL1(L1_H_XFRERR, "CRC check failed"); - error++; - } - - if(rsta & HSCX_RSTA_RAB) - { - chan->stat_RAB++; - NDBGL1(L1_H_XFRERR, "Receive message aborted"); - error++; - } - } - - fifo_data_len = ((HSCX_READ(h_chan, H_RBCL)) & - ((sc->sc_bfifolen)-1)); - - if(fifo_data_len == 0) - fifo_data_len = sc->sc_bfifolen; - - /* all error conditions checked, now decide and take action */ - - if(error == 0) - { - if(chan->in_mbuf == NULL) - { - if((chan->in_mbuf = i4b_Bgetmbuf(BCH_MAX_DATALEN)) == NULL) - panic("L1 isic_hscx_irq: RME, cannot allocate mbuf!"); - chan->in_cbptr = chan->in_mbuf->m_data; - chan->in_len = 0; - } - - fifo_data_len -= 1; /* last byte in fifo is RSTA ! */ - - if((chan->in_len + fifo_data_len) <= BCH_MAX_DATALEN) - { - /* read data from HSCX fifo */ - - HSCX_RDFIFO(h_chan, chan->in_cbptr, fifo_data_len); - - cmd |= (HSCX_CMDR_RMC); - isic_hscx_cmd(sc, h_chan, cmd); - cmd = 0; - - chan->in_len += fifo_data_len; - chan->rxcount += fifo_data_len; - - /* setup mbuf data length */ - - chan->in_mbuf->m_len = chan->in_len; - chan->in_mbuf->m_pkthdr.len = chan->in_len; - - if(sc->sc_trace & TRACE_B_RX) - { - i4b_trace_hdr hdr; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_NT; - hdr.count = ++sc->sc_trace_bcount; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, chan->in_mbuf->m_len, chan->in_mbuf->m_data); - } - - (*chan->l4_driver->bch_rx_data_ready)(chan->l4_driver_softc); - - activity = ACT_RX; - - /* mark buffer ptr as unused */ - - chan->in_mbuf = NULL; - chan->in_cbptr = NULL; - chan->in_len = 0; - } - else - { - NDBGL1(L1_H_XFRERR, "RAWHDLC rx buffer overflow in RME, in_len=%d, fifolen=%d", chan->in_len, fifo_data_len); - chan->in_cbptr = chan->in_mbuf->m_data; - chan->in_len = 0; - cmd |= (HSCX_CMDR_RHR | HSCX_CMDR_RMC); - } - } - else - { - if (chan->in_mbuf != NULL) - { - i4b_Bfreembuf(chan->in_mbuf); - chan->in_mbuf = NULL; - chan->in_cbptr = NULL; - chan->in_len = 0; - } - cmd |= (HSCX_CMDR_RMC); - } - } - - /* rx fifo full */ - - if(ista & HSCX_ISTA_RPF) - { - if(chan->in_mbuf == NULL) - { - if((chan->in_mbuf = i4b_Bgetmbuf(BCH_MAX_DATALEN)) == NULL) - panic("L1 isic_hscx_irq: RPF, cannot allocate mbuf!"); - chan->in_cbptr = chan->in_mbuf->m_data; - chan->in_len = 0; - } - - chan->rxcount += sc->sc_bfifolen; - - if((chan->in_len + sc->sc_bfifolen) <= BCH_MAX_DATALEN) - { - /* read data from HSCX fifo */ - - HSCX_RDFIFO(h_chan, chan->in_cbptr, sc->sc_bfifolen); - - chan->in_cbptr += sc->sc_bfifolen; - chan->in_len += sc->sc_bfifolen; - } - else - { - if(chan->bprot == BPROT_NONE) - { - /* setup mbuf data length */ - - chan->in_mbuf->m_len = chan->in_len; - chan->in_mbuf->m_pkthdr.len = chan->in_len; - - if(sc->sc_trace & TRACE_B_RX) - { - i4b_trace_hdr hdr; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_NT; - hdr.count = ++sc->sc_trace_bcount; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr,chan->in_mbuf->m_len, chan->in_mbuf->m_data); - } - - /* silence detection */ - - if(!(isdn_bchan_silence(chan->in_mbuf->m_data, chan->in_mbuf->m_len))) - activity = ACT_RX; - - if(!(IF_QFULL(&chan->rx_queue))) - { - IF_ENQUEUE(&chan->rx_queue, chan->in_mbuf); - } - else - { - i4b_Bfreembuf(chan->in_mbuf); - } - - /* signal upper driver that data is available */ - - (*chan->l4_driver->bch_rx_data_ready)(chan->l4_driver_softc); - - /* alloc new buffer */ - - if((chan->in_mbuf = i4b_Bgetmbuf(BCH_MAX_DATALEN)) == NULL) - panic("L1 isic_hscx_irq: RPF, cannot allocate new mbuf!"); - - /* setup new data ptr */ - - chan->in_cbptr = chan->in_mbuf->m_data; - - /* read data from HSCX fifo */ - - HSCX_RDFIFO(h_chan, chan->in_cbptr, sc->sc_bfifolen); - - chan->in_cbptr += sc->sc_bfifolen; - chan->in_len = sc->sc_bfifolen; - - chan->rxcount += sc->sc_bfifolen; - } - else - { - NDBGL1(L1_H_XFRERR, "RAWHDLC rx buffer overflow in RPF, in_len=%d", chan->in_len); - chan->in_cbptr = chan->in_mbuf->m_data; - chan->in_len = 0; - cmd |= (HSCX_CMDR_RHR); - } - } - - /* command to release fifo space */ - - cmd |= HSCX_CMDR_RMC; - } - - /* transmit fifo empty, new data can be written to fifo */ - - if(ista & HSCX_ISTA_XPR) - { - /* - * for a description what is going on here, please have - * a look at isic_bchannel_start() in i4b_bchan.c ! - */ - - int len; - int nextlen; - - NDBGL1(L1_H_IRQ, "%s, chan %d - XPR, Tx Fifo Empty!", device_xname(sc->sc_dev), h_chan); - - if(chan->out_mbuf_cur == NULL) /* last frame is transmitted */ - { - IF_DEQUEUE(&chan->tx_queue, chan->out_mbuf_head); - - if(chan->out_mbuf_head == NULL) - { - chan->state &= ~HSCX_TX_ACTIVE; - (*chan->l4_driver->bch_tx_queue_empty)(chan->l4_driver_softc); - } - else - { - chan->state |= HSCX_TX_ACTIVE; - chan->out_mbuf_cur = chan->out_mbuf_head; - chan->out_mbuf_cur_ptr = chan->out_mbuf_cur->m_data; - chan->out_mbuf_cur_len = chan->out_mbuf_cur->m_len; - - if(sc->sc_trace & TRACE_B_TX) - { - i4b_trace_hdr hdr; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_bcount; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, chan->out_mbuf_cur->m_len, chan->out_mbuf_cur->m_data); - } - - if(chan->bprot == BPROT_NONE) - { - if(!(isdn_bchan_silence(chan->out_mbuf_cur->m_data, chan->out_mbuf_cur->m_len))) - activity = ACT_TX; - } - else - { - activity = ACT_TX; - } - } - } - - len = 0; - - while(chan->out_mbuf_cur && len != sc->sc_bfifolen) - { - nextlen = min(chan->out_mbuf_cur_len, sc->sc_bfifolen - len); - -#ifdef NOTDEF - printf("i:mh=%x, mc=%x, mcp=%x, mcl=%d l=%d nl=%d # ", - chan->out_mbuf_head, - chan->out_mbuf_cur, - chan->out_mbuf_cur_ptr, - chan->out_mbuf_cur_len, - len, - next_len); -#endif - - isic_hscx_waitxfw(sc, h_chan); /* necessary !!! */ - - HSCX_WRFIFO(h_chan, chan->out_mbuf_cur_ptr, nextlen); - cmd |= HSCX_CMDR_XTF; - - len += nextlen; - chan->txcount += nextlen; - - chan->out_mbuf_cur_ptr += nextlen; - chan->out_mbuf_cur_len -= nextlen; - - if(chan->out_mbuf_cur_len == 0) - { - if((chan->out_mbuf_cur = chan->out_mbuf_cur->m_next) != NULL) - { - chan->out_mbuf_cur_ptr = chan->out_mbuf_cur->m_data; - chan->out_mbuf_cur_len = chan->out_mbuf_cur->m_len; - - if(sc->sc_trace & TRACE_B_TX) - { - i4b_trace_hdr hdr; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_bcount; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, chan->out_mbuf_cur->m_len, chan->out_mbuf_cur->m_data); - } - } - else - { - if (chan->bprot != BPROT_NONE) - cmd |= HSCX_CMDR_XME; - i4b_Bfreembuf(chan->out_mbuf_head); - chan->out_mbuf_head = NULL; - } - - } - } - } - - if(cmd) /* is there a command for the HSCX ? */ - { - isic_hscx_cmd(sc, h_chan, cmd); /* yes, to HSCX */ - } - - /* call timeout handling routine */ - - if(activity == ACT_RX || activity == ACT_TX) - (*chan->l4_driver->bch_activity)(chan->l4_driver_softc, activity); -} - -/*---------------------------------------------------------------------------* - * HSCX initialization - * - * for telephony: extended transparent mode 1 - * for raw hdlc: transparent mode 0 - *---------------------------------------------------------------------------*/ -void -isic_hscx_init(struct isic_softc *sc, int h_chan, int activate) -{ - l1_bchan_state_t *chan = &sc->sc_chan[h_chan]; - - HSCX_WRITE(h_chan, H_MASK, 0xff); /* mask irq's */ - - if(sc->sc_ipac) - { - /* CCR1: Power Up, Clock Mode 5 */ - HSCX_WRITE(h_chan, H_CCR1, HSCX_CCR1_PU | /* power up */ - HSCX_CCR1_CM1); /* IPAC clock mode 5 */ - } - else - { - /* CCR1: Power Up, Clock Mode 5 */ - HSCX_WRITE(h_chan, H_CCR1, HSCX_CCR1_PU | /* power up */ - HSCX_CCR1_CM2 | /* HSCX clock mode 5 */ - HSCX_CCR1_CM0); - } - - /* XAD1: Transmit Address Byte 1 */ - HSCX_WRITE(h_chan, H_XAD1, 0xff); - - /* XAD2: Transmit Address Byte 2 */ - HSCX_WRITE(h_chan, H_XAD2, 0xff); - - /* RAH2: Receive Address Byte High Reg. 2 */ - HSCX_WRITE(h_chan, H_RAH2, 0xff); - - /* XBCH: reset Transmit Byte Count High */ - HSCX_WRITE(h_chan, H_XBCH, 0x00); - - /* RLCR: reset Receive Length Check Register */ - HSCX_WRITE(h_chan, H_RLCR, 0x00); - - /* CCR2: set tx/rx clock shift bit 0 */ - /* disable CTS irq, disable RIE irq*/ - HSCX_WRITE(h_chan, H_CCR2, HSCX_CCR2_XCS0|HSCX_CCR2_RCS0); - - /* XCCR: tx bit count per time slot */ - HSCX_WRITE(h_chan, H_XCCR, 0x07); - - /* RCCR: rx bit count per time slot */ - HSCX_WRITE(h_chan, H_RCCR, 0x07); - - if(sc->sc_bustyp == BUS_TYPE_IOM2) - { - switch(h_chan) - { - case HSCX_CH_A: /* Prepare HSCX channel A */ - /* TSAX: tx clock shift bits 1 & 2 */ - /* tx time slot number */ - HSCX_WRITE(h_chan, H_TSAX, 0x2f); - - /* TSAR: rx clock shift bits 1 & 2 */ - /* rx time slot number */ - HSCX_WRITE(h_chan, H_TSAR, 0x2f); - break; - - case HSCX_CH_B: /* Prepare HSCX channel B */ - /* TSAX: tx clock shift bits 1 & 2 */ - /* tx time slot number */ - HSCX_WRITE(h_chan, H_TSAX, 0x03); - - /* TSAR: rx clock shift bits 1 & 2 */ - /* rx time slot number */ - HSCX_WRITE(h_chan, H_TSAR, 0x03); - break; - } - } - else /* IOM 1 setup */ - { - /* TSAX: tx clock shift bits 1 & 2 */ - /* tx time slot number */ - HSCX_WRITE(h_chan, H_TSAX, 0x07); - - /* TSAR: rx clock shift bits 1 & 2 */ - /* rx time slot number */ - HSCX_WRITE(h_chan, H_TSAR, 0x07); - } - - if(activate) - { - if(chan->bprot == BPROT_RHDLC) - { - /* HDLC Frames, transparent mode 0 */ - HSCX_WRITE(h_chan, H_MODE, - HSCX_MODE_MDS1|HSCX_MODE_RAC|HSCX_MODE_RTS); - } - else - { - /* Raw Telephony, extended transparent mode 1 */ - HSCX_WRITE(h_chan, H_MODE, - HSCX_MODE_MDS1|HSCX_MODE_MDS0|HSCX_MODE_ADM|HSCX_MODE_RTS); - } - - isic_hscx_cmd(sc, h_chan, HSCX_CMDR_RHR|HSCX_CMDR_XRES); - } - else - { - /* TSAX: tx time slot */ - HSCX_WRITE(h_chan, H_TSAX, 0xff); - - /* TSAR: rx time slot */ - HSCX_WRITE(h_chan, H_TSAR, 0xff); - - /* Raw Telephony, extended transparent mode 1 */ - HSCX_WRITE(h_chan, H_MODE, - HSCX_MODE_MDS1|HSCX_MODE_MDS0|HSCX_MODE_ADM|HSCX_MODE_RTS); - } - - /* don't touch ICA, EXA and EXB bits, this could be HSCX_CH_B */ - /* always disable RSC and TIN */ - - chan->hscx_mask |= HSCX_MASK_RSC | HSCX_MASK_TIN; - - if(activate) - { - /* enable */ - chan->hscx_mask &= ~(HSCX_MASK_RME | HSCX_MASK_RPF | HSCX_MASK_XPR); - } - else - { - /* disable */ - chan->hscx_mask |= HSCX_MASK_RME | HSCX_MASK_RPF | HSCX_MASK_XPR; - } - - /* handle ICA, EXA, and EXB via interrupt mask of channel b */ - - if (h_chan == HSCX_CH_A) - { - if (activate) - HSCX_B_IMASK &= ~(HSCX_MASK_EXA | HSCX_MASK_ICA); - else - HSCX_B_IMASK |= HSCX_MASK_EXA | HSCX_MASK_ICA; - HSCX_WRITE(HSCX_CH_A, H_MASK, HSCX_A_IMASK); - HSCX_WRITE(HSCX_CH_B, H_MASK, HSCX_B_IMASK); - } - else - { - if (activate) - HSCX_B_IMASK &= ~HSCX_MASK_EXB; - else - HSCX_B_IMASK |= HSCX_MASK_EXB; - HSCX_WRITE(HSCX_CH_B, H_MASK, HSCX_B_IMASK); - } - - /* clear spurious interrupts left over */ - - if(h_chan == HSCX_CH_A) - { - HSCX_READ(h_chan, H_EXIR); - HSCX_READ(h_chan, H_ISTA); - } - else /* mask ICA, because it must not be cleared by reading ISTA */ - { - HSCX_WRITE(HSCX_CH_B, H_MASK, HSCX_B_IMASK | HSCX_MASK_ICA); - HSCX_READ(h_chan, H_EXIR); - HSCX_READ(h_chan, H_ISTA); - HSCX_WRITE(HSCX_CH_B, H_MASK, HSCX_B_IMASK); - } -} - -/*---------------------------------------------------------------------------* - * write command to HSCX command register - *---------------------------------------------------------------------------*/ -void -isic_hscx_cmd(struct isic_softc *sc, int h_chan, unsigned char cmd) -{ - int timeout = 20; - - while(((HSCX_READ(h_chan, H_STAR)) & HSCX_STAR_CEC) && timeout) - { - DELAY(10); - timeout--; - } - - if(timeout == 0) - { - NDBGL1(L1_H_ERR, "HSCX wait for CEC timeout!"); - } - - HSCX_WRITE(h_chan, H_CMDR, cmd); -} - -/*---------------------------------------------------------------------------* - * wait for HSCX transmit FIFO write enable - *---------------------------------------------------------------------------*/ -void -isic_hscx_waitxfw(struct isic_softc *sc, int h_chan) -{ -#define WAITVAL 50 -#define WAITTO 200 - - int timeout = WAITTO; - - while((!(((HSCX_READ(h_chan, H_STAR)) & - (HSCX_STAR_CEC | HSCX_STAR_XFW)) == HSCX_STAR_XFW)) && timeout) - { - DELAY(WAITVAL); - timeout--; - } - - if(timeout == 0) - { - NDBGL1(L1_H_ERR, "HSCX wait for XFW timeout!"); - } - else if (timeout != WAITTO) - { - NDBGL1(L1_H_XFRERR, "HSCX wait for XFW time: %d uS", (WAITTO-timeout)*50); - } -} - diff --git a/sys/dev/ic/hscx.h b/sys/dev/ic/hscx.h deleted file mode 100644 index dc2a46b30cb..00000000000 --- a/sys/dev/ic/hscx.h +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright (c) 1996, 1998 Gary Jennejohn. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * $Id: hscx.h,v 1.4 2011/08/07 20:05:08 jakllsch Exp $ - * - * last edit-date: [Sun Feb 14 10:26:56 1999] - * - * -hm added AVM config register defs - * -hm split up for rewrite of Siemens chipset driver - * - *--------------------------------------------------------------------------- - */ - -#ifndef I4B_HSCX_H_ -#define I4B_HSCX_H_ - -enum HSCX_VERSIONS { - HSCX_VA1, /* 82525 A1 */ - HSCX_UNKN1, /* unknown 1 */ - HSCX_VA2, /* 82525 A2 */ - HSCX_UNKN3, /* unknown 3 */ - HSCX_VA3, /* 82525 A3 */ - HSCX_V21, /* 82525 2.1 */ - HSCX_UNKN /* unknown version */ -}; - -#define HSCX_CH_A 0 /* channel A */ -#define HSCX_CH_B 1 /* channel B */ - -#define HSCX_FIFO_LEN 32 /* 32 bytes FIFO on chip */ - -/* - * definitions of registers and bits for the HSCX ISDN chip. - */ - -typedef struct hscx_reg { - - /* 32 byte deep FIFO always first */ - - unsigned char hscx_fifo [HSCX_FIFO_LEN]; - - /* most registers can be read/written, but have different names */ - /* so define a union with read/write names to make that clear */ - - union { - struct { - unsigned char hscx_ista; - unsigned char hscx_star; - unsigned char hscx_mode; - unsigned char hscx_timr; - unsigned char hscx_exir; - unsigned char hscx_rbcl; - unsigned char dummy_26; - unsigned char hscx_rsta; - unsigned char hscx_ral1; - unsigned char hscx_rhcr; - unsigned char dummy_2a; - unsigned char dummy_2b; - unsigned char hscx_ccr2; - unsigned char hscx_rbch; - unsigned char hscx_vstr; - unsigned char hscx_ccr; - unsigned char dummy_30; - unsigned char dummy_31; - unsigned char dummy_32; - unsigned char dummy_33; - } hscx_r; - struct { - unsigned char hscx_mask; - unsigned char hscx_cmdr; - unsigned char hscx_mode; - unsigned char hscx_timr; - unsigned char hscx_xad1; - unsigned char hscx_xad2; - unsigned char hscx_rah1; - unsigned char hscx_rah2; - unsigned char hscx_ral1; - unsigned char hscx_ral2; - unsigned char hscx_xbcl; - unsigned char hscx_bgr; - unsigned char hscx_ccr2; - unsigned char hscx_xbch; - unsigned char hscx_rlcr; - unsigned char hscx_ccr1; - unsigned char hscx_tsax; - unsigned char hscx_tsar; - unsigned char hscx_xccr; - unsigned char hscx_rccr; - } hscx_w; - } hscx_rw; -} hscx_reg_t; - -#define REG_OFFSET(type, field) (uintptr_t)(&(((type *)0)->field)) - -/* HSCX read registers */ - -#define h_ista hscx_rw.hscx_r.hscx_ista -#define H_ISTA REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_ista) -#define h_star hscx_rw.hscx_r.hscx_star -#define H_STAR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_star) -#define h_mode hscx_rw.hscx_r.hscx_mode -#define H_MODE REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_mode) -#define h_timr hscx_rw.hscx_r.hscx_timr -#define H_TIMR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_timr) -#define h_exir hscx_rw.hscx_r.hscx_exir -#define H_EXIR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_exir) -#define h_rbcl hscx_rw.hscx_r.hscx_rbcl -#define H_RBCL REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_rbcl) -#define h_rsta hscx_rw.hscx_r.hscx_rsta -#define H_RSTA REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_rsta) -#define h_ral1 hscx_rw.hscx_r.hscx_ral1 -#define H_RAL1 REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_ral1) -#define h_rhcr hscx_rw.hscx_r.hscx_rhcr -#define H_RHCR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_rhcr) -#define h_ccr2 hscx_rw.hscx_r.hscx_ccr2 -#define H_CCR2 REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_ccr2) -#define h_rbch hscx_rw.hscx_r.hscx_rbch -#define H_RBCH REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_rbch) -#define h_vstr hscx_rw.hscx_r.hscx_vstr -#define H_VSTR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_vstr) -#define h_ccr hscx_rw.hscx_r.hscx_ccr -#define H_CCR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_r.hscx_ccr) - -/* HSCX write registers - for hscx_mode, hscx_timr, hscx_ral1, hscx_ccr2 */ -/* see read registers */ - -#define h_mask hscx_rw.hscx_w.hscx_mask -#define H_MASK REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_mask) -#define h_cmdr hscx_rw.hscx_w.hscx_cmdr -#define H_CMDR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_cmdr) -#define h_xad1 hscx_rw.hscx_w.hscx_xad1 -#define H_XAD1 REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_xad1) -#define h_xad2 hscx_rw.hscx_w.hscx_xad2 -#define H_XAD2 REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_xad2) -#define h_rah1 hscx_rw.hscx_w.hscx_rah1 -#define H_RAH1 REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_rah1) -#define h_rah2 hscx_rw.hscx_w.hscx_rah2 -#define H_RAH2 REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_rah2) -#define h_ral2 hscx_rw.hscx_w.hscx_ral2 -#define H_RAL2 REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_ral2) -#define h_xbcl hscx_rw.hscx_w.hscx_xbcl -#define H_XBCL REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_xbcl) -#define h_bgr hscx_rw.hscx_w.hscx_bgr -#define H_BGR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_bgr) -#define h_xbch hscx_rw.hscx_w.hscx_xbch -#define H_XBCH REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_xbch) -#define h_rlcr hscx_rw.hscx_w.hscx_rlcr -#define H_RLCR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_rlcr) -#define h_ccr1 hscx_rw.hscx_w.hscx_ccr1 -#define H_CCR1 REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_ccr1) -#define h_tsax hscx_rw.hscx_w.hscx_tsax -#define H_TSAX REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_tsax) -#define h_tsar hscx_rw.hscx_w.hscx_tsar -#define H_TSAR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_tsar) -#define h_xccr hscx_rw.hscx_w.hscx_xccr -#define H_XCCR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_xccr) -#define h_rccr hscx_rw.hscx_w.hscx_rccr -#define H_RCCR REG_OFFSET(hscx_reg_t, hscx_rw.hscx_w.hscx_rccr) - -#define HSCX_ISTA_RME 0x80 -#define HSCX_ISTA_RPF 0x40 -#define HSCX_ISTA_RSC 0x20 -#define HSCX_ISTA_XPR 0x10 -#define HSCX_ISTA_TIN 0x08 -#define HSCX_ISTA_ICA 0x04 -#define HSCX_ISTA_EXA 0x02 -#define HSCX_ISTA_EXB 0x01 - -#define HSCX_MASK_RME 0x80 -#define HSCX_MASK_RPF 0x40 -#define HSCX_MASK_RSC 0x20 -#define HSCX_MASK_XPR 0x10 -#define HSCX_MASK_TIN 0x08 -#define HSCX_MASK_ICA 0x04 -#define HSCX_MASK_EXA 0x02 -#define HSCX_MASK_EXB 0x01 - -#define HSCX_EXIR_XMR 0x80 -#define HSCX_EXIR_XDU 0x40 -#define HSCX_EXIR_PCE 0x20 -#define HSCX_EXIR_RFO 0x10 -#define HSCX_EXIR_CSC 0x08 -#define HSCX_EXIR_RFS 0x04 - -/* the other bits are always 0 */ - -#define HSCX_STAR_XDOV 0x80 -#define HSCX_STAR_XFW 0x40 -#define HSCX_STAR_XRNR 0x20 -#define HSCX_STAR_RRNR 0x10 -#define HSCX_STAR_RLI 0x08 -#define HSCX_STAR_CEC 0x04 -#define HSCX_STAR_CTS 0x02 -#define HSCX_STAR_WFA 0x01 - -#define HSCX_CMDR_RMC 0x80 -#define HSCX_CMDR_RHR 0x40 -/* also known as XREP in transparent mode */ -#define HSCX_CMDR_RNR 0x20 -#define HSCX_CMDR_STI 0x10 -#define HSCX_CMDR_XTF 0x08 -#define HSCX_CMDR_XIF 0x04 -#define HSCX_CMDR_XME 0x02 -#define HSCX_CMDR_XRES 0x01 - -#define HSCX_MODE_MDS1 0x80 -#define HSCX_MODE_MDS0 0x40 -#define HSCX_MODE_ADM 0x20 -#define HSCX_MODE_TMD 0x10 -#define HSCX_MODE_RAC 0x08 -#define HSCX_MODE_RTS 0x04 -#define HSCX_MODE_TRS 0x02 -#define HSCX_MODE_TLP 0x01 - -#define HSCX_RSTA_VFR 0x80 -#define HSCX_RSTA_RDO 0x40 -#define HSCX_RSTA_CRC 0x20 -#define HSCX_RSTA_RAB 0x10 -#define HSCX_RSTA_HA1 0x08 -#define HSCX_RSTA_HA0 0x04 -#define HSCX_RSTA_CR 0x02 -#define HSCX_RSTA_LA 0x01 - -#define HSCX_RSTA_MASK 0xf0 /* the interesting ones */ - -/* only used in DMA mode */ -#define HSCX_XBCH_DMA 0x80 -#define HSCX_XBCH_NRM 0x40 -#define HSCX_XBCH_CAS 0x20 -#define HSCX_XBCH_XC 0x10 -/* the rest are bits 11 thru 8 of the byte count */ - -#define HSCX_RBCH_DMA 0x80 -#define HSCX_RBCH_NRM 0x40 -#define HSCX_RBCH_CAS 0x20 -#define HSCX_RBCH_OV 0x10 -/* the rest are bits 11 thru 8 of the byte count */ - -#define HSCX_VSTR_CD 0x80 -/* bits 6 thru 4 are 0 */ -/* bits 3 thru 0 are the version number */ - -#define HSCX_RLCR_RC 0x80 -/* the rest of the bits are used to set the received length */ - -#define HSCX_CCR1_PU 0x80 -/* bits 6 and 5 are SC1 SC0 */ -#define HSCX_CCR1_ODS 0x10 -#define HSCX_CCR1_ITF 0x08 -#define HSCX_CCR1_CM2 0x04 -#define HSCX_CCR1_CM1 0x02 -#define HSCX_CCR1_CM0 0x01 - -/* for clock mode 5 */ -#define HSCX_CCR2_SOC2 0x80 -#define HSCX_CCR2_SOC1 0x40 -#define HSCX_CCR2_XCS0 0x20 -#define HSCX_CCR2_RCS0 0x10 -#define HSCX_CCR2_TIO 0x08 -#define HSCX_CCR2_CIE 0x04 -#define HSCX_CCR2_RIE 0x02 -#define HSCX_CCR2_DIV 0x01 - -/* bits 7 thru 2 are TSNX */ -#define HSCX_TSAX_XCS2 0x02 -#define HSCX_TSAX_XCS1 0x01 - -/* bits 7 thru 2 are TSNR */ -#define HSCX_TSAR_RCS2 0x02 -#define HSCX_TSAR_RCS1 0x01 - -#endif /* I4B_HSCX_H_ */ diff --git a/sys/dev/ic/ipac.h b/sys/dev/ic/ipac.h deleted file mode 100644 index 64a9d789037..00000000000 --- a/sys/dev/ic/ipac.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * i4b_ipac.h - definitions for the Siemens IPAC PSB2115 chip - * ========================================================== - * - * $Id: ipac.h,v 1.4 2011/08/07 20:05:08 jakllsch Exp $ - * - * last edit-date: [Thu Jan 6 14:54:19 2000] - * - *--------------------------------------------------------------------------- - */ - -#ifndef _I4B_IPAC_H_ -#define _I4B_IPAC_H_ - -#define IPAC_BFIFO_LEN 64 /* 64 bytes B-channel FIFO on chip */ - -#define IPAC_HSCXA_OFF 0x00 -#define IPAC_HSCXB_OFF 0x40 -#define IPAC_ISAC_OFF 0x80 -#define IPAC_IPAC_OFF 0xc0 - -/* chip version */ - -#define IPAC_V11 0x01 /* IPAC Version 1.1 */ -#define IPAC_V12 0x02 /* IPAC Version 1.2 */ - -/* - * definitions of registers and bits for the IPAC ISDN chip. - */ - -typedef struct ipac_reg { - - /* most registers can be read/written, but have different names */ - /* so define a union with read/write names to make that clear */ - - union { - struct { - unsigned char ipac_conf; - unsigned char ipac_ista; - unsigned char ipac_id; - unsigned char ipac_acfg; - unsigned char ipac_aoe; - unsigned char ipac_arx; - unsigned char ipac_pita1; - unsigned char ipac_pita2; - unsigned char ipac_pota1; - unsigned char ipac_pota2; - unsigned char ipac_pcfg; - unsigned char ipac_scfg; - unsigned char ipac_timr2; - } ipac_r; - struct { - unsigned char ipac_conf; - unsigned char ipac_mask; - unsigned char ipac_dummy; - unsigned char ipac_acfg; - unsigned char ipac_aoe; - unsigned char ipac_atx; - unsigned char ipac_pita1; - unsigned char ipac_pita2; - unsigned char ipac_pota1; - unsigned char ipac_pota2; - unsigned char ipac_pcfg; - unsigned char ipac_scfg; - unsigned char ipac_timr2; - } ipac_w; - } ipac_rw; -} ipac_reg_t; - -#define REG_OFFSET(type, field) (uintptr_t)(&(((type *)0)->field)) - -/* IPAC read registers */ - -#define IPAC_CONF REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_conf) -#define IPAC_ISTA REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_ista) -#define IPAC_ID REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_id) -#define IPAC_ACFG REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_acfg) -#define IPAC_AOE REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_aoe) -#define IPAC_ARX REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_arx) -#define IPAC_PITA1 REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_pita1) -#define IPAC_PITA2 REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_pita2) -#define IPAC_POTA1 REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_pota1) -#define IPAC_POTA2 REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_pota2) -#define IPAC_PCFG REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_pcfg) -#define IPAC_SCFG REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_scfg) -#define IPAC_TIMR2 REG_OFFSET(ipac_reg_t, ipac_rw.ipac_r.ipac_timr2) - -/* IPAC write registers */ - -#define IPAC_MASK REG_OFFSET(ipac_reg_t, ipac_rw.ipac_w.ipac_mask) -#define IPAC_ATX REG_OFFSET(ipac_reg_t, ipac_rw.ipac_w.ipac_atx) - -/* register bits */ - -#define IPAC_CONF_AMP 0x80 -#define IPAC_CONF_CFS 0x40 -#define IPAC_CONF_TEM 0x20 -#define IPAC_CONF_PDS 0x10 -#define IPAC_CONF_IDH 0x08 -#define IPAC_CONF_SGO 0x04 -#define IPAC_CONF_ODS 0x02 -#define IPAC_CONF_IOF 0x01 - -#define IPAC_ISTA_INT1 0x80 -#define IPAC_ISTA_INT0 0x40 -#define IPAC_ISTA_ICD 0x20 -#define IPAC_ISTA_EXD 0x10 -#define IPAC_ISTA_ICA 0x08 -#define IPAC_ISTA_EXA 0x04 -#define IPAC_ISTA_ICB 0x02 -#define IPAC_ISTA_EXB 0x01 - -#define IPAC_MASK_INT1 0x80 -#define IPAC_MASK_INT0 0x40 -#define IPAC_MASK_ICD 0x20 -#define IPAC_MASK_EXD 0x10 -#define IPAC_MASK_ICA 0x08 -#define IPAC_MASK_EXA 0x04 -#define IPAC_MASK_ICB 0x02 -#define IPAC_MASK_EXB 0x01 - -#define IPAC_ACFG_OD7 0x80 -#define IPAC_ACFG_OD6 0x40 -#define IPAC_ACFG_OD5 0x20 -#define IPAC_ACFG_OD4 0x10 -#define IPAC_ACFG_OD3 0x08 -#define IPAC_ACFG_OD2 0x04 -#define IPAC_ACFG_EL1 0x02 -#define IPAC_ACFG_EL2 0x01 - -#define IPAC_AOE_OE7 0x80 -#define IPAC_AOE_OE6 0x40 -#define IPAC_AOE_OE5 0x20 -#define IPAC_AOE_OE4 0x10 -#define IPAC_AOE_OE3 0x08 -#define IPAC_AOE_OE2 0x04 - -#define IPAC_ARX_AR7 0x80 -#define IPAC_ARX_AR6 0x40 -#define IPAC_ARX_AR5 0x20 -#define IPAC_ARX_AR4 0x10 -#define IPAC_ARX_AR3 0x08 -#define IPAC_ARX_AR2 0x04 - -#define IPAC_ATX_AT7 0x80 -#define IPAC_ATX_AT6 0x40 -#define IPAC_ATX_AT5 0x20 -#define IPAC_ATX_AT4 0x10 -#define IPAC_ATX_AT3 0x08 -#define IPAC_ATX_AT2 0x04 - -#define IPAC_PITA1_ENA 0x80 -#define IPAC_PITA1_DUDD 0x40 - -#define IPAC_PITA2_ENA 0x80 -#define IPAC_PITA2_DUDD 0x40 - -#define IPAC_POTA1_ENA 0x80 -#define IPAC_POTA1_DUDD 0x40 - -#define IPAC_POTA2_ENA 0x80 -#define IPAC_POTA2_DUDD 0x40 - -#define IPAC_PCFG_DPS 0x80 -#define IPAC_PCFG_ACL 0x40 -#define IPAC_PCFG_LED 0x20 -#define IPAC_PCFG_PLD 0x10 -#define IPAC_PCFG_FBS 0x08 -#define IPAC_PCFG_CSL2 0x04 -#define IPAC_PCFG_CSL1 0x02 -#define IPAC_PCFG_CSL0 0x01 - -#define IPAC_SCFG_PRI 0x80 -#define IPAC_SCFG_TXD 0x40 -#define IPAC_SCFG_TLEN 0x20 - -#define IPAC_TIMR2_TMD 0x80 - -#endif /* _I4B_IPAC_H_ */ diff --git a/sys/dev/ic/isac.c b/sys/dev/ic/isac.c deleted file mode 100644 index b563df19907..00000000000 --- a/sys/dev/ic/isac.c +++ /dev/null @@ -1,726 +0,0 @@ -/* - * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * i4b_isac.c - i4b siemens isdn chipset driver ISAC handler - * --------------------------------------------------------- - * - * $Id: isac.c,v 1.24 2012/10/27 17:18:21 chs Exp $ - * - * last edit-date: [Fri Jan 5 11:36:10 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isac.c,v 1.24 2012/10/27 17:18:21 chs Exp $"); - -#ifdef __FreeBSD__ -#include "opt_i4b.h" -#endif -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#ifndef __bsdi__ -#include <sys/bus.h> -#endif -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#include <machine/i4b_trace.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_trace.h> -#endif - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/ipac.h> -#include <dev/ic/hscx.h> - -static u_char isic_isac_exir_hdlr(register struct isic_softc *sc, u_char exir); -static void isic_isac_ind_hdlr(register struct isic_softc *sc, int ind); - -/*---------------------------------------------------------------------------* - * ISAC interrupt service routine - *---------------------------------------------------------------------------*/ -void -isic_isac_irq(struct isic_softc *sc, int ista) -{ - register u_char c = 0; - NDBGL1(L1_F_MSG, "%s: ista = 0x%02x", device_xname(sc->sc_dev), ista); - - if(ista & ISAC_ISTA_EXI) /* extended interrupt */ - { - u_int8_t exirstat = ISAC_READ(I_EXIR); - if (sc->sc_intr_valid == ISIC_INTR_VALID) - c |= isic_isac_exir_hdlr(sc, exirstat); - } - - if(ista & ISAC_ISTA_RME) /* receive message end */ - { - register int rest; - u_char rsta; - - /* get rx status register */ - - rsta = ISAC_READ(I_RSTA); - - if((rsta & ISAC_RSTA_MASK) != 0x20) - { - int error = 0; - - if(!(rsta & ISAC_RSTA_CRC)) /* CRC error */ - { - error++; - NDBGL1(L1_I_ERR, "%s: CRC error", device_xname(sc->sc_dev)); - } - - if(rsta & ISAC_RSTA_RDO) /* ReceiveDataOverflow */ - { - error++; - NDBGL1(L1_I_ERR, "%s: Data Overrun error", device_xname(sc->sc_dev)); - } - - if(rsta & ISAC_RSTA_RAB) /* ReceiveABorted */ - { - error++; - NDBGL1(L1_I_ERR, "%s: Receive Aborted error", device_xname(sc->sc_dev)); - } - - if(error == 0) - { - NDBGL1(L1_I_ERR, "%s: RME unknown error, RSTA = 0x%02x!", device_xname(sc->sc_dev), rsta); - } - - i4b_Dfreembuf(sc->sc_ibuf); - - c |= ISAC_CMDR_RMC|ISAC_CMDR_RRES; - - sc->sc_ibuf = NULL; - sc->sc_ib = NULL; - sc->sc_ilen = 0; - - ISAC_WRITE(I_CMDR, ISAC_CMDR_RMC|ISAC_CMDR_RRES); - ISACCMDRWRDELAY(); - - return; - } - - rest = (ISAC_READ(I_RBCL) & (ISAC_FIFO_LEN-1)); - - if(rest == 0) - rest = ISAC_FIFO_LEN; - - if(sc->sc_ibuf == NULL) - { - if((sc->sc_ibuf = i4b_Dgetmbuf(rest)) != NULL) - sc->sc_ib = sc->sc_ibuf->m_data; - else - panic("isic_isac_irq: RME, i4b_Dgetmbuf returns NULL!"); - sc->sc_ilen = 0; - } - - if(sc->sc_ilen <= (MAX_DFRAME_LEN - rest)) - { - ISAC_RDFIFO(sc->sc_ib, rest); - sc->sc_ilen += rest; - - sc->sc_ibuf->m_pkthdr.len = - sc->sc_ibuf->m_len = sc->sc_ilen; - - if(sc->sc_trace & TRACE_D_RX) - { - i4b_trace_hdr hdr; - memset(&hdr, 0, sizeof hdr); - hdr.type = TRC_CH_D; - hdr.dir = FROM_NT; - hdr.count = ++sc->sc_trace_dcount; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, sc->sc_ibuf->m_len, sc->sc_ibuf->m_data); - } - - c |= ISAC_CMDR_RMC; - - if(sc->sc_intr_valid == ISIC_INTR_VALID && - (((struct isdn_l3_driver*)sc->sc_l3token)->protocol != PROTOCOL_D64S)) - { - isdn_layer2_data_ind(&sc->sc_l2, sc->sc_l3token, sc->sc_ibuf); - } - else - { - i4b_Dfreembuf(sc->sc_ibuf); - } - } - else - { - NDBGL1(L1_I_ERR, "RME, input buffer overflow!"); - i4b_Dfreembuf(sc->sc_ibuf); - c |= ISAC_CMDR_RMC|ISAC_CMDR_RRES; - } - - sc->sc_ibuf = NULL; - sc->sc_ib = NULL; - sc->sc_ilen = 0; - } - - if(ista & ISAC_ISTA_RPF) /* receive fifo full */ - { - if(sc->sc_ibuf == NULL) - { - if((sc->sc_ibuf = i4b_Dgetmbuf(MAX_DFRAME_LEN)) != NULL) - sc->sc_ib= sc->sc_ibuf->m_data; - else - panic("isic_isac_irq: RPF, i4b_Dgetmbuf returns NULL!"); - sc->sc_ilen = 0; - } - - if(sc->sc_ilen <= (MAX_DFRAME_LEN - ISAC_FIFO_LEN)) - { - ISAC_RDFIFO(sc->sc_ib, ISAC_FIFO_LEN); - sc->sc_ilen += ISAC_FIFO_LEN; - sc->sc_ib += ISAC_FIFO_LEN; - c |= ISAC_CMDR_RMC; - } - else - { - NDBGL1(L1_I_ERR, "RPF, input buffer overflow!"); - i4b_Dfreembuf(sc->sc_ibuf); - sc->sc_ibuf = NULL; - sc->sc_ib = NULL; - sc->sc_ilen = 0; - c |= ISAC_CMDR_RMC|ISAC_CMDR_RRES; - } - } - - if(ista & ISAC_ISTA_XPR) /* transmit fifo empty (XPR bit set) */ - { - if((sc->sc_obuf2 != NULL) && (sc->sc_obuf == NULL)) - { - sc->sc_freeflag = sc->sc_freeflag2; - sc->sc_obuf = sc->sc_obuf2; - sc->sc_op = sc->sc_obuf->m_data; - sc->sc_ol = sc->sc_obuf->m_len; - sc->sc_obuf2 = NULL; -#ifdef NOTDEF - printf("ob2=%x, op=%x, ol=%d, f=%d #", - sc->sc_obuf, - sc->sc_op, - sc->sc_ol, - sc->sc_state); -#endif - } - else - { -#ifdef NOTDEF - printf("ob=%x, op=%x, ol=%d, f=%d #", - sc->sc_obuf, - sc->sc_op, - sc->sc_ol, - sc->sc_state); -#endif - } - - if(sc->sc_obuf) - { - ISAC_WRFIFO(sc->sc_op, min(sc->sc_ol, ISAC_FIFO_LEN)); - - if(sc->sc_ol > ISAC_FIFO_LEN) /* length > 32 ? */ - { - sc->sc_op += ISAC_FIFO_LEN; /* bufferptr+32 */ - sc->sc_ol -= ISAC_FIFO_LEN; /* length - 32 */ - c |= ISAC_CMDR_XTF; /* set XTF bit */ - } - else - { - if(sc->sc_freeflag) - { - i4b_Dfreembuf(sc->sc_obuf); - sc->sc_freeflag = 0; - } - sc->sc_obuf = NULL; - sc->sc_op = NULL; - sc->sc_ol = 0; - - c |= ISAC_CMDR_XTF | ISAC_CMDR_XME; - } - } - else - { - sc->sc_state &= ~ISAC_TX_ACTIVE; - } - } - - if(ista & ISAC_ISTA_CISQ) /* channel status change CISQ */ - { - register u_char ci; - - /* get command/indication rx register*/ - - ci = ISAC_READ(I_CIRR); - - /* if S/Q IRQ, read SQC reg to clr SQC IRQ */ - - if(ci & ISAC_CIRR_SQC) - (void) ISAC_READ(I_SQRR); - - /* C/I code change IRQ (flag already cleared by CIRR read) */ - - if(ci & ISAC_CIRR_CIC0) - isic_isac_ind_hdlr(sc, (ci >> 2) & 0xf); - } - - if(c) - { - ISAC_WRITE(I_CMDR, c); - ISACCMDRWRDELAY(); - } -} - -/*---------------------------------------------------------------------------* - * ISAC L1 Extended IRQ handler - *---------------------------------------------------------------------------*/ -static u_char -isic_isac_exir_hdlr(register struct isic_softc *sc, u_char exir) -{ - u_char c = 0; - - if(exir & ISAC_EXIR_XMR) - { - NDBGL1(L1_I_ERR, "EXIRQ Tx Message Repeat"); - - c |= ISAC_CMDR_XRES; - } - - if(exir & ISAC_EXIR_XDU) - { - NDBGL1(L1_I_ERR, "EXIRQ Tx Data Underrun"); - - c |= ISAC_CMDR_XRES; - } - - if(exir & ISAC_EXIR_PCE) - { - NDBGL1(L1_I_ERR, "EXIRQ Protocol Error"); - } - - if(exir & ISAC_EXIR_RFO) - { - NDBGL1(L1_I_ERR, "EXIRQ Rx Frame Overflow"); - - c |= ISAC_CMDR_RMC|ISAC_CMDR_RRES; - } - - if(exir & ISAC_EXIR_SOV) - { - NDBGL1(L1_I_ERR, "EXIRQ Sync Xfer Overflow"); - } - - if(exir & ISAC_EXIR_MOS) - { - NDBGL1(L1_I_ERR, "EXIRQ Monitor Status"); - } - - if(exir & ISAC_EXIR_SAW) - { - /* cannot happen, STCR:TSF is set to 0 */ - - NDBGL1(L1_I_ERR, "EXIRQ Subscriber Awake"); - } - - if(exir & ISAC_EXIR_WOV) - { - /* cannot happen, STCR:TSF is set to 0 */ - - NDBGL1(L1_I_ERR, "EXIRQ Watchdog Timer Overflow"); - } - - return(c); -} - -/*---------------------------------------------------------------------------* - * ISAC L1 Indication handler - *---------------------------------------------------------------------------*/ -static void -isic_isac_ind_hdlr(register struct isic_softc *sc, int ind) -{ - register int event; - - switch(ind) - { - case ISAC_CIRR_IAI8: - NDBGL1(L1_I_CICO, "rx AI8 in state %s", isic_printstate(sc)); - if(sc->sc_bustyp == BUS_TYPE_IOM2) - isic_isac_l1_cmd(sc, CMD_AR8); - event = EV_INFO48; - isdn_layer2_status_ind(&sc->sc_l2, sc->sc_l3token, STI_L1STAT, LAYER_ACTIVE); - break; - - case ISAC_CIRR_IAI10: - NDBGL1(L1_I_CICO, "rx AI10 in state %s", isic_printstate(sc)); - if(sc->sc_bustyp == BUS_TYPE_IOM2) - isic_isac_l1_cmd(sc, CMD_AR10); - event = EV_INFO410; - isdn_layer2_status_ind(&sc->sc_l2, sc->sc_l3token, STI_L1STAT, LAYER_ACTIVE); - break; - - case ISAC_CIRR_IRSY: - NDBGL1(L1_I_CICO, "rx RSY in state %s", isic_printstate(sc)); - event = EV_RSY; - break; - - case ISAC_CIRR_IPU: - NDBGL1(L1_I_CICO, "rx PU in state %s", isic_printstate(sc)); - event = EV_PU; - break; - - case ISAC_CIRR_IDR: - NDBGL1(L1_I_CICO, "rx DR in state %s", isic_printstate(sc)); - isic_isac_l1_cmd(sc, CMD_DIU); - event = EV_DR; - break; - - case ISAC_CIRR_IDID: - NDBGL1(L1_I_CICO, "rx DID in state %s", isic_printstate(sc)); - event = EV_INFO0; - isdn_layer2_status_ind(&sc->sc_l2, sc->sc_l3token, STI_L1STAT, LAYER_IDLE); - break; - - case ISAC_CIRR_IDIS: - NDBGL1(L1_I_CICO, "rx DIS in state %s", isic_printstate(sc)); - event = EV_DIS; - break; - - case ISAC_CIRR_IEI: - NDBGL1(L1_I_CICO, "rx EI in state %s", isic_printstate(sc)); - isic_isac_l1_cmd(sc, CMD_DIU); - event = EV_EI; - break; - - case ISAC_CIRR_IARD: - NDBGL1(L1_I_CICO, "rx ARD in state %s", isic_printstate(sc)); - event = EV_INFO2; - break; - - case ISAC_CIRR_ITI: - NDBGL1(L1_I_CICO, "rx TI in state %s", isic_printstate(sc)); - event = EV_INFO0; - break; - - case ISAC_CIRR_IATI: - NDBGL1(L1_I_CICO, "rx ATI in state %s", isic_printstate(sc)); - event = EV_INFO0; - break; - - case ISAC_CIRR_ISD: - NDBGL1(L1_I_CICO, "rx SD in state %s", isic_printstate(sc)); - event = EV_INFO0; - break; - - default: - NDBGL1(L1_I_ERR, "UNKNOWN Indication 0x%x in state %s", ind, isic_printstate(sc)); - event = EV_INFO0; - break; - } - isic_next_state(sc, event); -} - -/*---------------------------------------------------------------------------* - * execute a layer 1 command - *---------------------------------------------------------------------------*/ -void -isic_isac_l1_cmd(struct isic_softc *sc, int command) -{ - u_char cmd; - -#ifdef I4B_SMP_WORKAROUND - - /* XXXXXXXXXXXXXXXXXXX */ - - /* - * patch from Wolfgang Helbig: - * - * Here is a patch that makes i4b work on an SMP: - * The card (TELES 16.3) didn't interrupt on an SMP machine. - * This is a gross workaround, but anyway it works *and* provides - * some information as how to finally fix this problem. - */ - - HSCX_WRITE(0, H_MASK, 0xff); - HSCX_WRITE(1, H_MASK, 0xff); - ISAC_WRITE(I_MASK, 0xff); - DELAY(100); - HSCX_WRITE(0, H_MASK, HSCX_A_IMASK); - HSCX_WRITE(1, H_MASK, HSCX_B_IMASK); - ISAC_WRITE(I_MASK, ISAC_IMASK); - - /* XXXXXXXXXXXXXXXXXXX */ - -#endif /* I4B_SMP_WORKAROUND */ - - if(command < 0 || command > CMD_ILL) - { - NDBGL1(L1_I_ERR, "illegal cmd 0x%x in state %s", command, isic_printstate(sc)); - return; - } - - if(sc->sc_bustyp == BUS_TYPE_IOM2) - cmd = ISAC_CIX0_LOW; - else - cmd = 0; - - switch(command) - { - case CMD_TIM: - NDBGL1(L1_I_CICO, "tx TIM in state %s", isic_printstate(sc)); - cmd |= (ISAC_CIXR_CTIM << 2); - break; - - case CMD_RS: - NDBGL1(L1_I_CICO, "tx RS in state %s", isic_printstate(sc)); - cmd |= (ISAC_CIXR_CRS << 2); - break; - - case CMD_AR8: - NDBGL1(L1_I_CICO, "tx AR8 in state %s", isic_printstate(sc)); - cmd |= (ISAC_CIXR_CAR8 << 2); - break; - - case CMD_AR10: - NDBGL1(L1_I_CICO, "tx AR10 in state %s", isic_printstate(sc)); - cmd |= (ISAC_CIXR_CAR10 << 2); - break; - - case CMD_DIU: - NDBGL1(L1_I_CICO, "tx DIU in state %s", isic_printstate(sc)); - cmd |= (ISAC_CIXR_CDIU << 2); - break; - } - ISAC_WRITE(I_CIXR, cmd); -} - -/*---------------------------------------------------------------------------* - * L1 ISAC initialization - *---------------------------------------------------------------------------*/ -int -isic_isac_init(struct isic_softc *sc) -{ - ISAC_IMASK = 0xff; /* disable all irqs */ - - ISAC_WRITE(I_MASK, ISAC_IMASK); - - if(sc->sc_bustyp != BUS_TYPE_IOM2) - { - NDBGL1(L1_I_SETUP, "configuring for IOM-1 mode"); - - /* ADF2: Select mode IOM-1 */ - ISAC_WRITE(I_ADF2, 0x00); - - /* SPCR: serial port control register: - * SPU - software power up = 0 - * SAC - SIP port high Z - * SPM - timing mode 0 - * TLP - test loop = 0 - * C1C, C2C - B1 and B2 switched to/from SPa - */ - ISAC_WRITE(I_SPCR, ISAC_SPCR_C1C1|ISAC_SPCR_C2C1); - - /* SQXR: S/Q channel xmit register: - * SQIE - S/Q IRQ enable = 0 - * SQX1-4 - Fa bits = 1 - */ - ISAC_WRITE(I_SQXR, ISAC_SQXR_SQX1|ISAC_SQXR_SQX2|ISAC_SQXR_SQX3|ISAC_SQXR_SQX4); - - /* ADF1: additional feature reg 1: - * WTC - watchdog = 0 - * TEM - test mode = 0 - * PFS - pre-filter = 0 - * CFS - IOM clock/frame always active - * FSC1/2 - polarity of 8kHz strobe - * ITF - interframe fill = idle - */ - ISAC_WRITE(I_ADF1, ISAC_ADF1_FC2); /* ADF1 */ - - /* STCR: sync transfer control reg: - * TSF - terminal secific functions = 0 - * TBA - TIC bus address = 7 - * STx/SCx = 0 - */ - ISAC_WRITE(I_STCR, ISAC_STCR_TBA2|ISAC_STCR_TBA1|ISAC_STCR_TBA0); - } - else - { - NDBGL1(L1_I_SETUP, "configuring for IOM-2 mode"); - - /* ADF2: Select mode IOM-2 */ - ISAC_WRITE(I_ADF2, ISAC_ADF2_IMS); - - /* SPCR: serial port control register: - * SPU - software power up = 0 - * SPM - timing mode 0 - * TLP - test loop = 0 - * C1C, C2C - B1 + C1 and B2 + IC2 monitoring - */ - ISAC_WRITE(I_SPCR, 0x00); - - /* SQXR: S/Q channel xmit register: - * IDC - IOM direction = 0 (master) - * CFS - Config Select = 0 (clock always active) - * CI1E - C/I channel 1 IRQ enable = 0 - * SQIE - S/Q IRQ enable = 0 - * SQX1-4 - Fa bits = 1 - */ - ISAC_WRITE(I_SQXR, ISAC_SQXR_SQX1|ISAC_SQXR_SQX2|ISAC_SQXR_SQX3|ISAC_SQXR_SQX4); - - /* ADF1: additional feature reg 1: - * WTC - watchdog = 0 - * TEM - test mode = 0 - * PFS - pre-filter = 0 - * IOF - IOM i/f off = 0 - * ITF - interframe fill = idle - */ - ISAC_WRITE(I_ADF1, 0x00); - - /* STCR: sync transfer control reg: - * TSF - terminal secific functions = 0 - * TBA - TIC bus address = 7 - * STx/SCx = 0 - */ - ISAC_WRITE(I_STCR, ISAC_STCR_TBA2|ISAC_STCR_TBA1|ISAC_STCR_TBA0); - } - - - /* MODE: Mode Register: - * MDSx - transparent mode 2 - * TMD - timer mode = external - * RAC - Receiver enabled - * DIMx - digital i/f mode - */ - ISAC_WRITE(I_MODE, ISAC_MODE_MDS2|ISAC_MODE_MDS1|ISAC_MODE_RAC|ISAC_MODE_DIM0); - - /* enabled interrupts: - * =================== - * RME - receive message end - * RPF - receive pool full - * XPR - transmit pool ready - * CISQ - CI or S/Q channel change - * EXI - extended interrupt - */ - - ISAC_IMASK = ISAC_MASK_RSC | /* auto mode only */ - ISAC_MASK_TIN | /* timer irq */ - ISAC_MASK_SIN; /* sync xfer irq */ - - ISAC_WRITE(I_MASK, ISAC_IMASK); - - ISAC_WRITE(I_CMDR, ISAC_CMDR_RRES|ISAC_CMDR_XRES); - ISACCMDRWRDELAY(); - - return(0); -} - -/*---------------------------------------------------------------------------* - * isic_recovery - try to recover from irq lockup - *---------------------------------------------------------------------------*/ -void -isic_recover(struct isic_softc *sc) -{ - u_char byte; - - /* get hscx irq status from hscx b ista */ - - byte = HSCX_READ(HSCX_CH_B, H_ISTA); - - NDBGL1(L1_ERROR, "HSCX B: ISTA = 0x%x", byte); - - if(byte & HSCX_ISTA_ICA) - NDBGL1(L1_ERROR, "HSCX A: ISTA = 0x%x", (u_char)HSCX_READ(HSCX_CH_A, H_ISTA)); - - if(byte & HSCX_ISTA_EXB) - NDBGL1(L1_ERROR, "HSCX B: EXIR = 0x%x", (u_char)HSCX_READ(HSCX_CH_B, H_EXIR)); - - if(byte & HSCX_ISTA_EXA) - NDBGL1(L1_ERROR, "HSCX A: EXIR = 0x%x", (u_char)HSCX_READ(HSCX_CH_A, H_EXIR)); - - /* get isac irq status */ - - byte = ISAC_READ(I_ISTA); - - NDBGL1(L1_ERROR, " ISAC: ISTA = 0x%x", byte); - - if(byte & ISAC_ISTA_EXI) - NDBGL1(L1_ERROR, " ISAC: EXIR = 0x%x", (u_char)ISAC_READ(I_EXIR)); - - if(byte & ISAC_ISTA_CISQ) - { - byte = ISAC_READ(I_CIRR); - - NDBGL1(L1_ERROR, " ISAC: CISQ = 0x%x", byte); - - if(byte & ISAC_CIRR_SQC) - NDBGL1(L1_ERROR, " ISAC: SQRR = 0x%x", (u_char)ISAC_READ(I_SQRR)); - } - - NDBGL1(L1_ERROR, "HSCX B: IMASK = 0x%x", HSCX_B_IMASK); - NDBGL1(L1_ERROR, "HSCX A: IMASK = 0x%x", HSCX_A_IMASK); - - HSCX_WRITE(0, H_MASK, 0xff); - HSCX_WRITE(1, H_MASK, 0xff); - DELAY(100); - HSCX_WRITE(0, H_MASK, HSCX_A_IMASK); - HSCX_WRITE(1, H_MASK, HSCX_B_IMASK); - DELAY(100); - - NDBGL1(L1_ERROR, " ISAC: IMASK = 0x%x", ISAC_IMASK); - - ISAC_WRITE(I_MASK, 0xff); - DELAY(100); - ISAC_WRITE(I_MASK, ISAC_IMASK); -} diff --git a/sys/dev/ic/isac.h b/sys/dev/ic/isac.h deleted file mode 100644 index a264e5ef179..00000000000 --- a/sys/dev/ic/isac.h +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright (c) 1996, 1998 Gary Jennejohn. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * $Id: isac.h,v 1.4 2011/08/07 20:05:08 jakllsch Exp $ - * - * last edit-date: [Sun Feb 14 10:27:13 1999] - * - * -hm split up for rewrite of Siemens chipset driver - * - *--------------------------------------------------------------------------- - */ - -#ifndef I4B_ISAC_H_ -#define I4B_ISAC_H_ - -/* - * The ISAC databook specifies a delay of 2.5 DCL clock cycles between - * writes to the ISAC command register CMDR. This is the delay used to - * satisfy this requirement. - */ - -#define I4B_ISAC_CMDRWRDELAY 30 - -#if (I4B_ISAC_CMDRWRDELAY > 0) -#define ISACCMDRWRDELAY() DELAY(I4B_ISAC_CMDRWRDELAY) -#else -#warning "I4B_ISAC_CMDRWRDELAY set to 0!" -#define ISACCMDRWRDELAY() -#endif - -enum ISAC_VERSIONS { - ISAC_VA, /* 2085 A1 or A2, 2086/2186 V1.1 */ - ISAC_VB1, /* 2085 B1 */ - ISAC_VB2, /* 2085 B2 */ - ISAC_VB3, /* 2085 B3/V2.3 */ - ISAC_UNKN /* unknown version */ -}; - -#define ISAC_FIFO_LEN 32 /* 32 bytes FIFO on chip */ - -/* - * definitions of registers and bits for the ISAC ISDN chip. - */ - -typedef struct isac_reg { - - /* 32 byte deep FIFO always first */ - - unsigned char isac_fifo [ISAC_FIFO_LEN]; - - /* most registers can be read/written, but have different names */ - /* so define a union with read/write names to make that clear */ - - union { - struct { - unsigned char isac_ista; - unsigned char isac_star; - unsigned char isac_mode; - unsigned char isac_timr; - unsigned char isac_exir; - unsigned char isac_rbcl; - unsigned char isac_sapr; - unsigned char isac_rsta; - unsigned char dummy_28; - unsigned char isac_rhcr; - unsigned char isac_rbch; - unsigned char isac_star2; - unsigned char dummy_2c; - unsigned char dummy_2d; - unsigned char dummy_2e; - unsigned char dummt_2f; - unsigned char isac_spcr; - unsigned char isac_cirr; - unsigned char isac_mor; - unsigned char isac_sscr; - unsigned char isac_sfcr; - unsigned char isac_c1r; - unsigned char isac_c2r; - unsigned char isac_b1cr; - unsigned char isac_b2cr; - unsigned char isac_adf2; - unsigned char isac_mosr; - unsigned char isac_sqrr; - } isac_r; - struct { - unsigned char isac_mask; - unsigned char isac_cmdr; - unsigned char isac_mode; - unsigned char isac_timr; - unsigned char isac_xad1; - unsigned char isac_xad2; - unsigned char isac_sap1; - unsigned char isac_sap2; - unsigned char isac_tei1; - unsigned char isac_tei2; - unsigned char dummy_2a; - unsigned char isac_star2; - unsigned char dummy_2c; - unsigned char dummy_2d; - unsigned char dummy_2e; - unsigned char dummt_2f; - unsigned char isac_spcr; - unsigned char isac_cixr; - unsigned char isac_mox; - unsigned char isac_sscx; - unsigned char isac_sfcw; - unsigned char isac_c1r; - unsigned char isac_c2r; - unsigned char isac_stcr; - unsigned char isac_adf1; - unsigned char isac_adf2; - unsigned char isac_mocr; - unsigned char isac_sqxr; - } isac_w; - } isac_rw; -} isac_reg_t; - -#define REG_OFFSET(type, field) (uintptr_t)(&(((type *)0)->field)) - -/* ISAC read registers */ - -#define i_ista isac_rw.isac_r.isac_ista -#define I_ISTA REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_ista) -#define i_star isac_rw.isac_r.isac_star -#define I_STAR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_star) -#define i_mode isac_rw.isac_r.isac_mode -#define I_MODE REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_mode) -#define i_timr isac_rw.isac_r.isac_timr -#define I_TIMR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_timr) -#define i_exir isac_rw.isac_r.isac_exir -#define I_EXIR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_exir) -#define i_rbcl isac_rw.isac_r.isac_rbcl -#define I_RBCL REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_rbcl) -#define i_sapr isac_rw.isac_r.isac_sapr -#define I_SAPR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_sapr) -#define i_rsta isac_rw.isac_r.isac_rsta -#define I_RSTA REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_rsta) -#define i_rhcr isac_rw.isac_r.isac_rhcr -#define I_RHCR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_rhcr) -#define i_rbch isac_rw.isac_r.isac_rbch -#define I_RBCH REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_rbch) -#define i_star2 isac_rw.isac_r.isac_star2 -#define I_STAR2 REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_star2) -#define i_spcr isac_rw.isac_r.isac_spcr -#define I_SPCR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_spcr) -#define i_cirr isac_rw.isac_r.isac_cirr -#define I_CIRR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_cirr) -#define i_mor isac_rw.isac_r.isac_mor -#define I_MOR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_mor) -#define i_sscr isac_rw.isac_r.isac_sscr -#define I_SSCR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_sscr) -#define i_sfcr isac_rw.isac_r.isac_sfcr -#define I_SFCR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_sfcr) -#define i_c1r isac_rw.isac_r.isac_c1r -#define I_C1R REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_c1r) -#define i_c2r isac_rw.isac_r.isac_c2r -#define I_C2R REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_c2r) -#define i_b1cr isac_rw.isac_r.isac_b1cr -#define I_B1CR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_b1cr) -#define i_b2cr isac_rw.isac_r.isac_b2cr -#define I_B2CR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_b2cr) -#define i_adf2 isac_rw.isac_r.isac_adf2 -#define I_ADF2 REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_adf2) -#define i_mosr isac_rw.isac_r.isac_mosr -#define I_MOSR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_mosr) -#define i_sqrr isac_rw.isac_r.isac_sqrr -#define I_SQRR REG_OFFSET(isac_reg_t, isac_rw.isac_r.isac_sqrr) - -/* ISAC write registers - isac_mode, isac_timr, isac_star2, isac_spcr, */ -/* isac_c1r, isac_c2r, isac_adf2 see read registers */ - -#define i_mask isac_rw.isac_w.isac_mask -#define I_MASK REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_mask) -#define i_cmdr isac_rw.isac_w.isac_cmdr -#define I_CMDR REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_cmdr) -#define i_xad1 isac_rw.isac_w.isac_xad1 -#define I_XAD1 REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_xad1) -#define i_xad2 isac_rw.isac_w.isac_xad2 -#define I_XAD2 REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_xad2) -#define i_sap1 isac_rw.isac_w.isac_sap1 -#define I_SAP1 REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_sap1) -#define i_sap2 isac_rw.isac_w.isac_sap2 -#define I_SAP2 REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_sap2) -#define i_tei1 isac_rw.isac_w.isac_tei1 -#define i_tei2 isac_rw.isac_w.isac_tei2 -#define i_cixr isac_rw.isac_w.isac_cixr -#define I_CIXR REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_cixr) -#define I_CIX0 I_CIXR -#define i_mox isac_rw.isac_w.isac_mox -#define I_MOX REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_mox) -#define i_sscx isac_rw.isac_w.isac_sscx -#define I_SSCX REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_sscx) -#define i_sfcw isac_rw.isac_w.isac_sfcw -#define I_SFCW REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_sfcw) -#define i_stcr isac_rw.isac_w.isac_stcr -#define I_STCR REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_stcr) -#define i_adf1 isac_rw.isac_w.isac_adf1 -#define I_ADF1 REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_adf1) -#define i_mocr isac_rw.isac_w.isac_mocr -#define I_MOCR REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_mocr) -#define i_sqxr isac_rw.isac_w.isac_sqxr -#define I_SQXR REG_OFFSET(isac_reg_t, isac_rw.isac_w.isac_sqxr) - -#define ISAC_ISTA_RME 0x80 -#define ISAC_ISTA_RPF 0x40 -#define ISAC_ISTA_RSC 0x20 -#define ISAC_ISTA_XPR 0x10 -#define ISAC_ISTA_TIN 0x08 -#define ISAC_ISTA_CISQ 0x04 -#define ISAC_ISTA_SIN 0x02 -#define ISAC_ISTA_EXI 0x01 - -#define ISAC_MASK_RME 0x80 -#define ISAC_MASL_RPF 0x40 -#define ISAC_MASK_RSC 0x20 -#define ISAC_MASK_XPR 0x10 -#define ISAC_MASK_TIN 0x08 -#define ISAC_MASK_CISQ 0x04 -#define ISAC_MASK_SIN 0x02 -#define ISAC_MASK_EXI 0x01 -#define ISAC_MASK_ALL 0xff - -#define ISAC_STAR_XDOV 0x80 -#define ISAC_STAR_XFW 0x40 -#define ISAC_STAR_XRNR 0x20 -#define ISAC_STAR_RRNR 0x10 -#define ISAC_STAR_MBR 0x08 -#define ISAC_STAR_MAC1 0x04 -#define ISAC_STAR_BVS 0x02 -#define ISAC_STAR_MAC0 0x01 - -#define ISAC_CMDR_RMC 0x80 -#define ISAC_CMDR_RRES 0x40 -#define ISAC_CMDR_RNR 0x20 -#define ISAC_CMDR_STI 0x10 -#define ISAC_CMDR_XTF 0x08 -#define ISAC_CMDR_XIF 0x04 -#define ISAC_CMDR_XME 0x02 -#define ISAC_CMDR_XRES 0x01 - -#define ISAC_MODE_MDS2 0x80 -#define ISAC_MODE_MDS1 0x40 -#define ISAC_MODE_MDS0 0x20 -#define ISAC_MODE_TMD 0x10 -#define ISAC_MODE_RAC 0x08 -#define ISAC_MODE_DIM2 0x04 -#define ISAC_MODE_DIM1 0x02 -#define ISAC_MODE_DIM0 0x01 - -#define ISAC_EXIR_XMR 0x80 -#define ISAC_EXIR_XDU 0x40 -#define ISAC_EXIR_PCE 0x20 -#define ISAC_EXIR_RFO 0x10 -#define ISAC_EXIR_SOV 0x08 -#define ISAC_EXIR_MOS 0x04 -#define ISAC_EXIR_SAW 0x02 -#define ISAC_EXIR_WOV 0x01 - -#define ISAC_RSTA_RDA 0x80 -#define ISAC_RSTA_RDO 0x40 -#define ISAC_RSTA_CRC 0x20 -#define ISAC_RSTA_RAB 0x10 -#define ISAC_RSTA_SA1 0x08 -#define ISAC_RSTA_SA0 0x04 -#define ISAC_RSTA_CR 0x02 -#define ISAC_RSTA_TA 0x01 - -#define ISAC_RSTA_MASK 0x70 /* the interesting bits */ - -#define ISAC_RBCH_XAC 0x80 -#define ISAC_RBCH_VN1 0x40 -#define ISAC_RBCH_VN0 0x20 -#define ISAC_RBCH_OV 0x10 -/* the other 4 bits are the high bits of the receive byte count */ - -#define ISAC_SPCR_SPU 0x80 -#define ISAC_SPCR_SAC 0x40 -#define ISAC_SPCR_SPM 0x20 -#define ISAC_SPCR_TLP 0x10 -#define ISAC_SPCR_C1C1 0x08 -#define ISAC_SPCR_C1C0 0x04 -#define ISAC_SPCR_C2C1 0x02 -#define ISAC_SPCR_C2C0 0x01 - -#define ISAC_CIRR_SQC 0x80 -#define ISAC_CIRR_BAS 0x40 -/* bits 5-2 CODR */ -#define ISAC_CIRR_CIC0 0x02 -/* bit 0 is always 0 */ -/* C/I codes from bits 5-2 (>> 2 & 0xf) */ -/* the indications */ -#define ISAC_CIRR_IPU 0x07 -#define ISAC_CIRR_IDR 0x00 -#define ISAC_CIRR_ISD 0x02 -#define ISAC_CIRR_IDIS 0x03 -#define ISAC_CIRR_IEI 0x06 -#define ISAC_CIRR_IRSY 0x04 -#define ISAC_CIRR_IARD 0x08 -#define ISAC_CIRR_ITI 0x0a -#define ISAC_CIRR_IATI 0x0b -#define ISAC_CIRR_IAI8 0x0c -#define ISAC_CIRR_IAI10 0x0d -#define ISAC_CIRR_IDID 0x0f - -#define ISAC_CI_MASK 0x0f - -#define ISAC_CIXR_RSS 0x80 -#define ISAC_CIXR_BAC 0x40 -/* bits 5-2 CODX */ -#define ISAC_CIXR_TCX 0x02 -#define ISAC_CIXR_ECX 0x01 -/* in IOM-2 mode the low bits are always 1 */ -#define ISAC_CIX0_LOW 0x03 -/* C/I codes from bits 5-2 (>> 2 & 0xf) */ -/* the commands */ -#define ISAC_CIXR_CTIM 0 -#define ISAC_CIXR_CRS 0x01 -#define ISAC_CIXR_CSCZ 0x04 -#define ISAC_CIXR_CSSZ 0x02 -#define ISAC_CIXR_CAR8 0x08 -#define ISAC_CIXR_CAR10 0x09 -#define ISAC_CIXR_CARL 0x0a -#define ISAC_CIXR_CDIU 0x0f - -#define ISAC_STCR_TSF 0x80 -#define ISAC_STCR_TBA2 0x40 -#define ISAC_STCR_TBA1 0x20 -#define ISAC_STCR_TBA0 0x10 -#define ISAC_STCR_ST1 0x08 -#define ISAC_STCR_ST0 0x04 -#define ISAC_STCR_SC1 0x02 -#define ISAC_STCR_SC0 0x01 - -#define ISAC_ADF1_WTC1 0x80 -#define ISAC_ADF1_WTC2 0x40 -#define ISAC_ADF1_TEM 0x20 -#define ISAC_ADF1_PFS 0x10 -#define ISAC_ADF1_CFS 0x08 -#define ISAC_ADF1_FC2 0x04 -#define ISAC_ADF1_FC1 0x02 -#define ISAC_ADF1_ITF 0x01 - -#define ISAC_ADF2_IMS 0x80 -/* all other bits are 0 */ - -/* bits 7-5 are always 0 */ -#define ISAC_SQRR_SYN 0x10 -#define ISAC_SQRR_SQR1 0x08 -#define ISAC_SQRR_SQR2 0x04 -#define ISAC_SQRR_SQR3 0x02 -#define ISAC_SQRR_SQR4 0x01 - -#define ISAC_SQXR_IDC 0x80 -#define ISAC_SQXR_CFS 0x40 -#define ISAC_SQXR_CI1E 0x20 -#define ISAC_SQXR_SQIE 0x10 -#define ISAC_SQXR_SQX1 0x08 -#define ISAC_SQXR_SQX2 0x04 -#define ISAC_SQXR_SQX3 0x02 -#define ISAC_SQXR_SQX4 0x01 - -#endif /* I4B_ISAC_H_ */ diff --git a/sys/dev/ic/isacsx.c b/sys/dev/ic/isacsx.c deleted file mode 100644 index a97c9f01540..00000000000 --- a/sys/dev/ic/isacsx.c +++ /dev/null @@ -1,675 +0,0 @@ -/* $NetBSD: isacsx.c,v 1.7 2012/10/27 17:18:21 chs Exp $ */ -/* - * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved. - * Copyright (c) 2001 Gary Jennejohn. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * i4b_ifpi2_isac.c - i4b Fritz PCI Version 2 ISACSX handler - * -------------------------------------------- - * - * $Id: isacsx.c,v 1.7 2012/10/27 17:18:21 chs Exp $ - * - * $FreeBSD: src/sys/i4b/layer1/ifpi2/i4b_ifpi2_isacsx.c,v 1.3 2002/09/02 00:52:07 brooks Exp $ - * - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isacsx.c,v 1.7 2012/10/27 17:18:21 chs Exp $"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <sys/device.h> - -#include <net/if.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#include <machine/i4b_trace.h> - -#include <i4b/layer1/i4b_l1.h> - -#include <i4b/layer1/isic/i4b_isic.h> -#include <i4b/layer1/isic/i4b_hscx.h> - -#include <i4b/layer1/ifpi2/i4b_ifpi2_ext.h> -#include <i4b/layer1/ifpi2/i4b_ifpi2_isacsx.h> - -#include <i4b/include/i4b_global.h> -#include <i4b/include/i4b_mbuf.h> -#else -#include <sys/bus.h> - -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_trace.h> - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#include <dev/ic/isacsx.h> -#include <dev/ic/isic_l1.h> -#include <dev/ic/hscx.h> - -#endif - -static u_char isic_isacsx_exir_hdlr(register struct isic_softc *sc, u_char exir); -static void isic_isacsx_ind_hdlr(register struct isic_softc *sc, int ind); - -/* the ISACSX has 2 mask registers of interest - cannot use ISAC_IMASK */ -unsigned char isacsx_imaskd; -unsigned char isacsx_imask; - -/*---------------------------------------------------------------------------* - * ISACSX interrupt service routine - *---------------------------------------------------------------------------*/ -void -isic_isacsx_irq(struct isic_softc *sc, int ista) -{ - register u_char c = 0; - register u_char istad = 0; - - NDBGL1(L1_F_MSG, "%s: ista = 0x%02x", device_xname(sc->sc_dev), ista); - - /* was it an HDLC interrupt ? */ - if (ista & ISACSX_ISTA_ICD) - { - istad = ISAC_READ(I_ISTAD); - NDBGL1(L1_F_MSG, "%s: istad = 0x%02x", device_xname(sc->sc_dev), istad); - - if(istad & (ISACSX_ISTAD_RFO|ISACSX_ISTAD_XMR|ISACSX_ISTAD_XDU)) - { - /* not really EXIR, but very similar */ - c |= isic_isacsx_exir_hdlr(sc, istad); - } - } - - if(istad & ISACSX_ISTAD_RME) /* receive message end */ - { - register int rest; - u_char rsta; - - /* get rx status register */ - - rsta = ISAC_READ(I_RSTAD); - - /* Check for Frame and CRC valid */ - if((rsta & ISACSX_RSTAD_MASK) != (ISACSX_RSTAD_VFR|ISACSX_RSTAD_CRC)) - { - int error = 0; - - if(!(rsta & ISACSX_RSTAD_VFR)) /* VFR error */ - { - error++; - NDBGL1(L1_I_ERR, "%s: Frame not valid error", device_xname(sc->sc_dev)); - } - - if(!(rsta & ISACSX_RSTAD_CRC)) /* CRC error */ - { - error++; - NDBGL1(L1_I_ERR, "%s: CRC error", device_xname(sc->sc_dev)); - } - - if(rsta & ISACSX_RSTAD_RDO) /* ReceiveDataOverflow */ - { - error++; - NDBGL1(L1_I_ERR, "%s: Data Overrun error", device_xname(sc->sc_dev)); - } - - if(rsta & ISACSX_RSTAD_RAB) /* ReceiveABorted */ - { - error++; - NDBGL1(L1_I_ERR, "%s: Receive Aborted error", device_xname(sc->sc_dev)); - } - - if(error == 0) - NDBGL1(L1_I_ERR, "%s: RME unknown error, RSTAD = 0x%02x!", device_xname(sc->sc_dev), rsta); - - i4b_Dfreembuf(sc->sc_ibuf); - - c |= ISACSX_CMDRD_RMC|ISACSX_CMDRD_RRES; - - sc->sc_ibuf = NULL; - sc->sc_ib = NULL; - sc->sc_ilen = 0; - - ISAC_WRITE(I_CMDRD, ISACSX_CMDRD_RMC|ISACSX_CMDRD_RRES); - - return; - } - - rest = (ISAC_READ(I_RBCLD) & (ISACSX_FIFO_LEN-1)); - - if(rest == 0) - rest = ISACSX_FIFO_LEN; - - if(sc->sc_ibuf == NULL) - { - if((sc->sc_ibuf = i4b_Dgetmbuf(rest)) != NULL) - sc->sc_ib = sc->sc_ibuf->m_data; - else - panic("isic_isacsx_irq: RME, i4b_Dgetmbuf returns NULL!\n"); - sc->sc_ilen = 0; - } - - if(sc->sc_ilen <= (MAX_DFRAME_LEN - rest)) - { - ISAC_RDFIFO(sc->sc_ib, rest); - /* the last byte contains status, strip it */ - sc->sc_ilen += rest - 1; - - sc->sc_ibuf->m_pkthdr.len = - sc->sc_ibuf->m_len = sc->sc_ilen; - - if(sc->sc_trace & TRACE_D_RX) - { - i4b_trace_hdr hdr; - - memset(&hdr, 0, sizeof hdr); - hdr.type = TRC_CH_D; - hdr.dir = FROM_NT; - hdr.count = ++sc->sc_trace_dcount; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, sc->sc_ibuf->m_len, sc->sc_ibuf->m_data); - } - - c |= ISACSX_CMDRD_RMC; - - if(sc->sc_intr_valid == ISIC_INTR_VALID && - (((struct isdn_l3_driver*)sc->sc_l3token)->protocol != PROTOCOL_D64S)) - { - isdn_layer2_data_ind(&sc->sc_l2, sc->sc_l3token, sc->sc_ibuf); - } - else - { - i4b_Dfreembuf(sc->sc_ibuf); - } - } - else - { - NDBGL1(L1_I_ERR, "RME, input buffer overflow!"); - i4b_Dfreembuf(sc->sc_ibuf); - c |= ISACSX_CMDRD_RMC|ISACSX_CMDRD_RRES; - } - - sc->sc_ibuf = NULL; - sc->sc_ib = NULL; - sc->sc_ilen = 0; - } - - if(istad & ISACSX_ISTAD_RPF) /* receive fifo full */ - { - if(sc->sc_ibuf == NULL) - { - if((sc->sc_ibuf = i4b_Dgetmbuf(MAX_DFRAME_LEN)) != NULL) - sc->sc_ib= sc->sc_ibuf->m_data; - else - panic("isic_isacsx_irq: RPF, i4b_Dgetmbuf returns NULL!\n"); - sc->sc_ilen = 0; - } - - if(sc->sc_ilen <= (MAX_DFRAME_LEN - ISACSX_FIFO_LEN)) - { - ISAC_RDFIFO(sc->sc_ib, ISACSX_FIFO_LEN); - sc->sc_ilen += ISACSX_FIFO_LEN; - sc->sc_ib += ISACSX_FIFO_LEN; - c |= ISACSX_CMDRD_RMC; - } - else - { - NDBGL1(L1_I_ERR, "RPF, input buffer overflow!"); - i4b_Dfreembuf(sc->sc_ibuf); - sc->sc_ibuf = NULL; - sc->sc_ib = NULL; - sc->sc_ilen = 0; - c |= ISACSX_CMDRD_RMC|ISACSX_CMDRD_RRES; - } - } - - if(istad & ISACSX_ISTAD_XPR) /* transmit fifo empty (XPR bit set) */ - { - if((sc->sc_obuf2 != NULL) && (sc->sc_obuf == NULL)) - { - sc->sc_freeflag = sc->sc_freeflag2; - sc->sc_obuf = sc->sc_obuf2; - sc->sc_op = sc->sc_obuf->m_data; - sc->sc_ol = sc->sc_obuf->m_len; - sc->sc_obuf2 = NULL; -#ifdef NOTDEF - printf("ob2=%x, op=%x, ol=%d, f=%d #", - sc->sc_obuf, - sc->sc_op, - sc->sc_ol, - sc->sc_state); -#endif - } - else - { -#ifdef NOTDEF - printf("ob=%x, op=%x, ol=%d, f=%d #", - sc->sc_obuf, - sc->sc_op, - sc->sc_ol, - sc->sc_state); -#endif - } - - if(sc->sc_obuf) - { - ISAC_WRFIFO(sc->sc_op, min(sc->sc_ol, ISACSX_FIFO_LEN)); - - if(sc->sc_ol > ISACSX_FIFO_LEN) /* length > 32 ? */ - { - sc->sc_op += ISACSX_FIFO_LEN; /* bufferptr+32 */ - sc->sc_ol -= ISACSX_FIFO_LEN; /* length - 32 */ - c |= ISACSX_CMDRD_XTF; /* set XTF bit */ - } - else - { - if(sc->sc_freeflag) - { - i4b_Dfreembuf(sc->sc_obuf); - sc->sc_freeflag = 0; - } - sc->sc_obuf = NULL; - sc->sc_op = NULL; - sc->sc_ol = 0; - - c |= ISACSX_CMDRD_XTF | ISACSX_CMDRD_XME; - } - } - else - { - sc->sc_state &= ~ISAC_TX_ACTIVE; - } - } - - if(ista & ISACSX_ISTA_CIC) /* channel status change CISQ */ - { - register u_char ci; - - /* get command/indication rx register*/ - - ci = ISAC_READ(I_CIR0); - - /* C/I code change IRQ (flag already cleared by CIR0 read) */ - - if(ci & ISACSX_CIR0_CIC0) - isic_isacsx_ind_hdlr(sc, (ci >> 4) & 0xf); - } - - if(c) - { - ISAC_WRITE(I_CMDRD, c); - } -} - -/*---------------------------------------------------------------------------* - * ISACSX L1 Extended IRQ handler - *---------------------------------------------------------------------------*/ -static u_char -isic_isacsx_exir_hdlr(register struct isic_softc *sc, u_char exir) -{ - u_char c = 0; - - if(exir & ISACSX_ISTAD_XMR) - { - NDBGL1(L1_I_ERR, "EXIRQ Tx Message Repeat"); - - c |= ISACSX_CMDRD_XRES; - } - - if(exir & ISACSX_ISTAD_XDU) - { - NDBGL1(L1_I_ERR, "EXIRQ Tx Data Underrun"); - - c |= ISACSX_CMDRD_XRES; - } - - if(exir & ISACSX_ISTAD_RFO) - { - NDBGL1(L1_I_ERR, "EXIRQ Rx Frame Overflow"); - - c |= ISACSX_CMDRD_RMC; - } - -#if 0 /* all blocked per default */ - if(exir & ISACSX_EXIR_SOV) - { - NDBGL1(L1_I_ERR, "EXIRQ Sync Xfer Overflow"); - } - - if(exir & ISACSX_EXIR_MOS) - { - NDBGL1(L1_I_ERR, "EXIRQ Monitor Status"); - } - - if(exir & ISACSX_EXIR_SAW) - { - /* cannot happen, STCR:TSF is set to 0 */ - - NDBGL1(L1_I_ERR, "EXIRQ Subscriber Awake"); - } - - if(exir & ISACSX_EXIR_WOV) - { - /* cannot happen, STCR:TSF is set to 0 */ - - NDBGL1(L1_I_ERR, "EXIRQ Watchdog Timer Overflow"); - } -#endif - - return(c); -} - -/*---------------------------------------------------------------------------* - * ISACSX L1 Indication handler - *---------------------------------------------------------------------------*/ -static void -isic_isacsx_ind_hdlr(register struct isic_softc *sc, int ind) -{ - register int event; - - switch(ind) - { - case ISACSX_CIR0_IAI8: - NDBGL1(L1_I_CICO, "rx AI8 in state %s", isic_printstate(sc)); - if(sc->sc_bustyp == BUS_TYPE_IOM2) - isic_isacsx_l1_cmd(sc, CMD_AR8); - event = EV_INFO48; - isdn_layer2_status_ind(&sc->sc_l2, sc->sc_l3token, STI_L1STAT, LAYER_ACTIVE); - break; - - case ISACSX_CIR0_IAI10: - NDBGL1(L1_I_CICO, "rx AI10 in state %s", isic_printstate(sc)); - if(sc->sc_bustyp == BUS_TYPE_IOM2) - isic_isacsx_l1_cmd(sc, CMD_AR10); - event = EV_INFO410; - isdn_layer2_status_ind(&sc->sc_l2, sc->sc_l3token, STI_L1STAT, LAYER_ACTIVE); - break; - - case ISACSX_CIR0_IRSY: - NDBGL1(L1_I_CICO, "rx RSY in state %s", isic_printstate(sc)); - event = EV_RSY; - break; - - case ISACSX_CIR0_IPU: - NDBGL1(L1_I_CICO, "rx PU in state %s", isic_printstate(sc)); - event = EV_PU; - break; - - case ISACSX_CIR0_IDR: - NDBGL1(L1_I_CICO, "rx DR in state %s", isic_printstate(sc)); - isic_isacsx_l1_cmd(sc, CMD_DIU); - event = EV_DR; - break; - - case ISACSX_CIR0_IDID: - NDBGL1(L1_I_CICO, "rx DID in state %s", isic_printstate(sc)); - event = EV_INFO0; - isdn_layer2_status_ind(&sc->sc_l2, sc->sc_l3token, STI_L1STAT, LAYER_IDLE); - break; - - case ISACSX_CIR0_IDIS: - NDBGL1(L1_I_CICO, "rx DIS in state %s", isic_printstate(sc)); - event = EV_DIS; - break; - - case ISACSX_CIR0_IEI: - NDBGL1(L1_I_CICO, "rx EI in state %s", isic_printstate(sc)); - isic_isacsx_l1_cmd(sc, CMD_DIU); - event = EV_EI; - break; - - case ISACSX_CIR0_IARD: - NDBGL1(L1_I_CICO, "rx ARD in state %s", isic_printstate(sc)); - event = EV_INFO2; - break; - - case ISACSX_CIR0_ITI: - NDBGL1(L1_I_CICO, "rx TI in state %s", isic_printstate(sc)); - event = EV_INFO0; - break; - - case ISACSX_CIR0_IATI: - NDBGL1(L1_I_CICO, "rx ATI in state %s", isic_printstate(sc)); - event = EV_INFO0; - break; - - case ISACSX_CIR0_ISD: - NDBGL1(L1_I_CICO, "rx SD in state %s", isic_printstate(sc)); - event = EV_INFO0; - break; - - default: - NDBGL1(L1_I_ERR, "UNKNOWN Indication 0x%x in state %s", ind, isic_printstate(sc)); - event = EV_INFO0; - break; - } - isic_next_state(sc, event); -} - -/*---------------------------------------------------------------------------* - * execute a layer 1 command - *---------------------------------------------------------------------------*/ -void -isic_isacsx_l1_cmd(struct isic_softc *sc, int command) -{ - u_char cmd; - -#ifdef I4B_SMP_WORKAROUND - - /* XXXXXXXXXXXXXXXXXXX */ - - /* - * patch from Wolfgang Helbig: - * - * Here is a patch that makes i4b work on an SMP: - * The card (TELES 16.3) didn't interrupt on an SMP machine. - * This is a gross workaround, but anyway it works *and* provides - * some information as how to finally fix this problem. - */ - - HSCX_WRITE(0, H_MASK, 0xff); - HSCX_WRITE(1, H_MASK, 0xff); - ISAC_WRITE(I_MASKD, 0xff); - ISAC_WRITE(I_MASK, 0xff); - DELAY(100); - HSCX_WRITE(0, H_MASK, HSCX_A_IMASK); - HSCX_WRITE(1, H_MASK, HSCX_B_IMASK); - ISAC_WRITE(I_MASKD, isacsx_imaskd); - ISAC_WRITE(I_MASK, isacsx_imask); - - /* XXXXXXXXXXXXXXXXXXX */ - -#endif /* I4B_SMP_WORKAROUND */ - - if(command < 0 || command > CMD_ILL) - { - NDBGL1(L1_I_ERR, "illegal cmd 0x%x in state %s", command, isic_printstate(sc)); - return; - } - - cmd = ISACSX_CIX0_LOW; - - switch(command) - { - case CMD_TIM: - NDBGL1(L1_I_CICO, "tx TIM in state %s", isic_printstate(sc)); - cmd |= (ISACSX_CIX0_CTIM << 4); - break; - - case CMD_RS: - NDBGL1(L1_I_CICO, "tx RS in state %s", isic_printstate(sc)); - cmd |= (ISACSX_CIX0_CRS << 4); - break; - - case CMD_AR8: - NDBGL1(L1_I_CICO, "tx AR8 in state %s", isic_printstate(sc)); - cmd |= (ISACSX_CIX0_CAR8 << 4); - break; - - case CMD_AR10: - NDBGL1(L1_I_CICO, "tx AR10 in state %s", isic_printstate(sc)); - cmd |= (ISACSX_CIX0_CAR10 << 4); - break; - - case CMD_DIU: - NDBGL1(L1_I_CICO, "tx DIU in state %s", isic_printstate(sc)); - cmd |= (ISACSX_CIX0_CDIU << 4); - break; - } - ISAC_WRITE(I_CIX0, cmd); -} - -/*---------------------------------------------------------------------------* - * L1 ISACSX initialization - *---------------------------------------------------------------------------*/ -int -isic_isacsx_init(struct isic_softc *sc) -{ - isacsx_imaskd = 0xff; /* disable all irqs */ - isacsx_imask = 0xff; /* disable all irqs */ - - ISAC_WRITE(I_MASKD, isacsx_imaskd); - ISAC_WRITE(I_MASK, isacsx_imask); - - /* the ISACSX only runs in IOM-2 mode */ - NDBGL1(L1_I_SETUP, "configuring for IOM-2 mode"); - - /* TR_CONF0: Transceiver Configuration Register 0: - * DIS_TR - transceiver enabled - * EN_ICV - normal operation - * EXLP - no external loop - * LDD - automatic clock generation - */ - ISAC_WRITE(I_WTR_CONF0, 0); - - /* TR_CONF2: Transceiver Configuration Register 1: - * DIS_TX - transmitter enabled - * PDS - phase deviation 2 S-bits - * RLP - remote line loop open - */ - ISAC_WRITE(I_WTR_CONF2, 0); - - /* MODED: Mode Register: - * MDSx - transparent mode 0 - * TMD - timer mode = external - * RAC - Receiver enabled - * DIMx - digital i/f mode - */ - ISAC_WRITE(I_WMODED, ISACSX_MODED_MDS2|ISACSX_MODED_MDS1|ISACSX_MODED_RAC|ISACSX_MODED_DIM0); - - /* enabled interrupts: - * =================== - * RME - receive message end - * RPF - receive pool full - * RPO - receive pool overflow - * XPR - transmit pool ready - * XMR - transmit message repeat - * XDU - transmit data underrun - */ - - isacsx_imaskd = ISACSX_MASKD_LOW; - ISAC_WRITE(I_MASKD, isacsx_imaskd); - - /* enabled interrupts: - * =================== - * ICD - HDLC interrupt from D-channel - * CIC - C/I channel change - */ - - isacsx_imask = ~(ISACSX_MASK_ICD | ISACSX_MASK_CIC); - - ISAC_WRITE(I_MASK, isacsx_imask); - - return(0); -} - -/*---------------------------------------------------------------------------* - * L1 ISACSX disable interrupts - *---------------------------------------------------------------------------*/ -void -isic_isacsx_disable_intr(struct isic_softc *sc) -{ - ISAC_WRITE(I_WMODED, ISACSX_MODED_MDS2|ISACSX_MODED_MDS1|ISACSX_MODED_DIM0); - isacsx_imaskd = 0xff; /* disable all irqs */ - isacsx_imask = 0xff; /* disable all irqs */ - - ISAC_WRITE(I_MASKD, isacsx_imaskd); - ISAC_WRITE(I_MASK, isacsx_imask); -} - -/*---------------------------------------------------------------------------* - * ISACSX recover - try to recover from irq lockup - *---------------------------------------------------------------------------*/ -void -isic_isacsx_recover(struct isic_softc *sc) -{ - u_char byte, istad; - - - /* - * XXX - * Leo: Unknown if this function does anything good... At least it - * prints some stuff that might be helpful. - */ - - printf("%s: isic_isacsx_recover\n", device_xname(sc->sc_dev)); - /* get isac irq status */ - - byte = ISAC_READ(I_ISTAD); - - NDBGL1(L1_ERROR, " ISAC: ISTAD = 0x%x", byte); - - if(byte & ISACSX_ISTA_ICD) { - istad = ISAC_READ(I_ISTAD); - NDBGL1(L1_ERROR, " ISACSX: istad = 0x%02x", istad); - } - - if(byte & ISACSX_ISTA_CIC) - { - byte = ISAC_READ(I_CIR0); - - NDBGL1(L1_ERROR, " ISACSX: CIR0 = 0x%x", byte); - } - - NDBGL1(L1_ERROR, " ISACSX: IMASKD/IMASK = 0x%02x/%02x", isacsx_imaskd, - isacsx_imask); - - ISAC_WRITE(I_MASKD, 0xff); - ISAC_WRITE(I_MASK, 0xff); - DELAY(100); - ISAC_WRITE(I_MASKD, isacsx_imaskd); - ISAC_WRITE(I_MASK, isacsx_imask); -} diff --git a/sys/dev/ic/isacsx.h b/sys/dev/ic/isacsx.h deleted file mode 100644 index f42d80581ef..00000000000 --- a/sys/dev/ic/isacsx.h +++ /dev/null @@ -1,595 +0,0 @@ -/* $NetBSD: isacsx.h,v 1.5 2011/08/07 20:14:42 jakllsch Exp $ */ -/* - * Copyright (c) 2001 Gary Jennejohn. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * $FreeBSD: src/sys/i4b/layer1/ifpi2/i4b_ifpi2_isacsx.h,v 1.1.2.1 2002/04/25 20:26:50 gj Exp $ - * - * last edit-date: [Wed Jan 24 09:10:42 2001] - * - *---------------------------------------------------------------------------*/ - -#ifndef I4B_ISACSX_H_ -#define I4B_ISACSX_H_ - -/* - * XXX: Leo: It is unclear to me if this is a necessity for the isacsx too... - * - * The ISAC databook specifies a delay of 2.5 DCL clock cycles between - * writes to the ISAC command register CMDR. This is the delay used to - * satisfy this requirement. - */ -#define I4B_ISAC_CMDRWRDELAY 30 - -#if (I4B_ISAC_CMDRWRDELAY > 0) -#define ISACCMDRWRDELAY() DELAY(I4B_ISAC_CMDRWRDELAY) -#else -#warning "I4B_ISAC_CMDRWRDELAY set to 0!" -#define ISACCMDRWRDELAY() -#endif - -#define ISACSX_FIFO_LEN 32 /* 32 bytes FIFO on chip */ - -#define ISACSX_V13 0x01 - -/* - * definitions of registers and bits for the ISAC-SX ISDN chip. - */ - -typedef struct isacsx_reg { - - /* 32 byte deep FIFO always first */ - - unsigned char isacsx_fifo [ISACSX_FIFO_LEN]; - - /* most registers can be read/written, but have different names */ - /* so define a union with read/write names to make that clear */ - - union { - struct { - unsigned char isacsx_istad; - unsigned char isacsx_stard; - unsigned char isacsx_moded; - unsigned char isacsx_exmd1; - unsigned char isacsx_timr1; - unsigned char dummy_25; - unsigned char isacsx_rbcld; - unsigned char isacsx_rbchd; - unsigned char isacsx_rstad; - unsigned char isacsx_tmd; - unsigned char dummy_2a; - unsigned char dummy_2b; - unsigned char dummy_2c; - unsigned char dummy_2d; - unsigned char isacsx_cir0; - unsigned char isacsx_codr1; - unsigned char isacsx_tr_conf0; - unsigned char isacsx_tr_conf1; - unsigned char isacsx_tr_conf2; - unsigned char isacsx_tr_sta; - unsigned char dummy_34; - unsigned char isacsx_sqrr1; - unsigned char isacsx_sqrr2; - unsigned char isacsx_sqrr3; - unsigned char isacsx_istatr; - unsigned char isacsx_masktr; - unsigned char dummy_3a; - unsigned char dummy_3b; - unsigned char isacsx_acgf2; - unsigned char dummy_3d; - unsigned char dummy_3e; - unsigned char dummy_3f; - unsigned char isacsx_cda10; - unsigned char isacsx_cda11; - unsigned char isacsx_cda20; - unsigned char isacsx_cda21; - unsigned char isacsx_cda_tsdp10; - unsigned char isacsx_cda_tsdp11; - unsigned char isacsx_cda_tsdp20; - unsigned char isacsx_cda_tsdp21; - unsigned char dummy_48; - unsigned char dummy_49; - unsigned char dummy_4a; - unsigned char dummy_4b; - unsigned char isacsx_tr_tsdp_bc1; - unsigned char isacsx_tr_tsdp_bc2; - unsigned char isacsx_cda1_cr; - unsigned char isacsx_cda2_cr; - unsigned char isacsx_tr_cr; - unsigned char dummy_51; - unsigned char dummy_52; - unsigned char isacsx_dci_cr; - unsigned char isacsx_mon_cr; - unsigned char isacsx_sds_cr; - unsigned char dummy_56; - unsigned char isacsx_iom_cr; - unsigned char isacsx_sti; - unsigned char isacsx_msti; - unsigned char isacsx_sds_conf; - unsigned char isacsx_mcda; - unsigned char isacsx_mor; - unsigned char isacsx_mosr; - unsigned char isacsx_mocr; - unsigned char isacsx_msta; - unsigned char isacsx_ista; - unsigned char isacsx_auxi; - unsigned char isacsx_mode1; - unsigned char isacsx_mode2; - unsigned char isacsx_id; - unsigned char isacsx_timr2; - unsigned char dummy_66; - unsigned char dummy_67; - unsigned char dummy_68; - unsigned char dummy_69; - unsigned char dummy_6a; - unsigned char dummy_6b; - unsigned char dummy_6c; - unsigned char dummy_6d; - unsigned char dummy_6e; - unsigned char dummy_6f; - } isacsx_r; - struct { - unsigned char isacsx_maskd; - unsigned char isacsx_cmdrd; - unsigned char isacsx_moded; - unsigned char isacsx_exmd1; - unsigned char isacsx_timr1; - unsigned char isacsx_sap1; - unsigned char isacsx_sap2; - unsigned char isacsx_tei1; - unsigned char isacsx_tei2; - unsigned char isacsx_tmd; - unsigned char dummy_2a; - unsigned char dummy_2b; - unsigned char dummy_2c; - unsigned char dummy_2d; - unsigned char isacsx_cix0; - unsigned char isacsx_codx1; - unsigned char isacsx_tr_conf0; - unsigned char isacsx_tr_conf1; - unsigned char isacsx_tr_conf2; - unsigned char dummy_33; - unsigned char dummy_34; - unsigned char isacsx_sqrx1; - unsigned char dummy_36; - unsigned char dummy_37; - unsigned char dummy_38; - unsigned char isacsx_masktr; - unsigned char dummy_3a; - unsigned char dummy_3b; - unsigned char isacsx_acgf2; - unsigned char dummy_3d; - unsigned char dummy_3e; - unsigned char dummy_3f; - unsigned char isacsx_cda10; - unsigned char isacsx_cda11; - unsigned char isacsx_cda20; - unsigned char isacsx_cda21; - unsigned char isacsx_cda_tsdp10; - unsigned char isacsx_cda_tsdp11; - unsigned char isacsx_cda_tsdp20; - unsigned char isacsx_cda_tsdp21; - unsigned char dummy_48; - unsigned char dummy_49; - unsigned char dummy_4a; - unsigned char dummy_4b; - unsigned char isacsx_tr_tsdp_bc1; - unsigned char isacsx_tr_tsdp_bc2; - unsigned char isacsx_cda1_cr; - unsigned char isacsx_cda2_cr; - unsigned char isacsx_tr_cr; - unsigned char dummy_51; - unsigned char dummy_52; - unsigned char isacsx_dci_cr; - unsigned char isacsx_mon_cr; - unsigned char isacsx_sds_cr; - unsigned char dummy_56; - unsigned char isacsx_iom_cr; - unsigned char isacsx_asti; - unsigned char isacsx_msti; - unsigned char isacsx_sds_conf; - unsigned char dummy_5b; - unsigned char isacsx_mox; - unsigned char dummy_5d; - unsigned char isacsx_mocr; - unsigned char isacsx_mconf; - unsigned char isacsx_mask; - unsigned char isacsx_auxm; - unsigned char isacsx_mode1; - unsigned char isacsx_mode2; - unsigned char isacsx_sres; - unsigned char isacsx_timr2; - unsigned char dummy_66; - unsigned char dummy_67; - unsigned char dummy_68; - unsigned char dummy_69; - unsigned char dummy_6a; - unsigned char dummy_6b; - unsigned char dummy_6c; - unsigned char dummy_6d; - unsigned char dummy_6e; - unsigned char dummy_6f; - } isacsx_w; - } isacsx_rw; -} __packed isacsx_reg_t; - -#define REG_OFFSET(type, field) (uintptr_t)(&(((type *)0)->field)) - -/* ISACSX read registers */ - -#define i_istad isacsx_rw.isacsx_r.isacsx_istad -#define I_ISTAD REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_istad) -#define i_stard isacsx_rw.isacsx_r.isacsx_stard -#define I_STARD REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_stard) -#define i_rmoded isacsx_rw.isacsx_r.isacsx_moded -#define I_RMODED REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_moded) -#define i_rexmd1 isacsx_rw.isacsx_r.isacsx_exmd1 -#define I_REXMD1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_exmd1) -#define i_rtimr1 isacsx_rw.isacsx_r.isacsx_timr1 -#define I_RTIMR1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_timr1) -#define i_rbcld isacsx_rw.isacsx_r.isacsx_rbcld -#define I_RBCLD REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_rbcld) -#define i_rbchd isacsx_rw.isacsx_r.isacsx_rbchd -#define I_RBCHD REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_rbchd) -#define i_rstad isacsx_rw.isacsx_r.isacsx_rstad -#define I_RSTAD REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_rstad) -#define i_rtmd isacsx_rw.isacsx_r.isacsx_tmd -#define I_RTMD REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_tmd) -#define i_cir0 isacsx_rw.isacsx_r.isacsx_cir0 -#define I_CIR0 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cir0) -#define i_codr1 isacsx_rw.isacsx_r.isacsx_codr1 -#define I_CODR1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_codr1) -#define i_rtr_conf0 isacsx_rw.isacsx_r.isacsx_tr_conf0 -#define I_RTR_CONF0 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_tr_conf0) -#define i_rtr_conf1 isacsx_rw.isacsx_r.isacsx_tr_conf1 -#define I_RTR_CONF1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_tr_conf1) -#define i_rtr_conf2 isacsx_rw.isacsx_r.isacsx_tr_conf2 -#define I_RTR_CONF2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_tr_conf2) -#define i_sta isacsx_rw.isacsx_r.isacsx_sta -#define I_STA REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_sta) -#define i_sqrr1 isacsx_rw.isacsx_r.isacsx_sqrr1 -#define I_SQRR1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_sqrr1) -#define i_sqrr2 isacsx_rw.isacsx_r.isacsx_sqrr2 -#define I_SQRR2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_sqrr2) -#define i_sqrr3 isacsx_rw.isacsx_r.isacsx_sqrr3 -#define I_SQRR3 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_sqrr3) -#define i_istatr isacsx_rw.isacsx_r.isacsx_istatr -#define I_ISTATR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_istatr) -#define i_rmasktr isacsx_rw.isacsx_r.isacsx_masktr -#define I_RMASKTR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_masktr) -#define i_racgf2 isacsx_rw.isacsx_r.isacsx_acgf2 -#define I_RACGF2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_acgf2) -#define i_rcda10 isacsx_rw.isacsx_r.isacsx_cda10 -#define I_RCDA10 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda10) -#define i_rcda11 isacsx_rw.isacsx_r.isacsx_cda11 -#define I_RCDA11 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda11) -#define i_rcda20 isacsx_rw.isacsx_r.isacsx_cda20 -#define I_RCDA20 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda20) -#define i_rcda21 isacsx_rw.isacsx_r.isacsx_cda21 -#define I_RCDA21 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda21) -#define i_cda_tsdp10 isacsx_rw.isacsx_r.isacsx_cda_tsdp10 -#define I_CDA_TSDP10 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda_tsdp10) -#define i_cda_tsdp11 isacsx_rw.isacsx_r.isacsx_cda_tsdp11 -#define I_CDA_TSDP11 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda_tsdp11) -#define i_cda_tsdp20 isacsx_rw.isacsx_r.isacsx_cda_tsdp20 -#define I_CDA_TSDP20 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda_tsdp20) -#define i_cda_tsdp21 isacsx_rw.isacsx_r.isacsx_cda_tsdp21 -#define I_CDA_TSDP21 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda_tsdp21) -#define i_tr_tsdp_bc1 isacsx_rw.isacsx_r.isacsx_tr_tsdp_bc1 -#define I_TR_TSDP_BC1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_tr_tsdp_bc1) -#define i_tr_tsdp_bc2 isacsx_rw.isacsx_r.isacsx_tr_tsdp_bc2 -#define I_TR_TSDP_BC2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_tr_tsdp_bc2) -#define i_cda1_cr isacsx_rw.isacsx_r.isacsx_cda1_cr -#define I_CDA1_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda1_cr) -#define i_cda2_cr isacsx_rw.isacsx_r.isacsx_cda2_cr -#define I_CDA2_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda2_cr) -#define i_tr_cr isacsx_rw.isacsx_r.isacsx_tr_cr -#define I_TR_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_tr_cr) -#define i_dci_cr isacsx_rw.isacsx_r.isacsx_dci_cr -#define I_DCI_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_dci_cr) -#define i_mon_cr isacsx_rw.isacsx_r.isacsx_mon_cr -#define I_MON_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_mon_cr) -#define i_sds_cr isacsx_rw.isacsx_r.isacsx_sds_cr -#define I_SDS_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_sds_cr) -#define i_iom_cr isacsx_rw.isacsx_r.isacsx_iom_cr -#define I_IOM_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_iom_cr) -#define i_sti isacsx_rw.isacsx_r.isacsx_sti -#define I_STI REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_sti) -#define i_msti isacsx_rw.isacsx_r.isacsx_msti -#define I_MSTI REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_msti) -#define i_sds_conf isacsx_rw.isacsx_r.isacsx_sds_conf -#define I_SDS_CONF REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_sds_conf) -#define i_mcda isacsx_rw.isacsx_r.isacsx_mcda -#define I_MCDA REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_mcda) -#define i_mor isacsx_rw.isacsx_r.isacsx_mor -#define I_MOR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_mor) -#define i_mosr isacsx_rw.isacsx_r.isacsx_mosr -#define I_MOSR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_mosr) -#define i_rmocr isacsx_rw.isacsx_r.isacsx_mocr -#define I_RMOCR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_mocr) -#define i_msta isacsx_rw.isacsx_r.isacsx_msta -#define I_MSTA REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_msta) -#define i_ista isacsx_rw.isacsx_r.isacsx_ista -#define I_ISTA REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_ista) -#define i_auxi isacsx_rw.isacsx_r.isacsx_auxi -#define I_AUXI REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_auxi) -#define i_rmode1 isacsx_rw.isacsx_r.isacsx_mode1 -#define I_RMODE1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_mode1) -#define i_rmode2 isacsx_rw.isacsx_r.isacsx_mode2 -#define I_RMODE2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_mode2) -#define i_id isacsx_rw.isacsx_r.isacsx_id -#define I_ID REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_id) -#define i_rtimr2 isacsx_rw.isacsx_r.isacsx_timr2 -#define I_RTIMR2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_timr2) - -/* ISAC write registers - isacsx_mode, isacsx_timr, isacsx_star2, isacsx_spcr, */ -/* isacsx_c1r, isacsx_c2r, isacsx_adf2 see read registers */ - -#define i_maskd isacsx_rw.isacsx_w.isacsx_maskd -#define I_MASKD REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_maskd) -#define i_cmdrd isacsx_rw.isacsx_w.isacsx_cmdrd -#define I_CMDRD REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_cmdrd) -#define i_wmoded isacsx_rw.isacsx_w.isacsx_moded -#define I_WMODED REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_moded) -#define i_wexmd1 isacsx_rw.isacsx_w.isacsx_exmd1 -#define I_WEXMD1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_exmd1) -#define i_wtimr1 isacsx_rw.isacsx_w.isacsx_timr1 -#define I_WTIMR1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_timr1) -#define i_sap1 isacsx_rw.isacsx_w.isacsx_sap1 -#define I_SAP1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_sap1) -#define i_sap2 isacsx_rw.isacsx_w.isacsx_sap2 -#define I_SAP2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_sap2) -#define i_tei1 isacsx_rw.isacsx_w.isacsx_tei1 -#define i_tei2 isacsx_rw.isacsx_w.isacsx_tei2 -#define i_wtmd isacsx_rw.isacsx_w.isacsx_tmd -#define I_WTMD REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_tmd) -#define i_cix0 isacsx_rw.isacsx_w.isacsx_cix0 -#define I_CIX0 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_cix0) -#define i_codx1 isacsx_rw.isacsx_w.isacsx_codx1 -#define I_CODX1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_codx1) -#define i_wtr_conf0 isacsx_rw.isacsx_w.isacsx_tr_conf0 -#define I_WTR_CONF0 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_tr_conf0) -#define i_wtr_conf1 isacsx_rw.isacsx_w.isacsx_tr_conf1 -#define I_WTR_CONF1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_tr_conf1) -#define i_wtr_conf2 isacsx_rw.isacsx_w.isacsx_tr_conf2 -#define I_WTR_CONF2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_tr_conf2) -#define i_sqrx1 isacsx_rw.isacsx_w.isacsx_sqrx1 -#define I_SQRX1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_sqrx1) -#define i_wmasktr isacsx_rw.isacsx_w.isacsx_masktr -#define I_WMASKTR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_masktr) -#define i_wacgf2 isacsx_rw.isacsx_w.isacsx_acgf2 -#define I_WACGF2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_acgf2) -#define i_wcda10 isacsx_rw.isacsx_w.isacsx_cda10 -#define I_WCDA10 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_cda10) -#define i_wcda11 isacsx_rw.isacsx_r.isacsx_cda11 -#define I_WCDA11 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda11) -#define i_wcda20 isacsx_rw.isacsx_r.isacsx_cda20 -#define I_WCDA20 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda20) -#define i_wcda21 isacsx_rw.isacsx_r.isacsx_cda21 -#define I_WCDA21 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda21) -#define i_cda_tsdp10 isacsx_rw.isacsx_r.isacsx_cda_tsdp10 -#define I_CDA_TSDP10 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda_tsdp10) -#define i_cda_tsdp11 isacsx_rw.isacsx_r.isacsx_cda_tsdp11 -#define I_CDA_TSDP11 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda_tsdp11) -#define i_cda_tsdp20 isacsx_rw.isacsx_r.isacsx_cda_tsdp20 -#define I_CDA_TSDP20 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda_tsdp20) -#define i_cda_tsdp21 isacsx_rw.isacsx_r.isacsx_cda_tsdp21 -#define I_CDA_TSDP21 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda_tsdp21) -#define i_tr_tsdp_bc1 isacsx_rw.isacsx_r.isacsx_tr_tsdp_bc1 -#define I_TR_TSDP_BC1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_tr_tsdp_bc1) -#define i_tr_tsdp_bc2 isacsx_rw.isacsx_r.isacsx_tr_tsdp_bc2 -#define I_TR_TSDP_BC2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_tr_tsdp_bc2) -#define i_cda1_cr isacsx_rw.isacsx_r.isacsx_cda1_cr -#define I_CDA1_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda1_cr) -#define i_cda2_cr isacsx_rw.isacsx_r.isacsx_cda2_cr -#define I_CDA2_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_cda2_cr) -#define i_tr_cr isacsx_rw.isacsx_r.isacsx_tr_cr -#define I_TR_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_tr_cr) -#define i_dci_cr isacsx_rw.isacsx_r.isacsx_dci_cr -#define I_DCI_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_dci_cr) -#define i_mon_cr isacsx_rw.isacsx_r.isacsx_mon_cr -#define I_MON_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_mon_cr) -#define i_sds_cr isacsx_rw.isacsx_r.isacsx_sds_cr -#define I_SDS_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_sds_cr) -#define i_iom_cr isacsx_rw.isacsx_r.isacsx_iom_cr -#define I_IOM_CR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_iom_cr) -#define i_asti isacsx_rw.isacsx_r.isacsx_asti -#define I_ASTI REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_asti) -#define i_msti isacsx_rw.isacsx_r.isacsx_msti -#define I_MSTI REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_msti) -#define i_sds_conf isacsx_rw.isacsx_r.isacsx_sds_conf -#define I_SDS_CONF REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_r.isacsx_sds_conf) -#define i_mox isacsx_rw.isacsx_w.isacsx_mox -#define I_MOX REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_mox) -#define i_wmocr isacsx_rw.isacsx_w.isacsx_mocr -#define I_WMOCR REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_mocr) -#define i_mconf isacsx_rw.isacsx_w.isacsx_mconf -#define I_MCONF REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_mconf) -#define i_mask isacsx_rw.isacsx_w.isacsx_mask -#define I_MASK REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_mask) -#define i_auxm isacsx_rw.isacsx_w.isacsx_auxm -#define I_AUXM REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_auxm) -#define i_wmode1 isacsx_rw.isacsx_w.isacsx_mode1 -#define I_WMODE1 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_mode1) -#define i_wmode2 isacsx_rw.isacsx_w.isacsx_mode2 -#define I_WMODE2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_mode2) -#define i_sres isacsx_rw.isacsx_w.isacsx_sres -#define I_SRES REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_sres) -#define i_wtimr2 isacsx_rw.isacsx_w.isacsx_timr2 -#define I_WTIMR2 REG_OFFSET(isacsx_reg_t, isacsx_rw.isacsx_w.isacsx_timr2) - -#define ISACSX_ISTAD_RME 0x80 -#define ISACSX_ISTAD_RPF 0x40 -#define ISACSX_ISTAD_RFO 0x20 -#define ISACSX_ISTAD_XPR 0x10 -#define ISACSX_ISTAD_XMR 0x08 -#define ISACSX_ISTAD_XDU 0x04 - -#define ISACSX_MASKD_RME 0x80 -#define ISACSX_MASKD_RPF 0x40 -#define ISACSX_MASKD_RFO 0x20 -#define ISACSX_MASKD_XPR 0x10 -#define ISACSX_MASKD_XMR 0x08 -#define ISACSX_MASKD_XDU 0x04 -/* these must always be set */ -#define ISACSX_MASKD_LOW 0x03 -#define ISACSX_MASKD_ALL 0xff - -#define ISACSX_STARD_XDOV 0x80 -#define ISACSX_STARD_XFW 0x40 -#define ISACSX_STARD_RAC1 0x08 -#define ISACSX_STARD_XAC1 0x02 - -#define ISACSX_CMDRD_RMC 0x80 -#define ISACSX_CMDRD_RRES 0x40 -#define ISACSX_CMDRD_STI 0x10 -#define ISACSX_CMDRD_XTF 0x08 -#define ISACSX_CMDRD_XME 0x02 -#define ISACSX_CMDRD_XRES 0x01 - -#define ISACSX_MODED_MDS2 0x80 -#define ISACSX_MODED_MDS1 0x40 -#define ISACSX_MODED_MDS0 0x20 -#define ISACSX_MODED_RAC 0x08 -#define ISACSX_MODED_DIM2 0x04 -#define ISACSX_MODED_DIM1 0x02 -#define ISACSX_MODED_DIM0 0x01 - -/* default */ -#define ISACSX_EXMD1_XFBS_32 0x00 /* XFIFO is 32 bytes */ -#define ISACSX_EXMD1_XFBS_16 0x80 /* XFIFO is 16 bytes */ -/* default */ -#define ISACSX_EXMD1_RFBS_32 0x00 /* XFIFO is 32 bytes */ -#define ISACSX_EXMD1_RFBS_16 0x20 /* XFIFO is 16 bytes */ -#define ISACSX_EXMD1_RFBS_08 0x40 /* XFIFO is 8 bytes */ -#define ISACSX_EXMD1_RFBS_04 0x60 /* XFIFO is 4 bytes */ -#define ISACSX_EXMD1_SRA 0x10 -#define ISACSX_EXMD1_XCRC 0x08 -#define ISACSX_EXMD1_RCRC 0x04 -#define ISACSX_EXMD1_ITF 0x01 - -#define ISACSX_RSTAD_VFR 0x80 -#define ISACSX_RSTAD_RDO 0x40 -#define ISACSX_RSTAD_CRC 0x20 -#define ISACSX_RSTAD_RAB 0x10 -#define ISACSX_RSTAD_SA1 0x08 -#define ISACSX_RSTAD_SA0 0x04 -#define ISACSX_RSTAD_CR 0x02 -#define ISACSX_RSTAD_TA 0x01 - -#define ISACSX_RSTAD_MASK 0xf0 /* the interesting bits */ - -#define ISACSX_RBCHD_OV 0x10 -/* the other 4 bits are the high bits of the receive byte count */ - -#define ISACSX_CIR0_CIC0 0x08 -/* CODR0 >> 4 */ -#define ISACSX_CIR0_IPU 0x07 -#define ISACSX_CIR0_IDR 0x00 -#define ISACSX_CIR0_ISD 0x02 -#define ISACSX_CIR0_IDIS 0x03 -#define ISACSX_CIR0_IEI 0x06 -#define ISACSX_CIR0_IRSY 0x04 -#define ISACSX_CIR0_IARD 0x08 -#define ISACSX_CIR0_ITI 0x0a -#define ISACSX_CIR0_IATI 0x0b -#define ISACSX_CIR0_IAI8 0x0c -#define ISACSX_CIR0_IAI10 0x0d -#define ISACSX_CIR0_IDID 0x0f - -#define ISACSX_IOM_CR_SPU 0x80 -#define ISACSX_IOM_CR_CI_CS 0x20 -#define ISACSX_IOM_CR_TIC_DIS 0x10 -#define ISACSX_IOM_CR_EN_BCL 0x08 -#define ISACSX_IOM_CR_CLKM 0x04 -#define ISACSX_IOM_CR_DIS_OD 0x02 -#define ISACSX_IOM_CR_DIS_IOM 0x01 - -#define ISACSX_CI_MASK 0x0f - -#define ISACSX_CIX0_BAC 0x01 -/* in IOM-2 mode the low bits are always 1 */ -#define ISACSX_CIX0_LOW 0x0e -/* C/I codes from bits 7-4 (>> 4 & 0xf) */ -/* the commands */ -#define ISACSX_CIX0_CTIM 0 -#define ISACSX_CIX0_CRS 0x01 -/* test mode only */ -#define ISACSX_CIX0_CSSSP 0x02 -/* test mode only */ -#define ISACSX_CIX0_CSSCP 0x03 -#define ISACSX_CIX0_CAR8 0x08 -#define ISACSX_CIX0_CAR10 0x09 -#define ISACSX_CIX0_CARL 0x0a -#define ISACSX_CIX0_CDIU 0x0f - -/* Interrupt, General Configuration Registers */ - -#define ISACSX_ISTA_ST 0x20 -#define ISACSX_ISTA_CIC 0x10 -#define ISACSX_ISTA_AUX 0x08 -#define ISACSX_ISTA_TRAN 0x04 -#define ISACSX_ISTA_MOS 0x02 -#define ISACSX_ISTA_ICD 0x01 - -#define ISACSX_MASK_ST 0x20 -#define ISACSX_MASK_CIC 0x10 -#define ISACSX_MASK_AUX 0x08 -#define ISACSX_MASK_TRAN 0x04 -#define ISACSX_MASK_MOS 0x02 -#define ISACSX_MASK_ICD 0x01 - -#define ISACSX_AUXI_EAW 0x20 -#define ISACSX_AUXI_WOV 0x10 -#define ISACSX_AUXI_TIN2 0x08 -#define ISACSX_AUXI_TIN1 0x04 - -#define ISACSX_AUXM_EAW 0x20 -#define ISACSX_AUXM_WOV 0x10 -#define ISACSX_AUXM_TIN2 0x08 -#define ISACSX_AUXM_TIN1 0x04 - -#define ISACSX_MODE1_WTC1 0x10 -#define ISACSX_MODE1_WTC2 0x08 -#define ISACSX_MODE1_CFS 0x04 -#define ISACSX_MODE1_RSS2 0x02 -#define ISACSX_MODE1_RSS1 0x01 - -#define ISACSX_MODE2_INT_POL 0x08 -#define ISACSX_MODE2_PPSDX 0x01 - -#define ISACSX_ID_MASK 0x2F /* 0x01 = Version 1.3 */ - - -extern unsigned char isacsx_imaskd; -extern unsigned char isacsx_imask; - -#endif /* I4B_ISACSX_H_ */ diff --git a/sys/dev/ic/isic.c b/sys/dev/ic/isic.c deleted file mode 100644 index 4ec59cd2100..00000000000 --- a/sys/dev/ic/isic.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * i4b_isic.c - global isic stuff - * ============================== - * - * $Id: isic.c,v 1.25 2012/10/27 17:18:21 chs Exp $ - * - * last edit-date: [Fri Jan 5 11:36:10 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic.c,v 1.25 2012/10/27 17:18:21 chs Exp $"); - -#include <sys/param.h> -#include <sys/ioccom.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <net/if.h> -#include <sys/callout.h> -#include <sys/device.h> -#include <sys/bus.h> - -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_trace.h> - -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> -#include <netisdn/i4b_global.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/ipac.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -isdn_link_t *isic_ret_linktab(void*, int channel); -void isic_set_link(void*, int channel, const struct isdn_l4_driver_functions *l4_driver, void *l4_driver_softc); -void n_connect_request(struct call_desc *cd); -void n_connect_response(struct call_desc *cd, int response, int cause); -void n_disconnect_request(struct call_desc *cd, int cause); -void n_alert_request(struct call_desc *cd); -void n_mgmt_command(struct isdn_l3_driver *drv, int cmd, void *parm); - -const struct isdn_l3_driver_functions -isic_l3_driver = { - isic_ret_linktab, - isic_set_link, - n_connect_request, - n_connect_response, - n_disconnect_request, - n_alert_request, - NULL, - NULL, - n_mgmt_command -}; - -/*---------------------------------------------------------------------------* - * isic - device driver interrupt routine - *---------------------------------------------------------------------------*/ -int -isicintr(void *arg) -{ - struct isic_softc *sc = arg; - - /* could this be an interrupt for us? */ - if (sc->sc_intr_valid == ISIC_INTR_DYING) - return 0; /* do not touch removed hardware */ - - if(sc->sc_ipac == 0) /* HSCX/ISAC interrupt routine */ - { - u_char was_hscx_irq = 0; - u_char was_isac_irq = 0; - - register u_char hscx_irq_stat; - register u_char isac_irq_stat; - - for(;;) - { - /* get hscx irq status from hscx b ista */ - hscx_irq_stat = - HSCX_READ(HSCX_CH_B, H_ISTA) & ~HSCX_B_IMASK; - - /* get isac irq status */ - isac_irq_stat = ISAC_READ(I_ISTA); - - /* do as long as there are pending irqs in the chips */ - if(!hscx_irq_stat && !isac_irq_stat) - break; - - if(hscx_irq_stat & (HSCX_ISTA_RME | HSCX_ISTA_RPF | - HSCX_ISTA_RSC | HSCX_ISTA_XPR | - HSCX_ISTA_TIN | HSCX_ISTA_EXB)) - { - isic_hscx_irq(sc, hscx_irq_stat, - HSCX_CH_B, - hscx_irq_stat & HSCX_ISTA_EXB); - was_hscx_irq = 1; - } - - if(hscx_irq_stat & (HSCX_ISTA_ICA | HSCX_ISTA_EXA)) - { - isic_hscx_irq(sc, - HSCX_READ(HSCX_CH_A, H_ISTA) & ~HSCX_A_IMASK, - HSCX_CH_A, - hscx_irq_stat & HSCX_ISTA_EXA); - was_hscx_irq = 1; - } - - if(isac_irq_stat) - { - /* isac handler */ - isic_isac_irq(sc, isac_irq_stat); - was_isac_irq = 1; - } - } - - HSCX_WRITE(0, H_MASK, 0xff); - ISAC_WRITE(I_MASK, 0xff); - HSCX_WRITE(1, H_MASK, 0xff); - - if (sc->clearirq) - { - DELAY(80); - sc->clearirq(sc); - } else - DELAY(100); - - HSCX_WRITE(0, H_MASK, HSCX_A_IMASK); - ISAC_WRITE(I_MASK, ISAC_IMASK); - HSCX_WRITE(1, H_MASK, HSCX_B_IMASK); - - return(was_hscx_irq || was_isac_irq); - } - else /* IPAC interrupt routine */ - { - register u_char ipac_irq_stat; - register u_char was_ipac_irq = 0; - - for(;;) - { - /* get global irq status */ - - ipac_irq_stat = (IPAC_READ(IPAC_ISTA)) & 0x3f; - - /* check hscx a */ - - if(ipac_irq_stat & (IPAC_ISTA_ICA | IPAC_ISTA_EXA)) - { - /* HSCX A interrupt */ - isic_hscx_irq(sc, HSCX_READ(HSCX_CH_A, H_ISTA), - HSCX_CH_A, - ipac_irq_stat & IPAC_ISTA_EXA); - was_ipac_irq = 1; - } - if(ipac_irq_stat & (IPAC_ISTA_ICB | IPAC_ISTA_EXB)) - { - /* HSCX B interrupt */ - isic_hscx_irq(sc, HSCX_READ(HSCX_CH_B, H_ISTA), - HSCX_CH_B, - ipac_irq_stat & IPAC_ISTA_EXB); - was_ipac_irq = 1; - } - if(ipac_irq_stat & IPAC_ISTA_ICD) - { - /* ISAC interrupt, Obey ISAC-IPAC differences */ - u_int8_t isac_ista = ISAC_READ(I_ISTA); - if (isac_ista & 0xfe) - isic_isac_irq(sc, isac_ista & 0xfe); - if (isac_ista & 0x01) /* unexpected */ - aprint_error_dev(sc->sc_dev, "unexpected ipac timer2 irq\n"); - was_ipac_irq = 1; - } - if(ipac_irq_stat & IPAC_ISTA_EXD) - { - /* ISAC EXI interrupt */ - isic_isac_irq(sc, ISAC_ISTA_EXI); - was_ipac_irq = 1; - } - - /* do as long as there are pending irqs in the chip */ - if(!ipac_irq_stat) - break; - } - -#if 0 - /* - * This seems not to be necessary on IPACs - no idea why - * it is here - but due to limit range of test cards, leave - * it in for now, in case we have to resurrect it. - */ - IPAC_WRITE(IPAC_MASK, 0xff); - DELAY(50); - IPAC_WRITE(IPAC_MASK, 0xc0); -#endif - - return(was_ipac_irq); - } -} - -int -isic_attach_bri(struct isic_softc *sc, const char *cardname, const struct isdn_layer1_isdnif_driver *dchan_driver) -{ - struct isdn_l3_driver * drv; - - drv = isdn_attach_isdnif(device_xname(sc->sc_dev), cardname, - &sc->sc_l2, &isic_l3_driver, NBCH_BRI); - sc->sc_l3token = drv; - sc->sc_l2.driver = dchan_driver; - sc->sc_l2.l1_token = sc; - sc->sc_l2.drv = drv; - isdn_layer2_status_ind(&sc->sc_l2, drv, STI_ATTACH, 1); - isdn_isdnif_ready(drv->isdnif); - return 1; -} - -int -isic_detach_bri(struct isic_softc *sc) -{ - isdn_layer2_status_ind(&sc->sc_l2, sc->sc_l3token, STI_ATTACH, 0); - isdn_detach_isdnif(sc->sc_l3token); - sc->sc_l3token = NULL; - return 1; -} diff --git a/sys/dev/ic/isic_bchan.c b/sys/dev/ic/isic_bchan.c deleted file mode 100644 index b9c90fbe6a6..00000000000 --- a/sys/dev/ic/isic_bchan.c +++ /dev/null @@ -1,424 +0,0 @@ -/* - * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * i4b_bchan.c - B channel handling L1 procedures - * ---------------------------------------------- - * - * $Id: isic_bchan.c,v 1.15 2012/10/27 17:18:21 chs Exp $ - * - * last edit-date: [Fri Jan 5 11:36:11 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_bchan.c,v 1.15 2012/10/27 17:18:21 chs Exp $"); - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#ifndef __bsdi__ -#include <sys/bus.h> -#endif -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_trace.h> - -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> -#include <netisdn/i4b_global.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -static void isic_bchannel_start(isdn_layer1token, int h_chan); -static void isic_bchannel_stat(isdn_layer1token, int h_chan, bchan_statistics_t *bsp); - -void isic_set_link(void*, int channel, const struct isdn_l4_driver_functions *l4_driver, void *l4_driver_softc); -isdn_link_t *isic_ret_linktab(void*, int channel); - -/*---------------------------------------------------------------------------* - * initialize one B channels rx/tx data structures and init/deinit HSCX - *---------------------------------------------------------------------------*/ -void -isic_bchannel_setup(isdn_layer1token t, int h_chan, int bprot, int activate) -{ - struct isic_softc *sc = (struct isic_softc*)t; - l1_bchan_state_t *chan = &sc->sc_chan[h_chan]; - - int s = splnet(); - - if(activate == 0) - { - /* deactivation */ - isic_hscx_init(sc, h_chan, activate); - } - - NDBGL1(L1_BCHAN, "%s, channel=%d, %s", - device_xname(sc->sc_dev), h_chan, activate ? "activate" : "deactivate"); - - /* general part */ - - chan->channel = h_chan; /* B channel */ - chan->bprot = bprot; /* B channel protocol */ - chan->state = HSCX_IDLE; /* B channel state */ - - /* receiver part */ - - i4b_Bcleanifq(&chan->rx_queue); /* clean rx queue */ - - chan->rx_queue.ifq_maxlen = IFQ_MAXLEN; - - chan->rxcount = 0; /* reset rx counter */ - - i4b_Bfreembuf(chan->in_mbuf); /* clean rx mbuf */ - - chan->in_mbuf = NULL; /* reset mbuf ptr */ - chan->in_cbptr = NULL; /* reset mbuf curr ptr */ - chan->in_len = 0; /* reset mbuf data len */ - - /* transmitter part */ - - i4b_Bcleanifq(&chan->tx_queue); /* clean tx queue */ - - chan->tx_queue.ifq_maxlen = IFQ_MAXLEN; - - chan->txcount = 0; /* reset tx counter */ - - i4b_Bfreembuf(chan->out_mbuf_head); /* clean tx mbuf */ - - chan->out_mbuf_head = NULL; /* reset head mbuf ptr */ - chan->out_mbuf_cur = NULL; /* reset current mbuf ptr */ - chan->out_mbuf_cur_ptr = NULL; /* reset current mbuf data ptr */ - chan->out_mbuf_cur_len = 0; /* reset current mbuf data cnt */ - - if(activate != 0) - { - /* activation */ - isic_hscx_init(sc, h_chan, activate); - } - - splx(s); -} - -/*---------------------------------------------------------------------------* - * start transmission on a b channel - *---------------------------------------------------------------------------*/ -static void -isic_bchannel_start(isdn_layer1token t, int h_chan) -{ - struct isic_softc *sc = (struct isic_softc*)t; - - register l1_bchan_state_t *chan = &sc->sc_chan[h_chan]; - register int next_len; - register int len; - - int s; - int activity = -1; - int cmd = 0; - - s = splnet(); /* enter critical section */ - if(chan->state & HSCX_TX_ACTIVE) /* already running ? */ - { - splx(s); - return; /* yes, leave */ - } - - /* get next mbuf from queue */ - - IF_DEQUEUE(&chan->tx_queue, chan->out_mbuf_head); - - if(chan->out_mbuf_head == NULL) /* queue empty ? */ - { - splx(s); /* leave critical section */ - return; /* yes, exit */ - } - - /* init current mbuf values */ - - chan->out_mbuf_cur = chan->out_mbuf_head; - chan->out_mbuf_cur_len = chan->out_mbuf_cur->m_len; - chan->out_mbuf_cur_ptr = chan->out_mbuf_cur->m_data; - - /* activity indicator for timeout handling */ - - if(chan->bprot == BPROT_NONE) - { - if(!(isdn_bchan_silence(chan->out_mbuf_cur->m_data, - chan->out_mbuf_cur->m_len))) - activity = ACT_TX; - } - else - { - activity = ACT_TX; - } - - chan->state |= HSCX_TX_ACTIVE; /* we start transmitting */ - - if(sc->sc_trace & TRACE_B_TX) /* if trace, send mbuf to trace dev */ - { - i4b_trace_hdr hdr; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_bcount; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, - chan->out_mbuf_cur->m_len, chan->out_mbuf_cur->m_data); - } - - len = 0; /* # of chars put into HSCX tx fifo this time */ - - /* - * fill the HSCX tx fifo with data from the current mbuf. if - * current mbuf holds less data than HSCX fifo length, try to - * get the next mbuf from (a possible) mbuf chain. if there is - * not enough data in a single mbuf or in a chain, then this - * is the last mbuf and we tell the HSCX that it has to send - * CRC and closing flag - */ - - while((len < sc->sc_bfifolen) && chan->out_mbuf_cur) - { - /* - * put as much data into the HSCX fifo as is - * available from the current mbuf - */ - - if((len + chan->out_mbuf_cur_len) >= sc->sc_bfifolen) - next_len = sc->sc_bfifolen - len; - else - next_len = chan->out_mbuf_cur_len; - -#ifdef NOTDEF - printf("b:mh=%x, mc=%x, mcp=%x, mcl=%d l=%d nl=%d # ", - chan->out_mbuf_head, - chan->out_mbuf_cur, - chan->out_mbuf_cur_ptr, - chan->out_mbuf_cur_len, - len, - next_len); -#endif - - /* wait for tx fifo write enabled */ - - isic_hscx_waitxfw(sc, h_chan); - - /* write what we have from current mbuf to HSCX fifo */ - - HSCX_WRFIFO(h_chan, chan->out_mbuf_cur_ptr, next_len); - - len += next_len; /* update # of bytes written */ - chan->txcount += next_len; /* statistics */ - chan->out_mbuf_cur_ptr += next_len; /* data ptr */ - chan->out_mbuf_cur_len -= next_len; /* data len */ - - /* - * in case the current mbuf (of a possible chain) data - * has been put into the fifo, check if there is a next - * mbuf in the chain. If there is one, get ptr to it - * and update the data ptr and the length - */ - - if((chan->out_mbuf_cur_len <= 0) && - ((chan->out_mbuf_cur = chan->out_mbuf_cur->m_next) != NULL)) - { - chan->out_mbuf_cur_ptr = chan->out_mbuf_cur->m_data; - chan->out_mbuf_cur_len = chan->out_mbuf_cur->m_len; - - if(sc->sc_trace & TRACE_B_TX) - { - i4b_trace_hdr hdr; - hdr.type = (h_chan == HSCX_CH_A ? - TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_bcount; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, - &hdr, - chan->out_mbuf_cur->m_len, - chan->out_mbuf_cur->m_data); - } - } - } - - /* - * if there is either still data in the current mbuf and/or - * there is a successor on the chain available issue just - * a XTF (transmit) command to HSCX. if ther is no more - * data available from the current mbuf (-chain), issue - * an XTF and an XME (message end) command which will then - * send the CRC and the closing HDLC flag sequence - */ - - if(chan->out_mbuf_cur && (chan->out_mbuf_cur_len > 0)) - { - /* - * more data available, send current fifo out. - * next xfer to HSCX tx fifo is done in the - * HSCX interrupt routine. - */ - - cmd |= HSCX_CMDR_XTF; - } - else - { - /* end of mbuf chain */ - - if(chan->bprot == BPROT_NONE) - cmd |= HSCX_CMDR_XTF; - else - cmd |= HSCX_CMDR_XTF | HSCX_CMDR_XME; - - i4b_Bfreembuf(chan->out_mbuf_head); /* free mbuf chain */ - - chan->out_mbuf_head = NULL; - chan->out_mbuf_cur = NULL; - chan->out_mbuf_cur_ptr = NULL; - chan->out_mbuf_cur_len = 0; - } - - /* call timeout handling routine */ - - if(activity == ACT_RX || activity == ACT_TX) - (*chan->l4_driver->bch_activity)( - chan->l4_driver_softc, activity); - - if(cmd) - isic_hscx_cmd(sc, h_chan, cmd); - - splx(s); -} - -/*---------------------------------------------------------------------------* - * fill statistics struct - *---------------------------------------------------------------------------*/ -static void -isic_bchannel_stat(isdn_layer1token t, int h_chan, bchan_statistics_t *bsp) -{ - struct isic_softc *sc = (struct isic_softc*)t; - l1_bchan_state_t *chan = &sc->sc_chan[h_chan]; - int s; - - s = splnet(); - - bsp->outbytes = chan->txcount; - bsp->inbytes = chan->rxcount; - - chan->txcount = 0; - chan->rxcount = 0; - - splx(s); -} - -/*---------------------------------------------------------------------------* - * return the address of isic drivers linktab - *---------------------------------------------------------------------------*/ -isdn_link_t * -isic_ret_linktab(void *token, int channel) -{ - struct l2_softc *l2sc = token; - struct isic_softc *sc = l2sc->l1_token; - l1_bchan_state_t *chan = &sc->sc_chan[channel]; - - return(&chan->isdn_linktab); -} - -/*---------------------------------------------------------------------------* - * set the driver linktab in the b channel softc - *---------------------------------------------------------------------------*/ -void -isic_set_link(void *token, int channel, const struct isdn_l4_driver_functions *l4_driver, void *l4_driver_softc) -{ - struct l2_softc *l2sc = token; - struct isic_softc *sc = l2sc->l1_token; - l1_bchan_state_t *chan = &sc->sc_chan[channel]; - - chan->l4_driver = l4_driver; - chan->l4_driver_softc = l4_driver_softc; -} - -static const struct isdn_l4_bchannel_functions -isic_l4_bchannel_functions = { - isic_bchannel_setup, - isic_bchannel_start, - isic_bchannel_stat -}; - -/*---------------------------------------------------------------------------* - * initialize our local linktab - *---------------------------------------------------------------------------*/ -void -isic_init_linktab(struct isic_softc *sc) -{ - l1_bchan_state_t *chan = &sc->sc_chan[HSCX_CH_A]; - isdn_link_t *lt = &chan->isdn_linktab; - - /* local setup */ - lt->l1token = sc; - lt->channel = HSCX_CH_A; - lt->bchannel_driver = &isic_l4_bchannel_functions; - lt->tx_queue = &chan->tx_queue; - - /* used by non-HDLC data transfers, i.e. telephony drivers */ - lt->rx_queue = &chan->rx_queue; - - /* used by HDLC data transfers, i.e. ipr and isp drivers */ - lt->rx_mbuf = &chan->in_mbuf; - - chan = &sc->sc_chan[HSCX_CH_B]; - lt = &chan->isdn_linktab; - - lt->l1token = sc; - lt->channel = HSCX_CH_B; - lt->bchannel_driver = &isic_l4_bchannel_functions; - lt->tx_queue = &chan->tx_queue; - - /* used by non-HDLC data transfers, i.e. telephony drivers */ - lt->rx_queue = &chan->rx_queue; - - /* used by HDLC data transfers, i.e. ipr and isp drivers */ - lt->rx_mbuf = &chan->in_mbuf; -} diff --git a/sys/dev/ic/isic_l1.c b/sys/dev/ic/isic_l1.c deleted file mode 100644 index 0168324a993..00000000000 --- a/sys/dev/ic/isic_l1.c +++ /dev/null @@ -1,294 +0,0 @@ -/* $NetBSD: isic_l1.c,v 1.19 2012/10/27 17:18:21 chs Exp $ */ - -/* - * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_l1.c,v 1.19 2012/10/27 17:18:21 chs Exp $"); - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#include <sys/bus.h> -#include <sys/device.h> - -#include <sys/socket.h> -#include <net/if.h> - -#include <sys/callout.h> - -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_trace.h> - -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> -#include <netisdn/i4b_global.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/ipac.h> -#include <dev/ic/hscx.h> - -#include "nisac.h" -#include "nisacsx.h" - -unsigned int i4b_l1_debug = L1_DEBUG_DEFAULT; - -static int isic_std_ph_data_req(isdn_layer1token, struct mbuf *, int); -static int isic_std_ph_activate_req(isdn_layer1token); -static int isic_std_mph_command_req(isdn_layer1token, int, void*); -static void isic_enable_intr(struct isic_softc *sc, int enable); - -const struct isdn_layer1_isdnif_driver isic_std_driver = { - isic_std_ph_data_req, - isic_std_ph_activate_req, - isic_std_mph_command_req -}; - -/* from i4btrc driver i4b_trace.c */ -extern int get_trace_data_from_l1(int unit, int what, int len, char *buf); - -/*---------------------------------------------------------------------------* - * - * L2 -> L1: PH-DATA-REQUEST - * ========================= - * - * parms: - * token softc of physical driver - * m mbuf containing L2 frame to be sent out - * freeflag MBUF_FREE: free mbuf here after having sent - * it out - * MBUF_DONTFREE: mbuf is freed by Layer 2 - * returns: - * ==0 fail, nothing sent out - * !=0 ok, frame sent out - * - *---------------------------------------------------------------------------*/ -static int -isic_std_ph_data_req(isdn_layer1token token, struct mbuf *m, int freeflag) -{ - struct isic_softc *sc = (struct isic_softc*)token; - u_char cmd; - int s; - - if (m == NULL) /* failsafe */ - return (0); - - s = splnet(); - - if(sc->sc_I430state == ST_F3) /* layer 1 not running ? */ - { - NDBGL1(L1_I_ERR, "still in state F3!"); - isic_std_ph_activate_req(token); - } - - if(sc->sc_state & ISAC_TX_ACTIVE) - { - if(sc->sc_obuf2 == NULL) - { - sc->sc_obuf2 = m; /* save mbuf ptr */ - - if(freeflag) - sc->sc_freeflag2 = 1; /* IRQ must mfree */ - else - sc->sc_freeflag2 = 0; /* IRQ must not mfree */ - - NDBGL1(L1_I_MSG, "using 2nd ISAC TX buffer, state = %s", isic_printstate(sc)); - - if(sc->sc_trace & TRACE_D_TX) - { - i4b_trace_hdr hdr; - hdr.type = TRC_CH_D; - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_dcount; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, m->m_len, m->m_data); - } - splx(s); - return(1); - } - - NDBGL1(L1_I_ERR, "No Space in TX FIFO, state = %s", isic_printstate(sc)); - - if(freeflag == MBUF_FREE) - i4b_Dfreembuf(m); - - splx(s); - return (0); - } - - if(sc->sc_trace & TRACE_D_TX) - { - i4b_trace_hdr hdr; - hdr.type = TRC_CH_D; - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_dcount; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, m->m_len, m->m_data); - } - - sc->sc_state |= ISAC_TX_ACTIVE; /* set transmitter busy flag */ - - NDBGL1(L1_I_MSG, "ISAC_TX_ACTIVE set"); - - sc->sc_freeflag = 0; /* IRQ must NOT mfree */ - - ISAC_WRFIFO(m->m_data, min(m->m_len, ISAC_FIFO_LEN)); /* output to TX fifo */ - - if(m->m_len > ISAC_FIFO_LEN) /* message > 32 bytes ? */ - { - sc->sc_obuf = m; /* save mbuf ptr */ - sc->sc_op = m->m_data + ISAC_FIFO_LEN; /* ptr for irq hdl */ - sc->sc_ol = m->m_len - ISAC_FIFO_LEN; /* length for irq hdl */ - - if(freeflag) - sc->sc_freeflag = 1; /* IRQ must mfree */ - - cmd = ISAC_CMDR_XTF; - } - else - { - sc->sc_obuf = NULL; - sc->sc_op = NULL; - sc->sc_ol = 0; - - if(freeflag) - i4b_Dfreembuf(m); - - cmd = ISAC_CMDR_XTF | ISAC_CMDR_XME; - } - - ISAC_WRITE(I_CMDR, cmd); - ISACCMDRWRDELAY(); - - splx(s); - - return(1); -} - -/*---------------------------------------------------------------------------* - * - * L2 -> L1: PH-ACTIVATE-REQUEST - * ============================= - * - * parms: - * token softc of physical interface - * - * returns: - * ==0 - * !=0 - * - *---------------------------------------------------------------------------*/ -static int -isic_std_ph_activate_req(isdn_layer1token token) -{ - struct isic_softc *sc = (struct isic_softc*)token; - - NDBGL1(L1_PRIM, " %s ", device_xname(sc->sc_dev)); - isic_next_state(sc, EV_PHAR); - return(0); -} - -/*---------------------------------------------------------------------------* - * command from the upper layers - *---------------------------------------------------------------------------*/ -static int -isic_std_mph_command_req(isdn_layer1token token, int command, void *parm) -{ - struct isic_softc *sc = (struct isic_softc*)token; - int s, pass_down = 0; - - s = splnet(); - switch(command) - { - case CMR_DOPEN: /* daemon running */ - NDBGL1(L1_PRIM, "%s, command = CMR_DOPEN", device_xname(sc->sc_dev)); - sc->sc_intr_valid = ISIC_INTR_VALID; - pass_down = 1; - break; - - case CMR_DCLOSE: /* daemon not running */ - NDBGL1(L1_PRIM, "%s, command = CMR_DCLOSE", device_xname(sc->sc_dev)); - sc->sc_intr_valid = ISIC_INTR_DISABLED; - isic_enable_intr(sc, 0); - pass_down = 1; - break; - - case CMR_SETLEDS: - pass_down = 1; - break; - - case CMR_SETTRACE: - NDBGL1(L1_PRIM, "%s, command = CMR_SETTRACE, parm = %p", device_xname(sc->sc_dev), parm); - sc->sc_trace = (int)(unsigned long)parm; - break; - - default: - NDBGL1(L1_ERROR, "ERROR, unknown command = %d, %s, parm = %p", command, device_xname(sc->sc_dev), parm); - break; - } - - if (pass_down && sc->drv_command != NULL) - sc->drv_command(sc, command, parm); - - if (command == CMR_DOPEN) - isic_enable_intr(sc, 1); - - splx(s); - - return(0); -} - -static void -isic_enable_intr(struct isic_softc *sc, int enable) -{ -#if NNISACSX > 0 - if (sc->sc_cardtyp == CARD_TYPEP_AVMA1PCIV2) { - if (enable) - isic_isacsx_init(sc); - else isic_isacsx_disable_intr(sc); - return; - } -#endif /* NNISACSX > 0 */ - -#if NNISAC > 0 - if (enable) { - isic_isac_init(sc); - } else { - /* disable receiver */ - ISAC_WRITE(I_MODE, ISAC_MODE_MDS2|ISAC_MODE_MDS1|ISAC_MODE_DIM0); - /* mask interrupts */ - if (sc->sc_ipac) { - IPAC_WRITE(IPAC_MASK, 0xff); - } else { - ISAC_WRITE(I_MASK, 0xff); - } - } -#endif /* NNISAC > 0 */ -} diff --git a/sys/dev/ic/isic_l1.h b/sys/dev/ic/isic_l1.h deleted file mode 100644 index 84238a50f46..00000000000 --- a/sys/dev/ic/isic_l1.h +++ /dev/null @@ -1,371 +0,0 @@ -/* $NetBSD: isic_l1.h,v 1.21 2012/10/27 17:18:21 chs Exp $ */ - -/* - * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#ifndef _ISIC_L1_H -#define _ISIC_L1_H - -#include <netisdn/i4b_l3l4.h> - -/*--------------------------------------------------------------------------- - * kernel config file flags definition - *---------------------------------------------------------------------------*/ -#define FLAG_TELES_S0_8 1 -#define FLAG_TELES_S0_16 2 -#define FLAG_TELES_S0_163 3 -#define FLAG_AVM_A1 4 -#define FLAG_TELES_S0_163_PnP 5 -#define FLAG_CREATIX_S0_PnP 6 -#define FLAG_USR_ISDN_TA_INT 7 -#define FLAG_DRN_NGO 8 -#define FLAG_SWS 9 -#define FLAG_AVM_A1_PCMCIA 10 -#define FLAG_DYNALINK 11 -#define FLAG_BLMASTER 12 -#define FLAG_ELSA_QS1P_ISA 13 -#define FLAG_ELSA_QS1P_PCI 14 -#define FLAG_SIEMENS_ITALK 15 -#define FLAG_ELSA_MLIMC 16 -#define FLAG_ELSA_MLMCALL 17 -#define FLAG_ITK_IX1 18 -#define FLAG_AVMA1PCI 19 -#define FLAG_ELSA_PCC16 20 -#define FLAG_AVM_PNP 21 -#define FLAG_SIEMENS_ISURF2 22 -#define FLAG_ASUSCOM_IPAC 23 - -#define SEC_DELAY 1000000 /* one second DELAY for DELAY*/ - -#define MAX_DFRAME_LEN 264 /* max length of a D frame */ - -#ifndef __bsdi__ -#define min(a,b) ((a)<(b)?(a):(b)) -#endif - -/* We try to map as few as possible as small as possible io and/or - memory regions. Each card defines its own interpretation of this - mapping array. At probe time we have a fixed size array, later - (when the card type is known) we allocate a minimal array - dynamically. */ - -#define ISIC_MAX_IO_MAPS 49 /* no cardtype needs more yet */ - -/* one entry in mapping array */ -struct isic_io_map { - bus_space_tag_t t; /* which bus-space is this? */ - bus_space_handle_t h; /* handle of mapped bus space region */ - bus_size_t offset; /* offset into region */ - bus_size_t size; /* size of region, zero if not ours - (i.e.: don't ever unmap it!) */ -}; - -/* this is passed around at probe time (no struct isic_softc yet) */ -struct isic_attach_args { - int ia_flags; /* flags from config file */ - int ia_num_mappings; /* number of io mappings provided */ - struct isic_io_map ia_maps[ISIC_MAX_IO_MAPS]; -}; - -/*---------------------------------------------------------------------------* - * isic_Bchan: the state of one B channel - *---------------------------------------------------------------------------*/ -typedef struct -{ - int channel; /* which channel is this*/ - - u_char hscx_mask; /* HSCX interrupt mask */ - - int bprot; /* B channel protocol */ - - int state; /* this channels state */ -#define HSCX_IDLE 0x00 /* channel idle */ -#define HSCX_TX_ACTIVE 0x01 /* tx running */ - - /* receive data from ISDN */ - - struct ifqueue rx_queue; /* receiver queue */ - - int rxcount; /* rx statistics counter*/ - - struct mbuf *in_mbuf; /* rx input buffer */ - u_char *in_cbptr; /* curr buffer pointer */ - int in_len; /* rx input buffer len */ - - /* transmit data to ISDN */ - - struct ifqueue tx_queue; /* transmitter queue */ - - int txcount; /* tx statistics counter*/ - - struct mbuf *out_mbuf_head; /* first mbuf in possible chain */ - struct mbuf *out_mbuf_cur; /* current mbuf in possbl chain */ - unsigned char *out_mbuf_cur_ptr; /* data pointer into mbuf */ - int out_mbuf_cur_len; /* remaining bytes in mbuf */ - - /* link between b channel and driver */ - - isdn_link_t isdn_linktab; /* b channel driver data */ - const struct isdn_l4_driver_functions - *l4_driver; /* layer 4 driver */ - void *l4_driver_softc; /* layer 4 driver instance */ - - /* statistics */ - - /* RSTA */ - - int stat_VFR; /* HSCX RSTA Valid FRame */ - int stat_RDO; /* HSCX RSTA Rx Data Overflow */ - int stat_CRC; /* HSCX RSTA CRC */ - int stat_RAB; /* HSCX RSTA Rx message ABorted */ - - /* EXIR */ - - int stat_XDU; /* HSCX EXIR tx data underrun */ - int stat_RFO; /* HSCX EXIR rx frame overflow */ - -} l1_bchan_state_t; - -/*---------------------------------------------------------------------------* - * isic_softc: the state of the layer 1 of the D channel - *---------------------------------------------------------------------------*/ -struct isic_softc -{ - device_t sc_dev; - void *sc_l3token; /* pointer to registered L3 instance */ - struct l2_softc sc_l2; /* D-channel variables */ - - int sc_irq; /* interrupt vector */ - int sc_intr_valid; /* set when card is detached or disable */ -#define ISIC_INTR_VALID 0 /* normal operation */ -#define ISIC_INTR_DISABLED 1 /* ISDN subsystem not opened */ -#define ISIC_INTR_DYING 2 /* card is detaching */ - - int sc_num_mappings; /* number of io mappings provided */ - struct isic_io_map *sc_maps; - -#define MALLOC_MAPS(sc) \ - (sc)->sc_maps = (struct isic_io_map*)malloc(sizeof((sc)->sc_maps[0])*(sc)->sc_num_mappings, M_DEVBUF, 0) - - int sc_cardtyp; /* only needed for some cards */ -#define CARD_TYPEP_UNK 0 /* unknown */ -#define CARD_TYPEP_8 1 /* Teles, S0/8 */ -#define CARD_TYPEP_16 2 /* Teles, S0/16 */ -#define CARD_TYPEP_16_3 3 /* Teles, S0/16.3 */ -#define CARD_TYPEP_AVMA1 4 /* AVM A1 or AVM Fritz!Card */ -#define CARD_TYPEP_163P 5 /* Teles, S0/16.3 PnP */ -#define CARD_TYPEP_CS0P 6 /* Creatix, S0 PnP */ -#define CARD_TYPEP_USRTA 7 /* US Robotics ISDN TA internal */ -#define CARD_TYPEP_DRNNGO 8 /* Dr. Neuhaus Niccy GO@ */ -#define CARD_TYPEP_SWS 9 /* Sedlbauer Win Speed */ -#define CARD_TYPEP_DYNALINK 10 /* Dynalink IS64PH */ -#define CARD_TYPEP_BLMASTER 11 /* ISDN Blaster / ISDN Master */ -#define CARD_TYPEP_PCFRITZ 12 /* AVM PCMCIA Fritz!Card */ -#define CARD_TYPEP_ELSAQS1ISA 13 /* ELSA QuickStep 1000pro ISA */ -#define CARD_TYPEP_ELSAQS1PCI 14 /* ELSA QuickStep 1000pro PCI */ -#define CARD_TYPEP_SIEMENSITALK 15 /* Siemens I-Talk */ -#define CARD_TYPEP_ELSAMLIMC 16 /* ELSA MicroLink ISDN/MC */ -#define CARD_TYPEP_ELSAMLMCALL 17 /* ELSA MicroLink MCall */ -#define CARD_TYPEP_ITKIX1 18 /* ITK ix1 micro */ -#define CARD_TYPEP_AVMA1PCI 19 /* AVM FRITZ!CARD PCI */ -#define CARD_TYPEP_PCC16 20 /* ELSA PCC-16 */ -#define CARD_TYPEP_AVM_PNP 21 /* AVM FRITZ!CARD PnP */ -#define CARD_TYPEP_SIE_ISURF2 22 /* Siemens I-Surf 2 PnP */ -#define CARD_TYPEP_ASUSCOMIPAC 23 /* Asuscom ISDNlink 128 K PnP */ -#define CARD_TYPEP_AVMA1PCIV2 24 /* AVM FRITZ!CARD V2 PCI */ - - int sc_bustyp; /* IOM1 or IOM2 */ -#define BUS_TYPE_IOM1 0x01 -#define BUS_TYPE_IOM2 0x02 - - int sc_trace; /* output protocol data for tracing */ - unsigned int sc_trace_dcount;/* d channel trace frame counter */ - unsigned int sc_trace_bcount;/* b channel trace frame counter */ - - int sc_state; /* ISAC state flag */ -#define ISAC_IDLE 0x00 /* state = idle */ -#define ISAC_TX_ACTIVE 0x01 /* state = transmitter active */ - - int sc_init_tries; /* no of out tries to access S0 */ - int sc_maddr; /* some stupid ISA cards need this */ - - u_char sc_isac_mask; /* ISAC IRQ mask */ -#define ISAC_IMASK (sc->sc_isac_mask) - - l1_bchan_state_t sc_chan[2]; /* B-channel state */ -#define HSCX_A_BASE (sc->sc_chan[0].hscx) -#define HSCX_A_IMASK (sc->sc_chan[0].hscx_mask) -#define HSCX_B_BASE (sc->sc_chan[1].hscx) -#define HSCX_B_IMASK (sc->sc_chan[1].hscx_mask) - - struct mbuf *sc_ibuf; /* input buffer mgmt */ - u_short sc_ilen; - u_char *sc_ib; - /* this is for the irq TX routine */ - struct mbuf *sc_obuf; /* pointer to an mbuf with TX frame */ - u_char *sc_op; /* ptr to next chunk of frame to tx */ - int sc_ol; /* length of remaining frame to tx */ - int sc_freeflag; /* m_freem mbuf if set */ - - struct mbuf *sc_obuf2; /* pointer to an mbuf with TX frame */ - int sc_freeflag2; /* m_freem mbuf if set */ - - int sc_isac_version; /* version number of ISAC */ - int sc_hscx_version; /* version number of HSCX */ - int sc_ipac_version; /* version number of IPAC */ - - int sc_I430state; /* I.430 state F3 .... F8 */ - - int sc_I430T3; /* I.430 Timer T3 running */ - struct callout sc_T3_callout; - - int sc_I430T4; /* Timer T4 running */ - struct callout sc_T4_callout; - - int sc_driver_specific; /* used for LED values */ - struct callout sc_driver_callout; /* used for LED timer */ - - /* - * byte fields for the AVM Fritz!Card PCI. These are packed into - * a u_int in the driver. - */ - u_char avma1pp_cmd; - u_char avma1pp_txl; - u_char avma1pp_prot; - - int sc_ipac; /* flag, running on ipac */ - int sc_bfifolen; /* length of b channel fifos */ - -#define ISIC_WHAT_ISAC 0 -#define ISIC_WHAT_HSCXA 1 -#define ISIC_WHAT_HSCXB 2 -#define ISIC_WHAT_IPAC 3 - - u_int8_t (*readreg)(struct isic_softc *, int, bus_size_t); - void (*writereg)(struct isic_softc *, int, bus_size_t, u_int8_t); - void (*readfifo)(struct isic_softc *, int, void *, size_t); - void (*writefifo)(struct isic_softc *, int what, - const void *, size_t); - void (*clearirq)(struct isic_softc *); - - void (*drv_command)(struct isic_softc *, int, void *); - -#define ISAC_READ(r) (*sc->readreg)(sc, ISIC_WHAT_ISAC, (r)) -#define ISAC_WRITE(r,v) (*sc->writereg)(sc, ISIC_WHAT_ISAC, (r), (v)) -#define ISAC_RDFIFO(b,s) (*sc->readfifo)(sc, ISIC_WHAT_ISAC, (b), (s)) -#define ISAC_WRFIFO(b,s) (*sc->writefifo)(sc, ISIC_WHAT_ISAC, (b), (s)) - -#define HSCX_READ(n,r) (*sc->readreg)(sc, ISIC_WHAT_HSCXA+(n), (r)) -#define HSCX_WRITE(n,r,v) (*sc->writereg)(sc, ISIC_WHAT_HSCXA+(n), (r), (v)) -#define HSCX_RDFIFO(n,b,s) (*sc->readfifo)(sc, ISIC_WHAT_HSCXA+(n), (b), (s)) -#define HSCX_WRFIFO(n,b,s) (*sc->writefifo)(sc, ISIC_WHAT_HSCXA+(n), (b), (s)) - -#define IPAC_READ(r) (*sc->readreg)(sc, ISIC_WHAT_IPAC, (r)) -#define IPAC_WRITE(r, v) (*sc->writereg)(sc, ISIC_WHAT_IPAC, (r), (v)) - -}; - -/*---------------------------------------------------------------------------* - * possible I.430/ISAC states - *---------------------------------------------------------------------------*/ -enum I430states { - ST_F3, /* F3 Deactivated */ - ST_F4, /* F4 Awaiting Signal */ - ST_F5, /* F5 Identifying Input */ - ST_F6, /* F6 Synchronized */ - ST_F7, /* F7 Activated */ - ST_F8, /* F8 Lost Framing */ - ST_ILL, /* Illegal State */ - N_STATES -}; - -/*---------------------------------------------------------------------------* - * possible I.430/ISAC events - *---------------------------------------------------------------------------*/ -enum I430events { - EV_PHAR, /* PH ACTIVATE REQUEST */ - EV_T3, /* Timer 3 expired */ - EV_INFO0, /* receiving INFO0 */ - EV_RSY, /* receiving any signal */ - EV_INFO2, /* receiving INFO2 */ - EV_INFO48, /* receiving INFO4 pri 8/9 */ - EV_INFO410, /* receiving INFO4 pri 10/11 */ - EV_DR, /* Deactivate Request */ - EV_PU, /* Power UP */ - EV_DIS, /* Disconnected (only 2085) */ - EV_EI, /* Error Indication */ - EV_ILL, /* Illegal Event */ - N_EVENTS -}; - -enum I430commands { - CMD_TIM, /* Timing */ - CMD_RS, /* Reset */ - CMD_AR8, /* Activation request pri 8 */ - CMD_AR10, /* Activation request pri 10 */ - CMD_DIU, /* Deactivate Indication Upstream */ - CMD_ILL /* Illegal command */ -}; - -#define N_COMMANDS CMD_ILL - -extern void isic_recover(struct isic_softc *); -extern int isicintr(void *); -extern int isicprobe(struct isic_attach_args *); -extern int isic_attach_avma1(struct isic_softc *); -extern int isic_attach_s016(struct isic_softc *); -extern int isic_attach_s0163(struct isic_softc *); -extern int isic_attach_s08(struct isic_softc *); -extern int isic_attach_usrtai(struct isic_softc *); -extern int isic_attach_itkix1(struct isic_softc *); -extern void isic_bchannel_setup(void *, int, int, int); -extern void isic_hscx_init(struct isic_softc *, int, int); -extern void isic_hscx_irq(struct isic_softc *, u_char ista, int, u_char); -extern void isic_hscx_cmd( struct isic_softc *, int, unsigned char); -extern void isic_hscx_waitxfw( struct isic_softc *, int); -extern void isic_init_linktab(struct isic_softc *); -extern int isic_isac_init(struct isic_softc *); -extern void isic_isac_irq(struct isic_softc *, int); -extern void isic_isac_l1_cmd(struct isic_softc *, int); -extern void isic_next_state(struct isic_softc *, int); -extern const char * isic_printstate(struct isic_softc *); -extern int isic_probe_avma1(struct isic_attach_args *); -extern int isic_probe_s016(struct isic_attach_args *); -extern int isic_probe_s0163(struct isic_attach_args *); -extern int isic_probe_s08(struct isic_attach_args *ia); -extern int isic_probe_usrtai(struct isic_attach_args *ia); -extern int isic_probe_itkix1(struct isic_attach_args *ia); -extern int isic_attach_bri(struct isic_softc *sc, const char *cardname, const struct isdn_layer1_isdnif_driver *dchan_driver); -extern int isic_detach_bri(struct isic_softc *sc); - -extern void isic_isacsx_disable_intr(struct isic_softc *sc); -extern void isic_isacsx_recover(struct isic_softc *sc); -extern void isic_isacsx_irq(struct isic_softc *sc, int r); -extern void isic_isacsx_l1_cmd(struct isic_softc *sc, int command); -extern int isic_isacsx_init(struct isic_softc *sc); - -#endif /* !_ISIC_L1_H */ - diff --git a/sys/dev/ic/isic_l1fsm.c b/sys/dev/ic/isic_l1fsm.c deleted file mode 100644 index 063742d57f8..00000000000 --- a/sys/dev/ic/isic_l1fsm.c +++ /dev/null @@ -1,545 +0,0 @@ -/* - * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * i4b_l1fsm.c - isdn4bsd layer 1 I.430 state machine - * -------------------------------------------------- - * - * $Id: isic_l1fsm.c,v 1.14 2011/07/17 20:54:51 joerg Exp $ - * - * last edit-date: [Fri Jan 5 11:36:11 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_l1fsm.c,v 1.14 2011/07/17 20:54:51 joerg Exp $"); - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#ifndef __bsdi__ -#include <sys/bus.h> -#endif -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#endif - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_trace.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#include "nisac.h" -#include "nisacsx.h" - -#if DO_I4B_DEBUG -static const char *state_text[N_STATES] = { - "F3 Deactivated", - "F4 Awaiting Signal", - "F5 Identifying Input", - "F6 Synchronized", - "F7 Activated", - "F8 Lost Framing", - "Illegal State" -}; - -static const char *event_text[N_EVENTS] = { - "EV_PHAR PH_ACT_REQ", - "EV_T3 Timer 3 expired", - "EV_INFO0 INFO0 received", - "EV_RSY Level Detected", - "EV_INFO2 INFO2 received", - "EV_INFO48 INFO4 received", - "EV_INFO410 INFO4 received", - "EV_DR Deactivate Req", - "EV_PU Power UP", - "EV_DIS Disconnected", - "EV_EI Error Ind", - "Illegal Event" -}; -#endif - -/* Function prototypes */ - -static void timer3_expired (struct isic_softc *sc); -static void T3_start (struct isic_softc *sc); -static void T3_stop (struct isic_softc *sc); -static void F_T3ex (struct isic_softc *sc); -static void timer4_expired (struct isic_softc *sc); -static void T4_start (struct isic_softc *sc); -static void T4_stop (struct isic_softc *sc); -static void F_AI8 (struct isic_softc *sc); -static void F_AI10 (struct isic_softc *sc); -static void F_I01 (struct isic_softc *sc); -static void F_I02 (struct isic_softc *sc); -static void F_I03 (struct isic_softc *sc); -static void F_I2 (struct isic_softc *sc); -static void F_ill (struct isic_softc *sc); -static void F_NULL (struct isic_softc *sc); - -/*---------------------------------------------------------------------------* - * I.430 Timer T3 expire function - *---------------------------------------------------------------------------*/ -static void -timer3_expired(struct isic_softc *sc) -{ - if(sc->sc_I430T3) - { - NDBGL1(L1_T_ERR, "state = %s", isic_printstate(sc)); - sc->sc_I430T3 = 0; - - /* XXX try some recovery here XXX */ - switch(sc->sc_cardtyp) { -#if NNISACSX > 0 - case CARD_TYPEP_AVMA1PCIV2: - isic_isacsx_recover(sc); - break; -#endif /* NNISACSX > 0 */ - default: -#if NNISAC > 0 - isic_recover(sc); -#endif /* NNISAC > 0 */ - break; - } - - sc->sc_init_tries++; /* increment retry count */ - -/*XXX*/ if(sc->sc_init_tries > 4) - { - int s = splnet(); - - sc->sc_init_tries = 0; - - if(sc->sc_obuf2 != NULL) - { - i4b_Dfreembuf(sc->sc_obuf2); - sc->sc_obuf2 = NULL; - } - if(sc->sc_obuf != NULL) - { - i4b_Dfreembuf(sc->sc_obuf); - sc->sc_obuf = NULL; - sc->sc_freeflag = 0; - sc->sc_op = NULL; - sc->sc_ol = 0; - } - - splx(s); - - isdn_layer2_status_ind(&sc->sc_l2, sc->sc_l3token, STI_NOL1ACC, 0); - } - - isic_next_state(sc, EV_T3); - } - else - { - NDBGL1(L1_T_ERR, "expired without starting it ...."); - } -} - -/*---------------------------------------------------------------------------* - * I.430 Timer T3 start - *---------------------------------------------------------------------------*/ -static void -T3_start(struct isic_softc *sc) -{ - NDBGL1(L1_T_MSG, "state = %s", isic_printstate(sc)); - sc->sc_I430T3 = 1; - - START_TIMER(sc->sc_T3_callout, timer3_expired, sc, 2*hz); -} - -/*---------------------------------------------------------------------------* - * I.430 Timer T3 stop - *---------------------------------------------------------------------------*/ -static void -T3_stop(struct isic_softc *sc) -{ - NDBGL1(L1_T_MSG, "state = %s", isic_printstate(sc)); - - sc->sc_init_tries = 0; /* init connect retry count */ - - if(sc->sc_I430T3) - { - sc->sc_I430T3 = 0; - STOP_TIMER(sc->sc_T3_callout, timer3_expired, sc); - } -} - -/*---------------------------------------------------------------------------* - * I.430 Timer T3 expiry - *---------------------------------------------------------------------------*/ -static void -F_T3ex(struct isic_softc *sc) -{ - NDBGL1(L1_F_MSG, "FSM function F_T3ex executing"); - if(((struct isdn_l3_driver*)sc->sc_l3token)->protocol != PROTOCOL_D64S) - isdn_layer2_activate_ind(&sc->sc_l2, sc->sc_l3token, 0); -} - -/*---------------------------------------------------------------------------* - * Timer T4 expire function - *---------------------------------------------------------------------------*/ -static void -timer4_expired(struct isic_softc *sc) -{ - if(sc->sc_I430T4) - { - NDBGL1(L1_T_MSG, "state = %s", isic_printstate(sc)); - sc->sc_I430T4 = 0; - isdn_layer2_status_ind(&sc->sc_l2, sc->sc_l3token, STI_PDEACT, 0); - } - else - { - NDBGL1(L1_T_ERR, "expired without starting it ...."); - } -} - -/*---------------------------------------------------------------------------* - * Timer T4 start - *---------------------------------------------------------------------------*/ -static void -T4_start(struct isic_softc *sc) -{ - NDBGL1(L1_T_MSG, "state = %s", isic_printstate(sc)); - sc->sc_I430T4 = 1; - - START_TIMER(sc->sc_T4_callout, timer4_expired, sc, hz); -} - -/*---------------------------------------------------------------------------* - * Timer T4 stop - *---------------------------------------------------------------------------*/ -static void -T4_stop(struct isic_softc *sc) -{ - NDBGL1(L1_T_MSG, "state = %s", isic_printstate(sc)); - - if(sc->sc_I430T4) - { - sc->sc_I430T4 = 0; - STOP_TIMER(sc->sc_T4_callout, timer4_expired, sc); - } -} - -/*---------------------------------------------------------------------------* - * FSM function: received AI8 - *---------------------------------------------------------------------------*/ -static void -F_AI8(struct isic_softc *sc) -{ - T4_stop(sc); - - NDBGL1(L1_F_MSG, "FSM function F_AI8 executing"); - - if(((struct isdn_l3_driver*)sc->sc_l3token)->protocol != PROTOCOL_D64S) - isdn_layer2_activate_ind(&sc->sc_l2, sc->sc_l3token, 1); - - T3_stop(sc); - - if(sc->sc_trace & TRACE_I) - { - i4b_trace_hdr hdr; - char info = INFO4_8; - - hdr.type = TRC_CH_I; - hdr.dir = FROM_NT; - hdr.count = 0; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, 1, &info); - } -} - -/*---------------------------------------------------------------------------* - * FSM function: received AI10 - *---------------------------------------------------------------------------*/ -static void -F_AI10(struct isic_softc *sc) -{ - T4_stop(sc); - - NDBGL1(L1_F_MSG, "FSM function F_AI10 executing"); - - if(((struct isdn_l3_driver*)sc->sc_l3token)->protocol != PROTOCOL_D64S) - isdn_layer2_activate_ind(&sc->sc_l2, sc->sc_l3token, 1); - - T3_stop(sc); - - if(sc->sc_trace & TRACE_I) - { - i4b_trace_hdr hdr; - char info = INFO4_10; - - hdr.type = TRC_CH_I; - hdr.dir = FROM_NT; - hdr.count = 0; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, 1, &info); - } -} - -/*---------------------------------------------------------------------------* - * FSM function: received INFO 0 in states F3 .. F5 - *---------------------------------------------------------------------------*/ -static void -F_I01(struct isic_softc *sc) -{ - NDBGL1(L1_F_MSG, "FSM function F_I01 executing"); - - if(sc->sc_trace & TRACE_I) - { - i4b_trace_hdr hdr; - char info = INFO0; - - hdr.type = TRC_CH_I; - hdr.dir = FROM_NT; - hdr.count = 0; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, 1, &info); - } -} - -/*---------------------------------------------------------------------------* - * FSM function: received INFO 0 in state F6 - *---------------------------------------------------------------------------*/ -static void -F_I02(struct isic_softc *sc) -{ - NDBGL1(L1_F_MSG, "FSM function F_I02 executing"); - - if(((struct isdn_l3_driver*)sc->sc_l3token)->protocol != PROTOCOL_D64S) - isdn_layer2_activate_ind(&sc->sc_l2, sc->sc_l3token, 0); - - if(sc->sc_trace & TRACE_I) - { - i4b_trace_hdr hdr; - char info = INFO0; - - hdr.type = TRC_CH_I; - hdr.dir = FROM_NT; - hdr.count = 0; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, 1, &info); - } -} - -/*---------------------------------------------------------------------------* - * FSM function: received INFO 0 in state F7 or F8 - *---------------------------------------------------------------------------*/ -static void -F_I03(struct isic_softc *sc) -{ - NDBGL1(L1_F_MSG, "FSM function F_I03 executing"); - - if(((struct isdn_l3_driver*)sc->sc_l3token)->protocol != PROTOCOL_D64S) - isdn_layer2_activate_ind(&sc->sc_l2, sc->sc_l3token, 0); - - T4_start(sc); - - if(sc->sc_trace & TRACE_I) - { - i4b_trace_hdr hdr; - char info = INFO0; - - hdr.type = TRC_CH_I; - hdr.dir = FROM_NT; - hdr.count = 0; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, 1, &info); - } -} - -/*---------------------------------------------------------------------------* - * FSM function: activate request - *---------------------------------------------------------------------------*/ -static void -F_AR(struct isic_softc *sc) -{ - NDBGL1(L1_F_MSG, "FSM function F_AR executing"); - - if(sc->sc_trace & TRACE_I) - { - i4b_trace_hdr hdr; - char info = INFO1_8; - - hdr.type = TRC_CH_I; - hdr.dir = FROM_TE; - hdr.count = 0; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, 1, &info); - } - - switch(sc->sc_cardtyp) { -#if NNISACSX > 0 - case CARD_TYPEP_AVMA1PCIV2: - isic_isacsx_l1_cmd(sc, CMD_AR8); - break; -#endif /* NNISACSX > 0 */ - default: -#if NNISAC > 0 - isic_isac_l1_cmd(sc, CMD_AR8); -#endif /* NNISAC > 0 */ - break; - } - - T3_start(sc); -} - -/*---------------------------------------------------------------------------* - * FSM function: received INFO2 - *---------------------------------------------------------------------------*/ -static void -F_I2(struct isic_softc *sc) -{ - NDBGL1(L1_F_MSG, "FSM function F_I2 executing"); - - if(sc->sc_trace & TRACE_I) - { - i4b_trace_hdr hdr; - char info = INFO2; - - hdr.type = TRC_CH_I; - hdr.dir = FROM_NT; - hdr.count = 0; - isdn_layer2_trace_ind(&sc->sc_l2, sc->sc_l3token, &hdr, 1, &info); - } -} - -/*---------------------------------------------------------------------------* - * illegal state default action - *---------------------------------------------------------------------------*/ -static void -F_ill(struct isic_softc *sc) -{ - NDBGL1(L1_F_ERR, "FSM function F_ill executing"); -} - -/*---------------------------------------------------------------------------* - * No action - *---------------------------------------------------------------------------*/ -static void -F_NULL(struct isic_softc *sc) -{ - NDBGL1(L1_F_MSG, "FSM function F_NULL executing"); -} - - -/*---------------------------------------------------------------------------* - * layer 1 state transition table - *---------------------------------------------------------------------------*/ -struct isic_state_tab { - void (*func) (struct isic_softc *sc); /* function to execute */ - int newstate; /* next state */ -} isic_state_tab[N_EVENTS][N_STATES] = { - -/* STATE: F3 F4 F5 F6 F7 F8 ILLEGAL STATE */ -/* -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ -/* EV_PHAR x*/ {{F_AR, ST_F4}, {F_NULL, ST_F4}, {F_NULL, ST_F5}, {F_NULL, ST_F6}, {F_ill, ST_ILL}, {F_NULL, ST_F8}, {F_ill, ST_ILL}}, -/* EV_T3 x*/ {{F_NULL, ST_F3}, {F_T3ex, ST_F3}, {F_T3ex, ST_F3}, {F_T3ex, ST_F3}, {F_NULL, ST_F7}, {F_NULL, ST_F8}, {F_ill, ST_ILL}}, -/* EV_INFO0 */ {{F_I01, ST_F3}, {F_I01, ST_F4}, {F_I01, ST_F5}, {F_I02, ST_F3}, {F_I03, ST_F3}, {F_I03, ST_F3}, {F_ill, ST_ILL}}, -/* EV_RSY x*/ {{F_NULL, ST_F3}, {F_NULL, ST_F5}, {F_NULL, ST_F5}, {F_NULL, ST_F8}, {F_NULL, ST_F8}, {F_NULL, ST_F8}, {F_ill, ST_ILL}}, -/* EV_INFO2 */ {{F_I2, ST_F6}, {F_I2, ST_F6}, {F_I2, ST_F6}, {F_I2, ST_F6}, {F_I2, ST_F6}, {F_I2, ST_F6}, {F_ill, ST_ILL}}, -/* EV_INFO48*/ {{F_AI8, ST_F7}, {F_AI8, ST_F7}, {F_AI8, ST_F7}, {F_AI8, ST_F7}, {F_NULL, ST_F7}, {F_AI8, ST_F7}, {F_ill, ST_ILL}}, -/* EV_INFO41*/ {{F_AI10, ST_F7}, {F_AI10, ST_F7}, {F_AI10, ST_F7}, {F_AI10, ST_F7}, {F_NULL, ST_F7}, {F_AI10, ST_F7}, {F_ill, ST_ILL}}, -/* EV_DR */ {{F_NULL, ST_F3}, {F_NULL, ST_F4}, {F_NULL, ST_F5}, {F_NULL, ST_F6}, {F_NULL, ST_F7}, {F_NULL, ST_F8}, {F_ill, ST_ILL}}, -/* EV_PU */ {{F_NULL, ST_F3}, {F_NULL, ST_F4}, {F_NULL, ST_F5}, {F_NULL, ST_F6}, {F_NULL, ST_F7}, {F_NULL, ST_F8}, {F_ill, ST_ILL}}, -/* EV_DIS */ {{F_ill, ST_ILL}, {F_ill, ST_ILL}, {F_ill, ST_ILL}, {F_ill, ST_ILL}, {F_ill, ST_ILL}, {F_ill, ST_ILL}, {F_ill, ST_ILL}}, -/* EV_EI */ {{F_NULL, ST_F3}, {F_NULL, ST_F3}, {F_NULL, ST_F3}, {F_NULL, ST_F3}, {F_NULL, ST_F3}, {F_NULL, ST_F3}, {F_ill, ST_ILL}}, -/* EV_ILL */ {{F_ill, ST_ILL}, {F_ill, ST_ILL}, {F_ill, ST_ILL}, {F_ill, ST_ILL}, {F_ill, ST_ILL}, {F_ill, ST_ILL}, {F_ill, ST_ILL}} -}; - -/*---------------------------------------------------------------------------* - * event handler - *---------------------------------------------------------------------------*/ -void -isic_next_state(struct isic_softc *sc, int event) -{ - int currstate, newstate; - - if(event >= N_EVENTS) - panic("i4b_l1fsm.c: event >= N_EVENTS"); - - currstate = sc->sc_I430state; - - if(currstate >= N_STATES) - panic("i4b_l1fsm.c: currstate >= N_STATES"); - - newstate = isic_state_tab[event][currstate].newstate; - - if(newstate >= N_STATES) - panic("i4b_l1fsm.c: newstate >= N_STATES"); - - NDBGL1(L1_F_MSG, "FSM event [%s]: [%s => %s]", event_text[event], - state_text[currstate], - state_text[newstate]); - - (*isic_state_tab[event][currstate].func)(sc); - - if(newstate == ST_ILL) - { - newstate = ST_F3; - NDBGL1(L1_F_ERR, "FSM Illegal State ERROR, oldstate = %s, newstate = %s, event = %s!", - state_text[currstate], - state_text[newstate], - event_text[event]); - } - - sc->sc_I430state = newstate; -} - -#if DO_I4B_DEBUG -/*---------------------------------------------------------------------------* - * return pointer to current state description - *---------------------------------------------------------------------------*/ -const char * -isic_printstate(struct isic_softc *sc) -{ - return(state_text[sc->sc_I430state]); -} -#endif diff --git a/sys/dev/isa/files.isa b/sys/dev/isa/files.isa index fd580232b36..bbe496264d6 100644 --- a/sys/dev/isa/files.isa +++ b/sys/dev/isa/files.isa @@ -1,4 +1,4 @@ -# $NetBSD: files.isa,v 1.170 2018/09/19 13:58:27 maxv Exp $ +# $NetBSD: files.isa,v 1.171 2018/09/22 16:22:23 maxv Exp $ # # Config file and device description for machine-independent ISA code. # Included by ports that need it. Requires that the SCSI files be @@ -484,20 +484,6 @@ device aps: sysmon_envsys attach aps at isa with aps file dev/isa/aps.c aps -# ISDN devices -attach isic at isa with isic_isa -file dev/isa/isic_isa.c isic_isa - -defflag opt_isicisa.h ISICISA_TEL_S0_8 ISICISA_TEL_S0_16 ISICISA_TEL_S0_16_3 - ISICISA_AVM_A1 ISICISA_USR_STI ISICISA_ITKIX1 - -file dev/isa/isic_isa_tel_s08.c isic_isa -file dev/isa/isic_isa_tel_s016.c isic_isa -file dev/isa/isic_isa_tel_s0163.c isic_isa -file dev/isa/isic_isa_avm_a1.c isic_isa -file dev/isa/isic_isa_usr_sti.c isic_isa -file dev/isa/isic_isa_itk_ix1.c isic_isa - # Game adapter (joystick) attach joy at isa with joy_isa file dev/isa/joy_isa.c joy_isa diff --git a/sys/dev/isa/isic_isa.c b/sys/dev/isa/isic_isa.c deleted file mode 100644 index caf95c0b623..00000000000 --- a/sys/dev/isa/isic_isa.c +++ /dev/null @@ -1,1268 +0,0 @@ -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann <martin@NetBSD.org>. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isa.c,v 1.38 2016/07/14 10:19:06 msaitoh Exp $"); - -#include <sys/param.h> -#include <sys/errno.h> -#include <sys/syslog.h> -#include <sys/device.h> -#include <sys/socket.h> -#include <net/if.h> -#include <sys/systm.h> -#include <sys/malloc.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#include <sys/cpu.h> -#include <sys/intr.h> -#include <sys/bus.h> - -#include <dev/isa/isavar.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_ioctl.h> -#endif - -#include "opt_isicisa.h" - -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_trace.h> - -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <dev/ic/isic_l1.h> -#include <dev/ic/ipac.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#include <netisdn/i4b_mbuf.h> -#include <netisdn/i4b_global.h> - -extern const struct isdn_layer1_isdnif_driver isic_std_driver; - -/* local functions */ -static int isic_isa_probe(device_t, cfdata_t, void *); - -static void isic_isa_attach(device_t, device_t, void *); -static int setup_io_map(int flags, bus_space_tag_t iot, - bus_space_tag_t memt, bus_size_t iobase, bus_size_t maddr, - int *num_mappings, struct isic_io_map *maps, int *iosize, - int *msize); -static void args_unmap(int *num_mappings, struct isic_io_map *maps); - -CFATTACH_DECL_NEW(isic_isa, sizeof(struct isic_softc), - isic_isa_probe, isic_isa_attach, NULL, NULL); - -#define ISIC_FMT "%s: " -#define ISIC_PARM device_xname(sc->sc_dev) -#define TERMFMT "\n" - -/* - * 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; -} - -static int -isicattach(int flags, struct isic_softc *sc) -{ - int ret = 0; - const char *drvid; - -#ifdef __FreeBSD__ - - struct isic_softc *sc = &l1_sc[dev->id_unit]; -#define PARM dev -#define PARM2 dev, iobase2 -#define FLAGS dev->id_flags - -#elif defined(__bsdi__) - - struct isic_softc *sc = device_private(self); -#define PARM parent, self, ia -#define PARM2 parent, self, ia -#define FLAGS sc->sc_flags - -#else - -#define PARM sc -#define PARM2 sc -#define FLAGS flags - -#endif /* __FreeBSD__ */ - - static const 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 const char *HSCXversion[] = { - "82525 Version A1", - "Unknown (0x01)", - "82525 Version A2", - "Unknown (0x03)", - "82525 Version A3", - "82525 or 21525 Version 2.1", - "Unknown Version" - }; - - /* card dependent setup */ - switch(FLAGS) - { -#ifdef ISICISA_DYNALINK -#if defined(__bsdi__) || defined(__FreeBSD__) - case FLAG_DYNALINK: - ret = isic_attach_Dyn(PARM2); - break; -#endif -#endif - -#ifdef ISICISA_TEL_S0_8 - case FLAG_TELES_S0_8: - ret = isic_attach_s08(PARM); - break; -#endif - -#ifdef ISICISA_TEL_S0_16 - case FLAG_TELES_S0_16: - ret = isic_attach_s016(PARM); - break; -#endif - -#ifdef ISICISA_TEL_S0_16_3 - case FLAG_TELES_S0_163: - ret = isic_attach_s0163(PARM); - break; -#endif - -#ifdef ISICISA_AVM_A1 - case FLAG_AVM_A1: - ret = isic_attach_avma1(PARM); - break; -#endif - -#ifdef ISICISA_USR_STI - case FLAG_USR_ISDN_TA_INT: - ret = isic_attach_usrtai(PARM); - break; -#endif - -#ifdef ISICISA_ITKIX1 - case FLAG_ITK_IX1: - ret = isic_attach_itkix1(PARM); - break; -#endif - -#ifdef ISICISA_ELSA_PCC16 - case FLAG_ELSA_PCC16: - ret = isic_attach_Eqs1pi(dev, 0); - break; -#endif - -#ifdef amiga - case FLAG_BLMASTER: - ret = 1; /* full detection was done in caller */ - 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_A1_PCMCIA - case FLAG_AVM_A1_PCMCIA: - ret = isic_attach_fritzpcmcia(PARM); - break; -#endif - -#ifdef TEL_S0_16_3_P - case FLAG_TELES_S0_163_PnP: - ret = isic_attach_s0163P(PARM2); - break; -#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 - -#ifdef AVM_PNP - case FLAG_AVM_PNP: - ret = isic_attach_avm_pnp(PARM2); - ret = 0; - break; -#endif - -#ifdef SIEMENS_ISURF2 - case FLAG_SIEMENS_ISURF2: - ret = isic_attach_siemens_isurf(PARM2); - break; -#endif - -#ifdef ASUSCOM_IPAC - case FLAG_ASUSCOM_IPAC: - ret = isic_attach_asi(PARM2); - break; -#endif - -#endif /* __FreeBSD__ / P&P specific part */ - - default: - break; - } - - if(ret == 0) - return(0); - - if(sc->sc_ipac) - { - sc->sc_ipac_version = IPAC_READ(IPAC_ID); - - switch(sc->sc_ipac_version) - { - case IPAC_V11: - case IPAC_V12: - break; - - default: - aprint_error_dev(sc->sc_dev, "Error, IPAC version %d unknown!\n", ret); - return(0); - break; - } - } - else - { - 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; - } - } - - sc->sc_intr_valid = ISIC_INTR_DISABLED; - - /* HSCX setup */ - - isic_bchannel_setup(sc, HSCX_CH_A, BPROT_NONE, 0); - - isic_bchannel_setup(sc, 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 - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 - callout_init(&sc->sc_T3_callout, 0); - callout_init(&sc->sc_T4_callout, 0); -#endif - - /* 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; - - case FLAG_ELSA_PCC16: - drvid = "ELSA PCC-16"; - break; - - case FLAG_ASUSCOM_IPAC: - drvid = "Asuscom ISDNlink 128K PnP"; - break; - - case FLAG_SIEMENS_ISURF2: - drvid = "Siemens I-Surf 2.0"; - 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_ipac) - { - if(sc->sc_ipac_version == IPAC_V11) - printf(ISIC_FMT "IPAC PSB2115 Version 1.1\n", ISIC_PARM); - else - printf(ISIC_FMT "IPAC PSB2115 Version 1.2\n", ISIC_PARM); - } - else - { - 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); - -#endif /* __FreeBSD__ */ - } - -#ifdef __FreeBSD__ - 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__ */ - - /* init higher protocol layers */ - isic_attach_bri(sc, drvid, &isic_std_driver); - - return(1); -#undef PARM -#undef FLAGS -} - -/* - * 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, maddr; - struct isic_attach_args args; - - iobase = ia->ia_nio > 0 ? ia->ia_io[0].ir_addr : ISA_UNKNOWN_PORT; - maddr = ia->ia_niomem > 0 ? ia->ia_iomem[0].ir_addr : ISA_UNKNOWN_IOMEM; - - /* 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 { - aprint_error(": 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 (leo@NetBSD.org). - */ - isicintr(sc); - } - } -} - -/* - * Setup card specific io mapping. Return 0 on success, - * any other value on config error. - * Be prepared to get NULL as maps array. - * Make sure to keep *num_mappings in sync with the real - * mappings already setup when returning! - */ -static int -setup_io_map(int flags, bus_space_tag_t iot, bus_space_tag_t memt, bus_size_t iobase, bus_size_t maddr, int *num_mappings, struct isic_io_map *maps, int *iosize, int *msize) -{ - /* nothing mapped yet */ - *num_mappings = 0; - - /* which resources do we need? */ - switch(flags) - { - case FLAG_TELES_S0_8: - if (maddr == ISA_UNKNOWN_IOMEM) { - printf("isic: config error: no shared memory specified for Teles S0/8!\n"); - return 1; - } - if (iosize) *iosize = 0; /* no i/o ports */ - if (msize) *msize = 0x1000; /* shared memory size */ - - /* this card uses a single memory mapping */ - if (maps == NULL) { - *num_mappings = 1; - return 0; - } - *num_mappings = 0; - maps[0].t = memt; - maps[0].offset = 0; - maps[0].size = 0x1000; - if (bus_space_map(maps[0].t, maddr, - maps[0].size, 0, &maps[0].h)) { - return 1; - } - (*num_mappings)++; - break; - - case FLAG_TELES_S0_16: - if (iobase == ISA_UNKNOWN_PORT) { - printf("isic: config error: no i/o address specified for Teles S0/16!\n"); - return 1; - } - if (maddr == ISA_UNKNOWN_IOMEM) { - printf("isic: config error: no shared memory specified for Teles S0/16!\n"); - return 1; - } - if (iosize) *iosize = 8; /* i/o ports */ - if (msize) *msize = 0x1000; /* shared memory size */ - - /* one io and one memory mapping */ - if (maps == NULL) { - *num_mappings = 2; - return 0; - } - *num_mappings = 0; - maps[0].t = iot; - maps[0].offset = 0; - maps[0].size = 8; - if (bus_space_map(maps[0].t, iobase, - maps[0].size, 0, &maps[0].h)) { - return 1; - } - (*num_mappings)++; - maps[1].t = memt; - maps[1].offset = 0; - maps[1].size = 0x1000; - if (bus_space_map(maps[1].t, maddr, - maps[1].size, 0, &maps[1].h)) { - return 1; - } - (*num_mappings)++; - break; - - case FLAG_TELES_S0_163: - if (iobase == ISA_UNKNOWN_PORT) { - printf("isic: config error: no i/o address specified for Teles S0/16!\n"); - return 1; - } - if (iosize) *iosize = 8; /* only some i/o ports shown */ - if (msize) *msize = 0; /* no shared memory */ - - /* Four io mappings: config, isac, 2 * hscx */ - if (maps == NULL) { - *num_mappings = 4; - return 0; - } - *num_mappings = 0; - maps[0].t = iot; - maps[0].offset = 0; - maps[0].size = 8; - if (bus_space_map(maps[0].t, iobase, - maps[0].size, 0, &maps[0].h)) { - return 1; - } - (*num_mappings)++; - maps[1].t = iot; - maps[1].offset = 0; - maps[1].size = 0x40; /* XXX - ??? */ - if ((iobase - 0xd80 + 0x980) > 0x0ffff) - return 1; - if (bus_space_map(maps[1].t, iobase - 0xd80 + 0x980, - maps[1].size, 0, &maps[1].h)) { - return 1; - } - (*num_mappings)++; - maps[2].t = iot; - maps[2].offset = 0; - maps[2].size = 0x40; /* XXX - ??? */ - if ((iobase - 0xd80 + 0x180) > 0x0ffff) - return 1; - if (bus_space_map(maps[2].t, iobase - 0xd80 + 0x180, - maps[2].size, 0, &maps[2].h)) { - return 1; - } - (*num_mappings)++; - maps[3].t = iot; - maps[3].offset = 0; - maps[3].size = 0x40; /* XXX - ??? */ - if ((iobase - 0xd80 + 0x580) > 0x0ffff) - return 1; - if (bus_space_map(maps[3].t, iobase - 0xd80 + 0x580, - maps[3].size, 0, &maps[3].h)) { - return 1; - } - (*num_mappings)++; - break; - - case FLAG_AVM_A1: - if (iobase == ISA_UNKNOWN_PORT) { - printf("isic: config error: no i/o address specified for AVM A1/Fritz! card!\n"); - return 1; - } - if (iosize) *iosize = 8; /* only some i/o ports shown */ - if (msize) *msize = 0; /* no shared memory */ - - /* Seven io mappings: config, isac, 2 * hscx, - isac-fifo, 2 * hscx-fifo */ - if (maps == NULL) { - *num_mappings = 7; - return 0; - } - *num_mappings = 0; - maps[0].t = iot; /* config */ - maps[0].offset = 0; - maps[0].size = 8; - if ((iobase + 0x1800) > 0x0ffff) - return 1; - if (bus_space_map(maps[0].t, iobase + 0x1800, maps[0].size, 0, &maps[0].h)) - return 1; - (*num_mappings)++; - maps[1].t = iot; /* isac */ - maps[1].offset = 0; - maps[1].size = 0x80; /* XXX - ??? */ - if ((iobase + 0x1400 - 0x20) > 0x0ffff) - return 1; - if (bus_space_map(maps[1].t, iobase + 0x1400 - 0x20, maps[1].size, 0, &maps[1].h)) - return 1; - (*num_mappings)++; - maps[2].t = iot; /* hscx 0 */ - maps[2].offset = 0; - maps[2].size = 0x40; /* XXX - ??? */ - if ((iobase + 0x400 - 0x20) > 0x0ffff) - return 1; - if (bus_space_map(maps[2].t, iobase + 0x400 - 0x20, maps[2].size, 0, &maps[2].h)) - return 1; - (*num_mappings)++; - maps[3].t = iot; /* hscx 1 */ - maps[3].offset = 0; - maps[3].size = 0x40; /* XXX - ??? */ - if ((iobase + 0xc00 - 0x20) > 0x0ffff) - return 1; - if (bus_space_map(maps[3].t, iobase + 0xc00 - 0x20, maps[3].size, 0, &maps[3].h)) - return 1; - (*num_mappings)++; - maps[4].t = iot; /* isac-fifo */ - maps[4].offset = 0; - maps[4].size = 1; - if ((iobase + 0x1400 - 0x20 -0x3e0) > 0x0ffff) - return 1; - if (bus_space_map(maps[4].t, iobase + 0x1400 - 0x20 -0x3e0, maps[4].size, 0, &maps[4].h)) - return 1; - (*num_mappings)++; - maps[5].t = iot; /* hscx 0 fifo */ - maps[5].offset = 0; - maps[5].size = 1; - if ((iobase + 0x400 - 0x20 -0x3e0) > 0x0ffff) - return 1; - if (bus_space_map(maps[5].t, iobase + 0x400 - 0x20 -0x3e0, maps[5].size, 0, &maps[5].h)) - return 1; - (*num_mappings)++; - maps[6].t = iot; /* hscx 1 fifo */ - maps[6].offset = 0; - maps[6].size = 1; - if ((iobase + 0xc00 - 0x20 -0x3e0) > 0x0ffff) - return 1; - if (bus_space_map(maps[6].t, iobase + 0xc00 - 0x20 -0x3e0, maps[6].size, 0, &maps[6].h)) - return 1; - (*num_mappings)++; - break; - - case FLAG_USR_ISDN_TA_INT: - if (iobase == ISA_UNKNOWN_PORT) { - printf("isic: config error: no I/O base specified for USR Sportster TA intern!\n"); - return 1; - } - if (iosize) *iosize = 8; /* scattered ports, only some shown */ - if (msize) *msize = 0; /* no shared memory */ - - /* 49 io mappings: 1 config and 48x8 registers */ - if (maps == NULL) { - *num_mappings = 49; - return 0; - } - *num_mappings = 0; - { - int i, num; - bus_size_t base; - - /* config at offset 0x8000 */ - base = iobase + 0x8000; - maps[0].size = 1; - maps[0].t = iot; - maps[0].offset = 0; - if (base > 0x0ffff) - return 1; - if (bus_space_map(iot, base, 1, 0, &maps[0].h)) { - return 1; - } - *num_mappings = num = 1; - - /* HSCX A at offset 0 */ - base = iobase; - for (i = 0; i < 16; i++) { - maps[num].size = 8; - maps[num].offset = 0; - maps[num].t = iot; - if (base+i*1024+8 > 0x0ffff) - return 1; - if (bus_space_map(iot, base+i*1024, 8, 0, &maps[num].h)) { - return 1; - } - *num_mappings = ++num; - } - /* HSCX B at offset 0x4000 */ - base = iobase + 0x4000; - for (i = 0; i < 16; i++) { - maps[num].size = 8; - maps[num].offset = 0; - maps[num].t = iot; - if (base+i*1024+8 > 0x0ffff) - return 1; - if (bus_space_map(iot, base+i*1024, 8, 0, &maps[num].h)) { - return 1; - } - *num_mappings = ++num; - } - /* ISAC at offset 0xc000 */ - base = iobase + 0xc000; - for (i = 0; i < 16; i++) { - maps[num].size = 8; - maps[num].offset = 0; - maps[num].t = iot; - if (base+i*1024+8 > 0x0ffff) - return 1; - if (bus_space_map(iot, base+i*1024, 8, 0, &maps[num].h)) { - return 1; - } - *num_mappings = ++num; - } - } - break; - - case FLAG_ITK_IX1: - if (iobase == ISA_UNKNOWN_PORT) { - printf("isic: config error: no I/O base specified for ITK ix1 micro!\n"); - return 1; - } - if (iosize) *iosize = 4; - if (msize) *msize = 0; - if (maps == NULL) { - *num_mappings = 1; - return 0; - } - *num_mappings = 0; - maps[0].size = 4; - maps[0].t = iot; - maps[0].offset = 0; - if (bus_space_map(iot, iobase, 4, 0, &maps[0].h)) { - return 1; - } - *num_mappings = 1; - break; - - default: - printf("isic: config error: flags do not specify any known card!\n"); - return 1; - break; - } - - return 0; -} - -static void -args_unmap(int *num_mappings, struct isic_io_map *maps) -{ - int i, n; - for (i = 0, n = *num_mappings; i < n; i++) - if (maps[i].size) - bus_space_unmap(maps[i].t, maps[i].h, maps[i].size); - *num_mappings = 0; -} diff --git a/sys/dev/isa/isic_isa_avm_a1.c b/sys/dev/isa/isic_isa_avm_a1.c deleted file mode 100644 index 401e91f384c..00000000000 --- a/sys/dev/isa/isic_isa_avm_a1.c +++ /dev/null @@ -1,508 +0,0 @@ -/* - * Copyright (c) 1996 Andrew Gordon. All rights reserved. - * - * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * i4b_avm_a1.c - AVM A1/Fritz passive card driver for isdn4bsd - * ------------------------------------------------------------ - * - * $Id: isic_isa_avm_a1.c,v 1.10 2007/10/19 12:00:19 ad Exp $ - * - * last edit-date: [Fri Jan 5 11:37:22 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isa_avm_a1.c,v 1.10 2007/10/19 12:00:19 ad Exp $"); - -#include "opt_isicisa.h" -#ifdef ISICISA_AVM_A1 - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#endif - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#ifndef __FreeBSD__ -static u_int8_t avma1_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -static void avma1_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static void avma1_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void avma1_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size); -#endif - -/*---------------------------------------------------------------------------* - * AVM A1 and AVM Fritz! Card special registers - *---------------------------------------------------------------------------*/ - -#define AVM_CONF_REG 0x1800 /* base offset for config register */ -#define AVM_CONF_IRQ 0x1801 /* base offset for IRQ register */ - /* config register write */ -#define AVM_CONF_WR_RESET 0x01 /* 1 = RESET ISAC and HSCX */ -#define AVM_CONF_WR_CCL 0x02 /* 1 = clear counter low nibble */ -#define AVM_CONF_WR_CCH 0x04 /* 1 = clear counter high nibble */ -#define AVM_CONF_WR_IRQEN 0x08 /* 1 = enable IRQ */ -#define AVM_CONF_WR_TEST 0x10 /* test bit */ - /* config register read */ -#define AVM_CONF_RD_IIRQ 0x01 /* 0 = ISAC IRQ active */ -#define AVM_CONF_RD_HIRQ 0x02 /* 0 = HSCX IRQ active */ -#define AVM_CONF_RD_CIRQ 0x04 /* 0 = counter IRQ active */ -#define AVM_CONF_RD_ZER1 0x08 /* unused, always read 0 */ -#define AVM_CONF_RD_TEST 0x10 /* test bit read back */ -#define AVM_CONF_RD_ZER2 0x20 /* unused, always read 0 */ - -/*---------------------------------------------------------------------------* - * AVM read fifo routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -avma1_read_fifo(void *buf, const void *base, size_t len) -{ - insb((int)base - 0x3e0, (u_char *)buf, (u_int)len); -} -#else -static void -avma1_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[what+4].t; - bus_space_handle_t h = sc->sc_maps[what+4].h; - bus_space_read_multi_1(t, h, 0, buf, size); -} -#endif - -/*---------------------------------------------------------------------------* - * AVM write fifo routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -avma1_write_fifo(void *base, const void *buf, size_t len) -{ - outsb((int)base - 0x3e0, (u_char *)buf, (u_int)len); -} -#else -static void -avma1_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[what+4].t; - bus_space_handle_t h = sc->sc_maps[what+4].h; - bus_space_write_multi_1(t, h, 0, buf, size); -} -#endif - -/*---------------------------------------------------------------------------* - * AVM write register routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -avma1_write_reg(u_char *base, u_int offset, u_int v) -{ - outb((int)base + offset, (u_char)v); -} -#else -static void -avma1_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_space_write_1(t, h, offs, data); -} -#endif - -/*---------------------------------------------------------------------------* - * AVM read register routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static u_char -avma1_read_reg(u_char *base, u_int offset) -{ - return (inb((int)base + offset)); -} -#else -static u_int8_t -avma1_read_reg(struct isic_softc *sc, int what, bus_size_t offs) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - return bus_space_read_1(t, h, offs); -} -#endif - -/*---------------------------------------------------------------------------* - * isic_probe_avma1 - probe for AVM A1 and compatibles - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -int -isic_probe_avma1(struct isa_device *dev) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - u_char savebyte; - u_char byte; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for AVM A1/Fritz!\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* check IRQ validity */ - - switch(ffs(dev->id_irq)-1) - { - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - break; - - default: - printf("isic%d: Error, invalid IRQ [%d] specified for AVM A1/Fritz!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - break; - } - sc->sc_irq = dev->id_irq; - - /* check if memory addr specified */ - - if(dev->id_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for AVM A1/Fritz!\n", - dev->id_unit, (u_long)dev->id_maddr); - return(0); - } - - dev->id_msize = 0; - - /* check if we got an iobase */ - - switch(dev->id_iobase) - { - case 0x200: - case 0x240: - case 0x300: - case 0x340: - break; - - default: - printf("isic%d: Error, invalid iobase 0x%x specified for AVM A1/Fritz!\n", - dev->id_unit, dev->id_iobase); - return(0); - break; - } - sc->sc_port = dev->id_iobase; - - sc->clearirq = NULL; - sc->readreg = avma1_read_reg; - sc->writereg = avma1_write_reg; - - sc->readfifo = avma1_read_fifo; - sc->writefifo = avma1_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_AVMA1; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - - ISAC_BASE = (void *)dev->id_iobase + 0x1400 - 0x20; - - HSCX_A_BASE = (void *)dev->id_iobase + 0x400 - 0x20; - HSCX_B_BASE = (void *)dev->id_iobase + 0xc00 - 0x20; - - /* - * Read HSCX A/B VSTR. - * Expected value for AVM A1 is 0x04 or 0x05 and for the - * AVM Fritz!Card is 0x05 in the least significant bits. - */ - - if( (((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) && - ((HSCX_READ(0, H_VSTR) & 0xf) != 0x4)) || - (((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) && - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x4)) ) - { - printf("isic%d: HSCX VSTR test failed for AVM A1/Fritz\n", - dev->id_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - dev->id_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - dev->id_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - /* AVM A1 or Fritz! control register bits: */ - /* read write */ - /* 0x01 hscx irq* RESET */ - /* 0x02 isac irq* clear counter1 */ - /* 0x04 counter irq* clear counter2 */ - /* 0x08 always 0 irq enable */ - /* 0x10 read test bit set test bit */ - /* 0x20 always 0 unused */ - - /* - * XXX the following test may be destructive, to prevent the - * worst case, we save the byte first, and in case the test - * fails, we write back the saved byte ..... - */ - - savebyte = inb(dev->id_iobase + AVM_CONF_REG); - - /* write low to test bit */ - - outb(dev->id_iobase + AVM_CONF_REG, 0x00); - - /* test bit and next higher and lower bit must be 0 */ - - if((byte = inb(dev->id_iobase + AVM_CONF_REG) & 0x38) != 0x00) - { - printf("isic%d: Error, probe-1 failed, 0x%02x should be 0x00 for AVM A1/Fritz!\n", - dev->id_unit, byte); - outb(dev->id_iobase + AVM_CONF_REG, savebyte); - return (0); - } - - /* write high to test bit */ - - outb(dev->id_iobase + AVM_CONF_REG, 0x10); - - /* test bit must be high, next higher and lower bit must be 0 */ - - if((byte = inb(dev->id_iobase + AVM_CONF_REG) & 0x38) != 0x10) - { - printf("isic%d: Error, probe-2 failed, 0x%02x should be 0x10 for AVM A1/Fritz!\n", - dev->id_unit, byte); - outb(dev->id_iobase + AVM_CONF_REG, savebyte); - return (0); - } - - return (1); -} - -#else - -int -isic_probe_avma1(struct isic_attach_args *ia) -{ - u_int8_t savebyte, v1, v2; - - /* - * Read HSCX A/B VSTR. - * Expected value for AVM A1 is 0x04 or 0x05 and for the - * AVM Fritz!Card is 0x05 in the least significant bits. - */ - - v1 = bus_space_read_1(ia->ia_maps[ISIC_WHAT_HSCXA+1].t, ia->ia_maps[ISIC_WHAT_HSCXA+1].h, H_VSTR) & 0x0f; - v2 = bus_space_read_1(ia->ia_maps[ISIC_WHAT_HSCXB+1].t, ia->ia_maps[ISIC_WHAT_HSCXB+1].h, H_VSTR) & 0x0f; - if (v1 != v2 || (v1 != 0x05 && v1 != 0x04)) - return 0; - - /* AVM A1 or Fritz! control register bits: */ - /* read write */ - /* 0x01 hscx irq* RESET */ - /* 0x02 isac irq* clear counter1 */ - /* 0x04 counter irq* clear counter2 */ - /* 0x08 always 0 irq enable */ - /* 0x10 read test bit set test bit */ - /* 0x20 always 0 unused */ - - /* - * XXX the following test may be destructive, to prevent the - * worst case, we save the byte first, and in case the test - * fails, we write back the saved byte ..... - */ - - savebyte = bus_space_read_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0); - - /* write low to test bit */ - - bus_space_write_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0, 0); - - /* test bit and next higher and lower bit must be 0 */ - - if((bus_space_read_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0) & 0x38) != 0x00) - { - bus_space_write_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0, savebyte); - return 0; - } - - /* write high to test bit */ - - bus_space_write_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0, 0x10); - - /* test bit must be high, next higher and lower bit must be 0 */ - - if((bus_space_read_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0) & 0x38) != 0x10) - { - bus_space_write_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0, savebyte); - return 0; - } - - return (1); -} -#endif - -/*---------------------------------------------------------------------------* - * isic_attach_avma1 - attach AVM A1 and compatibles - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -int -isic_attach_avma1(struct isa_device *dev) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - - /* reset the HSCX and ISAC chips */ - - outb(dev->id_iobase + AVM_CONF_REG, 0x00); - DELAY(SEC_DELAY / 10); - - outb(dev->id_iobase + AVM_CONF_REG, AVM_CONF_WR_RESET); - DELAY(SEC_DELAY / 10); - - outb(dev->id_iobase + AVM_CONF_REG, 0x00); - DELAY(SEC_DELAY / 10); - - /* setup IRQ */ - - outb(dev->id_iobase + AVM_CONF_IRQ, (ffs(sc->sc_irq)) - 1); - DELAY(SEC_DELAY / 10); - - /* enable IRQ, disable counter IRQ */ - - outb(dev->id_iobase + AVM_CONF_REG, AVM_CONF_WR_IRQEN | - AVM_CONF_WR_CCH | AVM_CONF_WR_CCL); - DELAY(SEC_DELAY / 10); - - return (1); -} - -#else - -int -isic_attach_avma1(struct isic_softc *sc) -{ - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t h = sc->sc_maps[0].h; - - sc->clearirq = NULL; - sc->readreg = avma1_read_reg; - sc->writereg = avma1_write_reg; - - sc->readfifo = avma1_read_fifo; - sc->writefifo = avma1_write_fifo; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* reset the HSCX and ISAC chips */ - - bus_space_write_1(t, h, 0, 0x00); - DELAY(SEC_DELAY / 10); - - bus_space_write_1(t, h, 0, AVM_CONF_WR_RESET); - DELAY(SEC_DELAY / 10); - - bus_space_write_1(t, h, 0, 0x00); - DELAY(SEC_DELAY / 10); - - /* setup IRQ */ - - bus_space_write_1(t, h, 1, sc->sc_irq); - DELAY(SEC_DELAY / 10); - - /* enable IRQ, disable counter IRQ */ - - bus_space_write_1(t, h, 0, AVM_CONF_WR_IRQEN | - AVM_CONF_WR_CCH | AVM_CONF_WR_CCL); - DELAY(SEC_DELAY / 10); - - return (1); -} -#endif - -#endif /* ISICISA_AVM_A1 */ diff --git a/sys/dev/isa/isic_isa_itk_ix1.c b/sys/dev/isa/isic_isa_itk_ix1.c deleted file mode 100644 index 71faf4c29bb..00000000000 --- a/sys/dev/isa/isic_isa_itk_ix1.c +++ /dev/null @@ -1,494 +0,0 @@ -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann <martin@NetBSD.org>. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isa_itk_ix1.c,v 1.18 2012/10/27 17:18:25 chs Exp $"); - -#include "opt_isicisa.h" - -/* - * The ITK ix1 micro ISDN card is an ISA card with one region - * of four io ports mapped and a fixed irq all jumpered on the card. - * Access to the board is straight forward and simmilar to - * the ELSA and DYNALINK cards. If a PCI version of this card - * exists all we need is probably a pci-bus attachment, all - * this low level routines should work immediately. - * - * To reset the card: - * - write 0x01 to ITK_CONFIG - * - wait >= 10 ms - * - write 0x00 to ITK_CONFIG - * - * To read or write data: - * - write address to ITK_ALE port - * - read data from or write data to ITK_ISAC_DATA port or ITK_HSCX_DATA port - * The two HSCX channel registers are offset by HSCXA (0x00) and HSCXB (0x40). - * - * The probe routine was derived by trial and error from a representative - * sample of two cards ;-) The standard way (checking HSCX versions) - * was extended by reading a zero from a non existent HSCX register (register - * 0xff). Reading the config register gives varying results, so this doesn't - * seem to be used as an id register (like the Teles S0/16.3). - * - * If the probe fails for your card use "options ITK_PROBE_DEBUG" to get - * additional debug output. - * - */ - -#ifdef ISICISA_ITKIX1 - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#endif - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#include <netisdn/i4b_global.h> - -/* Register offsets */ -#define ITK_ISAC_DATA 0 -#define ITK_HSCX_DATA 1 -#define ITK_ALE 2 -#define ITK_CONFIG 3 - -/* Size of IO range to allocate for this card */ -#define ITK_IO_SIZE 4 - -/* Register offsets for the two HSCX channels */ -#define HSCXA 0 -#define HSCXB 0x40 - -/* - * Local function prototypes - */ -#ifdef __FreeBSD__ -/* FreeBSD version */ -static void itkix1_read_fifo(void *buf, const void *base, size_t len); -static void itkix1_write_fifo(void *base, const void *buf, size_t len); -static void itkix1_write_reg(u_char *base, u_int offset, u_int v); -static u_char itkix1_read_reg(u_char *base, u_int offset); -#else -/* NetBSD/OpenBSD version */ -static void itkix1_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void itkix1_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size); -static void itkix1_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static u_int8_t itkix1_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -#endif - -/* - * Probe for card - */ -#ifdef __FreeBSD__ -int -isic_probe_itkix1(struct isa_device *dev) -{ - u_int8_t hd, hv1, hv2, saveale; - int ret; - - /* save old value of this port, we're stomping over it */ - saveale = inb(dev->id_iobase + ITK_ALE); - - /* select invalid register */ - outb(dev->id_iobase + ITK_ALE, 0xff); - /* get HSCX data for this non existent register */ - hd = inb(dev->id_iobase + ITK_HSCX_DATA); - /* get HSCX version info */ - outb(dev->id_iobase + ITK_ALE, HSCXA + H_VSTR); - hv1 = inb(dev->id_iobase + ITK_HSCX_DATA); - outb(dev->id_iobase + ITK_ALE, HSCXB + H_VSTR); - hv2 = inb(dev->id_iobase + ITK_HSCX_DATA); - - /* succeed if version bits are OK and we got a zero from the - * non existent register. we found verison 0x05 and 0x04 - * out there... */ - ret = (hd == 0) - && (((hv1 & 0x0f) == 0x05) || ((hv1 & 0x0f) == 0x04)) - && (((hv2 & 0x0f) == 0x05) || ((hv2 & 0x0f) == 0x04)); - - /* retstore save value if we fail (if we succeed the old value - * has no meaning) */ - if (!ret) - outb(dev->id_iobase + ITK_ALE, saveale); - -#ifdef ITK_PROBE_DEBUG - printf("\nITK ix1 micro probe: hscx = 0x%02x, v1 = 0x%02x, v2 = 0x%02x, would have %s\n", - hd, hv1, hv2, ret ? "succeeded" : "failed"); - return 1; -#else - return ret; -#endif -} -#else -int -isic_probe_itkix1(struct isic_attach_args *ia) -{ - bus_space_tag_t t = ia->ia_maps[0].t; - bus_space_handle_t h = ia->ia_maps[0].h; - u_int8_t hd, hv1, hv2, saveale; - int ret; - - /* save old value of this port, we're stomping over it */ - saveale = bus_space_read_1(t, h, ITK_ALE); - - /* select invalid register */ - bus_space_write_1(t, h, ITK_ALE, 0xff); - /* get HSCX data for this non existent register */ - hd = bus_space_read_1(t, h, ITK_HSCX_DATA); - /* get HSCX version info */ - bus_space_write_1(t, h, ITK_ALE, HSCXA + H_VSTR); - hv1 = bus_space_read_1(t, h, ITK_HSCX_DATA); - bus_space_write_1(t, h, ITK_ALE, HSCXB + H_VSTR); - hv2 = bus_space_read_1(t, h, ITK_HSCX_DATA); - - ret = (hd == 0) && ((hv1 & 0x0f) == 0x05) && ((hv2 & 0x0f) == 0x05); - /* succeed if version bits are OK and we got a zero from the - * non existent register. we found verison 0x05 and 0x04 - * out there... */ - ret = (hd == 0) - && (((hv1 & 0x0f) == 0x05) || ((hv1 & 0x0f) == 0x04)) - && (((hv2 & 0x0f) == 0x05) || ((hv2 & 0x0f) == 0x04)); - - /* retstore save value if we fail (if we succeed the old value - * has no meaning) */ - if (!ret) - bus_space_write_1(t, h, ITK_ALE, saveale); - -#ifdef ITK_PROBE_DEBUG - printf("\nITK ix1 micro probe: hscx = 0x%02x, v1 = 0x%02x, v2 = 0x%02x, would have %s\n", - hd, hv1, hv2, ret ? "succeeded" : "failed"); - return 1; -#else - return ret; -#endif -} -#endif - -/* - * Attach card - */ -#ifdef __FreeBSD__ -int -isic_attach_itkix1(struct isa_device *dev) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - u_int8_t hv1, hv2; - - sc->sc_irq = dev->id_irq; - - dev->id_msize = 0; - - /* check if we got an iobase */ - sc->sc_port = dev->id_iobase; - - /* setup access routines */ - sc->clearirq = NULL; - sc->readreg = itkix1_read_reg; - sc->writereg = itkix1_write_reg; - sc->readfifo = itkix1_read_fifo; - sc->writefifo = itkix1_write_fifo; - - /* setup card type */ - sc->sc_cardtyp = CARD_TYPEP_ITKIX1; - - /* setup IOM bus type */ - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - ISAC_BASE = (void *) sc->sc_port; - HSCX_A_BASE = (void *) sc->sc_port + 1; - HSCX_B_BASE = (void *) sc->sc_port + 2; - - /* Read HSCX A/B VSTR. Expected value is 0x05 (V2.1) or 0x04 (V2.0). */ - hv1 = HSCX_READ(0, H_VSTR) & 0xf; - hv2 = HSCX_READ(1, H_VSTR) & 0xf; - if((hv1 != 0x05 && hv1 != 0x04) || (hv2 != 0x05 && hv2 != 0x04)) - { - printf("isic%d: HSCX VSTR test failed for ITK ix1 micro\n", - dev->id_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - dev->id_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - dev->id_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - outb((dev->id_iobase)+ITK_CONFIG, 1); - DELAY(SEC_DELAY / 10); - outb((dev->id_iobase)+ITK_CONFIG, 0); - DELAY(SEC_DELAY / 10); - return(1); -} - -#else - -int isic_attach_itkix1(struct isic_softc *sc) -{ - u_int8_t hv1, hv2; - - /* setup access routines */ - sc->clearirq = NULL; - sc->readreg = itkix1_read_reg; - sc->writereg = itkix1_write_reg; - sc->readfifo = itkix1_read_fifo; - sc->writefifo = itkix1_write_fifo; - - /* setup card type */ - sc->sc_cardtyp = CARD_TYPEP_ITKIX1; - - /* setup IOM bus type */ - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* Read HSCX A/B VSTR. Expected value is 0x05 (V2.1) or 0x04 (V2.0). */ - hv1 = HSCX_READ(0, H_VSTR) & 0xf; - hv2 = HSCX_READ(1, H_VSTR) & 0xf; - if((hv1 != 0x05 && hv1 != 0x04) || (hv2 != 0x05 && hv2 != 0x04)) - { - printf("%s: HSCX VSTR test failed for ITK ix1 micro\n", - device_xname(sc->sc_dev)); - printf("%s: HSC0: VSTR: %#x\n", - device_xname(sc->sc_dev), HSCX_READ(0, H_VSTR)); - printf("%s: HSC1: VSTR: %#x\n", - device_xname(sc->sc_dev), HSCX_READ(1, H_VSTR)); - return 0; - } - - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ITK_CONFIG, 1); - DELAY(SEC_DELAY / 10); - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ITK_CONFIG, 0); - DELAY(SEC_DELAY / 10); - return 1; -} - -#endif - -#ifdef __FreeBSD__ -static void -itkix1_read_fifo(void *buf, const void *base, size_t len) -{ - u_int port = (u_int)base & ~0x0003; - switch ((u_int)base & 3) { - case 0: /* ISAC */ - outb(port+ITK_ALE, 0); - insb(port+ITK_ISAC_DATA, (u_char *)buf, (u_int)len); - break; - case 1: /* HSCXA */ - outb(port+ITK_ALE, HSCXA); - insb(port+ITK_HSCX_DATA, (u_char *)buf, (u_int)len); - break; - case 2: /* HSCXB */ - outb(port+ITK_ALE, HSCXB); - insb(port+ITK_HSCX_DATA, (u_char *)buf, (u_int)len); - break; - } -} -#else -static void -itkix1_read_fifo(struct isic_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, ITK_ALE, 0); - bus_space_read_multi_1(t, h, ITK_ISAC_DATA, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ITK_ALE, HSCXA); - bus_space_read_multi_1(t, h, ITK_HSCX_DATA, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ITK_ALE, HSCXB); - bus_space_read_multi_1(t, h, ITK_HSCX_DATA, buf, size); - break; - } -} -#endif - -#ifdef __FreeBSD__ -static void -itkix1_write_fifo(void *base, const void *buf, size_t len) -{ - u_int port = (u_int)base & ~0x0003; - switch ((u_int)base & 3) { - case 0: /* ISAC */ - outb(port+ITK_ALE, 0); - outsb(port+ITK_ISAC_DATA, (u_char *)buf, (u_int)len); - break; - case 1: /* HSCXA */ - outb(port+ITK_ALE, HSCXA); - outsb(port+ITK_HSCX_DATA, (u_char *)buf, (u_int)len); - break; - case 2: /* HSCXB */ - outb(port+ITK_ALE, HSCXB); - outsb(port+ITK_HSCX_DATA, (u_char *)buf, (u_int)len); - break; - } -} -#else -static void itkix1_write_fifo(struct isic_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, ITK_ALE, 0); - bus_space_write_multi_1(t, h, ITK_ISAC_DATA, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ITK_ALE, HSCXA); - bus_space_write_multi_1(t, h, ITK_HSCX_DATA, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ITK_ALE, HSCXB); - bus_space_write_multi_1(t, h, ITK_HSCX_DATA, buf, size); - break; - } -} -#endif - -#ifdef __FreeBSD__ -static void -itkix1_write_reg(u_char *base, u_int offset, u_int v) -{ - u_int port = (u_int)base & ~0x0003; - switch ((u_int)base & 3) { - case 0: /* ISAC */ - outb(port+ITK_ALE, offset); - outb(port+ITK_ISAC_DATA, (u_char)v); - break; - case 1: /* HSCXA */ - outb(port+ITK_ALE, HSCXA+offset); - outb(port+ITK_HSCX_DATA, (u_char)v); - break; - case 2: /* HSCXB */ - outb(port+ITK_ALE, HSCXB+offset); - outb(port+ITK_HSCX_DATA, (u_char)v); - break; - } -} -#else -static void itkix1_write_reg(struct isic_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, ITK_ALE, offs); - bus_space_write_1(t, h, ITK_ISAC_DATA, data); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ITK_ALE, HSCXA+offs); - bus_space_write_1(t, h, ITK_HSCX_DATA, data); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ITK_ALE, HSCXB+offs); - bus_space_write_1(t, h, ITK_HSCX_DATA, data); - break; - } -} -#endif - -#ifdef __FreeBSD__ -static u_char -itkix1_read_reg(u_char *base, u_int offset) -{ - u_int port = (u_int)base & ~0x0003; - switch ((u_int)base & 3) { - case 0: /* ISAC */ - outb(port+ITK_ALE, offset); - return (inb(port+ITK_ISAC_DATA)); - case 1: /* HSCXA */ - outb(port+ITK_ALE, HSCXA+offset); - return (inb(port+ITK_HSCX_DATA)); - case 2: /* HSCXB */ - outb(port+ITK_ALE, HSCXB+offset); - return (inb(port+ITK_HSCX_DATA)); - } -} -#else -static u_int8_t itkix1_read_reg(struct isic_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, ITK_ALE, offs); - return bus_space_read_1(t, h, ITK_ISAC_DATA); - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ITK_ALE, HSCXA+offs); - return bus_space_read_1(t, h, ITK_HSCX_DATA); - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ITK_ALE, HSCXB+offs); - return bus_space_read_1(t, h, ITK_HSCX_DATA); - } - return 0; -} -#endif - -#endif /* ISICISA_ITKIX1 */ diff --git a/sys/dev/isa/isic_isa_tel_s016.c b/sys/dev/isa/isic_isa_tel_s016.c deleted file mode 100644 index 438eb54bad4..00000000000 --- a/sys/dev/isa/isic_isa_tel_s016.c +++ /dev/null @@ -1,459 +0,0 @@ -/* - * Copyright (c) 1996 Arne Helme. All rights reserved. - * - * Copyright (c) 1996 Gary Jennejohn. All rights reserved. - * - * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * isic - I4B Siemens ISDN Chipset Driver for Teles S0/16 and clones - * ================================================================= - * - * $Id: isic_isa_tel_s016.c,v 1.9 2007/10/19 12:00:19 ad Exp $ - * - * last edit-date: [Fri Jan 5 11:37:22 2001] - * - * -hm clean up - * -hm checked with a Creatix ISDN-S0 (PCB version: mp 130.1) - * -hm more cleanup - * -hm NetBSD patches from Martin - * -hm converting asm -> C - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isa_tel_s016.c,v 1.9 2007/10/19 12:00:19 ad Exp $"); - -#include "opt_isicisa.h" -#ifdef ISICISA_TEL_S0_16 - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <machine/md_var.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#endif - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -static u_char intr_no[] = { 1, 1, 0, 2, 4, 6, 1, 1, 1, 0, 8, 10, 12, 1, 1, 14 }; - -#ifndef __FreeBSD__ -static u_int8_t tels016_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -static void tels016_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static void tels016_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void tels016_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size); -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/16 write register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -tels016_write_reg(u_char *base, u_int i, u_int v) -{ - if(i & 0x01) - i |= 0x200; - base[i] = v; -} - -#else - -static const bus_size_t offset[] = { 0x100, 0x180, 0x1c0 }; - -static void -tels016_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data) -{ - bus_space_tag_t t = sc->sc_maps[1].t; - bus_space_handle_t h = sc->sc_maps[1].h; - - offs += offset[what]; - if (offs & 0x01) - offs |= 0x200; - - bus_space_write_1(t, h, offs, data); -} -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/16 read register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static u_char -tels016_read_reg(u_char *base, u_int i) -{ - if(i & 0x1) - i |= 0x200; - return(base[i]); -} - -#else - -static u_int8_t -tels016_read_reg(struct isic_softc *sc, int what, bus_size_t offs) -{ - bus_space_tag_t t = sc->sc_maps[1].t; - bus_space_handle_t h = sc->sc_maps[1].h; - - offs += offset[what]; - - if(offs & 0x01) - offs |= 0x200; - - return bus_space_read_1(t, h, offs); -} -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/16 fifo read/write routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -tels016_memcpyb(void *to, const void *from, size_t len) -{ - for(;len > 0; len--) - *((unsigned char *)to)++ = *((unsigned char *)from)++; -} - -#else - -static void -tels016_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[1].t; - bus_space_handle_t h = sc->sc_maps[1].h; - bus_space_write_region_1(t, h, offset[what], data, size); -} - -static void -tels016_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[1].t; - bus_space_handle_t h = sc->sc_maps[1].h; - bus_space_read_region_1(t, h, offset[what], buf, size); -} -#endif - -/*---------------------------------------------------------------------------* - * isic_probe_s016 - probe for Teles S0/16 and compatibles - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -int -isic_probe_s016(struct isa_device *dev) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - u_char byte; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Teles S0/16!\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* check IRQ validity */ - - if((intr_no[ffs(dev->id_irq) - 1]) == 1) - { - printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/16!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - } - sc->sc_irq = dev->id_irq; - - /* check if we got an iobase */ - - switch(dev->id_iobase) - { - case 0xd80: - case 0xe80: - case 0xf80: - break; - - default: - printf("isic%d: Error, invalid iobase 0x%x specified for Teles S0/16!\n", - dev->id_unit, dev->id_iobase); - return(0); - break; - } - sc->sc_port = dev->id_iobase; - - /* check if valid memory addr */ - - switch((unsigned int)kvtop(dev->id_maddr)) - { - case 0xc0000: - case 0xc2000: - case 0xc4000: - case 0xc6000: - case 0xc8000: - case 0xca000: - case 0xcc000: - case 0xce000: - case 0xd0000: - case 0xd2000: - case 0xd4000: - case 0xd6000: - case 0xd8000: - case 0xda000: - case 0xdc000: - case 0xde000: - break; - - default: - printf("isic%d: Error, invalid mem addr 0x%lx for Teles S0/16!\n", - dev->id_unit, kvtop(dev->id_maddr)); - return(0); - break; - } - sc->sc_vmem_addr = (void *) dev->id_maddr; - dev->id_msize = 0x1000; - - /* check card signature */ - - if((byte = inb(sc->sc_port)) != 0x51) - { - printf("isic%d: Error, signature 1 0x%x != 0x51 for Teles S0/16!\n", - dev->id_unit, byte); - return(0); - } - - if((byte = inb(sc->sc_port + 1)) != 0x93) - { - printf("isic%d: Error, signature 2 0x%x != 0x93 for Teles S0/16!\n", - dev->id_unit, byte); - return(0); - } - - byte = inb(sc->sc_port + 2); - - if((byte != 0x1e) && (byte != 0x1f)) - { - printf("isic%d: Error, signature 3 0x%x != 0x1e or 0x1f for Teles S0/16!\n", - dev->id_unit, byte); - return(0); - } - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = tels016_read_reg; - sc->writereg = tels016_write_reg; - - sc->readfifo = tels016_memcpyb; - sc->writefifo = tels016_memcpyb; - - /* setup card type */ - - sc->sc_cardtyp= CARD_TYPEP_16; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM1; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC base addr */ - - ISAC_BASE = (void *) ((dev->id_maddr) + 0x100); - - /* setup HSCX base addr */ - - HSCX_A_BASE = (void *) ((dev->id_maddr) + 0x180); - HSCX_B_BASE = (void *) ((dev->id_maddr) + 0x1c0); - - return (1); -} - -#else - -int -isic_probe_s016(struct isic_attach_args *ia) -{ - bus_space_tag_t t = ia->ia_maps[0].t; - bus_space_handle_t h = ia->ia_maps[0].h; - u_int8_t b0, b1, b2; - - b0 = bus_space_read_1(t, h, 0); - b1 = bus_space_read_1(t, h, 1); - b2 = bus_space_read_1(t, h, 2); - - if (b0 == 0x51 && b1 == 0x93 && (b2 == 0x1e || b2 == 0x1f)) - return 1; - - return 0; -} -#endif - -/*---------------------------------------------------------------------------* - * isic_attach_s016 - attach Teles S0/16 and compatibles - *---------------------------------------------------------------------------*/ -int -#ifdef __FreeBSD__ -isic_attach_s016(struct isa_device *dev) -#else -isic_attach_s016(struct isic_softc *sc) -#endif -{ - -#ifdef __FreeBSD__ - struct isic_softc *sc = &l1_sc[dev->id_unit]; -#endif - - u_long irq; - -#ifndef __FreeBSD__ - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = tels016_read_reg; - sc->writereg = tels016_write_reg; - - sc->readfifo = tels016_read_fifo; - sc->writefifo = tels016_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp= CARD_TYPEP_16; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM1; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - -#endif - -#ifdef __FreeBSD__ - if((irq = intr_no[ffs(dev->id_irq) - 1]) == 1) - { - printf("isic%d: Attach error, invalid IRQ [%d] specified for Teles S0/16!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - } -#else - irq = intr_no[sc->sc_irq]; -#endif - - /* configure IRQ */ - -#ifdef __FreeBSD__ - irq |= ((u_long) sc->sc_vmem_addr) >> 9; - - DELAY(SEC_DELAY / 10); - outb(sc->sc_port + 4, irq); - - DELAY(SEC_DELAY / 10); - outb(sc->sc_port + 4, irq | 0x01); - - DELAY(SEC_DELAY / 5); - - /* set card bit off */ - - sc->sc_vmem_addr[0x80] = 0; - DELAY(SEC_DELAY / 5); - - /* set card bit on */ - - sc->sc_vmem_addr[0x80] = 1; - DELAY(SEC_DELAY / 5); - -#else - - irq |= ((sc->sc_maddr >> 9) & 0x000000f0); - - DELAY(SEC_DELAY / 10); - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, 4, irq); - - DELAY(SEC_DELAY / 10); - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, 4, irq | 0x01); - - DELAY(SEC_DELAY / 5); - - /* set card bit off */ - - bus_space_write_1(sc->sc_maps[1].t, sc->sc_maps[1].h, 0x80, 0); - DELAY(SEC_DELAY / 5); - - /* set card bit on */ - - bus_space_write_1(sc->sc_maps[1].t, sc->sc_maps[1].h, 0x80, 1); - DELAY(SEC_DELAY / 5); -#endif - - return (1); -} - -#endif /* ISICISA_TEL_S0_16 */ - diff --git a/sys/dev/isa/isic_isa_tel_s0163.c b/sys/dev/isa/isic_isa_tel_s0163.c deleted file mode 100644 index e44686f865b..00000000000 --- a/sys/dev/isa/isic_isa_tel_s0163.c +++ /dev/null @@ -1,607 +0,0 @@ -/* - * Copyright (c) 1996 Arne Helme. All rights reserved. - * - * Copyright (c) 1996 Gary Jennejohn. All rights reserved. - * - * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * isic - I4B Siemens ISDN Chipset Driver for Teles S0/16.3 - * ======================================================== - * - * $Id: isic_isa_tel_s0163.c,v 1.13 2012/10/27 17:18:25 chs Exp $ - * - * last edit-date: [Fri Jan 5 11:37:22 2001] - * - * -hm clean up - * -hm more cleanup - * -hm NetBSD patches from Martin - * -hm VSTR detection for older 16.3 cards - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isa_tel_s0163.c,v 1.13 2012/10/27 17:18:25 chs Exp $"); - -#include "opt_isicisa.h" -#ifdef ISICISA_TEL_S0_16_3 - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#elif defined(__bsdi__) - /* XXX */ -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#endif - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -static u_char intr_no[] = { 1, 1, 0, 2, 4, 6, 1, 1, 1, 0, 8, 10, 12, 1, 1, 14 }; - -#if !defined(__FreeBSD__) && !defined(__bsdi__) -static u_int8_t tels0163_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -static void tels0163_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static void tels0163_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void tels0163_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size); -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/16.3 read fifo routine - *---------------------------------------------------------------------------*/ -#if defined(__FreeBSD__) || defined(__bsdi__) - -static void -tels0163_read_fifo(void *buf, const void *base, size_t len) -{ - insb((int)base + 0x3e, (u_char *)buf, (u_int)len); -} - -#else - -static void -tels0163_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - bus_space_read_multi_1(t, h, o + 0x1e, buf, size); -} - -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/16.3 write fifo routine - *---------------------------------------------------------------------------*/ -#if defined(__FreeBSD__) || defined(__bsdi__) - -static void -tels0163_write_fifo(void *base, const void *buf, size_t len) -{ - outsb((int)base + 0x3e, (u_char *)buf, (u_int)len); -} - -#else - -static void -tels0163_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - bus_space_write_multi_1(t, h, o + 0x1e, buf, size); -} -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/16.3 ISAC put register routine - *---------------------------------------------------------------------------*/ -#if defined(__FreeBSD__) || defined(__bsdi__) - -static void -tels0163_write_reg(u_char *base, u_int offset, u_int v) -{ - outb((int)base + offset, (u_char)v); -} - -#else - -static void -tels0163_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - bus_space_write_1(t, h, o + offs - 0x20, data); -} -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/16.3 ISAC get register routine - *---------------------------------------------------------------------------*/ -#if defined(__FreeBSD__) || defined(__bsdi__) - -static u_char -tels0163_read_reg(u_char *base, u_int offset) -{ - return (inb((int)base + offset)); -} - -#else - -static u_int8_t -tels0163_read_reg(struct isic_softc *sc, int what, bus_size_t offs) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - return bus_space_read_1(t, h, o + offs - 0x20); -} - -#endif - -/*---------------------------------------------------------------------------* - * isic_probe_s0163 - probe for Teles S0/16.3 and compatibles - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -int -isic_probe_s0163(struct isa_device *dev) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - u_char byte; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Teles S0/16.3!\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* check IRQ validity */ - - if((intr_no[ffs(dev->id_irq) - 1]) == 1) - { - printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/16.3!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - } - sc->sc_irq = dev->id_irq; - - /* check if memory addr specified */ - - if(dev->id_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for Teles S0/16.3!\n", - dev->id_unit, (u_long)dev->id_maddr); - return(0); - } - - dev->id_msize = 0; - - /* check if we got an iobase */ - - switch(dev->id_iobase) - { - case 0xd80: - case 0xe80: - case 0xf80: - break; - - default: - printf("isic%d: Error, invalid iobase 0x%x specified for Teles S0/16.3!\n", - dev->id_unit, dev->id_iobase); - return(0); - break; - } - sc->sc_port = dev->id_iobase; - - if(((byte = inb(sc->sc_port)) != 0x51) && (byte != 0x10)) - { - printf("isic%d: Error, signature 1 0x%x != 0x51 or 0x10 for Teles S0/16.3!\n", - dev->id_unit, byte); - return(0); - } - - if((byte = inb(sc->sc_port + 1)) != 0x93) - { - printf("isic%d: Error, signature 2 0x%x != 0x93 for Teles S0/16.3!\n", - dev->id_unit, byte); - return(0); - } - - if(((byte = inb(sc->sc_port + 2)) != 0x1c) && (byte != 0x1f)) - { - printf("isic%d: Error, signature 3 0x%x != (0x1c||0x1f) for Teles S0/16.3!\n", - dev->id_unit, byte); - return(0); - } - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = tels0163_read_reg; - sc->writereg = tels0163_write_reg; - - sc->readfifo = tels0163_read_fifo; - sc->writefifo = tels0163_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp= CARD_TYPEP_16_3; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - - switch(dev->id_iobase) - { - case 0xd80: - ISAC_BASE = (void *) 0x960; - HSCX_A_BASE = (void *) 0x160; - HSCX_B_BASE = (void *) 0x560; - break; - - case 0xe80: - ISAC_BASE = (void *) 0xa60; - HSCX_A_BASE = (void *) 0x260; - HSCX_B_BASE = (void *) 0x660; - break; - - case 0xf80: - ISAC_BASE = (void *) 0xb60; - HSCX_A_BASE = (void *) 0x360; - HSCX_B_BASE = (void *) 0x760; - break; - } - - /* - * Read HSCX A/B VSTR. Expected value for the S0/16.3 card is - * 0x05 or 0x04 (for older 16.3's) in the least significant bits. - */ - - if( (((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) && - ((HSCX_READ(0, H_VSTR) & 0xf) != 0x4)) || - (((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) && - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x4)) ) - { - printf("isic%d: HSCX VSTR test failed for Teles S0/16.3\n", - dev->id_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - dev->id_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - dev->id_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - return (1); -} - -#elif defined(__bsdi__) - -static int -set_softc(struct isic_softc *sc, struct isa_attach_args *ia, int unit) -{ - sc->sc_irq = ia->ia_irq; - - /* check if we got an iobase */ - - switch(ia->ia_iobase) - { - case 0xd80: - case 0xe80: - case 0xf80: - break; - - default: - printf("isic%d: Error, invalid iobase 0x%x specified for Teles S0/16.3!\n", - unit, ia->ia_iobase); - return(0); - break; - } - sc->sc_port = ia->ia_iobase; - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = tels0163_read_reg; - sc->writereg = tels0163_write_reg; - - sc->readfifo = tels0163_read_fifo; - sc->writefifo = tels0163_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp= CARD_TYPEP_16_3; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - - switch(ia->ia_iobase) - { - case 0xd80: - ISAC_BASE = (void *) 0x960; - HSCX_A_BASE = (void *) 0x160; - HSCX_B_BASE = (void *) 0x560; - break; - - case 0xe80: - ISAC_BASE = (void *) 0xa60; - HSCX_A_BASE = (void *) 0x260; - HSCX_B_BASE = (void *) 0x660; - break; - - case 0xf80: - ISAC_BASE = (void *) 0xb60; - HSCX_A_BASE = (void *) 0x360; - HSCX_B_BASE = (void *) 0x760; - break; - } - return 1; -} - -int -isic_probe_s0163(device_t dev, cfdata_t cf, - struct isa_attach_args *ia) -{ - u_char byte; - struct isic_softc dummysc, *sc = &dummysc; - - if((intr_no[ffs(ia->ia_irq) - 1]) == 1) - { - printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/16.3!\n", - cf->cf_unit, ffs(ia->ia_irq)-1); - return(0); - } - - /* check if memory addr specified */ - - if(ia->ia_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for Teles S0/16.3!\n", - cf->cf_unit, (u_long)ia->ia_maddr); - return 0; - } - - /* Set up a temporary softc for the probe */ - - if (set_softc(sc, ia, cf->cf_unit) == 0) - return 0; - - if((byte = inb(sc->sc_port)) != 0x51) - { - printf("isic%d: Error, signature 1 0x%x != 0x51 for Teles S0/16.3!\n", - cf->cf_unit, byte); - return(0); - } - - if((byte = inb(sc->sc_port + 1)) != 0x93) - { - printf("isic%d: Error, signature 2 0x%x != 0x93 for Teles S0/16.3!\n", - cf->cf_unit, byte); - return(0); - } - - if(((byte = inb(sc->sc_port + 2)) != 0x1c) && (byte != 0x1f)) - { - printf("isic%d: Error, signature 3 0x%x != (0x1c||0x1f) for Teles S0/16.3!\n", - cf->cf_unit, byte); - return(0); - } - - /* - * Read HSCX A/B VSTR. Expected value for the S0/16.3 card is - * 0x05 or 0x04 (for older 16.3's) in the least significant bits. - */ - - if( (((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) && - ((HSCX_READ(0, H_VSTR) & 0xf) != 0x4)) || - (((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) && - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x4)) ) - { - printf("isic%d: HSCX VSTR test failed for Teles S0/16.3\n", - cf->cf_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - cf->cf_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - cf->cf_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - return (1); -} - - -#else - -int -isic_probe_s0163(struct isic_attach_args *ia) -{ - bus_space_tag_t t = ia->ia_maps[0].t; - bus_space_handle_t h = ia->ia_maps[0].h; - u_int8_t b0, b1, b2; - - b0 = bus_space_read_1(t, h, 0); - b1 = bus_space_read_1(t, h, 1); - b2 = bus_space_read_1(t, h, 2); - - if (b0 == 0x51 && b1 == 0x93 && (b2 == 0x1c || b2 == 0x1f)) - return 1; - - return 0; -} -#endif - -/*---------------------------------------------------------------------------* - * isic_attach_s0163 - attach Teles S0/16.3 and compatibles - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -int -isic_attach_s0163(struct isa_device *dev) -{ - u_char irq; - - if((irq = intr_no[ffs(dev->id_irq) - 1]) == 1) - { - printf("isic%d: Attach error, invalid IRQ [%d] specified for Teles S0/16.3!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - } - - /* configure IRQ */ - - DELAY(SEC_DELAY / 10); - outb(dev->id_iobase + 4, irq); - - DELAY(SEC_DELAY / 10); - outb(dev->id_iobase + 4, irq | 0x01); - - return (1); -} - -#elif defined(__bsdi__) - -extern int -isic_attach_s0163(device_t parent, device_t self, struct isa_attach_args *ia) -{ - u_char irq; - struct isic_softc *sc = device_private(self); - int unit = sc->sc_dev.dv_unit; - - /* Commit the probed attachement values */ - - if (set_softc(sc, ia, unit) == 0) - panic("isic_attach_s0163: set_softc"); - - if (((unsigned)sc->sc_unit) >= NISIC) - panic("attach isic%d; NISIC=%d", sc->sc_unit, NISIC); - l1_sc[sc->sc_unit] = sc; - irq = intr_no[ffs(sc->sc_irq) - 1]; - /* configure IRQ */ - - DELAY(SEC_DELAY / 10); - outb(sc->sc_port + 4, irq); - - DELAY(SEC_DELAY / 10); - outb(sc->sc_port + 4, irq | 0x01); - - return 1; -} -#else - -int -isic_attach_s0163(struct isic_softc *sc) -{ - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t h = sc->sc_maps[0].h; - u_int8_t irq = intr_no[sc->sc_irq]; - - /* configure IRQ */ - - DELAY(SEC_DELAY / 10); - bus_space_write_1(t, h, 4, irq); - - DELAY(SEC_DELAY / 10); - bus_space_write_1(t, h, 4, irq | 0x01); - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = tels0163_read_reg; - sc->writereg = tels0163_write_reg; - - sc->readfifo = tels0163_read_fifo; - sc->writefifo = tels0163_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp= CARD_TYPEP_16_3; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - return (1); -} -#endif - -#endif /* ISICISA_TEL_S0_16_3 */ - diff --git a/sys/dev/isa/isic_isa_tel_s08.c b/sys/dev/isa/isic_isa_tel_s08.c deleted file mode 100644 index 48975e445fa..00000000000 --- a/sys/dev/isa/isic_isa_tel_s08.c +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright (c) 1996 Arne Helme. All rights reserved. - * - * Copyright (c) 1996 Gary Jennejohn. All rights reserved. - * - * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * isic - I4B Siemens ISDN Chipset Driver for Teles S0/8 and clones - * ================================================================ - * - * $Id: isic_isa_tel_s08.c,v 1.9 2007/10/19 12:00:19 ad Exp $ - * - * last edit-date: [Fri Jan 5 11:37:22 2001] - * - * -hm clean up - * -hm more cleanup - * -hm NetBSD patches from Martin - * -hm making it finally work (checked with board revision 1.2) - * -hm converting asm -> C - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isa_tel_s08.c,v 1.9 2007/10/19 12:00:19 ad Exp $"); - -#include "opt_isicisa.h" -#ifdef ISICISA_TEL_S0_8 - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <machine/md_var.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#endif - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#ifndef __FreeBSD__ -static u_int8_t tels08_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -static void tels08_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static void tels08_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size); -static void tels08_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/8 write register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -tels08_write_reg(u_char *base, u_int i, u_int v) -{ - if(i & 0x01) - i |= 0x200; - base[i] = v; -} - -#else - -static const bus_size_t offset[] = { 0x100, 0x180, 0x1c0 }; - -static void -tels08_write_reg(struct isic_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; - - offs += offset[what]; - - if (offs & 0x01) - offs |= 0x200; - - bus_space_write_1(t, h, offs, data); -} -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/8 read register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static u_char -tels08_read_reg(u_char *base, u_int i) -{ - if(i & 0x1) - i |= 0x200; - return(base[i]); -} - -#else - -static u_int8_t -tels08_read_reg(struct isic_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; - - offs += offset[what]; - - if (offs & 0x01) - offs |= 0x200; - - return bus_space_read_1(t, h, offs); -} -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/8 fifo read/write access - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -tels08_memcpyb(void *to, const void *from, size_t len) -{ - for(;len > 0; len--) - *((unsigned char *)to)++ = *((unsigned char *)from)++; -} - -#else - -static void -tels08_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t h = sc->sc_maps[0].h; - bus_space_write_region_1(t, h, offset[what], data, size); -} - -static void -tels08_read_fifo(struct isic_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; - bus_space_read_region_1(t, h, offset[what], buf, size); -} -#endif - -/*---------------------------------------------------------------------------* - * isic_probe_s08 - probe for Teles S0/8 and compatibles - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -int -isic_probe_s08(struct isa_device *dev) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Teles S0/8!\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* check IRQ validity */ - - switch(ffs(dev->id_irq)-1) - { - case 2: - case 9: /* XXX */ - case 3: - case 4: - case 5: - case 6: - case 7: - break; - - default: - printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/8!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - break; - } - sc->sc_irq = dev->id_irq; - - /* check if we got an iobase */ - - if(dev->id_iobase > 0) - { - printf("isic%d: Error, iobase specified for Teles S0/8!\n", - dev->id_unit); - return(0); - } - - /* check if inside memory range of 0xA0000 .. 0xDF000 */ - - if( (kvtop(dev->id_maddr) < 0xa0000) || - (kvtop(dev->id_maddr) > 0xdf000) ) - { - printf("isic%d: Error, mem addr 0x%lx outside 0xA0000-0xDF000 for Teles S0/8!\n", - dev->id_unit, kvtop(dev->id_maddr)); - return(0); - } - - sc->sc_vmem_addr = (void *) dev->id_maddr; - dev->id_msize = 0x1000; - - /* setup ISAC access routines */ - - sc->clearirq = NULL; - sc->readreg = tels08_read_reg; - sc->writereg = tels08_write_reg; - - sc->readfifo = tels08_memcpyb; - sc->writefifo = tels08_memcpyb; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_8; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM1; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC base addr */ - - ISAC_BASE = (void *)((dev->id_maddr) + 0x100); - - /* setup HSCX base addr */ - - HSCX_A_BASE = (void *)((dev->id_maddr) + 0x180); - HSCX_B_BASE = (void *)((dev->id_maddr) + 0x1c0); - - return (1); -} - -#else - -int -isic_probe_s08(struct isic_attach_args *ia) -{ - /* no real sensible probe is easy - write to fifo memory - and read back to verify there is memory doesn't work, - because you talk to tx fifo and rcv fifo. So, just check - HSCX version, which at least fails if no card present - at the given location. */ - bus_space_tag_t t = ia->ia_maps[0].t; - bus_space_handle_t h = ia->ia_maps[0].h; - u_int8_t v1, v2; - - /* HSCX A VSTR */ - v1 = bus_space_read_1(t, h, offset[1] + H_VSTR) & 0x0f; - if (v1 != HSCX_VA1 && v1 != HSCX_VA2 && v1 != HSCX_VA3 && v1 != HSCX_V21) - return 0; - - /* HSCX B VSTR */ - v2 = bus_space_read_1(t, h, offset[2] + H_VSTR) & 0x0f; - if (v2 != HSCX_VA1 && v2 != HSCX_VA2 && v2 != HSCX_VA3 && v2 != HSCX_V21) - return 0; - - /* both HSCX channels should have the same version... */ - if (v1 != v2) - return 0; - - return 1; -} -#endif - -/*---------------------------------------------------------------------------* - * isic_attach_s08 - attach Teles S0/8 and compatibles - *---------------------------------------------------------------------------*/ -int -#ifdef __FreeBSD__ -isic_attach_s08(struct isa_device *dev) -#else -isic_attach_s08(struct isic_softc *sc) -#endif -{ -#ifdef __FreeBSD__ - struct isic_softc *sc = &l1_sc[dev->id_unit]; -#else - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t h = sc->sc_maps[0].h; -#endif - - /* set card off */ - -#ifdef __FreeBSD__ - sc->sc_vmem_addr[0x80] = 0; -#else - bus_space_write_1(t, h, 0x80, 0); -#endif - - DELAY(SEC_DELAY / 5); - - /* set card on */ - -#ifdef __FreeBSD__ - sc->sc_vmem_addr[0x80] = 1; -#else - bus_space_write_1(t, h, 0x80, 1); -#endif - - DELAY(SEC_DELAY / 5); - -#ifndef __FreeBSD__ - - /* setup ISAC access routines */ - - sc->clearirq = NULL; - sc->readreg = tels08_read_reg; - sc->writereg = tels08_write_reg; - sc->readfifo = tels08_read_fifo; - sc->writefifo = tels08_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_8; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM1; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - -#endif - - return (1); -} - -#endif /* ISICISA_TEL_S0_8 */ - diff --git a/sys/dev/isa/isic_isa_usr_sti.c b/sys/dev/isa/isic_isa_usr_sti.c deleted file mode 100644 index da32681b3cc..00000000000 --- a/sys/dev/isa/isic_isa_usr_sti.c +++ /dev/null @@ -1,445 +0,0 @@ -/* - * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * i4b_usr_sti.c - USRobotics Sportster ISDN TA intern (Tina-pp) - * ------------------------------------------------------------- - * - * $Id: isic_isa_usr_sti.c,v 1.8 2007/10/19 12:00:20 ad Exp $ - * - * last edit-date: [Fri Jan 5 11:37:22 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isa_usr_sti.c,v 1.8 2007/10/19 12:00:20 ad Exp $"); - -#include "opt_isicisa.h" -#ifdef ISICISA_USR_STI - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#endif - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#include <netisdn/i4b_global.h> - -/*---------------------------------------------------------------------------* - * USR Sportster TA intern special registers - *---------------------------------------------------------------------------*/ -#define USR_HSCXA_OFF 0x0000 -#define USR_HSCXB_OFF 0x4000 -#define USR_INTL_OFF 0x8000 -#define USR_ISAC_OFF 0xc000 - -#define USR_RES_BIT 0x80 /* 0 = normal, 1 = reset ISAC/HSCX */ -#define USR_INTE_BIT 0x40 /* 0 = IRQ disabled, 1 = IRQ's enabled */ -#define USR_IL_MASK 0x07 /* IRQ level config */ - -static u_char intr_no[] = { 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 3, 4, 5, 0, 6, 7 }; - -#ifdef __FreeBSD__ - -#define ADDR(reg) \ - (((reg/4) * 1024) + ((reg%4) * 2)) - -/*---------------------------------------------------------------------------* - * USRobotics read fifo routine - *---------------------------------------------------------------------------*/ -static void -usrtai_read_fifo(void *buf, const void *base, size_t len) -{ - register int offset = 0; - - for(;len > 0; len--, offset++) - *((u_char *)buf + offset) = inb((int)base + ADDR(offset)); -} - -/*---------------------------------------------------------------------------* - * USRobotics write fifo routine - *---------------------------------------------------------------------------*/ -static void -usrtai_write_fifo(void *base, const void *buf, size_t len) -{ - register int offset = 0; - - for(;len > 0; len--, offset++) - outb((int)base + ADDR(offset), *((u_char *)buf + offset)); -} - -/*---------------------------------------------------------------------------* - * USRobotics write register routine - *---------------------------------------------------------------------------*/ -static void -usrtai_write_reg(u_char *base, u_int offset, u_int v) -{ - outb((int)base + ADDR(offset), (u_char)v); -} - -/*---------------------------------------------------------------------------* - * USRobotics read register routine - *---------------------------------------------------------------------------*/ -static u_char -usrtai_read_reg(u_char *base, u_int offset) -{ - return(inb((int)base + ADDR(offset))); -} - -/*---------------------------------------------------------------------------* - * isic_probe_usrtai - probe for USR - *---------------------------------------------------------------------------*/ -int -isic_probe_usrtai(struct isa_device *dev) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= MAXUNIT for USR Sportster TA!\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* check IRQ validity */ - - if((intr_no[ffs(dev->id_irq) - 1]) == 0) - { - printf("isic%d: Error, invalid IRQ [%d] specified for USR Sportster TA!\n", - dev->id_unit, (ffs(dev->id_irq))-1); - return(0); - } - sc->sc_irq = dev->id_irq; - - /* check if memory addr specified */ - - if(dev->id_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for USR Sportster TA!\n", - dev->id_unit, (u_long)dev->id_maddr); - return(0); - } - dev->id_msize = 0; - - /* check if we got an iobase */ - - switch(dev->id_iobase) - { - case 0x200: - case 0x208: - case 0x210: - case 0x218: - case 0x220: - case 0x228: - case 0x230: - case 0x238: - case 0x240: - case 0x248: - case 0x250: - case 0x258: - case 0x260: - case 0x268: - case 0x270: - case 0x278: - break; - - default: - printf("isic%d: Error, invalid iobase 0x%x specified for USR Sportster TA!\n", - dev->id_unit, dev->id_iobase); - return(0); - break; - } - sc->sc_port = dev->id_iobase; - - /* setup ISAC access routines */ - - sc->clearirq = NULL; - sc->readreg = usrtai_read_reg; - sc->writereg = usrtai_write_reg; - - sc->readfifo = usrtai_read_fifo; - sc->writefifo = usrtai_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_USRTA; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - - ISAC_BASE = (void *)dev->id_iobase + USR_ISAC_OFF; - HSCX_A_BASE = (void *)dev->id_iobase + USR_HSCXA_OFF; - HSCX_B_BASE = (void *)dev->id_iobase + USR_HSCXB_OFF; - - /* - * Read HSCX A/B VSTR. Expected value for USR Sportster TA based - * boards is 0x05 in the least significant bits. - */ - - if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) || - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) ) - { - printf("isic%d: HSCX VSTR test failed for USR Sportster TA\n", - dev->id_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - dev->id_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - dev->id_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - return (1); -} - -/*---------------------------------------------------------------------------* - * isic_attach_usrtai - attach USR - *---------------------------------------------------------------------------*/ -int -isic_attach_usrtai(struct isa_device *dev) -{ - u_char irq = 0; - - /* reset the HSCX and ISAC chips */ - - outb(dev->id_iobase + USR_INTL_OFF, USR_RES_BIT); - DELAY(SEC_DELAY / 10); - - outb(dev->id_iobase + USR_INTL_OFF, 0x00); - DELAY(SEC_DELAY / 10); - - /* setup IRQ */ - - if((irq = intr_no[ffs(dev->id_irq) - 1]) == 0) - { - printf("isic%d: Attach error, invalid IRQ [%d] specified for USR Sportster TA!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - } - - /* configure and enable irq */ - - outb(dev->id_iobase + USR_INTL_OFF, irq | USR_INTE_BIT); - DELAY(SEC_DELAY / 10); - - return (1); -} - -#else /* end of FreeBSD, start NetBSD */ - -/* - * Use of sc->sc_maps: - * 0 : config register - * 1 - 16 : HSCX A registers - * 17 - 32 : HSCX B registers - * 33 - 48 : ISAC registers - */ - -#define USR_REG_OFFS(reg) ((reg % 4) * 2) -#define USR_HSCXA_MAP(reg) ((reg / 4) + 1) -#define USR_HSCXB_MAP(reg) ((reg / 4) + 17) -#define USR_ISAC_MAP(reg) ((reg / 4) + 33) - -static int map_base[] = { 33, 1, 17, 0 }; /* ISAC, HSCX A, HSCX B */ - -/*---------------------------------------------------------------------------* - * USRobotics read fifo routine - *---------------------------------------------------------------------------*/ -static void -usrtai_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size) -{ - int map, off, offset; - u_char * p = buf; - bus_space_tag_t t; - bus_space_handle_t h; - - for (offset = 0; size > 0; size--, offset++) { - map = map_base[what] + (offset / 4); - t = sc->sc_maps[map].t; - h = sc->sc_maps[map].h; - off = USR_REG_OFFS(offset); - - *p++ = bus_space_read_1(t, h, off); - } -} - -/*---------------------------------------------------------------------------* - * USRobotics write fifo routine - *---------------------------------------------------------------------------*/ -static void -usrtai_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size) -{ - int map, off, offset; - const u_char * p = buf; - bus_space_tag_t t; - bus_space_handle_t h; - u_char v; - - for (offset = 0; size > 0; size--, offset++) { - map = map_base[what] + (offset / 4); - t = sc->sc_maps[map].t; - h = sc->sc_maps[map].h; - off = USR_REG_OFFS(offset); - - v = *p++; - bus_space_write_1(t, h, off, v); - } -} - -/*---------------------------------------------------------------------------* - * USRobotics write register routine - *---------------------------------------------------------------------------*/ -static void -usrtai_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data) -{ - int map = map_base[what] + (offs / 4), - off = USR_REG_OFFS(offs); - bus_space_tag_t t = sc->sc_maps[map].t; - bus_space_handle_t h = sc->sc_maps[map].h; - - bus_space_write_1(t, h, off, data); -} - -/*---------------------------------------------------------------------------* - * USRobotics read register routine - *---------------------------------------------------------------------------*/ -static u_char -usrtai_read_reg(struct isic_softc *sc, int what, bus_size_t offs) -{ - int map = map_base[what] + (offs / 4), - off = USR_REG_OFFS(offs); - bus_space_tag_t t = sc->sc_maps[map].t; - bus_space_handle_t h = sc->sc_maps[map].h; - - return bus_space_read_1(t, h, off); -} - -/*---------------------------------------------------------------------------* - * isic_probe_usrtai - probe for USR - *---------------------------------------------------------------------------*/ -int -isic_probe_usrtai(struct isic_attach_args *ia) -{ - /* - * Read HSCX A/B VSTR. Expected value for IOM2 based - * boards is 0x05 in the least significant bits. - */ - - if(((bus_space_read_1(ia->ia_maps[USR_HSCXA_MAP(H_VSTR)].t, ia->ia_maps[USR_HSCXA_MAP(H_VSTR)].h, USR_REG_OFFS(H_VSTR)) & 0x0f) != 0x05) || - ((bus_space_read_1(ia->ia_maps[USR_HSCXB_MAP(H_VSTR)].t, ia->ia_maps[USR_HSCXB_MAP(H_VSTR)].h, USR_REG_OFFS(H_VSTR)) & 0x0f) != 0x05)) - return 0; - - return (1); -} - -/*---------------------------------------------------------------------------* - * isic_attach_usrtai - attach USR - *---------------------------------------------------------------------------*/ -int -isic_attach_usrtai(struct isic_softc *sc) -{ - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t h = sc->sc_maps[0].h; - u_char irq = intr_no[sc->sc_irq]; - - sc->clearirq = NULL; - sc->readreg = usrtai_read_reg; - sc->writereg = usrtai_write_reg; - - sc->readfifo = usrtai_read_fifo; - sc->writefifo = usrtai_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_USRTA; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* reset the HSCX and ISAC chips */ - - bus_space_write_1(t, h, 0, USR_RES_BIT); - DELAY(SEC_DELAY / 10); - - bus_space_write_1(t, h, 0, 0x00); - DELAY(SEC_DELAY / 10); - - /* setup IRQ */ - - bus_space_write_1(t, h, 0, irq | USR_INTE_BIT); - DELAY(SEC_DELAY / 10); - - return (1); -} - -#endif /* __FreeBSD__ */ - -#endif /* ISICISA_USR_STI */ diff --git a/sys/dev/isapnp/files.isapnp b/sys/dev/isapnp/files.isapnp index fcfbc6dce1b..9268e7a80e9 100644 --- a/sys/dev/isapnp/files.isapnp +++ b/sys/dev/isapnp/files.isapnp @@ -1,4 +1,4 @@ -# $NetBSD: files.isapnp,v 1.38 2005/12/11 12:22:16 christos Exp $ +# $NetBSD: files.isapnp,v 1.39 2018/09/22 16:22:23 maxv Exp $ # # Config file and device description for machine-independent ISAPnP code. # Included by ports that need it. @@ -91,24 +91,6 @@ file dev/isapnp/aha_isapnp.c aha_isapnp attach aic at isapnp with aic_isapnp file dev/isapnp/aic_isapnp.c aic_isapnp -# ISDN devices -attach isic at isapnp with isic_isapnp -file dev/isapnp/isic_isapnp.c isic_isapnp - -defflag opt_isicpnp.h ISICPNP_TEL_S0_16_3_P ISICPNP_CRTX_S0_P ISICPNP_DRN_NGO - ISICPNP_ELSA_QS1ISA ISICPNP_ELSA_PCC16 - ISICPNP_SEDLBAUER ISICPNP_DYNALINK - ISICPNP_SIEMENS_ISURF2 ISICPNP_ITKIX - -file dev/isapnp/isic_isapnp_tel_s0P.c isic_isapnp -file dev/isapnp/isic_isapnp_ctx_s0P.c isic_isapnp -file dev/isapnp/isic_isapnp_drn_ngo.c isic_isapnp -file dev/isapnp/isic_isapnp_elsa_qs1i.c isic_isapnp -file dev/isapnp/isic_isapnp_sws.c isic_isapnp -file dev/isapnp/isic_isapnp_dynalink.c isic_isapnp -file dev/isapnp/isic_isapnp_siemens_isurf.c isic_isapnp -file dev/isapnp/isic_isapnp_itkix.c isic_isapnp - # Game adapter (joystick) attach joy at isapnp with joy_isapnp file dev/isapnp/joy_isapnp.c joy_isapnp diff --git a/sys/dev/isapnp/isic_isapnp.c b/sys/dev/isapnp/isic_isapnp.c deleted file mode 100644 index e118ea66637..00000000000 --- a/sys/dev/isapnp/isic_isapnp.c +++ /dev/null @@ -1,393 +0,0 @@ -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann <martin@NetBSD.org>. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isapnp.c,v 1.33 2016/07/14 04:00:45 msaitoh Exp $"); - -#include <sys/param.h> -#include <sys/errno.h> -#include <sys/syslog.h> -#include <sys/device.h> -#include <sys/socket.h> -#include <net/if.h> -#include <sys/systm.h> -#include <sys/malloc.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#include <sys/cpu.h> -#include <sys/intr.h> -#include <sys/bus.h> - -#include <dev/isa/isavar.h> -#include <dev/isapnp/isapnpreg.h> -#include <dev/isapnp/isapnpvar.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_ioctl.h> -#include <machine/i4b_trace.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_trace.h> -#include <netisdn/i4b_l2.h> -#endif - -#include <dev/ic/isic_l1.h> -#include <dev/ic/ipac.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_global.h> - -#include "opt_isicpnp.h" - -extern const struct isdn_layer1_isdnif_driver isic_std_driver; - -static int isic_isapnp_probe(device_t, cfdata_t, void *); -static void isic_isapnp_attach(device_t, device_t, void *); - -CFATTACH_DECL_NEW(isic_isapnp, sizeof(struct isic_softc), - isic_isapnp_probe, isic_isapnp_attach, NULL, NULL); - -typedef void (*allocmaps_func)(struct isapnp_attach_args *ipa, - struct isic_softc *sc); -typedef void (*attach_func)(struct isic_softc *sc); - -/* map allocators */ -#if defined(ISICPNP_ELSA_QS1ISA) || defined(ISICPNP_SEDLBAUER) \ - || defined(ISICPNP_DYNALINK) || defined(ISICPNP_SIEMENS_ISURF2) \ - || defined(ISICPNP_ITKIX) -static void generic_pnp_mapalloc(struct isapnp_attach_args *ipa, - struct isic_softc *sc); -#endif -#ifdef ISICPNP_DRN_NGO -static void ngo_pnp_mapalloc(struct isapnp_attach_args *ipa, - struct isic_softc *sc); -#endif -#if defined(ISICPNP_CRTX_S0_P) || defined(ISICPNP_TEL_S0_16_3_P) -static void tls_pnp_mapalloc(struct isapnp_attach_args *ipa, - struct isic_softc *sc); -#endif - -/* card attach functions */ -extern void isic_attach_Cs0P(struct isic_softc *sc); -extern void isic_attach_Dyn(struct isic_softc *sc); -extern void isic_attach_s0163P(struct isic_softc *sc); -extern void isic_attach_drnngo(struct isic_softc *sc); -extern void isic_attach_sws(struct isic_softc *sc); -extern void isic_attach_Eqs1pi(struct isic_softc *sc); -extern void isic_attach_siemens_isurf(struct isic_softc *sc); -extern void isic_attach_isapnp_itkix1(struct isic_softc *sc); - -struct isic_isapnp_card_desc { - const char *devlogic; /* ISAPNP logical device ID */ - const char *name; /* Name of the card */ - int card_type; /* isic card type identifier */ - allocmaps_func allocmaps; /* map allocator function */ - attach_func attach; /* card attach and init function */ -}; -static const struct isic_isapnp_card_desc -isic_isapnp_descriptions[] = -{ -#ifdef ISICPNP_CRTX_S0_P - { "CTX0000", "Creatix ISDN S0-16 P&P", CARD_TYPEP_CS0P, - tls_pnp_mapalloc, isic_attach_Cs0P }, -#endif -#ifdef ISICPNP_TEL_S0_16_3_P - { "TAG2110", "Teles S0/PnP", CARD_TYPEP_163P, - tls_pnp_mapalloc, isic_attach_s0163P }, -#endif -#ifdef ISICPNP_DRN_NGO - { "SDA0150", "Dr. Neuhaus NICCY GO@", CARD_TYPEP_DRNNGO, - ngo_pnp_mapalloc, isic_attach_drnngo }, -#endif -#ifdef ISICPNP_ELSA_QS1ISA - { "ELS0133", "Elsa QuickStep 1000 (ISA)", CARD_TYPEP_ELSAQS1ISA, - generic_pnp_mapalloc, isic_attach_Eqs1pi }, -#endif -#ifdef ISICPNP_SEDLBAUER - { "SAG0001", "Sedlbauer WinSpeed", CARD_TYPEP_SWS, - generic_pnp_mapalloc, isic_attach_sws }, -#endif -#ifdef ISICPNP_DYNALINK - { "ASU1688", "Dynalink IS64PH", CARD_TYPEP_DYNALINK, - generic_pnp_mapalloc, isic_attach_Dyn }, -#endif -#ifdef ISICPNP_SIEMENS_ISURF2 - { "SIE0020", "Siemens I-Surf 2.0 PnP", CARD_TYPEP_SIE_ISURF2, - generic_pnp_mapalloc, isic_attach_siemens_isurf }, -#endif -#ifdef ISICPNP_ITKIX - { "ITK0025", "ix1-micro 3.0", 0, - generic_pnp_mapalloc, isic_attach_isapnp_itkix1 }, -#endif -}; -#define NUM_DESCRIPTIONS (sizeof(isic_isapnp_descriptions)/sizeof(isic_isapnp_descriptions[0])) - -/* - * Probe card - */ -static int -isic_isapnp_probe(device_t parent, cfdata_t cf, void *aux) -{ - struct isapnp_attach_args *ipa = aux; - const struct isic_isapnp_card_desc *desc = isic_isapnp_descriptions; - int i; - - for (i = 0; i < NUM_DESCRIPTIONS; i++, desc++) - if (strcmp(ipa->ipa_devlogic, desc->devlogic) == 0) - return 1; - - return 0; -} - -/*---------------------------------------------------------------------------* - * card independend attach for ISA P&P cards - *---------------------------------------------------------------------------*/ - -/* parameter and format for message producing e.g. "isic0: " */ - -#ifdef __FreeBSD__ -#define ISIC_FMT "isic%d: " -#define ISIC_PARM dev->id_unit -#define TERMFMT " " -#else -#define ISIC_FMT "%s: " -#define ISIC_PARM device_xname(sc->sc_dev) -#define TERMFMT "\n" -#endif - -static void -isic_isapnp_attach(device_t parent, device_t self, void *aux) -{ - static const 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 const char *HSCXversion[] = { - "82525 Version A1", - "Unknown (0x01)", - "82525 Version A2", - "Unknown (0x03)", - "82525 Version A3", - "82525 or 21525 Version 2.1", - "Unknown Version" - }; - - struct isic_softc *sc = device_private(self); - struct isapnp_attach_args *ipa = aux; - const struct isic_isapnp_card_desc *desc = isic_isapnp_descriptions; - int i; - - sc->sc_dev = self; - if (isapnp_config(ipa->ipa_iot, ipa->ipa_memt, ipa)) { - aprint_error_dev(sc->sc_dev, "error in region allocation\n"); - return; - } - - for (i = 0; i < NUM_DESCRIPTIONS; i++, desc++) - if (strcmp(ipa->ipa_devlogic, desc->devlogic) == 0) - break; - if (i >= NUM_DESCRIPTIONS) - panic("could not identify isic PnP device"); - - /* setup parameters */ - sc->sc_cardtyp = desc->card_type; - sc->sc_irq = ipa->ipa_irq[0].num; - desc->allocmaps(ipa, sc); - - /* announce card name */ - printf(": %s\n", desc->name); - - /* establish interrupt handler */ - if (isa_intr_establish(ipa->ipa_ic, ipa->ipa_irq[0].num, - ipa->ipa_irq[0].type, IPL_NET, isicintr, sc) == NULL) - aprint_error_dev(sc->sc_dev, - "couldn't establish interrupt handler\n"); - - /* init card */ - desc->attach(sc); - - /* announce chip versions */ - 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: - aprint_error(ISIC_FMT - "Error, ISAC version %d unknown!\n", - ISIC_PARM, sc->sc_isac_version); - return; - 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: - aprint_error(ISIC_FMT - "Error, HSCX version %d unknown!\n", - ISIC_PARM, sc->sc_hscx_version); - return; - break; - }; - - sc->sc_intr_valid = ISIC_INTR_DISABLED; - - /* HSCX setup */ - - isic_bchannel_setup(sc, HSCX_CH_A, BPROT_NONE, 0); - - isic_bchannel_setup(sc, 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(__NetBSD__) && __NetBSD_Version__ >= 104230000 - callout_init(&sc->sc_T3_callout, 0); - callout_init(&sc->sc_T4_callout, 0); -#endif - - /* announce chip versions */ - - if (sc->sc_isac_version >= ISAC_UNKN) { - aprint_error(ISIC_FMT - "ISAC Version UNKNOWN (VN=0x%x)" TERMFMT, ISIC_PARM, - sc->sc_isac_version); - sc->sc_isac_version = ISAC_UNKN; - } else { - aprint_error(ISIC_FMT "ISAC %s (IOM-%c)" TERMFMT, ISIC_PARM, - ISACversion[sc->sc_isac_version], - sc->sc_bustyp == BUS_TYPE_IOM1 ? '1' : '2'); - } - - if (sc->sc_hscx_version >= HSCX_UNKN) { - aprint_error(ISIC_FMT "HSCX Version UNKNOWN (VN=0x%x)" TERMFMT, - ISIC_PARM, sc->sc_hscx_version); - sc->sc_hscx_version = HSCX_UNKN; - } else { - aprint_error(ISIC_FMT "HSCX %s" TERMFMT, ISIC_PARM, - HSCXversion[sc->sc_hscx_version]); - } - - /* init higher protocol layers and save l2 handle */ - isic_attach_bri(sc, desc->name, &isic_std_driver); -} - -#if defined(ISICPNP_ELSA_QS1ISA) || defined(ISICPNP_SEDLBAUER) \ - || defined(ISICPNP_DYNALINK) || defined(ISICPNP_SIEMENS_ISURF2) \ - || defined(ISICPNP_ITKIX) -static void -generic_pnp_mapalloc(struct isapnp_attach_args *ipa, struct isic_softc *sc) -{ - sc->sc_num_mappings = 1; /* most cards have just one mapping */ - MALLOC_MAPS(sc); /* malloc the maps */ - sc->sc_maps[0].t = ipa->ipa_iot; /* copy the access handles */ - sc->sc_maps[0].h = ipa->ipa_io[0].h; - sc->sc_maps[0].size = 0; /* foreign mapping, leave it alone */ -} -#endif - -#ifdef ISICPNP_DRN_NGO -static void -ngo_pnp_mapalloc(struct isapnp_attach_args *ipa, struct isic_softc *sc) -{ - sc->sc_num_mappings = 2; /* one data, one address mapping */ - MALLOC_MAPS(sc); /* malloc the maps */ - sc->sc_maps[0].t = ipa->ipa_iot; /* copy the access handles */ - sc->sc_maps[0].h = ipa->ipa_io[0].h; - sc->sc_maps[0].size = 0; /* foreign mapping, leave it alone */ - sc->sc_maps[1].t = ipa->ipa_iot; - sc->sc_maps[1].h = ipa->ipa_io[1].h; - sc->sc_maps[1].size = 0; -} -#endif - -#if defined(ISICPNP_CRTX_S0_P) || defined(ISICPNP_TEL_S0_16_3_P) -static void -tls_pnp_mapalloc(struct isapnp_attach_args *ipa, struct isic_softc *sc) -{ - sc->sc_num_mappings = 4; /* config, isac, 2 * hscx */ - MALLOC_MAPS(sc); /* malloc the maps */ - sc->sc_maps[0].t = ipa->ipa_iot; /* copy the access handles */ - sc->sc_maps[0].h = ipa->ipa_io[0].h; - sc->sc_maps[0].size = 0; /* foreign mapping, leave it alone */ - sc->sc_maps[1].t = ipa->ipa_iot; - sc->sc_maps[1].h = ipa->ipa_io[0].h; - sc->sc_maps[1].size = 0; - sc->sc_maps[1].offset = - 0x20; - sc->sc_maps[2].t = ipa->ipa_iot; - sc->sc_maps[2].offset = - 0x20; - sc->sc_maps[2].h = ipa->ipa_io[1].h; - sc->sc_maps[2].size = 0; - sc->sc_maps[3].t = ipa->ipa_iot; - sc->sc_maps[3].offset = 0; - sc->sc_maps[3].h = ipa->ipa_io[1].h; - sc->sc_maps[3].size = 0; -} -#endif diff --git a/sys/dev/isapnp/isic_isapnp_ctx_s0P.c b/sys/dev/isapnp/isic_isapnp_ctx_s0P.c deleted file mode 100644 index 68a9cde71b7..00000000000 --- a/sys/dev/isapnp/isic_isapnp_ctx_s0P.c +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * isic - I4B Siemens ISDN Chipset Driver for Creatix PnP cards - * ============================================================ - * - * $Id: isic_isapnp_ctx_s0P.c,v 1.11 2007/10/19 12:00:32 ad Exp $ - * - * last edit-date: [Fri Jan 5 11:38:29 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isapnp_ctx_s0P.c,v 1.11 2007/10/19 12:00:32 ad Exp $"); - -#include "opt_isicpnp.h" -#if ISICPNP_CRTX_S0_P - -#include <sys/param.h> - -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif - -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#endif - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#include <netisdn/i4b_mbuf.h> - -#ifndef __FreeBSD__ -static u_int8_t ctxs0P_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -static void ctxs0P_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static void ctxs0P_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void ctxs0P_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size); -void isic_attach_Cs0P(struct isic_softc *sc); -#endif - -#ifdef __FreeBSD__ -#include <i386/isa/pnp.h> -extern void isicintr ( int unit ); -#endif - -/*---------------------------------------------------------------------------* - * Creatix ISDN-S0 P&P ISAC get fifo routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -ctxs0P_read_fifo(void *buf, const void *base, size_t len) -{ - insb((int)base + 0x3e, (u_char *)buf, (u_int)len); -} - -#else - -static void -ctxs0P_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - bus_space_read_multi_1(t, h, o + 0x3e, buf, size); -} - -#endif - -/*---------------------------------------------------------------------------* - * Creatix ISDN-S0 P&P ISAC put fifo routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -ctxs0P_write_fifo(void *base, const void *buf, size_t len) -{ - outsb((int)base + 0x3e, (u_char *)buf, (u_int)len); -} - -#else - -static void -ctxs0P_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - bus_space_write_multi_1(t, h, o + 0x3e, buf, size); -} -#endif - -/*---------------------------------------------------------------------------* - * Creatix ISDN-S0 P&P ISAC put register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -ctxs0P_write_reg(u_char *base, u_int offset, u_int v) -{ - outb((int)base + offset, (u_char)v); -} - -#else - -static void -ctxs0P_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - bus_space_write_1(t, h, o + offs, data); -} -#endif - -/*---------------------------------------------------------------------------* - * Creatix ISDN-S0 P&P ISAC get register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static u_char -ctxs0P_read_reg(u_char *base, u_int offset) -{ - return (inb((int)base + offset)); -} - -#else - -static u_int8_t -ctxs0P_read_reg(struct isic_softc *sc, int what, bus_size_t offs) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - return bus_space_read_1(t, h, o + offs); -} - -#endif - -#ifdef __FreeBSD__ - -/*---------------------------------------------------------------------------* - * isic_probe_Cs0P - probe for Creatix ISDN-S0 P&P and compatibles - *---------------------------------------------------------------------------*/ -int -isic_probe_Cs0P(struct isa_device *dev, unsigned int iobase2) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Creatix ISDN-S0 P&P!\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* check IRQ validity */ - - switch(ffs(dev->id_irq) - 1) - { - case 3: - case 5: - case 7: - case 10: - case 11: - case 12: - break; - - default: - printf("isic%d: Error, invalid IRQ [%d] specified for Creatix ISDN-S0 P&P!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - break; - } - sc->sc_irq = dev->id_irq; - - /* check if memory addr specified */ - - if(dev->id_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for Creatix ISDN-S0 P&P!\n", - dev->id_unit, (u_long)dev->id_maddr); - return(0); - } - dev->id_msize = 0; - - if(iobase2 == 0) - { - printf("isic%d: Error, iobase2 is 0 for Creatix ISDN-S0 P&P!\n", - dev->id_unit); - return(0); - } - - /* check if we got an iobase */ - - switch(dev->id_iobase) - { - case 0x120: - case 0x180: -/*XXX*/ break; - - default: - printf("isic%d: Error, invalid iobase 0x%x specified for Creatix ISDN-S0 P&P!\n", - dev->id_unit, dev->id_iobase); - return(0); - break; - } - sc->sc_port = dev->id_iobase; - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = ctxs0P_read_reg; - sc->writereg = ctxs0P_write_reg; - - sc->readfifo = ctxs0P_read_fifo; - sc->writefifo = ctxs0P_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_CS0P; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - - ISAC_BASE = (void *) dev->id_iobase - 0x20; - HSCX_A_BASE = (void *) iobase2 - 0x20; - HSCX_B_BASE = (void *) iobase2; - - /* - * Read HSCX A/B VSTR. Expected value for the Creatix PnP card is - * 0x05 ( = version 2.1 ) in the least significant bits. - */ - - if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) || - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) ) - { - printf("isic%d: HSCX VSTR test failed for Creatix PnP\n", - dev->id_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - dev->id_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - dev->id_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - return (1); -} - -/*---------------------------------------------------------------------------* - * isic_attach_s0163P - attach Creatix ISDN-S0 P&P - *---------------------------------------------------------------------------*/ -int -isic_attach_Cs0P(struct isa_device *dev, unsigned int iobase2) -{ - outb((dev->id_iobase) + 0x1c, 0); - DELAY(SEC_DELAY / 10); - outb((dev->id_iobase) + 0x1c, 1); - DELAY(SEC_DELAY / 10); - return(1); -} - -#else /* !__FreeBSD__ */ - -void -isic_attach_Cs0P(struct isic_softc *sc) -{ - /* init card */ - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t h = sc->sc_maps[0].h; - bus_space_write_1(t, h, 0x1c, 0); - DELAY(SEC_DELAY / 10); - bus_space_write_1(t, h, 0x1c, 1); - DELAY(SEC_DELAY / 10); - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = ctxs0P_read_reg; - sc->writereg = ctxs0P_write_reg; - - sc->readfifo = ctxs0P_read_fifo; - sc->writefifo = ctxs0P_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_CS0P; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; -} -#endif - -#endif /* ISICPNP_CRTX_S0_P */ - diff --git a/sys/dev/isapnp/isic_isapnp_drn_ngo.c b/sys/dev/isapnp/isic_isapnp_drn_ngo.c deleted file mode 100644 index a7c36be65e5..00000000000 --- a/sys/dev/isapnp/isic_isapnp_drn_ngo.c +++ /dev/null @@ -1,539 +0,0 @@ -/* - * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * i4b_drn_ngo.c - Dr. Neuhaus Niccy GO@ and SAGEM Cybermod - * -------------------------------------------------------- - * - * $Id: isic_isapnp_drn_ngo.c,v 1.10 2007/10/19 12:00:32 ad Exp $ - * - * last edit-date: [Fri Jan 5 11:38:29 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isapnp_drn_ngo.c,v 1.10 2007/10/19 12:00:32 ad Exp $"); - -#include "opt_isicpnp.h" -#ifdef ISICPNP_DRN_NGO - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#endif - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -/*---------------------------------------------------------------------------* - * Niccy GO@ definitions - * - * the card uses 2 i/o addressranges each using 2 bytes - * - * addressrange 0: - * offset 0 - ISAC dataregister - * offset 1 - HSCX dataregister - * addressrange 1: - * offset 0 - ISAC addressregister - * offset 1 - HSCX addressregister - * - * to access an ISAC/HSCX register, you have to write the register - * number into the ISAC or HSCX addressregister and then read/write - * data for the ISAC/HSCX register into/from the corresponding - * dataregister. - * - * Thanks to Klaus Muehle of Dr. Neuhaus Telekommunikation for giving - * out this information! - * - *---------------------------------------------------------------------------*/ -#define NICCY_PORT_MIN 0x200 -#define NICCY_PORT_MAX 0x3e0 - -#define HSCX_ABIT 0x1000 /* flag, HSCX A is meant */ -#define HSCX_BBIT 0x2000 /* flag, HSCX B is meant */ - -#define HSCX_BOFF 0x40 - -#define ADDR_OFF 2 /* address register range offset XXX */ - -#define ISAC_DATA 0 -#define HSCX_DATA 1 - -#define ISAC_ADDR 0 -#define HSCX_ADDR 1 - -#ifdef __FreeBSD__ - -#if 0 -#define HSCXADEBUG -#define HSCXBDEBUG -#define ISACDEBUG -#else -#undef HSCXADEBUG -#undef HSCXBDEBUG -#undef ISACDEBUG -#endif - -/*---------------------------------------------------------------------------* - * Dr. Neuhaus Niccy GO@ read fifo routine - *---------------------------------------------------------------------------*/ -static void -drnngo_read_fifo(void *buf, const void *base, size_t len) -{ - register int offset; - register u_int data; - - int x = SPLI4B(); - - if((u_int)base & HSCX_ABIT) - { - (u_int)base &= ~HSCX_ABIT; - (u_int)data = ((u_int)base + HSCX_DATA); - (u_int)base += (ADDR_OFF + HSCX_ADDR); - offset = 0; -#ifdef HSCXADEBUG -printf("GO/A/frd: base=0x%x, data=0x%x, len=%d\n", base, data, len); -#endif - } - else if((u_int)base & HSCX_BBIT) - { - (u_int)base &= ~HSCX_BBIT; - (u_int)data = ((u_int)base + HSCX_DATA); - (u_int)base += (ADDR_OFF + HSCX_ADDR); - offset = HSCX_BOFF; -#ifdef HSCXBDEBUG -printf("GO/B/frd: base=0x%x, data=0x%x, len=%d\n", base, data, len); -#endif - } - else - { - (u_int)data = ((u_int)base + ISAC_DATA); - (u_int)base += (ADDR_OFF + ISAC_ADDR); - offset = 0; -#ifdef ISACDEBUG -printf("GO/I/frd: base=0x%x, data=0x%x, len=%d\n", base, data, len); -#endif - } - - for(;len > 0; len--, offset++) - { - outb((int)base, (u_char)offset); - *((u_char *)buf + offset) = inb((int)data); - } - - splx(x); -} - -/*---------------------------------------------------------------------------* - * Dr. Neuhaus Niccy GO@ write fifo routine - *---------------------------------------------------------------------------*/ -static void -drnngo_write_fifo(void *base, const void *buf, size_t len) -{ - register int offset; - register u_int data; - - int x = SPLI4B(); - - if((u_int)base & HSCX_ABIT) - { - (u_int)base &= ~HSCX_ABIT; - (u_int)data = ((u_int)base + HSCX_DATA); - (u_int)base += (ADDR_OFF + HSCX_ADDR); - offset = 0; -#ifdef HSCXADEBUG -printf("GO/A/fwr: base=0x%x, data=0x%x, len=%d\n", base, data, len); -#endif - } - else if((u_int)base & HSCX_BBIT) - { - (u_int)base &= ~HSCX_BBIT; - (u_int)data = ((u_int)base + HSCX_DATA); - (u_int)base += (ADDR_OFF + HSCX_ADDR); - offset = HSCX_BOFF; -#ifdef HSCXBDEBUG -printf("GO/B/fwr: base=0x%x, data=0x%x, len=%d\n", base, data, len); -#endif - } - else - { - (u_int)data = ((u_int)base + ISAC_DATA); - (u_int)base += (ADDR_OFF + ISAC_ADDR); - offset = 0; -#ifdef ISACDEBUG -printf("GO/I/fwr: base=0x%x, data=0x%x, len=%d\n", base, data, len); -#endif - } - - for(;len > 0; len--, offset++) - { - outb((int)base, (u_char)offset); - outb((int)data, *((u_char *)buf + offset)); - } - - splx(x); -} - -/*---------------------------------------------------------------------------* - * Dr. Neuhaus Niccy GO@ write register routine - *---------------------------------------------------------------------------*/ -static void -drnngo_write_reg(u_char *base, u_int offset, u_int v) -{ - int x = SPLI4B(); - if((u_int)base & HSCX_ABIT) - { - (u_int)base &= ~HSCX_ABIT; - outb((int)base + ADDR_OFF + HSCX_ADDR, (u_char)offset); - outb((int)base + HSCX_DATA, (u_char)v); -#ifdef HSCXADEBUG -printf("GO/A/rwr: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n", - (int)base + ADDR_OFF + HSCX_ADDR, (int)base + HSCX_DATA, - (u_char)offset, (u_char)v); -#endif - } - else if((u_int)base & HSCX_BBIT) - { - (u_int)base &= ~HSCX_BBIT; - outb((int)base + ADDR_OFF + HSCX_ADDR, (u_char)(offset + HSCX_BOFF)); - outb((int)base + HSCX_DATA, (u_char)v); -#ifdef HSCXBDEBUG -printf("GO/B/rwr: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n", - (int)base + ADDR_OFF + HSCX_ADDR, (int)base + HSCX_DATA, - (u_char)(offset + HSCX_BOFF), (u_char)v); -#endif - } - else - { - outb((int)base + ADDR_OFF + ISAC_ADDR, (u_char)offset); - outb((int)base + ISAC_DATA, (u_char)v); -#ifdef ISACDEBUG -printf("GO/I/rwr: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n", - (int)base + ADDR_OFF + ISAC_ADDR, (int)base + ISAC_DATA, - (u_char)offset, (u_char)v); -#endif - } - splx(x); -} - -/*---------------------------------------------------------------------------* - * Dr. Neuhaus Niccy GO@ read register routine - *---------------------------------------------------------------------------*/ -static u_char -drnngo_read_reg(u_char *base, u_int offset) -{ - u_char val; - int x = SPLI4B(); - - if((u_int)base & HSCX_ABIT) - { - (u_int)base &= ~HSCX_ABIT; - outb((int)base + ADDR_OFF + HSCX_ADDR, (u_char)offset); - val = inb((int)base + HSCX_DATA); -#ifdef HSCXADEBUG -printf("GO/A/rrd: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n", - (int)base + ADDR_OFF + HSCX_ADDR, (int)base + HSCX_DATA, - (u_char)offset, (u_char)val); -#endif - } - else if((u_int)base & HSCX_BBIT) - { - (u_int)base &= ~HSCX_BBIT; - outb((int)base + ADDR_OFF + HSCX_ADDR, (u_char)(offset + HSCX_BOFF)); - val = inb((int)base + HSCX_DATA); -#ifdef HSCXBDEBUG -printf("GO/B/rrd: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n", - (int)base + ADDR_OFF + HSCX_ADDR, (int)base + HSCX_DATA, - (u_char)(offset + HSCX_BOFF), (u_char)val); -#endif - } - else - { - outb((int)base + ADDR_OFF + ISAC_ADDR, (u_char)offset); - val = inb((int)base + ISAC_DATA); -#ifdef ISACDEBUG -printf("GO/I/rrd: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n", - (int)base + ADDR_OFF + ISAC_ADDR, (int)base + ISAC_DATA, - (u_char)offset, (u_char)val); -#endif - } - splx(x); - return(val); -} - -/*---------------------------------------------------------------------------* - * isic_probe_drnngo - probe for Dr. Neuhaus Niccy GO@ - *---------------------------------------------------------------------------*/ -int -isic_probe_drnngo(struct isa_device *dev, unsigned int iobase2) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Dr. Neuhaus Niccy GO@!\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* check IRQ validity */ - - switch(ffs(dev->id_irq)-1) - { - case 3: - case 4: - case 5: - case 9: - case 10: - case 11: - case 12: - case 15: - break; - - default: - printf("isic%d: Error, invalid IRQ [%d] specified for Dr. Neuhaus Niccy GO@!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - break; - } - sc->sc_irq = dev->id_irq; - - /* check if memory addr specified */ - - if(dev->id_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for Dr. Neuhaus Niccy GO@!\n", - dev->id_unit, (u_long)dev->id_maddr); - return(0); - } - dev->id_msize = 0; - - /* check if we got an iobase */ - - if(dev->id_iobase < NICCY_PORT_MIN || dev->id_iobase > NICCY_PORT_MAX) - { - printf("isic%d: Error, invalid iobase 0x%x specified for Dr. Neuhaus Niccy GO@!\n", - dev->id_unit, dev->id_iobase); - return(0); - } - sc->sc_port = dev->id_iobase; - - if(iobase2 == 0) - { - printf("isic%d: Error, iobase2 is 0 for Dr. Neuhaus Niccy GO@!\n", - dev->id_unit); - return(0); - } - - if(iobase2 < NICCY_PORT_MIN || iobase2 > NICCY_PORT_MAX) - { - printf("isic%d: Error, invalid port1 0x%x specified for Dr. Neuhaus Niccy GO@!\n", - dev->id_unit, iobase2); - return(0); - } - -/*XXX*/ if((dev->id_iobase + 2) != iobase2) - { - printf("isic%d: Error, port1 must be (port0+2) for Dr.Neuhaus Niccy GO@!\n", - dev->id_unit); - return(0); - } - - /* setup ISAC access routines */ - - sc->clearirq = NULL; - sc->readreg = drnngo_read_reg; - sc->writereg = drnngo_write_reg; - - sc->readfifo = drnngo_read_fifo; - sc->writefifo = drnngo_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_DRNNGO; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - - ISAC_BASE = (void *)dev->id_iobase; - HSCX_A_BASE = (void *)(((u_int)dev->id_iobase) | HSCX_ABIT); - HSCX_B_BASE = (void *)(((u_int)dev->id_iobase) | HSCX_BBIT); - - /* - * Read HSCX A/B VSTR. Expected value for Dr. Neuhaus Niccy GO@ based - * boards is 0x05 in the least significant bits. - */ - - if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) || - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) ) - { - printf("isic%d: HSCX VSTR test failed for Dr. Neuhaus Niccy GO@\n", - dev->id_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - dev->id_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - dev->id_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - return (1); -} - -/*---------------------------------------------------------------------------* - * isic_attach_drnngo - attach Dr. Neuhaus Niccy GO@ - *---------------------------------------------------------------------------*/ -int -isic_attach_drnngo(struct isa_device *dev, unsigned int iobase2) -{ - return (1); -} - -#else - -static u_int8_t drnngo_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -static void drnngo_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static void drnngo_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void drnngo_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size); -void isic_attach_drnngo(struct isic_softc *sc); - -/* - * Mapping from "what" parameter to offsets into the io map - */ -static struct { - bus_size_t oa, /* address register offset */ - od, /* data register offset */ - or; /* additional chip register offset */ -} offset[] = -{ - { ISAC_ADDR, ISAC_DATA, 0 }, /* ISAC access */ - { HSCX_ADDR, HSCX_DATA, 0 }, /* HSCX A access */ - { HSCX_ADDR, HSCX_DATA, HSCX_BOFF } /* HSCX B access */ -}; - -static void -drnngo_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t hd = sc->sc_maps[0].h, ha = sc->sc_maps[1].h; - bus_space_write_1(t, ha, offset[what].oa, offset[what].or); - bus_space_read_multi_1(t, hd, offset[what].od, buf, size); -} - -static void -drnngo_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t hd = sc->sc_maps[0].h, ha = sc->sc_maps[1].h; - bus_space_write_1(t, ha, offset[what].oa, offset[what].or); - bus_space_write_multi_1(t, hd, offset[what].od, buf, size); -} - -static void -drnngo_write_reg(struct isic_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 hd = sc->sc_maps[0].h, ha = sc->sc_maps[1].h; - bus_space_write_1(t, ha, offset[what].oa, offs+offset[what].or); - bus_space_write_1(t, hd, offset[what].od, data); -} - -static u_int8_t -drnngo_read_reg(struct isic_softc *sc, int what, bus_size_t offs) -{ - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t hd = sc->sc_maps[0].h, ha = sc->sc_maps[1].h; - bus_space_write_1(t, ha, offset[what].oa, offs+offset[what].or); - return bus_space_read_1(t, hd, offset[what].od); -} - -void -isic_attach_drnngo(struct isic_softc *sc) -{ - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = drnngo_read_reg; - sc->writereg = drnngo_write_reg; - - sc->readfifo = drnngo_read_fifo; - sc->writefifo = drnngo_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_DRNNGO; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; -} - -#endif - -#endif /* ISICPNP_DRN_NGO */ diff --git a/sys/dev/isapnp/isic_isapnp_dynalink.c b/sys/dev/isapnp/isic_isapnp_dynalink.c deleted file mode 100644 index 343b2c18772..00000000000 --- a/sys/dev/isapnp/isic_isapnp_dynalink.c +++ /dev/null @@ -1,574 +0,0 @@ -/* - * Copyright (c) 1998 Martijn Plak. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * isdn4bsd layer1 driver for Dynalink IS64PH isdn TA - * ================================================== - * - * $Id: isic_isapnp_dynalink.c,v 1.14 2012/10/27 17:18:26 chs Exp $ - * - * last edit-date: [Fri Jan 5 11:38:29 2001] - * - * written by Martijn Plak (martijn@be3.com) - * - * -mp 11 jun 1998 first try, code borrowed from Creatix driver - * -mp 18 jun 1998 cleaned up code - * -hm FreeBSD PnP - * -mp 17 dec 1998 made it compile again - * - *---------------------------------------------------------------------------*/ - -/* NOTES: - - This driver was written for the Dynalink IS64PH ISDN TA, based on two - Siemens chips (HSCX 21525 and ISAC 2186). It is sold in the Netherlands. - - model numbers found on (my) card: - IS64PH, TAS100H-N, P/N:89590555, TA200S100045521 - - chips: - Siemens PSB 21525N, HSCX TE V2.1 - Siemens PSB 2186N, ISAC-S TE V1.1 - 95MS14, PNP - - plug-and-play info: - device id "ASU1688" - vendor id 0x88167506 - serial 0x00000044 - i/o port 4 byte alignment, 4 bytes requested, - 10 bit i/o decoding, 0x100-0x3f8 (?) - irq 3,4,5,9,10,11,12,15, high true, edge sensitive - - At the moment I'm writing this Dynalink is replacing this card with - one based on a single Siemens chip (IPAC). It will apparently be sold - under the same model name. - - This driver might also work for Asuscom cards. -*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isapnp_dynalink.c,v 1.14 2012/10/27 17:18:26 chs Exp $"); - -#include "opt_isicpnp.h" -#ifdef ISICPNP_DYNALINK - -/* HEADERS -*/ - -#include <sys/param.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <net/if.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#if __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#include <i386/isa/pnp.h> -#elif defined(__bsdi__) -#include <i386/isa/pnp.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#endif - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#if defined(__FreeBSD__) || defined(__bsdi__) -static void dynalink_read_fifo(void *buf, const void *base, size_t len); -static void dynalink_write_fifo(void *base, const void *buf, size_t len); -static void dynalink_write_reg(u_char *base, u_int offset, u_int v); -static u_char dynalink_read_reg(u_char *base, u_int offset); -#endif - -#ifdef __FreeBSD__ -extern struct isa_driver isicdriver; -#endif -#ifdef __bsdi__ -extern struct cfdriver isiccd; -#endif - -#if !defined(__FreeBSD__) && !defined(__bsdi__) -static void dynalink_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void dynalink_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size); -static void dynalink_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static u_int8_t dynalink_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -void isic_attach_Dyn(struct isic_softc *sc); -#endif - -/* io address mapping */ -#define ISAC 0 -#define HSCX 1 -#define ADDR 2 - -/* ADDR bits */ -#define ADDRMASK 0x7F -#define RESET 0x80 - -/* HSCX register offsets */ -#define HSCXA 0x00 -#define HSCXB 0x40 - -#if defined(__FreeBSD__) || defined(__bsdi__) -/* base address juggling */ -#define HSCXB_HACK 0x400 -#define IOBASE(addr) (((int)addr)&0x3FC) -#define IOADDR(addr) (((int)addr)&0x3FF) -#define IS_HSCXB_HACK(addr) ((((int)addr)&HSCXB_HACK)?HSCXB:HSCXA) -#endif - -#ifdef __FreeBSD__ -/* ISIC probe and attach -*/ - -int -isic_probe_Dyn(struct isa_device *dev, unsigned int iobase2) -{ - - struct isic_softc *sc = &l1_sc[dev->id_unit]; - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Dynalink IS64PH.\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* check IRQ validity */ - - switch(ffs(dev->id_irq) - 1) - { - case 3: - case 4: - case 5: - case 9: - case 10: - case 11: - case 12: - case 15: - break; - - default: - printf("isic%d: Error, invalid IRQ [%d] specified for Dynalink IS64PH.\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - break; - } - sc->sc_irq = dev->id_irq; - - /* check if memory addr specified */ - - if(dev->id_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for Dynalink IS64PH.\n", - dev->id_unit, (u_long)dev->id_maddr); - return (0); - } - dev->id_msize = 0; - - /* check if we got an iobase */ - if ( (dev->id_iobase < 0x100) || - (dev->id_iobase > 0x3f8) || - (dev->id_iobase & 3) ) - { - printf("isic%d: Error, invalid iobase 0x%x specified for Dynalink!\n", dev->id_unit, dev->id_iobase); - return(0); - } - sc->sc_port = dev->id_iobase; - - /* setup access routines */ - sc->clearirq = NULL; - sc->readreg = dynalink_read_reg; - sc->writereg = dynalink_write_reg; - sc->readfifo = dynalink_read_fifo; - sc->writefifo = dynalink_write_fifo; - - /* setup card type */ - sc->sc_cardtyp = CARD_TYPEP_DYNALINK; - - /* setup IOM bus type */ - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - ISAC_BASE = (void *) sc->sc_port; - HSCX_A_BASE = (void *) sc->sc_port + 1; - HSCX_B_BASE = (void *) sc->sc_port + 1 + HSCXB_HACK; - - /* Read HSCX A/B VSTR. Expected value is 0x05 (V2.1). */ - if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) || - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) ) - { - printf("isic%d: HSCX VSTR test failed for Dynalink\n", - dev->id_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - dev->id_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - dev->id_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - return (1); -} - -int -isic_attach_Dyn(struct isa_device *dev, unsigned int iobase2) -{ - outb((dev->id_iobase)+ADDR, RESET); - DELAY(SEC_DELAY / 10); - outb((dev->id_iobase)+ADDR, 0); - DELAY(SEC_DELAY / 10); - return(1); -} - -#elif defined(__bsdi__) - -/* ISIC probe and attach -*/ - -static int -set_softc(struct isic_softc *sc, struct isa_attach_args *ia, int unit) -{ - if (unit >= NISIC) - return 0; - sc->sc_unit = unit; - switch(ffs(ia->ia_irq) - 1) - { - case 3: - case 4: - case 5: - case 9: - case 10: - case 11: - case 12: - case 15: - break; - - default: - printf("isic%d: Error, invalid IRQ [%d] specified for Dynalink IS64PH.\n", - unit, ffs(ia->ia_irq)-1); - return(0); - break; - } - sc->sc_irq = ia->ia_irq; - - /* check if memory addr specified */ - - if(ia->ia_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for Dynalink IS64PH.\n", - unit, (u_long)ia->ia_maddr); - return (0); - } - - /* check if we got an iobase */ - if ( (ia->ia_iobase < 0x100) || - (ia->ia_iobase > 0x3f8) || - (ia->ia_iobase & 3) ) - { - printf("isic%d: Error, invalid iobase 0x%x specified for Dynalink!\n", unit, ia->ia_iobase); - return(0); - } - sc->sc_port = ia->ia_iobase; - - /* setup access routines */ - sc->clearirq = NULL; - sc->readreg = dynalink_read_reg; - sc->writereg = dynalink_write_reg; - sc->readfifo = dynalink_read_fifo; - sc->writefifo = dynalink_write_fifo; - - /* setup card type */ - sc->sc_cardtyp = CARD_TYPEP_DYNALINK; - - /* setup IOM bus type */ - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - ISAC_BASE = (void *) sc->sc_port; - HSCX_A_BASE = (void *) sc->sc_port + 1; - HSCX_B_BASE = (void *) sc->sc_port + 1 + HSCXB_HACK; - return 1; -} - -int -isapnp_match_dynalink(device_t parent, cfdata_t cf, - struct isa_attach_args *ia) -{ - struct isic_softc dummysc, *sc = &dummysc; - pnp_resource_t res; - char *ids[] = {"ASU1688", NULL}; - memset(&res, 0, sizeof res); - res.res_irq[0].irq_level = ia->ia_irq; - res.res_port[0].prt_base = ia->ia_iobase; - res.res_port[0].prt_length = 4; - - if (!pnp_assigndev(ids, isiccd.cd_name, &res)) - return (0); - - ia->ia_irq = res.res_irq[0].irq_level; - ia->ia_iobase = res.res_port[0].prt_base; - ia->ia_iosize = res.res_port[0].prt_length; - - if (set_softc(sc, ia, cf->cf_unit) == 0) - return 0; - - /* Read HSCX A/B VSTR. Expected value is 0x05 (V2.1). */ - if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) || - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) ) - { - printf("isic%d: HSCX VSTR test failed for Dynalink\n", - cf->cf_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - cf->cf_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - cf->cf_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - cf->cf_flags = FLAG_DYNALINK; - return (1); -} - -int -isic_attach_Dyn(device_t parent, device_t self, - struct isa_attach_args *ia) -{ - struct isic_softc *sc = device_private(self); - int unit = sc->sc_dev.dv_unit; - - /* Commit the probed attachment values */ - if (set_softc(sc, ia, unit) == 0) - panic("isic_attach_Dyn: set_softc"); - - outb((ia->ia_iobase)+ADDR, RESET); - DELAY(SEC_DELAY / 10); - outb((ia->ia_iobase)+ADDR, 0); - DELAY(SEC_DELAY / 10); - return(1); -} - -#else - -void isic_attach_Dyn(struct isic_softc *sc) -{ - /* setup access routines */ - sc->clearirq = NULL; - sc->readreg = dynalink_read_reg; - sc->writereg = dynalink_write_reg; - sc->readfifo = dynalink_read_fifo; - sc->writefifo = dynalink_write_fifo; - - /* setup card type */ - sc->sc_cardtyp = CARD_TYPEP_DYNALINK; - - /* setup IOM bus type */ - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* Read HSCX A/B VSTR. Expected value is 0x05 (V2.1). */ - if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) || ((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) ) - { - printf("%s: HSCX VSTR test failed for Dynalink PnP\n", - device_xname(sc->sc_dev)); - printf("%s: HSC0: VSTR: %#x\n", - device_xname(sc->sc_dev), HSCX_READ(0, H_VSTR)); - printf("%s: HSC1: VSTR: %#x\n", - device_xname(sc->sc_dev), HSCX_READ(1, H_VSTR)); - return; - } - - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ADDR, RESET); - DELAY(SEC_DELAY / 10); - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ADDR, 0); - DELAY(SEC_DELAY / 10); -} - -#endif - -/* LOW-LEVEL DEVICE ACCESS - - NOTE: The isdn4bsd code expects the two HSCX channels at different - base addresses. I'm faking this, and remap them to the same address - in the low-level routines. Search for HSCXB_HACK and IS_HSCXB_HACK. - - REM: this is only true for the FreeBSD version of I4B! -*/ - -#if defined(__FreeBSD__) || defined(__bsdi__) -static void -dynalink_read_fifo(void *buf, const void *base, size_t len) -{ - outb(IOBASE(base)+ADDR, 0+IS_HSCXB_HACK(base)); - insb(IOADDR(base), (u_char *)buf, (u_int)len); -} -#else -static void -dynalink_read_fifo(struct isic_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, ADDR, 0); - bus_space_read_multi_1(t, h, ISAC, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ADDR, HSCXA); - bus_space_read_multi_1(t, h, HSCX, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ADDR, HSCXB); - bus_space_read_multi_1(t, h, HSCX, buf, size); - break; - } -} -#endif - -#if defined(__FreeBSD__) || defined(__bsdi__) -static void -dynalink_write_fifo(void *base, const void *buf, size_t len) -{ - outb(IOBASE(base)+ADDR, 0+IS_HSCXB_HACK(base)); - outsb(IOADDR(base), (u_char *)buf, (u_int)len); -} -#else -static void dynalink_write_fifo(struct isic_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, ADDR, 0); - bus_space_write_multi_1(t, h, ISAC, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ADDR, HSCXA); - bus_space_write_multi_1(t, h, HSCX, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ADDR, HSCXB); - bus_space_write_multi_1(t, h, HSCX, buf, size); - break; - } -} -#endif - -#if defined(__FreeBSD__) || defined(__bsdi__) -static void -dynalink_write_reg(u_char *base, u_int offset, u_int v) -{ - outb(IOBASE(base)+ADDR, (offset+IS_HSCXB_HACK(base))&ADDRMASK); - outb(IOADDR(base), (u_char)v); -} -#else -static void dynalink_write_reg(struct isic_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, ADDR, offs); - bus_space_write_1(t, h, ISAC, data); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ADDR, HSCXA+offs); - bus_space_write_1(t, h, HSCX, data); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ADDR, HSCXB+offs); - bus_space_write_1(t, h, HSCX, data); - break; - } -} -#endif - -#if defined(__FreeBSD__) || defined(__bsdi__) -static u_char -dynalink_read_reg(u_char *base, u_int offset) -{ - outb(IOBASE(base)+ADDR, (offset+IS_HSCXB_HACK(base))&ADDRMASK); - return (inb(IOADDR(base))); -} -#else -static u_int8_t dynalink_read_reg(struct isic_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, ADDR, offs); - return bus_space_read_1(t, h, ISAC); - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ADDR, HSCXA+offs); - return bus_space_read_1(t, h, HSCX); - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ADDR, HSCXB+offs); - return bus_space_read_1(t, h, HSCX); - } - return 0; -} -#endif - -#endif /* ISICPNP_DYNALINK */ diff --git a/sys/dev/isapnp/isic_isapnp_elsa_qs1i.c b/sys/dev/isapnp/isic_isapnp_elsa_qs1i.c deleted file mode 100644 index a04da6517ba..00000000000 --- a/sys/dev/isapnp/isic_isapnp_elsa_qs1i.c +++ /dev/null @@ -1,609 +0,0 @@ -/* - * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * isic - I4B Siemens ISDN Chipset Driver for ELSA Quickstep 1000pro ISA - * ===================================================================== - * - * $Id: isic_isapnp_elsa_qs1i.c,v 1.16 2007/10/19 12:00:32 ad Exp $ - * - * last edit-date: [Fri Jan 5 11:38:29 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isapnp_elsa_qs1i.c,v 1.16 2007/10/19 12:00:32 ad Exp $"); - -#include "opt_isicpnp.h" -#if defined(ISICPNP_ELSA_QS1ISA) || defined(ISICPNP_ELSA_PCC16) - -#include <sys/param.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <net/if.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#if __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#include <i386/isa/pnp.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#endif - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#ifdef __FreeBSD__ -static void i4b_eq1i_clrirq(void* base); -#else -static void i4b_eq1i_clrirq(struct isic_softc *sc); -void isic_attach_Eqs1pi(struct isic_softc *sc); -static void elsa_command_req(struct isic_softc *sc, int command, void *data); -static void elsa_led_handler(void *); -#endif - -/* masks for register encoded in base addr */ - -#define ELSA_BASE_MASK 0x0ffff -#define ELSA_OFF_MASK 0xf0000 - -/* register id's to be encoded in base addr */ - -#define ELSA_IDISAC 0x00000 -#define ELSA_IDHSCXA 0x10000 -#define ELSA_IDHSCXB 0x20000 - -/* offsets from base address */ - -#define ELSA_OFF_ISAC 0x00 -#define ELSA_OFF_HSCX 0x02 -#define ELSA_OFF_OFF 0x03 -#define ELSA_OFF_CTRL 0x04 -#define ELSA_OFF_CFG 0x05 -#define ELSA_OFF_TIMR 0x06 -#define ELSA_OFF_IRQ 0x07 - -/* control register (write access) */ - -#define ELSA_CTRL_LED_YELLOW 0x02 -#define ELSA_CTRL_LED_GREEN 0x08 -#define ELSA_CTRL_RESET 0x20 -#define ELSA_CTRL_TIMEREN 0x80 -#define ELSA_CTRL_SECRET 0x50 - -/*---------------------------------------------------------------------------* - * ELSA QuickStep 1000pro/ISA clear IRQ routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -i4b_eq1i_clrirq(void* base) -{ - outb((u_int)base + ELSA_OFF_IRQ, 0); -} - -#else -static void -i4b_eq1i_clrirq(struct isic_softc *sc) -{ - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t h = sc->sc_maps[0].h; - bus_space_write_1(t, h, ELSA_OFF_IRQ, 0); -} -#endif - -/*---------------------------------------------------------------------------* - * ELSA QuickStep 1000pro/ISA ISAC get fifo routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -eqs1pi_read_fifo(void *buf, const void *base, size_t len) -{ - if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB) - { - outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0x40); - insb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX), (u_char *)buf, (u_int)len); - } - else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA) - { - outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0); - insb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX), (u_char *)buf, (u_int)len); - } - else /* if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC) */ - { - outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0); - insb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ISAC), (u_char *)buf, (u_int)len); - } -} - -#else - -static void -eqs1pi_read_fifo(struct isic_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, ELSA_OFF_OFF, 0); - bus_space_read_multi_1(t, h, ELSA_OFF_ISAC, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ELSA_OFF_OFF, 0); - bus_space_read_multi_1(t, h, ELSA_OFF_HSCX, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ELSA_OFF_OFF, 0x40); - bus_space_read_multi_1(t, h, ELSA_OFF_HSCX, buf, size); - break; - } -} - -#endif - -/*---------------------------------------------------------------------------* - * ELSA QuickStep 1000pro/ISA ISAC put fifo routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -eqs1pi_write_fifo(void *base, const void *buf, size_t len) -{ - if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB) - { - outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0x40); - outsb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX), (u_char *)buf, (u_int)len); - } - else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA) - { - outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0); - outsb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX), (u_char *)buf, (u_int)len); - } - else /* if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC) */ - { - outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0); - outsb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ISAC), (u_char *)buf, (u_int)len); - } -} - -#else - -static void -eqs1pi_write_fifo(struct isic_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, ELSA_OFF_OFF, 0); - bus_space_write_multi_1(t, h, ELSA_OFF_ISAC, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ELSA_OFF_OFF, 0); - bus_space_write_multi_1(t, h, ELSA_OFF_HSCX, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ELSA_OFF_OFF, 0x40); - bus_space_write_multi_1(t, h, ELSA_OFF_HSCX, buf, size); - break; - } -} -#endif - -/*---------------------------------------------------------------------------* - * ELSA QuickStep 1000pro/ISA ISAC put register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -eqs1pi_write_reg(u_char *base, u_int offset, u_int v) -{ - if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB) - { - outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)(offset+0x40)); - outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX, (u_char)v); - } - else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA) - { - outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)offset); - outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX, (u_char)v); - } - else /* if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC) */ - { - outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)offset); - outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ISAC, (u_char)v); - } -} - -#else - -static void -eqs1pi_write_reg(struct isic_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, ELSA_OFF_OFF, offs); - bus_space_write_1(t, h, ELSA_OFF_ISAC, data); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ELSA_OFF_OFF, offs); - bus_space_write_1(t, h, ELSA_OFF_HSCX, data); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ELSA_OFF_OFF, 0x40+offs); - bus_space_write_1(t, h, ELSA_OFF_HSCX, data); - break; - } -} -#endif - -/*---------------------------------------------------------------------------* - * ELSA QuickStep 1000pro/ISA ISAC get register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static u_char -eqs1pi_read_reg(u_char *base, u_int offset) -{ - if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB) - { - outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)(offset+0x40)); - return(inb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX)); - } - else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA) - { - outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)offset); - return(inb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX)); - } - else /* if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC) */ - { - outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)offset); - return(inb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ISAC)); - } -} - -#else - -static u_int8_t -eqs1pi_read_reg(struct isic_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, ELSA_OFF_OFF, offs); - return bus_space_read_1(t, h, ELSA_OFF_ISAC); - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ELSA_OFF_OFF, offs); - return bus_space_read_1(t, h, ELSA_OFF_HSCX); - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ELSA_OFF_OFF, 0x40+offs); - return bus_space_read_1(t, h, ELSA_OFF_HSCX); - } - return 0; -} - -#endif - -#ifdef __FreeBSD__ - -/*---------------------------------------------------------------------------* - * isic_probe_Eqs1pi - probe for ELSA QuickStep 1000pro/ISA and compatibles - *---------------------------------------------------------------------------*/ -int -isic_probe_Eqs1pi(struct isa_device *dev, unsigned int iobase2) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for ELSA QuickStep 1000pro/ISA!\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* check IRQ validity */ - - switch(ffs(dev->id_irq) - 1) - { - case 3: - case 4: - case 5: - case 7: - case 10: - case 11: - case 12: - case 15: - break; - - default: - printf("isic%d: Error, invalid IRQ [%d] specified for ELSA QuickStep 1000pro/ISA!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - break; - } - sc->sc_irq = dev->id_irq; - - /* check if memory addr specified */ - - if(dev->id_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for ELSA QuickStep 1000pro/ISA!\n", - dev->id_unit, (u_long)dev->id_maddr); - return(0); - } - dev->id_msize = 0; - - /* check if we got an iobase */ - - if(!((dev->id_iobase >= 0x160) && (dev->id_iobase <= 0x360))) - { - printf("isic%d: Error, invalid iobase 0x%x specified for ELSA QuickStep 1000pro/ISA!\n", - dev->id_unit, dev->id_iobase); - return(0); - } - sc->sc_port = dev->id_iobase; - - /* setup access routines */ - - sc->clearirq = i4b_eq1i_clrirq; - sc->readreg = eqs1pi_read_reg; - sc->writereg = eqs1pi_write_reg; - - sc->readfifo = eqs1pi_read_fifo; - sc->writefifo = eqs1pi_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_ELSAQS1ISA; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - - ISAC_BASE = (void *) ((u_int)dev->id_iobase | ELSA_IDISAC); - HSCX_A_BASE = (void *) ((u_int)dev->id_iobase | ELSA_IDHSCXA); - HSCX_B_BASE = (void *) ((u_int)dev->id_iobase | ELSA_IDHSCXB); - - /* - * Read HSCX A/B VSTR. Expected value for the ELSA QuickStep 1000pro - * ISA card is 0x05 ( = version 2.1 ) in the least significant bits. - */ - - if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) || - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) ) - { - printf("isic%d: HSCX VSTR test failed for ELSA QuickStep 1000pro/ISA\n", - dev->id_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - dev->id_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - dev->id_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - return (1); -} - -/*---------------------------------------------------------------------------* - * isic_attach_s0163P - attach ELSA QuickStep 1000pro/ISA - *---------------------------------------------------------------------------*/ -int -isic_attach_Eqs1pi(struct isa_device *dev, unsigned int iobase2) -{ - u_char byte = ELSA_CTRL_SECRET; - - byte &= ~ELSA_CTRL_RESET; - outb(dev->id_iobase + ELSA_OFF_CTRL, byte); - DELAY(20); - byte |= ELSA_CTRL_RESET; - outb(dev->id_iobase + ELSA_OFF_CTRL, byte); - - DELAY(20); - outb(dev->id_iobase + ELSA_OFF_IRQ, 0xff); - - return(1); -} - -#else /* !__FreeBSD__ */ - -static void -elsa_command_req(struct isic_softc *sc, int command, void *data) -{ - int v, s, blink; - u_int8_t led_val; - - switch (command) { - case CMR_DOPEN: - s = splnet(); - - v = ELSA_CTRL_SECRET & ~ELSA_CTRL_RESET; - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, - ELSA_OFF_CTRL, v); - delay(20); - v |= ELSA_CTRL_RESET; - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, - ELSA_OFF_CTRL, v); - delay(20); - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, - ELSA_OFF_IRQ, 0xff); - - splx(s); - break; - - case CMR_DCLOSE: - s = splnet(); - callout_stop(&sc->sc_driver_callout); - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, - ELSA_OFF_IRQ, 0); - v = ELSA_CTRL_SECRET & ~ELSA_CTRL_RESET; - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, - ELSA_OFF_CTRL, v); - delay(20); - v |= ELSA_CTRL_RESET; - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, - ELSA_OFF_CTRL, v); - splx(s); - break; - - case CMR_SETLEDS: - /* the magic value and keep reset off */ - led_val = ELSA_CTRL_SECRET|ELSA_CTRL_RESET; - - /* now see what LEDs we want to add */ - v = (int)data; - if (v & CMRLEDS_TEI) - led_val |= ELSA_CTRL_LED_GREEN; - blink = 0; - if (v & (CMRLEDS_B0|CMRLEDS_B1)) { - led_val |= ELSA_CTRL_LED_YELLOW; - if ((v & (CMRLEDS_B0|CMRLEDS_B1)) == (CMRLEDS_B0|CMRLEDS_B1)) - blink = hz/4; - else - blink = hz; - sc->sc_driver_specific = v; - } - - s = splnet(); - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, - ELSA_OFF_CTRL, led_val); - callout_stop(&sc->sc_driver_callout); - if (blink) - callout_reset(&sc->sc_driver_callout, blink, - elsa_led_handler, sc); - splx(s); - - break; - - default: - return; - } -} - -static void -elsa_led_handler(void *token) -{ - struct isic_softc *sc = token; - int v, s, blink, off = 0; - u_int8_t led_val = ELSA_CTRL_SECRET|ELSA_CTRL_RESET; - - s = splnet(); - v = sc->sc_driver_specific; - if (v > 0) { - /* turn blinking LED off */ - v = -sc->sc_driver_specific; - sc->sc_driver_specific = v; - off = 1; - } else { - sc->sc_driver_specific = -v; - } - if (v & CMRLEDS_TEI) - led_val |= ELSA_CTRL_LED_GREEN; - blink = 0; - if (off == 0) { - if (v & (CMRLEDS_B0|CMRLEDS_B1)) - led_val |= ELSA_CTRL_LED_YELLOW; - } - if ((v & (CMRLEDS_B0|CMRLEDS_B1)) == (CMRLEDS_B0|CMRLEDS_B1)) - blink = hz/4; - else - blink = hz; - - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, - ELSA_OFF_CTRL, led_val); - if (blink) - callout_reset(&sc->sc_driver_callout, blink, - elsa_led_handler, sc); - splx(s); -} - -void -isic_attach_Eqs1pi(struct isic_softc *sc) -{ - /* setup access routines */ - - sc->clearirq = i4b_eq1i_clrirq; - sc->readreg = eqs1pi_read_reg; - sc->writereg = eqs1pi_write_reg; - - sc->readfifo = eqs1pi_read_fifo; - sc->writefifo = eqs1pi_write_fifo; - - sc->drv_command = elsa_command_req; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_ELSAQS1ISA; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - callout_init(&sc->sc_driver_callout, 0); - sc->sc_driver_specific = 0; -} - -#endif - -#endif /* ISICPNP_ELSA_QS1ISA or ISICPNP_ELSA_PCC16 */ diff --git a/sys/dev/isapnp/isic_isapnp_itkix.c b/sys/dev/isapnp/isic_isapnp_itkix.c deleted file mode 100644 index ca886ccdda4..00000000000 --- a/sys/dev/isapnp/isic_isapnp_itkix.c +++ /dev/null @@ -1,76 +0,0 @@ -/* $NetBSD: isic_isapnp_itkix.c,v 1.8 2008/04/28 20:23:53 martin Exp $ */ - -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann <martin@NetBSD.org>. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isapnp_itkix.c,v 1.8 2008/04/28 20:23:53 martin Exp $"); - -#include "opt_isicpnp.h" - -#ifdef ISICPNP_ITKIX - -#include <sys/param.h> -#include <sys/ioccom.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> -#include <sys/callout.h> -#include <sys/bus.h> -#include <sys/device.h> -#include <sys/socket.h> - -#include <net/if.h> - -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> - -#include <dev/ic/isic_l1.h> - -/* XXX: this is a hack to share some more code - will be replaced with generic - * io-mapped isic driver */ -#include "opt_isicisa.h" -#ifndef ISICISA_ITKIX1 -#define ISICISA_ITKIX1 -#include <dev/isa/isic_isa_itk_ix1.c> -#else -extern int isic_attach_itkix1(struct isic_softc *sc); -#endif - -void isic_attach_isapnp_itkix1(struct isic_softc *sc); - -void isic_attach_isapnp_itkix1(struct isic_softc *sc) -{ - isic_attach_itkix1(sc); -} - -#endif diff --git a/sys/dev/isapnp/isic_isapnp_siemens_isurf.c b/sys/dev/isapnp/isic_isapnp_siemens_isurf.c deleted file mode 100644 index 19fa589b041..00000000000 --- a/sys/dev/isapnp/isic_isapnp_siemens_isurf.c +++ /dev/null @@ -1,481 +0,0 @@ -/* - * Copyright (c) 1999 Udo Schweigert. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * Based on ELSA Quickstep 1000pro PCI driver (i4b_elsa_qs1p.c) - *--------------------------------------------------------------------------- - * In case of trouble please contact Udo Schweigert <ust@cert.siemens.de> - *--------------------------------------------------------------------------- - * - * Siemens I-Surf 2.0 PnP specific routines for isic driver - * -------------------------------------------------------- - * - * $Id: isic_isapnp_siemens_isurf.c,v 1.11 2007/10/19 12:00:32 ad Exp $ - * - * last edit-date: [Fri Jan 5 11:38:29 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isapnp_siemens_isurf.c,v 1.11 2007/10/19 12:00:32 ad Exp $"); - -#include <sys/param.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#if defined(__FreeBSD__) -#if __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif - -#include <machine/clock.h> -#include <i386/isa/isa_device.h> - -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#if defined(__FreeBSD__) -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_ioctl.h> -#endif - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/ipac.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#if !defined(__FreeBSD__) -void isic_attach_siemens_isurf(struct isic_softc *sc); -#endif - -/* masks for register encoded in base addr */ - -#define SIE_ISURF_BASE_MASK 0x0ffff -#define SIE_ISURF_OFF_MASK 0xf0000 - -/* register id's to be encoded in base addr */ - -#define SIE_ISURF_IDISAC 0x00000 -#define SIE_ISURF_IDHSCXA 0x10000 -#define SIE_ISURF_IDHSCXB 0x20000 -#define SIE_ISURF_IDIPAC 0x40000 - -/* offsets from base address */ - -#define SIE_ISURF_OFF_ALE 0x00 -#define SIE_ISURF_OFF_RW 0x01 - -/*---------------------------------------------------------------------------* - * Siemens I-Surf 2.0 PnP ISAC get fifo routine - *---------------------------------------------------------------------------*/ -#if defined(__FreeBSD__) - -static void -siemens_isurf_read_fifo(void *buf, const void *base, size_t len) -{ - if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXB) - { - outb((u_int)((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, IPAC_HSCXB_OFF); - insb((((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW), (u_char *)buf, (u_int)len); - } - else if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXA) - { - outb((u_int)((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, IPAC_HSCXA_OFF); - insb((((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW), (u_char *)buf, (u_int)len); - } - else /* if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDISAC) */ - { - outb((u_int)((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, IPAC_ISAC_OFF); - insb((((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW), (u_char *)buf, (u_int)len); - } -} - -#else - -static void -siemens_isurf_read_fifo(struct isic_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 -siemens_isurf_write_fifo(void *base, const void *buf, size_t len) -{ - if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXB) - { - outb((u_int)((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, IPAC_HSCXB_OFF); - outsb((((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW), (const u_char *)buf, (u_int)len); - } - else if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXA) - { - outb((u_int)((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, IPAC_HSCXA_OFF); - outsb((((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW), (const u_char *)buf, (u_int)len); - } - else /* if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDISAC) */ - { - outb((u_int)((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, IPAC_ISAC_OFF); - outsb((((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW), (const u_char *)buf, (u_int)len); - } -} - -#else - -static void -siemens_isurf_write_fifo(struct isic_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, 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, 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, buf, size); - break; - } -} - -#endif - -/*---------------------------------------------------------------------------* - * Siemens I-Surf 2.0 PnP ISAC put register routine - *---------------------------------------------------------------------------*/ -#if defined(__FreeBSD__) - -static void -siemens_isurf_write_reg(u_char *base, u_int offset, u_int v) -{ - if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXB) - { - outb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, (u_char)(offset+IPAC_HSCXB_OFF)); - outb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW, (u_char)v); - } - else if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXA) - { - outb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, (u_char)(offset+IPAC_HSCXA_OFF)); - outb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW, (u_char)v); - } - else if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDISAC) - { - outb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, (u_char)(offset+IPAC_ISAC_OFF)); - outb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW, (u_char)v); - } - else /* IPAC */ - { - outb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, (u_char)(offset+IPAC_IPAC_OFF)); - outb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW, (u_char)v); - } -} - -#else - -static void -siemens_isurf_write_reg(struct isic_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 -siemens_isurf_read_reg(u_char *base, u_int offset) -{ - if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXB) - { - outb((u_int)((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, (u_char)(offset+IPAC_HSCXB_OFF)); - return(inb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW)); - } - else if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXA) - { - outb((u_int)((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, (u_char)(offset+IPAC_HSCXA_OFF)); - return(inb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW)); - } - else if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDISAC) - { - outb((u_int)((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, (u_char)(offset+IPAC_ISAC_OFF)); - return(inb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW)); - } - else /* IPAC */ - { - outb((u_int)((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_ALE, (u_char)(offset+IPAC_IPAC_OFF)); - return(inb(((u_int)base & SIE_ISURF_BASE_MASK) + SIE_ISURF_OFF_RW)); - } -} - -#else - -static u_int8_t -siemens_isurf_read_reg(struct isic_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 -isic_probe_siemens_isurf(struct isa_device *dev, unsigned int iobase2) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Siemens I-Surf 2.0 PnP\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* check IRQ validity */ - - switch(ffs(dev->id_irq) - 1) - { - case 3: - case 4: - case 5: - case 7: - case 10: - case 11: - case 12: - case 15: - break; - - default: - printf("isic%d: Error, invalid IRQ [%d] specified for Siemens I-Surf 2.0 PnP!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - break; - } - sc->sc_irq = dev->id_irq; - - /* check if memory addr specified */ - - if(dev->id_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for Siemens I-Surf 2.0 PnP!\n", - dev->id_unit, (u_long)dev->id_maddr); - return(0); - } - dev->id_msize = 0; - - /* check if we got an iobase */ - - if(!((dev->id_iobase >= 0x100) && (dev->id_iobase <= 0xfffc))) - { - printf("isic%d: Error, invalid iobase 0x%x specified for Siemens I-Surf 2.0 PnP!\n", - dev->id_unit, dev->id_iobase); - return(0); - } - sc->sc_port = dev->id_iobase; - - - /* 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; - - - return (1); -} - -/*---------------------------------------------------------------------------* - * isic_attach_siemens_isurf - attach for Siemens I-Surf 2.0 PnP - *---------------------------------------------------------------------------*/ -int -isic_attach_siemens_isurf(struct isa_device *dev, unsigned int iobase2) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - - /* setup ISAC and HSCX base addr */ - - ISAC_BASE = (void *) ((u_int)sc->sc_port | SIE_ISURF_IDISAC); - HSCX_A_BASE = (void *) ((u_int)sc->sc_port | SIE_ISURF_IDHSCXA); - HSCX_B_BASE = (void *) ((u_int)sc->sc_port | SIE_ISURF_IDHSCXB); - IPAC_BASE = (void *) ((u_int)sc->sc_port | SIE_ISURF_IDIPAC); - - /* 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 */ - - return(1); -} - -#else - -void -isic_attach_siemens_isurf(struct isic_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 diff --git a/sys/dev/isapnp/isic_isapnp_sws.c b/sys/dev/isapnp/isic_isapnp_sws.c deleted file mode 100644 index d30739d8635..00000000000 --- a/sys/dev/isapnp/isic_isapnp_sws.c +++ /dev/null @@ -1,390 +0,0 @@ -/* - * Copyright (c) 1998 German Tischler. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * Card format: - * - * iobase + 0 : reset on (0x03) - * iobase + 1 : reset off (0x0) - * iobase + 2 : isac read/write - * iobase + 3 : hscx read/write ( offset 0-0x3f hscx0 , - * offset 0x40-0x7f hscx1 ) - * iobase + 4 : offset for indirect addressing - * - *--------------------------------------------------------------------------- - * - * isic - I4B Siemens ISDN Chipset Driver for SWS cards - * ==================================================== - * - * EXPERIMENTAL !!!! - * ================= - * - * $Id: isic_isapnp_sws.c,v 1.14 2012/10/27 17:18:26 chs Exp $ - * - * last edit-date: [Fri Jan 5 11:38:29 2001] - * - * -hm adding driver to i4b - * -hm adjustments for FreeBSD < 2.2.6, no PnP support yet - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isapnp_sws.c,v 1.14 2012/10/27 17:18:26 chs Exp $"); - -#include "opt_isicpnp.h" -#ifdef ISICPNP_SEDLBAUER - -#define SWS_RESON 0 /* reset on */ -#define SWS_RESOFF 1 /* reset off */ -#define SWS_ISAC 2 /* ISAC */ -#define SWS_HSCX0 3 /* HSCX0 */ -#define SWS_RW 4 /* indirect access register */ -#define SWS_HSCX1 5 /* this is for fakeing that we mean hscx1, though */ - /* access is done through hscx0 */ - -#define SWS_REGS 8 /* we use an area of 8 bytes for io */ - -#define SWS_BASE(X) ((unsigned int)X&~(SWS_REGS-1)) -#define SWS_PART(X) ((unsigned int)X& (SWS_REGS-1)) -#define SWS_ADDR(X) ((SWS_PART(X) == SWS_ISAC) ? (SWS_BASE(X)+SWS_ISAC) : (SWS_BASE(X)+SWS_HSCX0) ) -#define SWS_REG(X,Y) ((SWS_PART(X) != SWS_HSCX1) ? Y : (Y+0x40) ) -#define SWS_IDO(X) (SWS_BASE(X)+SWS_RW) - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_l2.h> -#endif - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#ifndef __FreeBSD__ -static u_int8_t sws_read_reg (struct isic_softc *sc, int what, bus_size_t offs); -static void sws_write_reg (struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static void sws_read_fifo (struct isic_softc *sc, int what, void *buf, size_t size); -static void sws_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size); -void isic_attach_sws(struct isic_softc *sc); -#endif - -/*---------------------------------------------------------------------------* - * SWS P&P ISAC get fifo routine - *---------------------------------------------------------------------------*/ - -#ifdef __FreeBSD__ - -static void -sws_read_fifo(void *buf, const void *base, size_t len) -{ - outb(SWS_IDO(base),SWS_REG(base,0)); - insb(SWS_ADDR(base),buf,len); -} - -#else - -static void -sws_read_fifo(struct isic_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, SWS_RW, 0); - bus_space_read_multi_1(t, h, SWS_ISAC, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, SWS_RW, 0); - bus_space_read_multi_1(t, h, SWS_HSCX0, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, SWS_RW, 0x40); - bus_space_read_multi_1(t, h, SWS_HSCX0, buf, size); - break; - } -} - -#endif - -/*---------------------------------------------------------------------------* - * SWS P&P ISAC put fifo routine - *---------------------------------------------------------------------------*/ - -#ifdef __FreeBSD__ - -static void -sws_write_fifo(void *base, const void *buf, size_t len) -{ - outb (SWS_IDO(base),SWS_REG(base,0)); - outsb(SWS_ADDR(base),buf,len); -} - -#else - -static void -sws_write_fifo(struct isic_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, SWS_RW, 0); - bus_space_write_multi_1(t, h, SWS_ISAC, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, SWS_RW, 0); - bus_space_write_multi_1(t, h, SWS_HSCX0, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, SWS_RW, 0x40); - bus_space_write_multi_1(t, h, SWS_HSCX0, buf, size); - break; - } -} - -#endif - -/*---------------------------------------------------------------------------* - * SWS P&P ISAC put register routine - *---------------------------------------------------------------------------*/ - -#ifdef __FreeBSD__ - -static void -sws_write_reg(u_char *base, u_int offset, u_int v) -{ - outb(SWS_IDO(base),SWS_REG(base,offset)); - outb(SWS_ADDR(base),v); -} - -#else - -static void -sws_write_reg(struct isic_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, SWS_RW, offs); - bus_space_write_1(t, h, SWS_ISAC, data); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, SWS_RW, offs); - bus_space_write_1(t, h, SWS_HSCX0, data); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, SWS_RW, 0x40+offs); - bus_space_write_1(t, h, SWS_HSCX0, data); - break; - } -} - -#endif - -/*---------------------------------------------------------------------------* - * SWS P&P ISAC get register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static u_char -sws_read_reg(u_char *base, u_int offset) -{ - outb(SWS_IDO(base),SWS_REG(base,offset)); - return inb(SWS_ADDR(base)); -} - -#else - -static u_int8_t -sws_read_reg(struct isic_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, SWS_RW, offs); - return bus_space_read_1(t, h, SWS_ISAC); - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, SWS_RW, offs); - return bus_space_read_1(t, h, SWS_HSCX0); - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, SWS_RW, 0x40+offs); - return bus_space_read_1(t, h, SWS_HSCX0); - } - return 0; -} - -#endif - -#ifdef __FreeBSD__ - -/* attach callback routine */ - -int -isic_attach_sws(struct isa_device *dev) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - - /* fill in isic_softc structure */ - - sc->readreg = sws_read_reg; - sc->writereg = sws_write_reg; - sc->readfifo = sws_read_fifo; - sc->writefifo = sws_write_fifo; - sc->clearirq = NULL; - sc->sc_unit = dev->id_unit; - sc->sc_irq = dev->id_irq; - sc->sc_port = dev->id_iobase; - sc->sc_cardtyp = CARD_TYPEP_SWS; - sc->sc_bustyp = BUS_TYPE_IOM2; - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - dev->id_msize = 0; - - ISAC_BASE = (void *) (((u_int) sc->sc_port) + SWS_ISAC); - HSCX_A_BASE = (void *) (((u_int) sc->sc_port) + SWS_HSCX0); - HSCX_B_BASE = (void *) (((u_int) sc->sc_port) + SWS_HSCX1); - - /* - * Read HSCX A/B VSTR. Expected value for the SWS PnP card is - * 0x05 ( = version 2.1 ) in the least significant bits. - */ - - if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) || - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) ) - { - printf("isic%d: HSCX VSTR test failed for SWS PnP\n", - dev->id_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - dev->id_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - dev->id_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - /* reset card */ - - outb( ((u_int) sc->sc_port) + SWS_RESON , 0x3); - DELAY(SEC_DELAY / 5); - outb( ((u_int) sc->sc_port) + SWS_RESOFF, 0); - DELAY(SEC_DELAY / 5); - - return(1); -} - -#else /* !__FreeBSD__ */ - -void -isic_attach_sws(struct isic_softc *sc) -{ - /* setup access routines */ - - sc->readreg = sws_read_reg; - sc->writereg = sws_write_reg; - - sc->readfifo = sws_read_fifo; - sc->writefifo = sws_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_SWS; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* - * Read HSCX A/B VSTR. Expected value for the SWS PnP card is - * 0x05 ( = version 2.1 ) in the least significant bits. - */ - - if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) || - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) ) - { - printf("%s: HSCX VSTR test failed for SWS PnP\n", - device_xname(sc->sc_dev)); - printf("%s: HSC0: VSTR: %#x\n", - device_xname(sc->sc_dev), HSCX_READ(0, H_VSTR)); - printf("%s: HSC1: VSTR: %#x\n", - device_xname(sc->sc_dev), HSCX_READ(1, H_VSTR)); - return; - } - - /* reset card */ - { - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t h = sc->sc_maps[0].h; - bus_space_write_1(t, h, SWS_RESON, 0x3); - DELAY(SEC_DELAY / 5); - bus_space_write_1(t, h, SWS_RESOFF, 0); - DELAY(SEC_DELAY / 5); - } -} - -#endif /* !__FreeBSD__ */ - -#endif /* ISICPNP_SEDLBAUER */ diff --git a/sys/dev/isapnp/isic_isapnp_tel_s0P.c b/sys/dev/isapnp/isic_isapnp_tel_s0P.c deleted file mode 100644 index 7d75652fab2..00000000000 --- a/sys/dev/isapnp/isic_isapnp_tel_s0P.c +++ /dev/null @@ -1,377 +0,0 @@ -/* - * Copyright (c) 1997 Andrew Gordon. All rights reserved. - * - * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * isic - I4B Siemens ISDN Chipset Driver for Teles S0 PnP - * ======================================================= - * - * EXPERIMENTAL !!! - * ================ - * - * $Id: isic_isapnp_tel_s0P.c,v 1.11 2007/10/19 12:00:32 ad Exp $ - * - * last edit-date: [Fri Jan 5 11:38:29 2001] - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_isapnp_tel_s0P.c,v 1.11 2007/10/19 12:00:32 ad Exp $"); - -#include "opt_isicpnp.h" -#ifdef ISICPNP_TEL_S0_16_3_P - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_l2.h> -#endif - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#ifndef __FreeBSD__ -static u_int8_t tels0163P_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -static void tels0163P_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static void tels0163P_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void tels0163P_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size); -void isic_attach_s0163P(struct isic_softc *sc); -#endif - - -/*---------------------------------------------------------------------------* - * Teles S0/16.3 PnP read fifo routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -tels0163P_read_fifo(void *buf, const void *base, size_t len) -{ - insb((int)base + 0x3e, (u_char *)buf, (u_int)len); -} - -#else - -static void -tels0163P_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - bus_space_read_multi_1(t, h, o + 0x3e, buf, size); -} - -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/16.3 PnP write fifo routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -tels0163P_write_fifo(void *base, const void *buf, size_t len) -{ - outsb((int)base + 0x3e, (u_char *)buf, (u_int)len); -} - -#else - -static void -tels0163P_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - bus_space_write_multi_1(t, h, o + 0x3e, buf, size); -} -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/16.3 PnP write register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -tels0163P_write_reg(u_char *base, u_int offset, u_int v) -{ - outb((int)base + offset, (u_char)v); -} - -#else - -static void -tels0163P_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - bus_space_write_1(t, h, o + offs, data); -} -#endif - -/*---------------------------------------------------------------------------* - * Teles S0/16.3 PnP read register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static u_char -tels0163P_read_reg(u_char *base, u_int offset) -{ - return (inb((int)base + offset)); -} - -#else - -static u_int8_t -tels0163P_read_reg(struct isic_softc *sc, int what, bus_size_t offs) -{ - bus_space_tag_t t = sc->sc_maps[what+1].t; - bus_space_handle_t h = sc->sc_maps[what+1].h; - bus_size_t o = sc->sc_maps[what+1].offset; - return bus_space_read_1(t, h, o + offs); -} -#endif - -/*---------------------------------------------------------------------------* - * isic_probe_s0163P - probe for Teles S0/16.3 PnP and compatibles - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -int -isic_probe_s0163P(struct isa_device *dev, unsigned int iobase2) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Teles S0/16.3 PnP!\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* check IRQ validity */ - - switch(ffs(dev->id_irq) - 1) - { - case 3: - case 5: - case 7: - case 10: - case 11: - case 12: - break; - - default: - printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/16.3 PnP!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - break; - } - sc->sc_irq = dev->id_irq; - - /* check if memory addr specified */ - - if(dev->id_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for Teles S0/16.3 PnP!\n", - dev->id_unit, (u_long)dev->id_maddr); - return(0); - } - dev->id_msize = 0; - - /* check if we got an iobase */ - - switch(dev->id_iobase) - { - case 0x580: - case 0x500: - case 0x680: - break; - - default: - printf("isic%d: Error, invalid iobase 0x%x specified for Teles S0/16.3 PnP!\n", - dev->id_unit, dev->id_iobase); - return(0); - break; - } - sc->sc_port = dev->id_iobase; - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = tels0163P_read_reg; - sc->writereg = tels0163P_write_reg; - - sc->readfifo = tels0163P_read_fifo; - sc->writefifo = tels0163P_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_163P; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - - switch(dev->id_iobase) - { - case 0x580: - ISAC_BASE = (void *) 0x580 - 0x20; - HSCX_A_BASE = (void *) 0x180 - 0x20; - HSCX_B_BASE = (void *) 0x180; - break; - - case 0x500: - ISAC_BASE = (void *) 0x500 - 0x20; - HSCX_A_BASE = (void *) 0x100 - 0x20; - HSCX_B_BASE = (void *) 0x100; - break; - - case 0x680: - ISAC_BASE = (void *) 0x680 - 0x20; - HSCX_A_BASE = (void *) 0x280 - 0x20; - HSCX_B_BASE = (void *) 0x280; - break; - } - - /* - * Read HSCX A/B VSTR. Expected value for the S0/16.3 PnP card is - * 0x05 in the least significant bits. - */ - - if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) || - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) ) - { - printf("isic%d: HSCX VSTR test failed for Teles S0/16.3 PnP\n", - dev->id_unit); - printf("isic%d: HSC0: VSTR: %#x\n", - dev->id_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: %#x\n", - dev->id_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - return (1); -} -#endif - -/*---------------------------------------------------------------------------* - * isic_attach_s0163P - attach Teles S0/16.3 PnP and compatibles - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -int -isic_attach_s0163P(struct isa_device *dev, unsigned int iobase2) -{ - outb((dev->id_iobase) + 0x1c, 0); - DELAY(SEC_DELAY / 10); - outb((dev->id_iobase) + 0x1c, 1); - DELAY(SEC_DELAY / 10); - return(1); -} - -#else - -void -isic_attach_s0163P(struct isic_softc *sc) -{ - /* init card */ - bus_space_tag_t t = sc->sc_maps[0].t; - bus_space_handle_t h = sc->sc_maps[0].h; - bus_space_write_1(t, h, 0x1c, 0); - DELAY(SEC_DELAY / 10); - bus_space_write_1(t, h, 0x1c, 1); - DELAY(SEC_DELAY / 10); - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = tels0163P_read_reg; - sc->writereg = tels0163P_write_reg; - - sc->readfifo = tels0163P_read_fifo; - sc->writefifo = tels0163P_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_163P; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; -} -#endif - -#endif /* ISICPNP_TEL_S0_16_3_P */ - diff --git a/sys/dev/pci/files.pci b/sys/dev/pci/files.pci index 92122e76206..a7f0c576f67 100644 --- a/sys/dev/pci/files.pci +++ b/sys/dev/pci/files.pci @@ -1,4 +1,4 @@ -# $NetBSD: files.pci,v 1.406 2018/09/22 12:56:16 maxv Exp $ +# $NetBSD: files.pci,v 1.407 2018/09/22 16:22:23 maxv Exp $ # # Config file and device description for machine-independent PCI code. # Included by ports that need it. Requires that the SCSI files be @@ -807,12 +807,6 @@ file dev/pci/if_malo_pci.c malo_pci attach wi at pci with wi_pci file dev/pci/if_wi_pci.c wi_pci -# ISDN devices -attach isic at pci with isic_pci -file dev/pci/isic_pci.c isic_pci - -file dev/pci/isic_pci_elsa_qs1p.c isic_pci - # IrDA devices # Toshiba Fast Infrared Type O IrDA driver device oboe: irbus, irdasir diff --git a/sys/dev/pci/isic_pci.c b/sys/dev/pci/isic_pci.c deleted file mode 100644 index 5f5bda050d3..00000000000 --- a/sys/dev/pci/isic_pci.c +++ /dev/null @@ -1,334 +0,0 @@ -/* $NetBSD: isic_pci.c,v 1.41 2016/07/14 10:19:06 msaitoh Exp $ */ - -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann <martin@NetBSD.org>. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_pci.c,v 1.41 2016/07/14 10:19:06 msaitoh Exp $"); - -#include <sys/param.h> -#include <sys/errno.h> -#include <sys/syslog.h> -#include <sys/device.h> -#include <sys/socket.h> -#include <net/if.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/callout.h> - -#include <sys/cpu.h> -#include <sys/intr.h> -#include <sys/bus.h> - - -#include <sys/bus.h> -#include <sys/intr.h> -#include <dev/pci/pcireg.h> -#include <dev/pci/pcivar.h> -#include <dev/pci/pcidevs.h> - -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_trace.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/ipac.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> -#include <dev/pci/isic_pci.h> - -extern const struct isdn_layer1_isdnif_driver isic_std_driver; - -static int isic_pci_match(device_t, cfdata_t, void *); -static void isic_pci_attach(device_t, device_t, void *); -static const struct isic_pci_product * find_matching_card(struct pci_attach_args *pa); - -static void isic_pci_isdn_attach(struct pci_isic_softc *psc, - struct pci_attach_args *pa, const char *cardname); -static int isic_pci_detach(device_t self, int flags); -static int isic_pci_activate(device_t self, enum devact act); - -CFATTACH_DECL_NEW(isic_pci, sizeof(struct pci_isic_softc), - isic_pci_match, isic_pci_attach, isic_pci_detach, isic_pci_activate); - -static const struct isic_pci_product { - pci_vendor_id_t npp_vendor; - pci_product_id_t npp_product; - int cardtype; - const char * name; - int (*attach)(struct pci_isic_softc *psc, struct pci_attach_args *pa); - void (*pciattach)(struct pci_isic_softc *psc, struct pci_attach_args *pa, const char *cardname); -} isic_pci_products[] = { - { PCI_VENDOR_ELSA, PCI_PRODUCT_ELSA_QS1PCI, - CARD_TYPEP_ELSAQS1PCI, - "ELSA QuickStep 1000pro/PCI", - isic_attach_Eqs1pp, /* card specific initialization */ - isic_pci_isdn_attach /* generic setup for ISAC/HSCX or IPAC boards */ - }, - { 0, 0, 0, NULL, NULL, NULL }, -}; - -static const struct isic_pci_product * find_matching_card( - struct pci_attach_args *pa) -{ - const struct isic_pci_product * pp = NULL; - - for (pp = isic_pci_products; pp->npp_vendor; pp++) - if (PCI_VENDOR(pa->pa_id) == pp->npp_vendor && - PCI_PRODUCT(pa->pa_id) == pp->npp_product) - return pp; - - return NULL; -} - -/* - * Match card - */ -static int -isic_pci_match(device_t parent, cfdata_t match, void *aux) -{ - struct pci_attach_args *pa = aux; - - if (!find_matching_card(pa)) - return 0; - - return 1; -} - -/* - * Attach the card - */ -static void -isic_pci_attach(device_t parent, device_t self, void *aux) -{ - struct pci_isic_softc *psc = device_private(self); - struct isic_softc *sc = &psc->sc_isic; - struct pci_attach_args *pa = aux; - const struct isic_pci_product * prod; - - aprint_naive("\n"); - sc->sc_dev = self; - - /* Redo probe */ - prod = find_matching_card(pa); - if (prod == NULL) return; /* oops - not found?!? */ - - aprint_normal(": %s\n", prod->name); - - callout_init(&sc->sc_T3_callout, 0); - callout_init(&sc->sc_T4_callout, 0); - - /* card initilization and sc setup */ - if (!prod->attach(psc, pa)) - return; - - /* generic setup, if needed for this card */ - if (prod->pciattach) - prod->pciattach(psc, pa, prod->name); -} - -/*---------------------------------------------------------------------------* - * isic - pci device driver attach routine - *---------------------------------------------------------------------------*/ -static void -isic_pci_isdn_attach(struct pci_isic_softc *psc, struct pci_attach_args *pa, - const char *cardname) -{ - struct isic_softc *sc = &psc->sc_isic; - pci_chipset_tag_t pc = pa->pa_pc; - pci_intr_handle_t ih; - const char *intrstr; - char intrbuf[PCI_INTRSTR_LEN]; - - static const 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 const char *HSCXversion[] = { - "82525 Version A1", - "Unknown (0x01)", - "82525 Version A2", - "Unknown (0x03)", - "82525 Version A3", - "82525 or 21525 Version 2.1", - "Unknown Version" - }; - - sc->sc_isac_version = 0; - sc->sc_hscx_version = 0; - - if(sc->sc_ipac) - { - u_int ret = IPAC_READ(IPAC_ID); - - switch(ret) - { - case 0x01: - printf("%s: IPAC PSB2115 Version 1.1\n", device_xname(sc->sc_dev)); - break; - - case 0x02: - printf("%s: IPAC PSB2115 Version 1.2\n", device_xname(sc->sc_dev)); - break; - - default: - printf("%s: Error, IPAC version %d unknown!\n", - device_xname(sc->sc_dev), ret); - return; - } - } - else - { - 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: - printf("%s: ISAC %s (IOM-%c)\n", - device_xname(sc->sc_dev), - ISACversion[sc->sc_isac_version], - sc->sc_bustyp == BUS_TYPE_IOM1 ? '1' : '2'); - break; - - default: - printf("%s: Error, ISAC version %d unknown!\n", - device_xname(sc->sc_dev), sc->sc_isac_version); - return; - } - - 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: - printf("%s: HSCX %s\n", - device_xname(sc->sc_dev), - HSCXversion[sc->sc_hscx_version]); - break; - - default: - printf("%s: Error, HSCX version %d unknown!\n", - device_xname(sc->sc_dev), sc->sc_hscx_version); - return; - } - } - - /* Map and establish the interrupt. */ - if (pci_intr_map(pa, &ih)) { - aprint_error_dev(sc->sc_dev, "couldn't map interrupt\n"); - return; - } - intrstr = pci_intr_string(pc, ih, intrbuf, sizeof(intrbuf)); - psc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, isic_intr_qs1p, psc); - if (psc->sc_ih == NULL) { - aprint_error_dev(sc->sc_dev, "couldn't establish interrupt"); - if (intrstr != NULL) - aprint_error(" at %s", intrstr); - aprint_error("\n"); - return; - } - psc->sc_pc = pc; - aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr); - - sc->sc_intr_valid = ISIC_INTR_DISABLED; - - /* HSCX setup */ - - isic_bchannel_setup(sc, HSCX_CH_A, BPROT_NONE, 0); - - isic_bchannel_setup(sc, 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; - - /* init higher protocol layers */ - isic_attach_bri(sc, cardname, &isic_std_driver); -} - - -static int -isic_pci_detach(device_t self, int flags) -{ - struct pci_isic_softc *psc = device_private(self); - - bus_space_unmap(psc->sc_isic.sc_maps[0].t, psc->sc_isic.sc_maps[0].h, - psc->sc_size); - bus_space_free(psc->sc_isic.sc_maps[0].t, psc->sc_isic.sc_maps[0].h, - psc->sc_size); - pci_intr_disestablish(psc->sc_pc, psc->sc_ih); - - return (0); -} - -static int -isic_pci_activate(device_t self, enum devact act) -{ - struct pci_isic_softc *psc = device_private(self); - - switch (act) { - case DVACT_DEACTIVATE: - psc->sc_isic.sc_intr_valid = ISIC_INTR_DYING; - isic_detach_bri(&psc->sc_isic); - return 0; - default: - return EOPNOTSUPP; - } -} diff --git a/sys/dev/pci/isic_pci.h b/sys/dev/pci/isic_pci.h deleted file mode 100644 index 6f9d7cbcb09..00000000000 --- a/sys/dev/pci/isic_pci.h +++ /dev/null @@ -1,50 +0,0 @@ -/* $NetBSD: isic_pci.h,v 1.11 2008/04/28 20:23:55 martin Exp $ */ - -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann <martin@NetBSD.org>. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -struct pci_isic_softc { - struct isic_softc sc_isic; /* parent class, must be first */ - - /* PCI-specific goo */ - void *sc_ih; /* interrupt handler */ - bus_addr_t sc_base; - bus_size_t sc_size; - pci_chipset_tag_t sc_pc; - int flags; -#define PCIISIC_LCROK 0x01 - - /* status LED handling */ - struct callout ledcallout; - u_int8_t ledstat, ledblinkmask; - int ledblinkfreq; -}; - -extern int isic_attach_Eqs1pp(struct pci_isic_softc *psc, struct pci_attach_args *pa); -extern int isic_intr_qs1p(void *); diff --git a/sys/dev/pci/isic_pci_elsa_qs1p.c b/sys/dev/pci/isic_pci_elsa_qs1p.c deleted file mode 100644 index 8cfedae33e7..00000000000 --- a/sys/dev/pci/isic_pci_elsa_qs1p.c +++ /dev/null @@ -1,365 +0,0 @@ -/* $NetBSD: isic_pci_elsa_qs1p.c,v 1.20 2012/10/27 17:18:34 chs Exp $ */ - -/* - * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * isic - I4B Siemens ISDN Chipset Driver for ELSA Quickstep 1000pro PCI - * ===================================================================== - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_pci_elsa_qs1p.c,v 1.20 2012/10/27 17:18:34 chs Exp $"); - -#include <sys/param.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <net/if.h> -#include <sys/callout.h> - -#include <sys/bus.h> -#include <sys/device.h> - -#include <dev/pci/pcireg.h> -#include <dev/pci/pcivar.h> -#include <dev/pci/pcidevs.h> - -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> -#include <dev/ic/ipac.h> -#include <dev/pci/isic_pci.h> - -/* masks for register encoded in base addr */ - -#define ELSA_BASE_MASK 0x0ffff -#define ELSA_OFF_MASK 0xf0000 - -/* register id's to be encoded in base addr */ - -#define ELSA_IDISAC 0x00000 -#define ELSA_IDHSCXA 0x10000 -#define ELSA_IDHSCXB 0x20000 -#define ELSA_IDIPAC 0x40000 - -/* offsets from base address */ - -#define ELSA_OFF_ALE 0x00 -#define ELSA_OFF_RW 0x01 - -/* LED values */ -#define ELSA_NO_LED 0xff -#define ELSA_GREEN_LED 0x40 -#define ELSA_YELLOW_LED 0x80 - -#define ELSA_PORT0_MEM_MAPOFF PCI_MAPREG_START -#define ELSA_PORT0_IO_MAPOFF PCI_MAPREG_START+4 -#define ELSA_PORT1_MAPOFF PCI_MAPREG_START+12 - - -static void elsa_cmd_req(struct isic_softc *sc, int cmd, void *data); -static void elsa_led_handler(void *token); - -/*---------------------------------------------------------------------------* - * ELSA QuickStep 1000pro/PCI ISAC get fifo routine - *---------------------------------------------------------------------------*/ - -static void -eqs1pp_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[1].t; - bus_space_handle_t h = sc->sc_maps[1].h; - switch (what) { - case ISIC_WHAT_ISAC: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_ISAC_OFF); - bus_space_read_multi_1(t, h, ELSA_OFF_RW, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_HSCXA_OFF); - bus_space_read_multi_1(t, h, ELSA_OFF_RW, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_HSCXB_OFF); - bus_space_read_multi_1(t, h, ELSA_OFF_RW, buf, size); - break; - } -} - -/*---------------------------------------------------------------------------* - * ELSA QuickStep 1000pro/PCI ISAC put fifo routine - *---------------------------------------------------------------------------*/ - -static void -eqs1pp_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size) -{ - bus_space_tag_t t = sc->sc_maps[1].t; - bus_space_handle_t h = sc->sc_maps[1].h; - switch (what) { - case ISIC_WHAT_ISAC: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_ISAC_OFF); - bus_space_write_multi_1(t, h, ELSA_OFF_RW, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_HSCXA_OFF); - bus_space_write_multi_1(t, h, ELSA_OFF_RW, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_HSCXB_OFF); - bus_space_write_multi_1(t, h, ELSA_OFF_RW, buf, size); - break; - } -} - -/*---------------------------------------------------------------------------* - * ELSA QuickStep 1000pro/PCI ISAC put register routine - *---------------------------------------------------------------------------*/ - -static void -eqs1pp_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data) -{ - bus_space_tag_t t = sc->sc_maps[1].t; - bus_space_handle_t h = sc->sc_maps[1].h; - switch (what) { - case ISIC_WHAT_ISAC: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_ISAC_OFF+offs); - bus_space_write_1(t, h, ELSA_OFF_RW, data); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_HSCXA_OFF+offs); - bus_space_write_1(t, h, ELSA_OFF_RW, data); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_HSCXB_OFF+offs); - bus_space_write_1(t, h, ELSA_OFF_RW, data); - break; - case ISIC_WHAT_IPAC: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_IPAC_OFF+offs); - bus_space_write_1(t, h, ELSA_OFF_RW, data); - break; - } -} - -/*---------------------------------------------------------------------------* - * ELSA QuickStep 1000pro/PCI ISAC get register routine - *---------------------------------------------------------------------------*/ - -static u_int8_t -eqs1pp_read_reg(struct isic_softc *sc, int what, bus_size_t offs) -{ - bus_space_tag_t t = sc->sc_maps[1].t; - bus_space_handle_t h = sc->sc_maps[1].h; - switch (what) { - case ISIC_WHAT_ISAC: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_ISAC_OFF+offs); - return bus_space_read_1(t, h, ELSA_OFF_RW); - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_HSCXA_OFF+offs); - return bus_space_read_1(t, h, ELSA_OFF_RW); - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_HSCXB_OFF+offs); - return bus_space_read_1(t, h, ELSA_OFF_RW); - case ISIC_WHAT_IPAC: - { - bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_IPAC_OFF+offs); - return bus_space_read_1(t, h, ELSA_OFF_RW); - } - } - - return 0; -} - -/*---------------------------------------------------------------------------* - * isic_attach_Eqs1pp - attach for ELSA QuickStep 1000pro/PCI - *---------------------------------------------------------------------------*/ - -int -isic_attach_Eqs1pp(struct pci_isic_softc *psc, struct pci_attach_args *pa) -{ - struct isic_softc *sc = &psc->sc_isic; - - /* setup io mappings */ - sc->sc_num_mappings = 2; - MALLOC_MAPS(sc); - sc->sc_maps[0].size = 0; - if (pci_mapreg_map(pa, ELSA_PORT0_MEM_MAPOFF, PCI_MAPREG_TYPE_MEM, 0, - &sc->sc_maps[0].t, &sc->sc_maps[0].h, &psc->sc_base, &psc->sc_size) != 0 - && pci_mapreg_map(pa, ELSA_PORT0_IO_MAPOFF, PCI_MAPREG_TYPE_IO, 0, - &sc->sc_maps[0].t, &sc->sc_maps[0].h, &psc->sc_base, &psc->sc_size) != 0) { - aprint_error_dev(sc->sc_dev, "can't map card registers\n"); - return (0); - } - - /* PLX9050 Errata #1 */ - if (PCI_REVISION(pa->pa_class) == 1 && psc->sc_base & 0x00000080) { -#ifdef DEBUG - printf("%s: no LCR access\n", device_xname(sc->sc_dev)); -#endif - } else - psc->flags |= PCIISIC_LCROK; - - sc->sc_maps[1].size = 0; - if (pci_mapreg_map(pa, ELSA_PORT1_MAPOFF, PCI_MAPREG_TYPE_IO, 0, - &sc->sc_maps[1].t, &sc->sc_maps[1].h, NULL, NULL)) { - aprint_error_dev(sc->sc_dev, "can't map i/o space\n"); - return (0); - } - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = eqs1pp_read_reg; - sc->writereg = eqs1pp_write_reg; - - sc->readfifo = eqs1pp_read_fifo; - sc->writefifo = eqs1pp_write_fifo; - - sc->drv_command = elsa_cmd_req; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_ELSAQS1PCI; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - /* setup chip type = IPAC ! */ - - sc->sc_ipac = 1; - sc->sc_bfifolen = IPAC_BFIFO_LEN; - - 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, ELSA_NO_LED); /* set all output lines high */ - callout_init(&((struct pci_isic_softc *)sc)->ledcallout, 0); - - /* disable any interrupts */ - IPAC_WRITE(IPAC_MASK, 0xff); - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, 0x4c, 0x01); - - return (1); -} - -int -isic_intr_qs1p(void *vsc) -{ - struct pci_isic_softc *psc = vsc; - struct isic_softc *sc = &psc->sc_isic; - u_int32_t intcsr; - - /* - * if we are not hit by the PLX bug we can try a shortcut - * (should improve speed for shared IRQs) - */ - if (psc->flags & PCIISIC_LCROK) { - intcsr = bus_space_read_4(sc->sc_maps[0].t, sc->sc_maps[0].h, - 0x4c /* INTCSR */); - if (!(intcsr & 0x4 /* LINTi1STAT */)) - return (0); - } - - return (isicintr(sc)); -} - -static void -elsa_cmd_req(struct isic_softc *sc, int cmd, void *data) -{ - intptr_t v; - int s; - struct pci_isic_softc *psc = (struct pci_isic_softc *)sc; - - switch (cmd) { - case CMR_DOPEN: - s = splnet(); - /* enable hscx/isac irq's */ - IPAC_WRITE(IPAC_MASK, (IPAC_MASK_INT1 | IPAC_MASK_INT0)); - /* enable card interrupt */ - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, 0x4c, 0x41); - splx(s); - break; - case CMR_DCLOSE: - s = splnet(); - callout_stop(&psc->ledcallout); - IPAC_WRITE(IPAC_ATX, ELSA_NO_LED); - IPAC_WRITE(IPAC_MASK, 0xff); - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, 0x4c, 0x01); - splx(s); - break; - case CMR_SETLEDS: - v = (intptr_t)data; - callout_stop(&psc->ledcallout); - - /* the magic value and keep reset off */ - psc->ledstat = ELSA_NO_LED; - psc->ledblinkmask = 0; - psc->ledblinkfreq = 0; - - /* now see what LEDs we want to add */ - if (v & CMRLEDS_TEI) - psc->ledstat &= ~ELSA_GREEN_LED; - - if (v & (CMRLEDS_B0|CMRLEDS_B1)) { - psc->ledstat &= ~ELSA_YELLOW_LED; - psc->ledblinkmask |= ELSA_YELLOW_LED; - if ((v & (CMRLEDS_B0|CMRLEDS_B1)) - == (CMRLEDS_B0|CMRLEDS_B1)) - psc->ledblinkfreq = hz/4; - else - psc->ledblinkfreq = hz; - } - - elsa_led_handler(psc); - break; - } -} - -static void -elsa_led_handler(void *token) -{ - struct pci_isic_softc *psc = token; - struct isic_softc *sc = token; /* XXX */ - int s; - - s = splnet(); - IPAC_WRITE(IPAC_ATX, psc->ledstat); - splx(s); - if (psc->ledblinkfreq) { - psc->ledstat ^= psc->ledblinkmask; - callout_reset(&psc->ledcallout, psc->ledblinkfreq, - elsa_led_handler, psc); - } -} diff --git a/sys/dev/pcmcia/files.pcmcia b/sys/dev/pcmcia/files.pcmcia index b194842395b..d528cb50ac3 100644 --- a/sys/dev/pcmcia/files.pcmcia +++ b/sys/dev/pcmcia/files.pcmcia @@ -1,4 +1,4 @@ -# $NetBSD: files.pcmcia,v 1.58 2012/08/25 08:20:03 kiyohara Exp $ +# $NetBSD: files.pcmcia,v 1.59 2018/09/22 16:22:23 maxv Exp $ # # Config.new file and device description for machine-independent PCMCIA code. # Included by ports that need it. @@ -115,18 +115,6 @@ file dev/pcmcia/if_cs_pcmcia.c cs_pcmcia attach an at pcmcia with an_pcmcia file dev/pcmcia/if_an_pcmcia.c an_pcmcia -# ISDN devices -attach isic at pcmcia with isic_pcmcia -file dev/pcmcia/isic_pcmcia.c isic_pcmcia - -defflag opt_isicpcmcia.h ISICPCMCIA_AVM_A1 ISICPCMCIA_ELSA_ISDNMC - ISICPCMCIA_ELSA_MCALL ISICPCMCIA_SBSPEEDSTAR2 - -file dev/pcmcia/isic_pcmcia_avm_fritz.c isic_pcmcia -file dev/pcmcia/isic_pcmcia_elsa_isdnmc.c isic_pcmcia -file dev/pcmcia/isic_pcmcia_elsa_mcall.c isic_pcmcia -file dev/pcmcia/isic_pcmcia_sbspeedstar2.c isic_pcmcia - # 3Com Bluetooth controller 3CRW6096 device bt3c: btbus, bluetooth, firmload attach bt3c at pcmcia diff --git a/sys/dev/pcmcia/isic_pcmcia.c b/sys/dev/pcmcia/isic_pcmcia.c deleted file mode 100644 index f95d9724364..00000000000 --- a/sys/dev/pcmcia/isic_pcmcia.c +++ /dev/null @@ -1,413 +0,0 @@ -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann <martin@NetBSD.org>. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_pcmcia.c,v 1.43 2016/07/14 09:27:14 msaitoh Exp $"); - -#include <sys/param.h> -#include <sys/errno.h> -#include <sys/syslog.h> -#include <sys/device.h> -#include <sys/socket.h> -#include <net/if.h> -#include <sys/systm.h> -#include <sys/malloc.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#include <sys/cpu.h> -#include <sys/intr.h> -#include <sys/bus.h> - -#include <dev/pcmcia/pcmciareg.h> -#include <dev/pcmcia/pcmciavar.h> -#include <dev/pcmcia/pcmciadevs.h> - -#ifdef __FreeBSD__ -#include <machine/i4b_ioctl.h> -#include <machine/i4b_trace.h> -#else -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_trace.h> -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#endif - -#include <dev/ic/isic_l1.h> -#include <dev/ic/ipac.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_global.h> - -#include <dev/pcmcia/isic_pcmcia.h> - -#include "opt_isicpcmcia.h" - -extern const struct isdn_layer1_isdnif_driver isic_std_driver; - -static int isic_pcmcia_match(device_t, cfdata_t, void *); -static void isic_pcmcia_attach(device_t, device_t, void *); -static const struct isic_pcmcia_card_entry * find_matching_card( - struct pcmcia_attach_args *pa); -static int isic_pcmcia_isdn_attach(struct isic_softc *sc, const char*); -static int isic_pcmcia_detach(device_t self, int flags); -static int isic_pcmcia_activate(device_t self, enum devact act); - -CFATTACH_DECL_NEW(isic_pcmcia, sizeof(struct pcmcia_isic_softc), - isic_pcmcia_match, isic_pcmcia_attach, - isic_pcmcia_detach, isic_pcmcia_activate); - -struct isic_pcmcia_card_entry { - int32_t vendor; /* vendor ID */ - int32_t product; /* product ID */ - const char *cis1_info[4]; /* CIS info to match */ - const char *name; /* name of controller */ - int function; /* expected PCMCIA function type */ - int card_type; /* card type found */ - isic_pcmcia_attach_func attach; /* card initialization */ -}; - -static const struct isic_pcmcia_card_entry card_list[] = { - -#ifdef ISICPCMCIA_AVM_A1 - { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID, - { "AVM", "ISDN A", NULL, NULL }, - "AVM Fritz!Card", PCMCIA_FUNCTION_NETWORK, - CARD_TYPEP_PCFRITZ, isic_attach_fritzpcmcia }, -#endif - -#ifdef ISICPCMCIA_ELSA_ISDNMC - { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID, - { "ELSA GmbH, Aachen", "MicroLink ISDN/MC ", NULL, NULL }, - "ELSA MicroLink ISDN/MC", PCMCIA_FUNCTION_NETWORK, - CARD_TYPEP_ELSAMLIMC, isic_attach_elsaisdnmc }, - { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID, - { "ELSA AG, Aachen", "MicroLink ISDN/MC ", NULL, NULL }, - "ELSA MicroLink ISDN/MC", PCMCIA_FUNCTION_NETWORK, - CARD_TYPEP_ELSAMLIMC, isic_attach_elsaisdnmc }, - { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID, - { "ELSA AG (Aachen, Germany)", "MicroLink ISDN/MC ", NULL, NULL }, - "ELSA MicroLink ISDN/MC", PCMCIA_FUNCTION_NETWORK, - CARD_TYPEP_ELSAMLIMC, isic_attach_elsaisdnmc }, -#endif - -#ifdef ISICPCMCIA_ELSA_MCALL - { 0x105, 0x410a, - { "ELSA", "MicroLink MC all", NULL, NULL }, - "ELSA MicroLink MCall", PCMCIA_FUNCTION_NETWORK, - CARD_TYPEP_ELSAMLMCALL, isic_attach_elsamcall }, -#endif - -#ifdef ISICPCMCIA_SBSPEEDSTAR2 - { 0x020e, 0x0002, - { "SEDLBAUER", "speed star II", NULL, NULL }, - "SEDLBAUER speed star II", PCMCIA_FUNCTION_NETWORK, - CARD_TYPEP_SWS, isic_attach_sbspeedstar2 }, -#endif - -}; -#define NUM_MATCH_ENTRIES (sizeof(card_list)/sizeof(card_list[0])) - -static const struct isic_pcmcia_card_entry * -find_matching_card(struct pcmcia_attach_args *pa) -{ - int i, j; - - for (i = 0; i < NUM_MATCH_ENTRIES; i++) { - if (card_list[i].vendor != PCMCIA_VENDOR_INVALID - && pa->card->manufacturer != card_list[i].vendor) - continue; - if (card_list[i].product != PCMCIA_PRODUCT_INVALID - && pa->card->product != card_list[i].product) - continue; - if (pa->pf->function != card_list[i].function) - continue; - for (j = 0; j < 4; j++) { - if (card_list[i].cis1_info[j] == NULL) - continue; /* wildcard */ - if (pa->card->cis1_info[j] == NULL) - break; /* not available */ - if (strcmp(pa->card->cis1_info[j], - card_list[i].cis1_info[j]) != 0) - break; /* mismatch */ - } - if (j >= 4) - break; - } - if (i >= NUM_MATCH_ENTRIES) - return NULL; - - return &card_list[i]; -} - -/* - * Match card - */ -static int -isic_pcmcia_match(device_t parent, cfdata_t match, void *aux) -{ - struct pcmcia_attach_args *pa = aux; - - if (!find_matching_card(pa)) - return 0; - - return 1; -} - -/* - * Attach the card - */ -static void -isic_pcmcia_attach(device_t parent, device_t self, void *aux) -{ - struct pcmcia_isic_softc *psc = device_private(self); - struct isic_softc *sc = &psc->sc_isic; - struct pcmcia_attach_args *pa = aux; - struct pcmcia_config_entry *cfe; - const struct isic_pcmcia_card_entry * cde; - - sc->sc_dev = self; - psc->sc_pf = pa->pf; - cfe = SIMPLEQ_FIRST(&pa->pf->cfe_head); - psc->sc_ih = NULL; - - aprint_naive("\n"); - /* Which card is it? */ - cde = find_matching_card(pa); - if (cde == NULL) { - aprint_error_dev(self, - "attach failed, couldn't find matching card\n"); - return; - } - aprint_normal_dev(self, "%s\n", cde->name); - - /* Enable the card */ - pcmcia_function_init(pa->pf, cfe); - psc->sc_ih = pcmcia_intr_establish(pa->pf, IPL_NET, isicintr, sc); - pcmcia_function_enable(pa->pf); - - if (!cde->attach(psc, cfe, pa)) { - aprint_error_dev(self, - "attach failed, card-specific attach unsuccesful\n"); - goto fail; - } - - /* MI initilization */ - sc->sc_cardtyp = cde->card_type; - if (isic_pcmcia_isdn_attach(sc, cde->name)) { - aprint_error_dev(self, - "attach failed, generic attach unsuccesful\n"); - goto fail; - } - - return; - -fail: - pcmcia_function_disable(psc->sc_pf); - pcmcia_intr_disestablish(psc->sc_pf, psc->sc_ih); -} - -static int -isic_pcmcia_detach(device_t self, int flags) -{ - struct pcmcia_isic_softc *psc = device_private(self); - - pcmcia_function_disable(psc->sc_pf); - pcmcia_io_unmap(psc->sc_pf, psc->sc_io_window); - pcmcia_io_free(psc->sc_pf, &psc->sc_pcioh); - if (psc->sc_ih != NULL) - pcmcia_intr_disestablish(psc->sc_pf, psc->sc_ih); - - return (0); -} - -int -isic_pcmcia_activate(device_t self, enum devact act) -{ - struct pcmcia_isic_softc *psc = device_private(self); - - switch (act) { - case DVACT_DEACTIVATE: - psc->sc_isic.sc_intr_valid = ISIC_INTR_DYING; - if (psc->sc_isic.sc_l3token != NULL) - isic_detach_bri(&psc->sc_isic); - return 0; - default: - return EOPNOTSUPP; - } -} - -/*---------------------------------------------------------------------------* - * card independend attach for pcmicia cards - *---------------------------------------------------------------------------*/ - -/* parameter and format for message producing e.g. "isic0: " */ - -#ifdef __FreeBSD__ -#define ISIC_FMT "isic%d: " -#define ISIC_PARM dev->id_unit -#define TERMFMT " " -#else -#define ISIC_FMT "%s: " -#define ISIC_PARM device_xname(sc->sc_dev) -#define TERMFMT "\n" -#endif - -int -isic_pcmcia_isdn_attach(struct isic_softc *sc, const char *cardname) -{ - static const 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 const char *HSCXversion[] = { - "82525 Version A1", - "Unknown (0x01)", - "82525 Version A2", - "Unknown (0x03)", - "82525 Version A3", - "82525 or 21525 Version 2.1", - "Unknown Version" - }; - - sc->sc_l3token = NULL; - 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(EIO); - } - - 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(EIO); - }; - - sc->sc_intr_valid = ISIC_INTR_DISABLED; - - /* HSCX setup */ - - isic_bchannel_setup(sc, HSCX_CH_A, BPROT_NONE, 0); - - isic_bchannel_setup(sc, 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(__NetBSD__) && __NetBSD_Version__ >= 104230000 - callout_init(&sc->sc_T3_callout, 0); - callout_init(&sc->sc_T4_callout, 0); -#endif - - /* 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'); - } - - 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]); - } - - /* init higher protocol layers */ - isic_attach_bri(sc, cardname, &isic_std_driver); - - return(0); -} - diff --git a/sys/dev/pcmcia/isic_pcmcia.h b/sys/dev/pcmcia/isic_pcmcia.h deleted file mode 100644 index b725268747c..00000000000 --- a/sys/dev/pcmcia/isic_pcmcia.h +++ /dev/null @@ -1,50 +0,0 @@ -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann <martin@NetBSD.org>. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -struct pcmcia_isic_softc { - struct isic_softc sc_isic; /* parent class */ - - /* PCMCIA-specific goo */ - struct pcmcia_io_handle sc_pcioh; /* PCMCIA i/o space info */ - int sc_io_window; /* our i/o window */ - struct pcmcia_function *sc_pf; /* our PCMCIA function */ - void *sc_ih; /* interrupt handler */ -}; - -typedef int (*isic_pcmcia_attach_func)(struct pcmcia_isic_softc *, - struct pcmcia_config_entry *, struct pcmcia_attach_args *); - -extern int isic_attach_fritzpcmcia(struct pcmcia_isic_softc *, - struct pcmcia_config_entry *, struct pcmcia_attach_args *); -extern int isic_attach_elsaisdnmc(struct pcmcia_isic_softc *, - struct pcmcia_config_entry *, struct pcmcia_attach_args *); -extern int isic_attach_elsamcall(struct pcmcia_isic_softc *, - struct pcmcia_config_entry *, struct pcmcia_attach_args *); -extern int isic_attach_sbspeedstar2(struct pcmcia_isic_softc *, - struct pcmcia_config_entry *, struct pcmcia_attach_args *); diff --git a/sys/dev/pcmcia/isic_pcmcia_avm_fritz.c b/sys/dev/pcmcia/isic_pcmcia_avm_fritz.c deleted file mode 100644 index 31b7e42c4a1..00000000000 --- a/sys/dev/pcmcia/isic_pcmcia_avm_fritz.c +++ /dev/null @@ -1,494 +0,0 @@ -/* - * Copyright (c) 1998 Matthias Apitz. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * 4. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software and/or documentation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - *--------------------------------------------------------------------------- - * - * Fritz!Card pcmcia specific routines for isic driver - * --------------------------------------------------- - * - * $Id: isic_pcmcia_avm_fritz.c,v 1.12 2007/10/19 12:01:05 ad Exp $ - * - * last edit-date: [Fri Jan 5 11:39:32 2001] - * - * -ap added support for AVM PCMCIA Fritz!Card - * -mh split into separate file - * - *---------------------------------------------------------------------------*/ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_pcmcia_avm_fritz.c,v 1.12 2007/10/19 12:01:05 ad Exp $"); - -#include "opt_isicpcmcia.h" -#ifdef ISICPCMCIA_AVM_A1 - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <dev/pcmcia/pcmciareg.h> -#include <dev/pcmcia/pcmciavar.h> -#endif - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#ifndef __FreeBSD__ -#include <dev/pcmcia/isic_pcmcia.h> - -/* PCMCIA support routines */ -static u_int8_t avma1_pcmcia_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -static void avma1_pcmcia_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static void avma1_pcmcia_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void avma1_pcmcia_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size); -#endif - -/*---------------------------------------------------------------------------* - * AVM PCMCIA Fritz!Card special registers - *---------------------------------------------------------------------------*/ - -/* - * register offsets from i/o base 0x140 or 0x300 - */ -#define ADDR_REG_OFFSET 0x02 -#define DATA_REG_OFFSET 0x03 -#define STAT0_OFFSET 0x04 -#define STAT1_OFFSET 0x05 -#define MODREG_OFFSET 0x06 -#define VERREG_OFFSET 0x07 -/* - * AVM PCMCIA Status Latch 0 read only bits - */ -#define ASL_IRQ_TIMER 0x10 /* Timer interrupt, active low */ -#define ASL_IRQ_ISAC 0x20 /* ISAC interrupt, active low */ -#define ASL_IRQ_HSCX 0x40 /* HSX interrupt, active low */ -#define ASL_IRQ_BCHAN ASL_IRQ_HSCX -#define ASL_IRQ_Pending (ASL_IRQ_ISAC | ASL_IRQ_HSCX | ASL_IRQ_TIMER) -/* - * AVM Status Latch 0 write only bits - */ -#define ASL_RESET_ALL 0x01 /* reset siemens IC's, active 1 */ -#define ASL_TIMERDISABLE 0x02 /* active high */ -#define ASL_TIMERRESET 0x04 /* active high */ -#define ASL_ENABLE_INT 0x08 /* active high */ -/* - * AVM Status Latch 1 write only bits - */ -#define ASL1_LED0 0x10 /* active high */ -#define ASL1_LED1 0x20 /* active high */ - -#define ASL1_ENABLE_S0 0xc0 /* enable active S0 I/F */ - -/*----- EEpromless controller -----*/ -/* - * AVM Status Latch read/write bit - */ - -#define ASL_TESTBIT 0x80 - - -/*---------------------------------------------------------------------------* - * AVM read fifo routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static int PCMCIA_IO_BASE = 0; /* ap: XXX hack */ -static void -avma1_pcmcia_read_fifo(void *buf, const void *base, size_t len) -{ - outb(PCMCIA_IO_BASE + ADDR_REG_OFFSET, (int)base - 0x20); - insb(PCMCIA_IO_BASE + DATA_REG_OFFSET, (u_char *)buf, (u_int)len); -} -#else -/* offsets of the different 'what' arguments */ -static u_int8_t what_map[] = { - 0x20-0x20, /* ISIC_WHAT_ISAC */ - 0xA0-0x20, /* ISIC_WHAT_HSCXA */ - 0xE0-0x20 /* ISIC_WHAT_HSCXB */ -}; -static void -avma1_pcmcia_read_fifo(struct isic_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; - bus_space_write_1(t, h, ADDR_REG_OFFSET, what_map[what]); - bus_space_read_multi_1(t, h, DATA_REG_OFFSET, buf, size); -} -#endif - -/*---------------------------------------------------------------------------* - * AVM write fifo routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -avma1_pcmcia_write_fifo(void *base, const void *buf, size_t len) -{ - outb(PCMCIA_IO_BASE + ADDR_REG_OFFSET, (int)base - 0x20); - outsb(PCMCIA_IO_BASE + DATA_REG_OFFSET, (u_char *)buf, (u_int)len); -} -#else -static void -avma1_pcmcia_write_fifo(struct isic_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; - bus_space_write_1(t, h, ADDR_REG_OFFSET, what_map[what]); - bus_space_write_multi_1(t, h, DATA_REG_OFFSET, buf, size); -} -#endif - -/*---------------------------------------------------------------------------* - * AVM write register routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -avma1_pcmcia_write_reg(u_char *base, u_int offset, u_int v) -{ - /* offset includes 0x20 FIFO ! */ - outb(PCMCIA_IO_BASE + ADDR_REG_OFFSET, (int)base+offset-0x20); - outb(PCMCIA_IO_BASE + DATA_REG_OFFSET, (u_char)v); -} -#else -static void -avma1_pcmcia_write_reg(struct isic_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; - bus_space_write_1(t, h, ADDR_REG_OFFSET, what_map[what]+offs); - bus_space_write_1(t, h, DATA_REG_OFFSET, data); -} -#endif - -/*---------------------------------------------------------------------------* - * AVM read register routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static u_char -avma1_pcmcia_read_reg(u_char *base, u_int offset) -{ - /* offset includes 0x20 FIFO ! */ - outb(PCMCIA_IO_BASE + ADDR_REG_OFFSET, (int)base+offset-0x20); - return (inb(PCMCIA_IO_BASE + DATA_REG_OFFSET)); -} -#else -static u_int8_t -avma1_pcmcia_read_reg(struct isic_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; - bus_space_write_1(t, h, ADDR_REG_OFFSET, what_map[what]+offs); - return bus_space_read_1(t, h, DATA_REG_OFFSET); -} -#endif - -/*---------------------------------------------------------------------------* - * isic_probe_avma1_pcmcia - probe for AVM PCMCIA Fritz!Card - * This is in the bus attachemnt part on NetBSD (isic_pcmcia.c), no - * card specicfic probe is needed on direct config buses like pcmcia. - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -int -isic_probe_avma1_pcmcia(struct isa_device *dev) -{ - struct isic_softc *sc = &l1_sc[dev->id_unit]; - u_char byte; - int i; - u_int cardinfo; - - /* check max unit range */ - - if(dev->id_unit > 1) - { - printf("isic%d: Error, unit %d > MAXUNIT for AVM PCMCIA Fritz!Card\n", - dev->id_unit, dev->id_unit); - return(0); - } - sc->sc_unit = dev->id_unit; - - /* - * we trust the IRQ we got from PCCARD service - */ - sc->sc_irq = dev->id_irq; - - /* check if we got an iobase */ - - switch(dev->id_iobase) - { - case 0x140: - case 0x300: - break; - default: - printf("isic%d: Error, invalid iobase 0x%x specified for AVM PCMCIA Fritz!Card.\n", - dev->id_unit, dev->id_iobase); - return(0); - break; - } - sc->sc_port = dev->id_iobase; - - /* ResetController */ - - outb(dev->id_iobase + STAT0_OFFSET, 0x00); - DELAY(SEC_DELAY / 20); - outb(dev->id_iobase + STAT0_OFFSET, 0x01); - DELAY(SEC_DELAY / 20); - outb(dev->id_iobase + STAT0_OFFSET, 0x00); - - /* - * CheckController - * The logic to check for the PCMCIA was adapted as - * described by AVM. - */ - - outb(dev->id_iobase + ADDR_REG_OFFSET, 0x21); /* ISAC STAR */ - if ( (byte=inb(dev->id_iobase + DATA_REG_OFFSET) & 0xfd) != 0x48 ) - { - printf("isic%d: Error, ISAC STAR for AVM PCMCIA is 0x%0x (should be 0x48)\n", - dev->id_unit, byte); - return(0); - } - - outb(dev->id_iobase + ADDR_REG_OFFSET, 0xa1); /* HSCX STAR */ - if ( (byte=inb(dev->id_iobase + DATA_REG_OFFSET) & 0xfd) != 0x48 ) - { - printf("isic%d: Error, HSCX STAR for AVM PCMCIA is 0x%0x (should be 0x48)\n", - dev->id_unit, byte); - return(0); - } - - byte = ASL_TESTBIT; - for (i=0; i<256; i++) { - byte = byte ? 0 : ASL_TESTBIT; - outb(dev->id_iobase + STAT0_OFFSET, byte); - if ((inb(dev->id_iobase+STAT0_OFFSET)&ASL_TESTBIT)!=byte) { - printf("isic%d: Error during toggle of AVM PCMCIA Status Latch0\n", - dev->id_unit); - return(0); - } - } - - sc->clearirq = NULL; - sc->readreg = avma1_pcmcia_read_reg; - sc->writereg = avma1_pcmcia_write_reg; - - sc->readfifo = avma1_pcmcia_read_fifo; - sc->writefifo = avma1_pcmcia_write_fifo; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; /* ap: XXX ??? */ - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* setup ISAC and HSCX base addr */ - /* - * NOTE: for PCMCIA these are no real addrs; they are - * offsets to be written into the base+ADDR_REG_OFFSET register - * to pick up the values of the bytes fro base+DATA_REG_OFFSET - * - * see also the logic in the avma1_pcmcia_* routines; - * therefore we also must have the base addr in some static - * space or struct; XXX better solution? - */ - - PCMCIA_IO_BASE = dev->id_iobase; - ISAC_BASE = (void *)0x20; - - HSCX_A_BASE = (void *)0xA0; - HSCX_B_BASE = (void *)0xE0; - - /* - * Read HSCX A/B VSTR. - * Expected value for AVM A1 is 0x04 or 0x05 and for the - * AVM Fritz!Card is 0x05 in the least significant bits. - */ - - if( (((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) && - ((HSCX_READ(0, H_VSTR) & 0xf) != 0x4)) || - (((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) && - ((HSCX_READ(1, H_VSTR) & 0xf) != 0x4)) ) - { - printf("isic%d: HSCX VSTR test failed for AVM PCMCIA Fritz!Card\n", - dev->id_unit); - printf("isic%d: HSC0: VSTR: 0x%0x\n", - dev->id_unit, HSCX_READ(0, H_VSTR)); - printf("isic%d: HSC1: VSTR: 0x%0x\n", - dev->id_unit, HSCX_READ(1, H_VSTR)); - return (0); - } - - /* - * seems we really have an AVM PCMCIA Fritz!Card controller - */ - cardinfo = inb(dev->id_iobase + VERREG_OFFSET)<<8 | inb(dev->id_iobase + MODREG_OFFSET); - printf("isic%d: successfully detect AVM PCMCIA cardinfo = 0x%0x\n", - dev->id_unit, cardinfo); - dev->id_flags = FLAG_AVM_A1_PCMCIA; - return (1); -} -#endif /* __FreeBSD__ */ - - - -/*---------------------------------------------------------------------------* - * isic_attach_fritzpcmcia - attach Fritz!Card - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -int -isic_attach_fritzpcmcia(struct isa_device *dev) -{ - /* ResetController again just to make sure... */ - - outb(dev->id_iobase + STAT0_OFFSET, 0x00); - DELAY(SEC_DELAY / 10); - outb(dev->id_iobase + STAT0_OFFSET, 0x01); - DELAY(SEC_DELAY / 10); - outb(dev->id_iobase + STAT0_OFFSET, 0x00); - DELAY(SEC_DELAY / 10); - - /* enable IRQ, disable counter IRQ */ - - outb(dev->id_iobase + STAT0_OFFSET, ASL_TIMERDISABLE | - ASL_TIMERRESET | ASL_ENABLE_INT); - /* DELAY(SEC_DELAY / 10); */ - - return(1); -} - -#else - -int -isic_attach_fritzpcmcia(struct pcmcia_isic_softc *psc, struct pcmcia_config_entry *cfe, struct pcmcia_attach_args *pa) -{ - struct isic_softc *sc = &psc->sc_isic; - bus_space_tag_t t; - bus_space_handle_t h; - int i; - - /* Validate config info */ - if (cfe->num_memspace != 0) - printf(": unexpected number of memory spaces %d should be 0\n", - cfe->num_memspace); - if (cfe->num_iospace != 1) - printf(": unexpected number of memory spaces %d should be 1\n", - cfe->num_iospace); - - /* Allocate pcmcia space - but don't listen to the card, it's lying - about the size needed! */ - for (i = 0; i < cfe->num_iospace; i++) - if (pcmcia_io_alloc(pa->pf, cfe->iospace[i].start, cfe->iospace[i].length, 1, &psc->sc_pcioh) == 0) - break; - if (i >= cfe->num_iospace) { - printf(": can't allocate i/o space\n"); - return 0; - } - - /* map the selected space */ - if (pcmcia_io_map(pa->pf, ((cfe->flags & PCMCIA_CFE_IO16) ? - PCMCIA_WIDTH_IO16 : PCMCIA_WIDTH_IO8), &psc->sc_pcioh, - &psc->sc_io_window)) { - printf(": can't map i/o space\n"); - return 0; - } - - /* Setup bus space maps */ - sc->sc_num_mappings = 1; - MALLOC_MAPS(sc); - - /* Copy our handles/tags to the MI maps */ - sc->sc_maps[0].t = psc->sc_pcioh.iot; - sc->sc_maps[0].h = psc->sc_pcioh.ioh; - sc->sc_maps[0].offset = 0; - sc->sc_maps[0].size = 0; /* not our mapping */ - - t = sc->sc_maps[0].t; - h = sc->sc_maps[0].h; - - sc->clearirq = NULL; - sc->readreg = avma1_pcmcia_read_reg; - sc->writereg = avma1_pcmcia_write_reg; - - sc->readfifo = avma1_pcmcia_read_fifo; - sc->writefifo = avma1_pcmcia_write_fifo; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* Reset controller again just to make sure... */ - - bus_space_write_1(t, h, STAT0_OFFSET, 0x00); - DELAY(SEC_DELAY / 10); - bus_space_write_1(t, h, STAT0_OFFSET, 0x01); - DELAY(SEC_DELAY / 10); - bus_space_write_1(t, h, STAT0_OFFSET, 0x00); - DELAY(SEC_DELAY / 10); - - /* enable IRQ, disable counter IRQ */ - - bus_space_write_1(t, h, STAT0_OFFSET, ASL_TIMERDISABLE | - ASL_TIMERRESET | ASL_ENABLE_INT); - - return 1; -} -#endif - -#endif /* ISICPCMCIA_AVM_A1 */ diff --git a/sys/dev/pcmcia/isic_pcmcia_elsa_isdnmc.c b/sys/dev/pcmcia/isic_pcmcia_elsa_isdnmc.c deleted file mode 100644 index 56df084c856..00000000000 --- a/sys/dev/pcmcia/isic_pcmcia_elsa_isdnmc.c +++ /dev/null @@ -1,304 +0,0 @@ -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann <martin@NetBSD.org>. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_pcmcia_elsa_isdnmc.c,v 1.14 2014/03/23 02:47:38 christos Exp $"); - -#include "opt_isicpcmcia.h" -#ifdef ISICPCMCIA_ELSA_ISDNMC - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> - -#include <dev/pcmcia/pcmciareg.h> -#include <dev/pcmcia/pcmciavar.h> -#endif - -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#include <dev/pcmcia/isic_pcmcia.h> - -#ifndef __FreeBSD__ -/* PCMCIA support routines */ -static u_int8_t elsa_isdnmc_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -static void elsa_isdnmc_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static void elsa_isdnmc_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void elsa_isdnmc_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size); -static void elsa_isdnmc_clrirq(struct isic_softc *sc); -#endif - -/* - * The ELSA MicroLink ISDN/MC uses one contigous IO region, - * mapped by the pcmcia code. - * The chip access is via three ports: - */ -#define ISAC_DATA 1 /* ISAC dataport at offset 1 */ -#define HSCX_DATA 2 /* HSCX dataport at offset 2 */ -#define ADDR_LATCH 4 /* address latch at offset 4 */ - -/* This is very similar to the ELSA QuickStep 1000 (ISA) card */ - -#ifdef __FreeBSD__ -static void -elsa_isdnmc_clrirq(void *base) -{ -} -#else -static void -elsa_isdnmc_clrirq(struct isic_softc *sc) -{ - ISAC_WRITE(I_MASK, 0xff); - HSCX_WRITE(0, H_MASK, 0xff); - HSCX_WRITE(1, H_MASK, 0xff); - ISAC_WRITE(I_MASK, ISAC_IMASK); - HSCX_WRITE(0, H_MASK, HSCX_A_IMASK); - HSCX_WRITE(1, H_MASK, HSCX_B_IMASK); -} -#endif - -/*---------------------------------------------------------------------------* - * read fifo routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -elsa_isdnmc_read_fifo(void *buf, const void *base, size_t len) -{ -} -#else -static void -elsa_isdnmc_read_fifo(struct isic_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, ADDR_LATCH, 0); - bus_space_read_multi_1(t, h, ISAC_DATA, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ADDR_LATCH, 0); - bus_space_read_multi_1(t, h, HSCX_DATA, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ADDR_LATCH, 0x40); - bus_space_read_multi_1(t, h, HSCX_DATA, buf, size); - break; - } -} -#endif - -/*---------------------------------------------------------------------------* - * write fifo routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -elsa_isdnmc_write_fifo(void *base, const void *buf, size_t len) -{ -} -#else -static void -elsa_isdnmc_write_fifo(struct isic_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, ADDR_LATCH, 0); - bus_space_write_multi_1(t, h, ISAC_DATA, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ADDR_LATCH, 0); - bus_space_write_multi_1(t, h, HSCX_DATA, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ADDR_LATCH, 0x40); - bus_space_write_multi_1(t, h, HSCX_DATA, buf, size); - break; - } -} -#endif - -/*---------------------------------------------------------------------------* - * write register routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -elsa_isdnmc_write_reg(u_char *base, u_int offset, u_int v) -{ -} -#else -static void -elsa_isdnmc_write_reg(struct isic_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, ADDR_LATCH, offs); - bus_space_write_1(t, h, ISAC_DATA, data); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ADDR_LATCH, offs); - bus_space_write_1(t, h, HSCX_DATA, data); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ADDR_LATCH, 0x40+offs); - bus_space_write_1(t, h, HSCX_DATA, data); - break; - } -} -#endif - -/*---------------------------------------------------------------------------* - * read register routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static u_char -elsa_isdnmc_read_reg(u_char *base, u_int offset) -{ - return 0; -} -#else -static u_int8_t -elsa_isdnmc_read_reg(struct isic_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, ADDR_LATCH, offs); - return bus_space_read_1(t, h, ISAC_DATA); - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ADDR_LATCH, offs); - return bus_space_read_1(t, h, HSCX_DATA); - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ADDR_LATCH, 0x40+offs); - return bus_space_read_1(t, h, HSCX_DATA); - } - return 0; -} -#endif - -#ifdef __FreeBSD__ -#else - -/* - * XXX - one time only! Some of this has to go into an enable - * function, with apropriate counterpart in disable, so a card - * could be removed an inserted again. - */ -int -isic_attach_elsaisdnmc(struct pcmcia_isic_softc *psc, struct pcmcia_config_entry *cfe, struct pcmcia_attach_args *pa) -{ - struct isic_softc *sc = &psc->sc_isic; - - /* Validate config info */ - if (cfe->num_memspace != 0) - printf(": unexpected number of memory spaces %d should be 0\n", - cfe->num_memspace); - if (cfe->num_iospace != 1) - printf(": unexpected number of memory spaces %d should be 1\n", - cfe->num_iospace); - - /* Allocate pcmcia space */ - if (pcmcia_io_alloc(pa->pf, 0, cfe->iospace[0].length, - cfe->iospace[0].length, &psc->sc_pcioh)) - printf(": can't allocate i/o space\n"); - - /* map them */ - if (pcmcia_io_map(pa->pf, ((cfe->flags & PCMCIA_CFE_IO16) ? - PCMCIA_WIDTH_IO16 : PCMCIA_WIDTH_IO8), &psc->sc_pcioh, - &psc->sc_io_window)) { - printf(": can't map i/o space\n"); - return 0; - } - - /* Setup bus space maps */ - sc->sc_num_mappings = 1; - MALLOC_MAPS(sc); - - /* Copy our handles/tags to the MI maps */ - sc->sc_maps[0].t = psc->sc_pcioh.iot; - sc->sc_maps[0].h = psc->sc_pcioh.ioh; - sc->sc_maps[0].offset = 0; - sc->sc_maps[0].size = 0; /* not our mapping */ - - sc->clearirq = elsa_isdnmc_clrirq; - - sc->readreg = elsa_isdnmc_read_reg; - sc->writereg = elsa_isdnmc_write_reg; - - sc->readfifo = elsa_isdnmc_read_fifo; - sc->writefifo = elsa_isdnmc_write_fifo; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - return 1; -} -#endif - -#endif /* ISICPCMCIA_ELSA_ISDNMC */ diff --git a/sys/dev/pcmcia/isic_pcmcia_elsa_mcall.c b/sys/dev/pcmcia/isic_pcmcia_elsa_mcall.c deleted file mode 100644 index 3d4f8cf6fec..00000000000 --- a/sys/dev/pcmcia/isic_pcmcia_elsa_mcall.c +++ /dev/null @@ -1,234 +0,0 @@ -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann <martin@NetBSD.org>. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_pcmcia_elsa_mcall.c,v 1.15 2014/03/23 02:48:41 christos Exp $"); - -#include "opt_isicpcmcia.h" -#ifdef ISICPCMCIA_ELSA_MCALL - -#include <sys/param.h> -#if defined(__FreeBSD__) && __FreeBSD__ >= 3 -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> - -#ifdef __FreeBSD__ -#include <machine/clock.h> -#include <i386/isa/isa_device.h> -#else -#include <sys/bus.h> -#include <sys/device.h> -#endif - -#include <sys/socket.h> -#include <net/if.h> - -#if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000 -#include <sys/callout.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> - -#include <dev/pcmcia/pcmciareg.h> -#include <dev/pcmcia/pcmciavar.h> -#endif - -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> -#include <dev/ic/ipac.h> - -#include <dev/pcmcia/isic_pcmcia.h> - -#ifndef __FreeBSD__ -/* PCMCIA support routines */ -static u_int8_t elsa_mcall_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -static void elsa_mcall_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static void elsa_mcall_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void elsa_mcall_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size); -#endif - -/*---------------------------------------------------------------------------* - * read fifo routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static int PCMCIA_IO_BASE = 0; /* ap: XXX hack */ -static void -elsa_mcall_read_fifo(void *buf, const void *base, size_t len) -{ -} -#else -static void -elsa_mcall_read_fifo(struct isic_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; - */ -} -#endif - -/*---------------------------------------------------------------------------* - * write fifo routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -elsa_mcall_write_fifo(void *base, const void *buf, size_t len) -{ -} -#else -static void -elsa_mcall_write_fifo(struct isic_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; - */ -} -#endif - -/*---------------------------------------------------------------------------* - * write register routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -elsa_mcall_write_reg(u_char *base, u_int offset, u_int v) -{ -} -#else -static void -elsa_mcall_write_reg(struct isic_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; - */ -} -#endif - -/*---------------------------------------------------------------------------* - * read register routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static u_char -elsa_mcall_read_reg(u_char *base, u_int offset) -{ - return 0; -} -#else -static u_int8_t -elsa_mcall_read_reg(struct isic_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; - */ - return 0; -} -#endif - -#ifdef __FreeBSD__ -#else - -/* - * XXX - one time only! Some of this has to go into an enable - * function, with apropriate counterpart in disable, so a card - * could be removed an inserted again. - */ -int -isic_attach_elsamcall(struct pcmcia_isic_softc *psc, struct pcmcia_config_entry *cfe, struct pcmcia_attach_args *pa) -{ - struct isic_softc *sc = &psc->sc_isic; - - /* Validate config info */ - if (cfe->num_memspace != 0) - printf(": unexpected number of memory spaces %d should be 0\n", - cfe->num_memspace); - if (cfe->num_iospace != 1) - printf(": unexpected number of memory spaces %d should be 1\n", - cfe->num_iospace); - - /* Allocate pcmcia space */ - if (pcmcia_io_alloc(pa->pf, 0, cfe->iospace[0].length, - cfe->iospace[0].length, &psc->sc_pcioh)) - printf(": can't allocate i/o space\n"); - - /* map them */ - if (pcmcia_io_map(pa->pf, ((cfe->flags & PCMCIA_CFE_IO16) ? - PCMCIA_WIDTH_IO16 : PCMCIA_WIDTH_IO8), &psc->sc_pcioh, - &psc->sc_io_window)) { - printf(": can't map i/o space\n"); - return 0; - } - - /* Setup bus space maps */ - sc->sc_num_mappings = 1; - MALLOC_MAPS(sc); - - /* Copy our handles/tags to the MI maps */ - sc->sc_maps[0].t = psc->sc_pcioh.iot; - sc->sc_maps[0].h = psc->sc_pcioh.ioh; - sc->sc_maps[0].offset = 0; - sc->sc_maps[0].size = 0; /* not our mapping */ - - sc->clearirq = NULL; - sc->readreg = elsa_mcall_read_reg; - sc->writereg = elsa_mcall_write_reg; - - sc->readfifo = elsa_mcall_read_fifo; - sc->writefifo = elsa_mcall_write_fifo; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 1; - sc->sc_bfifolen = IPAC_BFIFO_LEN; - - return 1; -} -#endif - -#endif /* ISICPCMCIA_ELSA_MCALL */ diff --git a/sys/dev/pcmcia/isic_pcmcia_sbspeedstar2.c b/sys/dev/pcmcia/isic_pcmcia_sbspeedstar2.c deleted file mode 100644 index ff245834660..00000000000 --- a/sys/dev/pcmcia/isic_pcmcia_sbspeedstar2.c +++ /dev/null @@ -1,247 +0,0 @@ -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann <martin@NetBSD.org>. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isic_pcmcia_sbspeedstar2.c,v 1.13 2014/03/23 02:50:08 christos Exp $"); - -#include "opt_isicpcmcia.h" -#ifdef ISICPCMCIA_SBSPEEDSTAR2 - -/* - * Card format: - * - * iobase + 0 : reset on (0x03), off (0x0) - * iobase + 1 : isac read/write - * iobase + 2 : hscx read/write ( offset 0-0x3f hscx0 , - * offset 0x40-0x7f hscx1 ) - * iobase + 4 : address register - * - */ - -#define SBSS_RESET 0 /* reset on / off */ -#define SBSS_ISAC 1 /* ISAC */ -#define SBSS_HSCX 2 /* HSCX0 */ -#define SBSS_RW 4 /* indirect access register */ - -#define SBSS_REGS 8 /* we use an area of 8 bytes for io */ - -#include <sys/param.h> -#include <sys/callout.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> -#include <sys/device.h> -#include <sys/bus.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netisdn/i4b_debug.h> -#include <netisdn/i4b_ioctl.h> -#include <netisdn/i4b_l2.h> -#include <netisdn/i4b_l1l2.h> - -#include <dev/ic/isic_l1.h> -#include <dev/ic/isac.h> -#include <dev/ic/hscx.h> - -#include <netisdn/i4b_global.h> -#include <netisdn/i4b_l1l2.h> -#include <netisdn/i4b_mbuf.h> -#include <dev/pcmcia/pcmciareg.h> -#include <dev/pcmcia/pcmciavar.h> - -#include <dev/pcmcia/isic_pcmcia.h> - -/*---------------------------------------------------------------------------* - * Sedlbauer SpeedStar ISAC get fifo routine - *---------------------------------------------------------------------------*/ - -static void -sws_read_fifo(struct isic_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, SBSS_RW, 0); - bus_space_read_multi_1(t, h, SBSS_ISAC, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, SBSS_RW, 0); - bus_space_read_multi_1(t, h, SBSS_HSCX, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, SBSS_RW, 0x40); - bus_space_read_multi_1(t, h, SBSS_HSCX, buf, size); - break; - } -} - -/*---------------------------------------------------------------------------* - * Sedlbauer SpeedStar ISAC put fifo routine - *---------------------------------------------------------------------------*/ - -static void -sws_write_fifo(struct isic_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, SBSS_RW, 0); - bus_space_write_multi_1(t, h, SBSS_ISAC, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, SBSS_RW, 0); - bus_space_write_multi_1(t, h, SBSS_HSCX, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, SBSS_RW, 0x40); - bus_space_write_multi_1(t, h, SBSS_HSCX, buf, size); - break; - } -} - -/*---------------------------------------------------------------------------* - * Sedlbauer SpeedStar ISAC put register routine - *---------------------------------------------------------------------------*/ - -static void -sws_write_reg(struct isic_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, SBSS_RW, offs); - bus_space_write_1(t, h, SBSS_ISAC, data); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, SBSS_RW, offs); - bus_space_write_1(t, h, SBSS_HSCX, data); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, SBSS_RW, 0x40+offs); - bus_space_write_1(t, h, SBSS_HSCX, data); - break; - } -} - -/*---------------------------------------------------------------------------* - * Sedlbauer SpeedStar ISAC get register routine - *---------------------------------------------------------------------------*/ - -static u_int8_t -sws_read_reg(struct isic_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, SBSS_RW, offs); - return bus_space_read_1(t, h, SBSS_ISAC); - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, SBSS_RW, offs); - return bus_space_read_1(t, h, SBSS_HSCX); - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, SBSS_RW, 0x40+offs); - return bus_space_read_1(t, h, SBSS_HSCX); - } - return 0; -} - -/* - * XXX - one time only! Some of this has to go into an enable - * function, with apropriate counterpart in disable, so a card - * could be removed an inserted again. - */ -int -isic_attach_sbspeedstar2(struct pcmcia_isic_softc *psc, struct pcmcia_config_entry *cfe, struct pcmcia_attach_args *pa) -{ - struct isic_softc * sc = &psc->sc_isic; - - /* Validate config info */ - if (cfe->num_memspace != 0) - printf(": unexpected number of memory spaces %d should be 0\n", - cfe->num_memspace); - if (cfe->num_iospace != 1) - printf(": unexpected number of memory spaces %d should be 1\n", - cfe->num_iospace); - - /* Allocate pcmcia space */ - if (pcmcia_io_alloc(pa->pf, 0, cfe->iospace[0].length, - cfe->iospace[0].length, &psc->sc_pcioh)) - printf(": can't allocate i/o space\n"); - - /* map them */ - if (pcmcia_io_map(pa->pf, ((cfe->flags & PCMCIA_CFE_IO16) ? - PCMCIA_WIDTH_IO16 : PCMCIA_WIDTH_IO8), &psc->sc_pcioh, - &psc->sc_io_window)) { - printf(": can't map i/o space\n"); - return 0; - } - - /* Setup bus space maps */ - sc->sc_num_mappings = 1; - MALLOC_MAPS(sc); - - /* Copy our handles/tags to the MI maps */ - sc->sc_maps[0].t = psc->sc_pcioh.iot; - sc->sc_maps[0].h = psc->sc_pcioh.ioh; - sc->sc_maps[0].offset = 0; - sc->sc_maps[0].size = 0; /* not our mapping */ - - /* setup access routines */ - - sc->readreg = sws_read_reg; - sc->writereg = sws_write_reg; - - sc->readfifo = sws_read_fifo; - sc->writefifo = sws_write_fifo; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* reset card */ - { - bus_space_tag_t t1 = sc->sc_maps[0].t; - bus_space_handle_t h1 = sc->sc_maps[0].h; - bus_space_write_1(t1, h1, SBSS_RESET, 0x3); - DELAY(SEC_DELAY / 5); - bus_space_write_1(t1, h1, SBSS_RESET, 0); - DELAY(SEC_DELAY / 5); - } - - return 1; -} - -#endif /* ISICPCMCIA_SBSPEEDSTAR2 */ |
