diff options
| author | cvs2svn <cvs2svn@FreeBSD.org> | 1999-09-16 08:26:13 +0000 |
|---|---|---|
| committer | cvs2svn <cvs2svn@FreeBSD.org> | 1999-09-16 08:26:13 +0000 |
| commit | e5eb97b547f5af1e2b6e4396933dc06b93d5590e (patch) | |
| tree | a225c25e840ec7274824d5c7c0d45fd244832a09 /sys | |
| parent | a7f56066b1c5f0d92fec969fc2c4205137454257 (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/dev/bktr/bktr_i2c.h | 34 | ||||
| -rw-r--r-- | sys/i386/include/i4b_rbch_ioctl.h | 53 | ||||
| -rw-r--r-- | sys/i386/isa/if_wl.c | 2 | ||||
| -rw-r--r-- | sys/i4b/MAINTAINER | 1 | ||||
| -rw-r--r-- | sys/i4b/driver/i4b_bsdi_ibc.c | 559 | ||||
| -rw-r--r-- | sys/i4b/layer1/i4b_asuscom_ipac.c | 510 | ||||
| -rw-r--r-- | sys/i4b/layer1/i4b_avm_fritz_pci.c | 1732 | ||||
| -rw-r--r-- | sys/i4b/layer1/i4b_avm_fritz_pnp.c | 1268 | ||||
| -rw-r--r-- | sys/i4b/layer1/i4b_siemens_isurf.c | 317 | ||||
| -rw-r--r-- | sys/i4b/layer1/pci_isic.h | 53 | ||||
| -rw-r--r-- | sys/pci/alpm.c | 666 | ||||
| -rw-r--r-- | sys/pci/if_sisreg.h | 404 | ||||
| -rw-r--r-- | sys/pci/intpmreg.h | 77 |
13 files changed, 2 insertions, 5674 deletions
diff --git a/sys/dev/bktr/bktr_i2c.h b/sys/dev/bktr/bktr_i2c.h deleted file mode 100644 index 075e9885ae5d..000000000000 --- a/sys/dev/bktr/bktr_i2c.h +++ /dev/null @@ -1,34 +0,0 @@ -/*- - * Copyright (c) 1998 Nicolas Souchu - * 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. - * - * $FreeBSD$ - * - */ -#ifndef _BT848_I2C_H -#define _BT848_I2C_H - -extern int bt848_i2c_attach(int, bt848_ptr_t, struct bktr_i2c_softc *); - -#endif diff --git a/sys/i386/include/i4b_rbch_ioctl.h b/sys/i386/include/i4b_rbch_ioctl.h deleted file mode 100644 index 62d2829b8b83..000000000000 --- a/sys/i386/include/i4b_rbch_ioctl.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 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_rbch_ioctl.h raw B-channel driver interface ioctls - * ------------------------------------------------------ - * - * $FreeBSD$ - * - * last edit-date: [Fri Jul 9 08:35:07 1999] - * - *---------------------------------------------------------------------------*/ - -#ifndef _I4B_RBCH_IOCTL_H_ -#define _I4B_RBCH_IOCTL_H_ - -/*---------------------------------------------------------------------------* - * instruct the rbch device to dial the given number - *---------------------------------------------------------------------------*/ - -typedef char telno_t[TELNO_MAX]; - -#define I4B_RBCH_DIALOUT _IOW('R', 1, telno_t) - -/*---------------------------------------------------------------------------* - * request version and release info from kernel part - *---------------------------------------------------------------------------*/ - -#define I4B_RBCH_VR_REQ _IOR('R', 2, msg_vr_req_t) - -#endif /* _I4B_RBCH_IOCTL_H_ */ diff --git a/sys/i386/isa/if_wl.c b/sys/i386/isa/if_wl.c index d5e7938594b6..01c3b3463a04 100644 --- a/sys/i386/isa/if_wl.c +++ b/sys/i386/isa/if_wl.c @@ -1282,6 +1282,8 @@ wlioctl(struct ifnet *ifp, u_long cmd, caddr_t data) } error = 0; } +#else + wlinit(sc); #endif break; #endif /* MULTICAST */ diff --git a/sys/i4b/MAINTAINER b/sys/i4b/MAINTAINER deleted file mode 100644 index fae4d58f6898..000000000000 --- a/sys/i4b/MAINTAINER +++ /dev/null @@ -1 +0,0 @@ -MAINTAINER = hm@freebsd.org diff --git a/sys/i4b/driver/i4b_bsdi_ibc.c b/sys/i4b/driver/i4b_bsdi_ibc.c deleted file mode 100644 index 17d90c276f16..000000000000 --- a/sys/i4b/driver/i4b_bsdi_ibc.c +++ /dev/null @@ -1,559 +0,0 @@ -/* - * Copyright (c) 1998, 1999 Bert Driehuis. All rights reserved. - * - * Copyright (c) 1997, 1998 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_bsdi_ibc.c - isdn4bsd kernel BSD/OS point to point driver - * ------------------------------------------------------------- - * - * $FreeBSD$ - * - * last edit-date: [Fri Apr 23 10:27:57 1999] - * - *---------------------------------------------------------------------------*/ - -#include "ibc.h" - -#if NIBC > 0 - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <sys/errno.h> -#include <sys/ioccom.h> -#include <sys/ttycom.h> -#include <sys/sockio.h> -#include <sys/kernel.h> -#include <sys/protosw.h> - -#include <net/if.h> -#include <net/if_types.h> -#include <net/if_p2p.h> -#include <net/netisr.h> -#include <net/route.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/in_var.h> -#include <netinet/ip.h> - -#include <i4b/i4b_ioctl.h> -#include <i4b/i4b_cause.h> -#include <i4b/include/i4b_global.h> -#include <i4b/include/i4b_mbuf.h> -#include <i4b/include/i4b_l3l4.h> -#include <i4b/layer4/i4b_l4.h> - -#define IFP2UNIT(ifp) (ifp)->if_unit - -#define IOCTL_CMD_T u_long - -void ibcattach(void *); - -#define IBCACCT 1 /* enable accounting messages */ -#define IBCACCTINTVL 2 /* accounting msg interval in secs */ - -#define PPP_HDRLEN 4 /* 4 octets PPP header length */ - -struct ibc_softc { - struct p2pcom sc_p2pcom; - - int sc_state; /* state of the interface */ - call_desc_t *sc_cdp; /* ptr to call descriptor */ - -#ifdef IBCACCT - int sc_iinb; /* isdn driver # of inbytes */ - int sc_ioutb; /* isdn driver # of outbytes */ - int sc_inb; /* # of bytes rx'd */ - int sc_outb; /* # of bytes tx'd */ - int sc_linb; /* last # of bytes rx'd */ - int sc_loutb; /* last # of bytes tx'd */ - int sc_fn; /* flag, first null acct */ -#endif -} ibc_softc[NIBC]; - -static void ibc_init_linktab(int unit); - -static int ibc_start(struct ifnet *ifp); - -static int ibc_watchdog(int unit); -static int ibc_mdmctl(struct p2pcom *pp, int flag); -static int ibc_getmdm(struct p2pcom *pp, caddr_t arg); - -/* initialized by L4 */ - -static drvr_link_t ibc_drvr_linktab[NIBC]; -static isdn_link_t *isdn_ibc_lt[NIBC]; - -enum ibc_states { - ST_IDLE, /* initialized, ready, idle */ - ST_DIALING, /* dialling out to remote */ - ST_CONNECTED, /* connected to remote */ -}; - -int ibcdebug = 0; /* Use bpatch to set this for debug printf's */ -#define DBG(x) if (ibcdebug) printf x - -/*===========================================================================* - * DEVICE DRIVER ROUTINES - *===========================================================================*/ - -/*---------------------------------------------------------------------------* - * interface attach routine at kernel boot time - *---------------------------------------------------------------------------*/ -void -ibcattach(void *dummy) -{ - struct ibc_softc *sc = ibc_softc; - struct ifnet *ifp; - int i; - -#ifndef HACK_NO_PSEUDO_ATTACH_MSG - printf("ibc: %d ISDN ibc device(s) attached\n", - NIBC); -#endif - - for(i = 0; i < NIBC; sc++, i++) { - ibc_init_linktab(i); - - sc->sc_p2pcom.p2p_mdmctl = ibc_mdmctl; - sc->sc_p2pcom.p2p_getmdm = ibc_getmdm; - sc->sc_state = ST_IDLE; - ifp = &sc->sc_p2pcom.p2p_if; - ifp->if_name = "ibc"; - ifp->if_next = NULL; - ifp->if_unit = i; - ifp->if_mtu = 1500 /*XXX*/; - ifp->if_baudrate = 64000; - ifp->if_flags = IFF_SIMPLEX | IFF_POINTOPOINT; - ifp->if_type = IFT_ISDNBASIC; - ifp->if_start = ibc_start; - ifp->if_output = 0; - ifp->if_ioctl = p2p_ioctl; - - ifp->if_hdrlen = 0; - ifp->if_addrlen = 0; - ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; - - ifp->if_ipackets = 0; - ifp->if_ierrors = 0; - ifp->if_opackets = 0; - ifp->if_oerrors = 0; - ifp->if_collisions = 0; - ifp->if_ibytes = 0; - ifp->if_obytes = 0; - ifp->if_imcasts = 0; - ifp->if_omcasts = 0; - ifp->if_iqdrops = 0; - ifp->if_noproto = 0; -#if IBCACCT - ifp->if_timer = 0; - ifp->if_watchdog = ibc_watchdog; - sc->sc_iinb = 0; - sc->sc_ioutb = 0; - sc->sc_inb = 0; - sc->sc_outb = 0; - sc->sc_linb = 0; - sc->sc_loutb = 0; - sc->sc_fn = 1; -#endif - if_attach(ifp); - p2p_attach(&sc->sc_p2pcom); - } -} - -static struct mbuf * -p2p_dequeue(struct p2pcom *pp) -{ - struct ifqueue *ifq; - struct mbuf *m; - - ifq = &pp->p2p_isnd; - m = ifq->ifq_head; - if (m == 0) { - ifq = &pp->p2p_if.if_snd; - m = ifq->ifq_head; - } - if (m == 0) - return 0; - IF_DEQUEUE(ifq, m); - return m; -} - -/*---------------------------------------------------------------------------* - * start output to ISDN B-channel - *---------------------------------------------------------------------------*/ -static int -ibc_start(struct ifnet *ifp) -{ - int unit = IFP2UNIT(ifp); - struct ibc_softc *sc = (struct ibc_softc *)&ibc_softc[unit]; - struct p2pcom *pp = &sc->sc_p2pcom; - struct mbuf *m; - int s; - - if(sc->sc_state != ST_CONNECTED) { - DBG(("ibc%d: ibc_start called with sc_state=%d\n", - unit, sc->sc_state)); - return 0; - } - - s = SPLI4B(); - - if (IF_QFULL(isdn_ibc_lt[unit]->tx_queue)) { - splx(s); - return 0; - } - - m = p2p_dequeue(pp); - if (m == NULL) { - splx(s); - return 0; - } - - do { - microtime(&ifp->if_lastchange); - - IF_ENQUEUE(isdn_ibc_lt[unit]->tx_queue, m); - - ifp->if_obytes += m->m_pkthdr.len; - sc->sc_outb += m->m_pkthdr.len; - ifp->if_opackets++; - } while (!IF_QFULL(isdn_ibc_lt[unit]->tx_queue) && - (m = p2p_dequeue(pp)) != NULL); - isdn_ibc_lt[unit]->bch_tx_start(isdn_ibc_lt[unit]->unit, - isdn_ibc_lt[unit]->channel); - splx(s); - return 0; -} - -#ifdef IBCACCT -/*---------------------------------------------------------------------------* - * watchdog routine - *---------------------------------------------------------------------------*/ -static int -ibc_watchdog(int unit) -{ - struct ibc_softc *sc = &ibc_softc[unit]; - struct ifnet *ifp = &sc->sc_p2pcom.p2p_if; - bchan_statistics_t bs; - - (*isdn_ibc_lt[unit]->bch_stat) - (isdn_ibc_lt[unit]->unit, isdn_ibc_lt[unit]->channel, &bs); - - sc->sc_ioutb += bs.outbytes; - sc->sc_iinb += bs.inbytes; - - if((sc->sc_iinb != sc->sc_linb) || (sc->sc_ioutb != sc->sc_loutb) || sc->sc_fn) - { - int ri = (sc->sc_iinb - sc->sc_linb)/IBCACCTINTVL; - int ro = (sc->sc_ioutb - sc->sc_loutb)/IBCACCTINTVL; - - if((sc->sc_iinb == sc->sc_linb) && (sc->sc_ioutb == sc->sc_loutb)) - sc->sc_fn = 0; - else - sc->sc_fn = 1; - - sc->sc_linb = sc->sc_iinb; - sc->sc_loutb = sc->sc_ioutb; - - i4b_l4_accounting(BDRV_IBC, unit, ACCT_DURING, - sc->sc_ioutb, sc->sc_iinb, ro, ri, sc->sc_outb, sc->sc_inb); - } - ifp->if_timer = IBCACCTINTVL; - return 0; -} -#endif /* IBCACCT */ - -/* - *===========================================================================* - * P2P layer interface routines - *===========================================================================* - */ - -#if 0 -/*---------------------------------------------------------------------------* - * PPP interface phase change - *---------------------------------------------------------------------------* - */ -static void -ibc_state_changed(struct sppp *sp, int new_state) -{ - struct ibc_softc *sc = (struct ibc_softc *)sp; - - i4b_l4_ifstate_changed(sc->sc_cdp, new_state); -} - -/*---------------------------------------------------------------------------* - * PPP control protocol negotiation complete (run ip-up script now) - *---------------------------------------------------------------------------* - */ -static void -ibc_negotiation_complete(struct sppp *sp) -{ - struct ibc_softc *sc = (struct ibc_softc *)sp; - - i4b_l4_negcomplete(sc->sc_cdp); -} -#endif - -/*===========================================================================* - * ISDN INTERFACE ROUTINES - *===========================================================================*/ - -/*---------------------------------------------------------------------------* - * this routine is called from L4 handler at connect time - *---------------------------------------------------------------------------*/ -static void -ibc_connect(int unit, void *cdp) -{ - struct ibc_softc *sc = &ibc_softc[unit]; - struct ifnet *ifp = &sc->sc_p2pcom.p2p_if; - int s; - - DBG(("ibc%d: ibc_connect\n", unit)); - - s = splimp(); - - sc->sc_cdp = (call_desc_t *)cdp; - sc->sc_state = ST_CONNECTED; - -#if IBCACCT - sc->sc_iinb = 0; - sc->sc_ioutb = 0; - sc->sc_inb = 0; - sc->sc_outb = 0; - sc->sc_linb = 0; - sc->sc_loutb = 0; - ifp->if_timer = IBCACCTINTVL; -#endif - - splx(s); - if (sc->sc_p2pcom.p2p_modem) - (*sc->sc_p2pcom.p2p_modem)(&sc->sc_p2pcom, 1); - - /* This is a lie... PPP is just starting to negociate :-) */ - i4b_l4_negcomplete(sc->sc_cdp); -} - -/*---------------------------------------------------------------------------* - * this routine is called from L4 handler at disconnect time - *---------------------------------------------------------------------------*/ -static void -ibc_disconnect(int unit, void *cdp) -{ - call_desc_t *cd = (call_desc_t *)cdp; - struct ibc_softc *sc = &ibc_softc[unit]; - struct ifnet *ifp = &sc->sc_p2pcom.p2p_if; - int s; - - DBG(("ibc%d: ibc_disconnect\n", unit)); - - s = splimp(); - - /* new stuff to check that the active channel is being closed */ - if (cd != sc->sc_cdp) - { - DBG(("ibc_disconnect: ibc%d channel%d not active\n", - cd->driver_unit, cd->channelid)); - splx(s); - return; - } - -#if IBCACCT - ifp->if_timer = 0; -#endif - - i4b_l4_accounting(BDRV_IBC, unit, ACCT_FINAL, - sc->sc_ioutb, sc->sc_iinb, 0, 0, sc->sc_outb, sc->sc_inb); - - if (sc->sc_state == ST_CONNECTED) - { - sc->sc_cdp = (call_desc_t *)0; - sc->sc_state = ST_IDLE; - if (sc->sc_p2pcom.p2p_modem) - (*sc->sc_p2pcom.p2p_modem)(&sc->sc_p2pcom, 0); - } - - splx(s); -} - -/*---------------------------------------------------------------------------* - * this routine is used to give a feedback from userland demon - * in case of dial problems - *---------------------------------------------------------------------------*/ -static void -ibc_dialresponse(int unit, int status) -{ - DBG(("ibc%d: ibc_dialresponse %d\n", unit, status)); -/* struct ibc_softc *sc = &ibc_softc[unit]; */ -} - -/*---------------------------------------------------------------------------* - * interface up/down - *---------------------------------------------------------------------------*/ -static void -ibc_updown(int unit, int updown) -{ - DBG(("ibc%d: ibc_updown %d\n", unit, updown)); - /* could probably do something useful here */ -} - -/*---------------------------------------------------------------------------* - * this routine is called from the HSCX interrupt handler - * when a new frame (mbuf) has been received and was put on - * the rx queue. - *---------------------------------------------------------------------------*/ -static void -ibc_rx_data_rdy(int unit) -{ - struct ibc_softc *sc = &ibc_softc[unit]; - struct ifnet *ifp = &sc->sc_p2pcom.p2p_if; - struct mbuf *m, *m0; - char *buf; - int s; - - if((m = *isdn_ibc_lt[unit]->rx_mbuf) == NULL) - return; - - microtime(&ifp->if_lastchange); - ifp->if_ipackets++; - - /* Walk the mbuf chain */ - s = splimp(); - for (m0 = m; m != 0; m = m->m_next) { - if (m->m_len == 0) - continue; - ifp->if_ibytes += m->m_len; -#if IBCACCT - sc->sc_inb += m->m_len; -#endif - buf = mtod(m, caddr_t); - if ((*sc->sc_p2pcom.p2p_hdrinput)( - &sc->sc_p2pcom, buf, m->m_len) >= 0) - (*sc->sc_p2pcom.p2p_input)(&sc->sc_p2pcom, 0); - } - splx(s); - m_freem(m0); -} - -/*---------------------------------------------------------------------------* - * this routine is called from the HSCX interrupt handler - * when the last frame has been sent out and there is no - * further frame (mbuf) in the tx queue. - *---------------------------------------------------------------------------*/ -static void -ibc_tx_queue_empty(int unit) -{ - ibc_start(&ibc_softc[unit].sc_p2pcom.p2p_if); -} - -/*---------------------------------------------------------------------------* - * this routine is called from the HSCX interrupt handler - * each time a packet is received or transmitted. It should - * be used to implement an activity timeout mechanism. - *---------------------------------------------------------------------------*/ -static void -ibc_activity(int unit, int rxtx) -{ - ibc_softc[unit].sc_cdp->last_active_time = SECOND; -} - -/*---------------------------------------------------------------------------* - * return this drivers linktab address - *---------------------------------------------------------------------------*/ -drvr_link_t * -ibc_ret_linktab(int unit) -{ - return(&ibc_drvr_linktab[unit]); -} - -/*---------------------------------------------------------------------------* - * setup the isdn_ibc_lt for this driver - *---------------------------------------------------------------------------*/ -void -ibc_set_linktab(int unit, isdn_link_t *ilt) -{ - isdn_ibc_lt[unit] = ilt; -} - -/*---------------------------------------------------------------------------* - * initialize this drivers linktab - *---------------------------------------------------------------------------*/ -static void -ibc_init_linktab(int unit) -{ - ibc_drvr_linktab[unit].unit = unit; - ibc_drvr_linktab[unit].bch_rx_data_ready = ibc_rx_data_rdy; - ibc_drvr_linktab[unit].bch_tx_queue_empty = ibc_tx_queue_empty; - ibc_drvr_linktab[unit].bch_activity = ibc_activity; - ibc_drvr_linktab[unit].line_connected = ibc_connect; - ibc_drvr_linktab[unit].line_disconnected = ibc_disconnect; - ibc_drvr_linktab[unit].dial_response = ibc_dialresponse; - ibc_drvr_linktab[unit].updown_ind = ibc_updown; -} - -/*===========================================================================*/ - -static int -ibc_mdmctl(pp, flag) - struct p2pcom *pp; - int flag; -{ - register struct ifnet *ifp = &pp->p2p_if; - struct ibc_softc *sc = (struct ibc_softc *)&ibc_softc[ifp->if_unit]; - - DBG(("ibc%d: ibc_mdmctl called flags=%d\n", IFP2UNIT(ifp), flag)); - - if (flag == 1 && sc->sc_state == ST_IDLE) { - sc->sc_state = ST_DIALING; - i4b_l4_dialout(BDRV_IBC, IFP2UNIT(ifp)); - } else if (flag == 0 && sc->sc_state != ST_IDLE) { - sc->sc_state = ST_IDLE; - i4b_l4_drvrdisc(BDRV_IBC, IFP2UNIT(ifp)); - } - return 0; -} - -static int -ibc_getmdm(pp, arg) - struct p2pcom *pp; - caddr_t arg; -{ - register struct ifnet *ifp = &pp->p2p_if; - struct ibc_softc *sc = (struct ibc_softc *)&ibc_softc[ifp->if_unit]; - - if (sc->sc_state == ST_CONNECTED) - *(int *)arg = TIOCM_CAR; - else - *(int *)arg = 0; - return 0; - - DBG(("ibc%d: ibc_getmdm called ret=%d\n", IFP2UNIT(ifp), *(int *)arg)); -} -#endif diff --git a/sys/i4b/layer1/i4b_asuscom_ipac.c b/sys/i4b/layer1/i4b_asuscom_ipac.c deleted file mode 100644 index 59f4211d7dd1..000000000000 --- a/sys/i4b/layer1/i4b_asuscom_ipac.c +++ /dev/null @@ -1,510 +0,0 @@ -/* - * Copyright (c) 1999 Ari Suutari. 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. - * - * 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 Asuscom ISDNlink 128K PnP - * ===================================================================== - * - * This driver works with Asuscom ISDNlink 128K PnP ISA adapter, - * which is based on Siemens IPAC chip (my card probes as ASU1690). - * Older Asuscom ISA cards are based on different chipset - * (containing two chips) - for those cards, one might want - * to try the Dynalink driver. - * - * This driver is heavily based on ELSA Quickstep 1000pro PCI - * driver written by Hellmuth Michaelis. Card initialization - * code is modeled after Linux i4l driver written by Karsten - * Keil. - * - * $FreeBSD$ - * - * last edit-date: [Mon May 31 20:53:17 EEST 1999] - * - *---------------------------------------------------------------------------*/ - -#if defined(__FreeBSD__) -#include "isic.h" -#include "opt_i4b.h" -#include "pnp.h" -#else -#define NISIC 1 -#define NPNP 1 -#endif - -#if (NISIC > 0) && (NPNP > 0) && defined(ASUSCOM_IPAC) - -#include <sys/param.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <net/if.h> - -#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 <machine/bus.h> -#include <sys/device.h> -#endif - -#ifdef __FreeBSD__ -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> -#else -#include <i4b/i4b_debug.h> -#include <i4b/i4b_ioctl.h> -#endif - -#include <i4b/include/i4b_global.h> -#include <i4b/include/i4b_l1l2.h> -#include <i4b/include/i4b_mbuf.h> - -#include <i4b/layer1/i4b_l1.h> -#include <i4b/layer1/i4b_isac.h> -#include <i4b/layer1/i4b_hscx.h> -#include <i4b/layer1/i4b_ipac.h> - -#ifndef __FreeBSD__ -#include <i4b/layer1/pci_isic.h> -#endif - -/* masks for register encoded in base addr */ - -#define ASI_BASE_MASK 0x0ffff -#define ASI_OFF_MASK 0xf0000 - -/* register id's to be encoded in base addr */ - -#define ASI_IDISAC 0x00000 -#define ASI_IDHSCXA 0x10000 -#define ASI_IDHSCXB 0x20000 -#define ASI_IDIPAC 0x40000 - -/* offsets from base address */ - -#define ASI_OFF_ALE 0x00 -#define ASI_OFF_RW 0x01 - -/*---------------------------------------------------------------------------* - * Asuscom ISDNlink 128K PnP ISAC get fifo routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -asi_read_fifo(void *buf, const void *base, size_t len) -{ - u_int asus_base; - - asus_base = ((u_int) base) & ASI_BASE_MASK; - switch (((u_int) base) & ASI_OFF_MASK) { - case ASI_IDHSCXB: - outb(asus_base + ASI_OFF_ALE, IPAC_HSCXB_OFF); - insb(asus_base + ASI_OFF_RW, (u_char *)buf, (u_int)len); - break; - case ASI_IDHSCXA: - outb(asus_base + ASI_OFF_ALE, IPAC_HSCXA_OFF); - insb(asus_base + ASI_OFF_RW, (u_char *)buf, (u_int)len); - break; - case ASI_IDISAC: - outb(asus_base + ASI_OFF_ALE, IPAC_ISAC_OFF); - insb(asus_base + ASI_OFF_RW, (u_char *)buf, (u_int)len); - break; - } -} - -#else - -static void -asi_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, ASI_OFF_ALE, IPAC_ISAC_OFF); - bus_space_read_multi_1(t, h, ASI_OFF_RW, buf, size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ASI_OFF_ALE, IPAC_HSCXA_OFF); - bus_space_read_multi_1(t, h, ASI_OFF_RW, buf, size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ASI_OFF_ALE, IPAC_HSCXB_OFF); - bus_space_read_multi_1(t, h, ASI_OFF_RW, buf, size); - break; - } -} - -#endif - -/*---------------------------------------------------------------------------* - * Asuscom ISDNlink 128K PnP ISAC put fifo routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -asi_write_fifo(void *base, const void *buf, size_t len) -{ - u_int asus_base; - - asus_base = ((u_int) base) & ASI_BASE_MASK; - switch (((u_int) base) & ASI_OFF_MASK) { - case ASI_IDHSCXB: - outb(asus_base + ASI_OFF_ALE, IPAC_HSCXB_OFF); - outsb(asus_base + ASI_OFF_RW, (u_char *)buf, (u_int)len); - break; - case ASI_IDHSCXA: - outb(asus_base + ASI_OFF_ALE, IPAC_HSCXA_OFF); - outsb(asus_base + ASI_OFF_RW, (u_char *)buf, (u_int)len); - break; - case ASI_IDISAC: - outb(asus_base + ASI_OFF_ALE, IPAC_ISAC_OFF); - outsb(asus_base + ASI_OFF_RW, (u_char *)buf, (u_int)len); - break; - } -} - -#else - -static void -asi_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, ASI_OFF_ALE, IPAC_ISAC_OFF); - bus_space_write_multi_1(t, h, ASI_OFF_RW, (u_int8_t*)buf,size); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ASI_OFF_ALE, IPAC_HSCXA_OFF); - bus_space_write_multi_1(t, h, ASI_OFF_RW, (u_int8_t*)buf,size); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ASI_OFF_ALE, IPAC_HSCXB_OFF); - bus_space_write_multi_1(t, h, ASI_OFF_RW, (u_int8_t*)buf,size); - break; - } -} -#endif - -/*---------------------------------------------------------------------------* - * Asuscom ISDNlink 128K PnP ISAC put register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static void -asi_write_reg(u_char *base, u_int offset, u_int v) -{ - u_int asus_base; - - asus_base = ((u_int) base) & ASI_BASE_MASK; - switch (((u_int) base) & ASI_OFF_MASK) { - case ASI_IDHSCXB: - outb(asus_base + ASI_OFF_ALE, (u_char)(offset+IPAC_HSCXB_OFF)); - outb(asus_base + ASI_OFF_RW, (u_char)v); - break; - case ASI_IDHSCXA: - outb(asus_base + ASI_OFF_ALE, (u_char)(offset+IPAC_HSCXA_OFF)); - outb(asus_base + ASI_OFF_RW, (u_char)v); - break; - case ASI_IDISAC: - outb(asus_base + ASI_OFF_ALE, (u_char)(offset+IPAC_ISAC_OFF)); - outb(asus_base + ASI_OFF_RW, (u_char)v); - break; - case ASI_IDIPAC: - outb(asus_base + ASI_OFF_ALE, (u_char)(offset+IPAC_IPAC_OFF)); - outb(asus_base + ASI_OFF_RW, (u_char)v); - break; - } -} - -#else - -static void -asi_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, ASI_OFF_ALE, IPAC_ISAC_OFF+offs); - bus_space_write_1(t, h, ASI_OFF_RW, data); - break; - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ASI_OFF_ALE, IPAC_HSCXA_OFF+offs); - bus_space_write_1(t, h, ASI_OFF_RW, data); - break; - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ASI_OFF_ALE, IPAC_HSCXB_OFF+offs); - bus_space_write_1(t, h, ASI_OFF_RW, data); - break; - case ISIC_WHAT_IPAC: - bus_space_write_1(t, h, ASI_OFF_ALE, IPAC_IPAC_OFF+offs); - bus_space_write_1(t, h, ASI_OFF_RW, data); - break; - } -} -#endif - -/*---------------------------------------------------------------------------* - * Asuscom ISDNlink 128K PnP ISAC get register routine - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static u_char -asi_read_reg(u_char *base, u_int offset) -{ - u_int asus_base; - - asus_base = ((u_int) base) & ASI_BASE_MASK; - switch (((u_int) base) & ASI_OFF_MASK) { - case ASI_IDHSCXB: - outb(asus_base + ASI_OFF_ALE, (u_char)(offset+IPAC_HSCXB_OFF)); - return(inb(asus_base + ASI_OFF_RW)); - case ASI_IDHSCXA: - outb(asus_base + ASI_OFF_ALE, (u_char)(offset+IPAC_HSCXA_OFF)); - return(inb(asus_base + ASI_OFF_RW)); - case ASI_IDISAC: - outb(asus_base + ASI_OFF_ALE, (u_char)(offset+IPAC_ISAC_OFF)); - return(inb(asus_base + ASI_OFF_RW)); - case ASI_IDIPAC: - outb(asus_base + ASI_OFF_ALE, (u_char)(offset+IPAC_IPAC_OFF)); - return(inb(asus_base + ASI_OFF_RW)); - } - - return 0; /* NOTREACHED */ -} - -#else - -static u_int8_t -asi_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, ASI_OFF_ALE, IPAC_ISAC_OFF+offs); - return bus_space_read_1(t, h, ASI_OFF_RW); - case ISIC_WHAT_HSCXA: - bus_space_write_1(t, h, ASI_OFF_ALE, IPAC_HSCXA_OFF+offs); - return bus_space_read_1(t, h, ASI_OFF_RW); - case ISIC_WHAT_HSCXB: - bus_space_write_1(t, h, ASI_OFF_ALE, IPAC_HSCXB_OFF+offs); - return bus_space_read_1(t, h, ASI_OFF_RW); - case ISIC_WHAT_IPAC: - bus_space_write_1(t, h, ASI_OFF_ALE, IPAC_IPAC_OFF+offs); - return bus_space_read_1(t, h, ASI_OFF_RW); - } - - return 0; -} - -#endif - -/*---------------------------------------------------------------------------* - * isic_attach_asi - attach for Asuscom ISDNlink 128K PnP - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -int -isic_probe_asi(struct isa_device *dev, unsigned int iobase2) -{ - struct isic_softc *sc = &isic_sc[dev->id_unit]; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT " - "for Asuscom ISDNlink 128K PnP!\n", - dev->id_unit, dev->id_unit); - - return(0); - } - sc->sc_unit = dev->id_unit; - - /* setup iobase */ - - if((dev->id_iobase <= 0) || (dev->id_iobase > 0xffff)) - { - printf("isic%d: Error, invalid iobase 0x%x specified " - "for Asuscom ISDNlink 128K PnP\n", - dev->id_unit, iobase2); - - return(0); - } - - sc->sc_port = dev->id_iobase; - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = asi_read_reg; - sc->writereg = asi_write_reg; - - sc->readfifo = asi_read_fifo; - sc->writefifo = asi_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_ASUSCOMIPAC; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - /* setup chip type = IPAC ! */ - - sc->sc_ipac = 1; - sc->sc_bfifolen = IPAC_BFIFO_LEN; - - /* setup ISAC and HSCX base addr */ - - ISAC_BASE = (caddr_t) ((u_int)dev->id_iobase | ASI_IDISAC); - HSCX_A_BASE = (caddr_t) ((u_int)dev->id_iobase | ASI_IDHSCXA); - HSCX_B_BASE = (caddr_t) ((u_int)dev->id_iobase | ASI_IDHSCXB); - IPAC_BASE = (caddr_t) ((u_int)dev->id_iobase | ASI_IDIPAC); - - return (1); -} - -int -isic_attach_asi(struct isa_device *dev, unsigned int iobase2) -{ - struct isic_softc *sc = &isic_sc[dev->id_unit]; - /* enable hscx/isac irq's */ -#if 0 -/* - * This is for ELSA driver - */ - 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 */ - - outb(dev->id_iobase + 0x4c, 0x41); /* enable card interrupt */ -#endif -/* - * This has been taken from Linux driver. - * XXX Figure out bits to use defines as original driver did. - */ - IPAC_WRITE (IPAC_CONF, 0x0); - IPAC_WRITE (IPAC_ACFG, 0xff); - IPAC_WRITE (IPAC_AOE, 0x0); - IPAC_WRITE (IPAC_MASK, 0xc0); - IPAC_WRITE (IPAC_PCFG, 0x12); - - return (1); -} - -#else /* !FreeBSD */ - -void -isic_attach_asi(psc, pa) - 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, ASI_PORT0_MAPOFF, PCI_MAPREG_TYPE_IO, 0, - &sc->sc_maps[0].t, &sc->sc_maps[0].h, NULL, NULL)) { - printf("%s: can't map i/o space\n", sc->sc_dev.dv_xname); - return; - } - sc->sc_maps[1].size = 0; - if (pci_mapreg_map(pa, ASI_PORT1_MAPOFF, PCI_MAPREG_TYPE_IO, 0, - &sc->sc_maps[1].t, &sc->sc_maps[1].h, NULL, NULL)) { - printf("%s: can't map i/o space\n", sc->sc_dev.dv_xname); - return; - } - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = asi_read_reg; - sc->writereg = asi_write_reg; - - sc->readfifo = asi_read_fifo; - sc->writefifo = asi_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_ASUSCOMIPAC; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - /* setup chip type = IPAC ! */ - - sc->sc_ipac = 1; - sc->sc_bfifolen = IPAC_BFIFO_LEN; - -#if 0 -/* - * This for ELSA card in original driver. - */ - /* 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 */ - - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, 0x4c, 0x41); /* enable card interrupt */ -#endif -/* - * This has been taken from Linux driver. - * XXX Figure out bits to use defines as original driver did. - */ - IPAC_WRITE (IPAC_CONF, 0x0); - IPAC_WRITE (IPAC_ACFG, 0xff); - IPAC_WRITE (IPAC_AOE, 0x0); - IPAC_WRITE (IPAC_MASK, 0xc0); - IPAC_WRITE (IPAC_PCFG, 0x12); -} - - -#endif - -#endif /* (NISIC > 0) && defined(ASUSCOM_IPAC) */ diff --git a/sys/i4b/layer1/i4b_avm_fritz_pci.c b/sys/i4b/layer1/i4b_avm_fritz_pci.c deleted file mode 100644 index 0b41c7bea129..000000000000 --- a/sys/i4b/layer1/i4b_avm_fritz_pci.c +++ /dev/null @@ -1,1732 +0,0 @@ -/* - * Copyright (c) 1999 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. - * - *--------------------------------------------------------------------------- - * a lot of code was borrowed from i4b_bchan.c and i4b_hscx.c - *--------------------------------------------------------------------------- - * - * Fritz!Card PCI specific routines for isic driver - * ------------------------------------------------ - * - * $FreeBSD$ - * - * last edit-date: [Tue Jun 1 14:08:01 1999] - * - *---------------------------------------------------------------------------*/ - -#if defined(__FreeBSD__) -#include "isic.h" -#include "opt_i4b.h" -#else -#define NISIC 1 -#endif - -#if NISIC > 0 && defined(AVM_A1_PCI) - -#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> -#include <pci/pcivar.h> /* for pcici_t */ -#if __FreeBSD__ < 3 -#include <pci/pcireg.h> -#include <pci/pcibus.h> -#endif /* __FreeBSD__ < 3 */ -#else -#include <machine/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 <dev/pci/pcireg.h> -#include <dev/pci/pcivar.h> -#include <dev/pci/pcidevs.h> -#include <i4b/i4b_debug.h> -#include <i4b/i4b_ioctl.h> -#endif - -#include <i4b/include/i4b_global.h> -#include <i4b/include/i4b_l1l2.h> -#include <i4b/include/i4b_mbuf.h> - -#include <i4b/layer1/i4b_l1.h> -#include <i4b/layer1/i4b_isac.h> -#include <i4b/layer1/i4b_hscx.h> - -#ifndef __FreeBSD__ - -#include <i4b/layer1/pci_isic.h> - -/* PCI config map to use (only one in this driver) */ -#define FRITZPCI_PORT0_MAPOFF PCI_MAPREG_START+4 - -#endif - -/* prototypes */ -static void avma1pp_disable(struct isic_softc *); - -#ifdef __FreeBSD__ - -static void avma1pp_intr(struct isic_softc *); -static void avma1pp_disable(struct isic_softc *); -void avma1pp_map_int(pcici_t , void *, unsigned *); -static void hscx_write_reg(int, u_int, u_int, struct isic_softc *); -static u_char hscx_read_reg(int, u_int, struct isic_softc *); -static u_int hscx_read_reg_int(int, u_int, struct isic_softc *); -static void hscx_read_fifo(int, void *, size_t, struct isic_softc *); -static void hscx_write_fifo(int, const void *, size_t, struct isic_softc *); -static void avma1pp_hscx_int_handler(struct isic_softc *); -static void avma1pp_hscx_intr(int, u_int, struct isic_softc *); -static void avma1pp_init_linktab(struct isic_softc *); -static void avma1pp_bchannel_setup(int, int, int, int); -static void avma1pp_bchannel_start(int, int); -static void avma1pp_hscx_init(struct isic_softc *, int, int); -static void avma1pp_bchannel_stat(int, int, bchan_statistics_t *); -static void avma1pp_set_linktab(int, int, drvr_link_t *); -static isdn_link_t * avma1pp_ret_linktab(int, int); -int isic_attach_avma1pp(int, u_int, u_int); -extern void isicintr_sc(struct isic_softc *); - -#else - -static int avma1pp_intr(void*); -static void avma1pp_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size); -static void avma1pp_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size); -static void avma1pp_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data); -static u_int8_t avma1pp_read_reg(struct isic_softc *sc, int what, bus_size_t offs); -static void hscx_write_fifo(int chan, const void *buf, size_t len, struct isic_softc *sc); -static void hscx_read_fifo(int chan, void *buf, size_t len, struct isic_softc *sc); -static void hscx_write_reg(int chan, u_int off, u_int val, struct isic_softc *sc); -static u_char hscx_read_reg(int chan, u_int off, struct isic_softc *sc); -static u_int hscx_read_reg_int(int chan, u_int off, struct isic_softc *sc); -static void avma1pp_fifo(isic_Bchan_t *chan, struct isic_softc *sc); -static void avma1pp_bchannel_stat(int unit, int h_chan, bchan_statistics_t *bsp); -static void avma1pp_map_int(struct pci_isic_softc *sc, struct pci_attach_args *pa); -static void avma1pp_bchannel_setup(int unit, int h_chan, int bprot, int activate); -static void avma1pp_init_linktab(struct isic_softc *); -#endif - -/*---------------------------------------------------------------------------* - * AVM PCI Fritz!Card special registers - *---------------------------------------------------------------------------*/ - -/* - * register offsets from i/o base - */ -#define STAT0_OFFSET 0x02 -#define STAT1_OFFSET 0x03 -#define ADDR_REG_OFFSET 0x04 -/*#define MODREG_OFFSET 0x06 -#define VERREG_OFFSET 0x07*/ - -/* these 2 are used to select an ISAC register set */ -#define ISAC_LO_REG_OFFSET 0x04 -#define ISAC_HI_REG_OFFSET 0x06 - -/* offset higher than this goes to the HI register set */ -#define MAX_LO_REG_OFFSET 0x2f - -/* mask for the offset */ -#define ISAC_REGSET_MASK 0x0f - -/* the offset from the base to the ISAC registers */ -#define ISAC_REG_OFFSET 0x10 - -/* the offset from the base to the ISAC FIFO */ -#define ISAC_FIFO 0x02 - -/* not really the HSCX, but sort of */ -#define HSCX_FIFO 0x00 -#define HSCX_STAT 0x04 - -/* - * AVM PCI Status Latch 0 read only bits - */ -#define ASL_IRQ_ISAC 0x01 /* ISAC interrupt, active low */ -#define ASL_IRQ_HSCX 0x02 /* HSX interrupt, active low */ -#define ASL_IRQ_TIMER 0x04 /* Timer interrupt, active low */ -#define ASL_IRQ_BCHAN ASL_IRQ_HSCX -/* actually active LOW */ -#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 */ -#define ASL_TESTBIT 0x10 /* active high */ - -/* - * AVM Status Latch 1 write only bits - */ -#define ASL1_INTSEL 0x0f /* active high */ -#define ASL1_ENABLE_IOM 0x80 /* active high */ - -/* - * "HSCX" mode bits - */ -#define HSCX_MODE_ITF_FLG 0x01 -#define HSCX_MODE_TRANS 0x02 -#define HSCX_MODE_CCR_7 0x04 -#define HSCX_MODE_CCR_16 0x08 -#define HSCX_MODE_TESTLOOP 0x80 - -/* - * "HSCX" status bits - */ -#define HSCX_STAT_RME 0x01 -#define HSCX_STAT_RDO 0x10 -#define HSCX_STAT_CRCVFRRAB 0x0E -#define HSCX_STAT_CRCVFR 0x06 -#define HSCX_STAT_RML_MASK 0x3f00 - -/* - * "HSCX" interrupt bits - */ -#define HSCX_INT_XPR 0x80 -#define HSCX_INT_XDU 0x40 -#define HSCX_INT_RPR 0x20 -#define HSCX_INT_MASK 0xE0 - -/* - * "HSCX" command bits - */ -#define HSCX_CMD_XRS 0x80 -#define HSCX_CMD_XME 0x01 -#define HSCX_CMD_RRS 0x20 -#define HSCX_CMD_XML_MASK 0x3f00 - -/* - * Commands and parameters are sent to the "HSCX" as a long, but the - * fields are handled as bytes. - * - * The long contains: - * (prot << 16)|(txl << 8)|cmd - * - * where: - * prot = protocol to use - * txl = transmit length - * cmd = the command to be executed - * - * The fields are defined as u_char in struct isic_softc. - * - * Macro to coalesce the byte fields into a u_int - */ -#define AVMA1PPSETCMDLONG(f) (f) = ((sc->avma1pp_cmd) | (sc->avma1pp_txl << 8) \ - | (sc->avma1pp_prot << 16)) - -#ifdef __FreeBSD__ - -/* "fake" addresses for the non-existent HSCX */ -/* note: the unit number is in the lower byte for both the ISAC and "HSCX" */ -#define HSCX0FAKE 0xfa000 /* read: fake0 */ -#define HSCX1FAKE 0xfa100 /* read: fake1 */ -#define IS_HSCX_MASK 0xfff00 - -#endif /* __FreeBSD__ */ - -/* - * to prevent deactivating the "HSCX" when both channels are active we - * define an HSCX_ACTIVE flag which is or'd into the channel's state - * flag in avma1pp_bchannel_setup upon active and cleared upon deactivation. - * It is set high to allow room for new flags. - */ -#define HSCX_AVMA1PP_ACTIVE 0x1000 - -/*---------------------------------------------------------------------------* - * AVM read fifo routines - *---------------------------------------------------------------------------*/ - -#ifdef __FreeBSD__ -static void -avma1pp_read_fifo(void *buf, const void *base, size_t len) -{ - int unit; - struct isic_softc *sc; - - unit = (int)base & 0xff; - sc = &isic_sc[unit]; - - /* check whether the target is an HSCX */ - if (((int)base & IS_HSCX_MASK) == HSCX0FAKE) - { - hscx_read_fifo(0, buf, len, sc); - return; - } - if (((int)base & IS_HSCX_MASK) == HSCX1FAKE) - { - hscx_read_fifo(1, buf, len, sc); - return; - } - /* tell the board to access the ISAC fifo */ - outb(sc->sc_port + ADDR_REG_OFFSET, ISAC_FIFO); - insb(sc->sc_port + ISAC_REG_OFFSET, (u_char *)buf, len); -} - -static void -hscx_read_fifo(int chan, void *buf, size_t len, struct isic_softc *sc) -{ - u_int *ip; - size_t cnt; - - outl(sc->sc_port + ADDR_REG_OFFSET, chan); - ip = (u_int *)buf; - cnt = 0; - /* what if len isn't a multiple of sizeof(int) and buf is */ - /* too small ???? */ - while (cnt < len) - { - *ip++ = inl(sc->sc_port + ISAC_REG_OFFSET); - cnt += 4; - } -} - -#else - -static void -avma1pp_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size) -{ - switch (what) { - case ISIC_WHAT_ISAC: - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ADDR_REG_OFFSET, ISAC_FIFO); - bus_space_read_multi_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ISAC_REG_OFFSET, buf, size); - break; - case ISIC_WHAT_HSCXA: - hscx_read_fifo(0, buf, size, sc); - break; - case ISIC_WHAT_HSCXB: - hscx_read_fifo(1, buf, size, sc); - break; - } -} - -static void -hscx_read_fifo(int chan, void *buf, size_t len, struct isic_softc *sc) -{ - u_int32_t *ip; - size_t cnt; - - bus_space_write_4(sc->sc_maps[0].t, sc->sc_maps[0].h, ADDR_REG_OFFSET, chan); - ip = (u_int32_t *)buf; - cnt = 0; - /* what if len isn't a multiple of sizeof(int) and buf is */ - /* too small ???? */ - while (cnt < len) - { - *ip++ = bus_space_read_4(sc->sc_maps[0].t, sc->sc_maps[0].h, ISAC_REG_OFFSET); - cnt += 4; - } -} - -#endif - -/*---------------------------------------------------------------------------* - * AVM write fifo routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -avma1pp_write_fifo(void *base, const void *buf, size_t len) -{ - int unit; - struct isic_softc *sc; - - unit = (int)base & 0xff; - sc = &isic_sc[unit]; - - /* check whether the target is an HSCX */ - if (((int)base & IS_HSCX_MASK) == HSCX0FAKE) - { - hscx_write_fifo(0, buf, len, sc); - return; - } - if (((int)base & IS_HSCX_MASK) == HSCX1FAKE) - { - hscx_write_fifo(1, buf, len, sc); - return; - } - /* tell the board to use the ISAC fifo */ - outb(sc->sc_port + ADDR_REG_OFFSET, ISAC_FIFO); - outsb(sc->sc_port + ISAC_REG_OFFSET, (const u_char *)buf, len); -} - -static void -hscx_write_fifo(int chan, const void *buf, size_t len, struct isic_softc *sc) -{ - register const u_int *ip; - register size_t cnt; - isic_Bchan_t *Bchan = &sc->sc_chan[chan]; - - sc->avma1pp_cmd &= ~HSCX_CMD_XME; - sc->avma1pp_txl = 0; - if (Bchan->out_mbuf_cur == NULL) - { - if (Bchan->bprot != BPROT_NONE) - sc->avma1pp_cmd |= HSCX_CMD_XME; - } - if (len != sc->sc_bfifolen) - sc->avma1pp_txl = len; - - cnt = 0; /* borrow cnt */ - AVMA1PPSETCMDLONG(cnt); - hscx_write_reg(chan, HSCX_STAT, cnt, sc); - - ip = (const u_int *)buf; - cnt = 0; - while (cnt < len) - { - outl(sc->sc_port + ISAC_REG_OFFSET, *ip++); - cnt += 4; - } -} - -#else - -static void -avma1pp_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size) -{ - switch (what) { - case ISIC_WHAT_ISAC: - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ADDR_REG_OFFSET, ISAC_FIFO); - bus_space_write_multi_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ISAC_REG_OFFSET, (u_int8_t*)buf, size); - break; - case ISIC_WHAT_HSCXA: - hscx_write_fifo(0, buf, size, sc); - break; - case ISIC_WHAT_HSCXB: - hscx_write_fifo(1, buf, size, sc); - break; - } -} - -static void -hscx_write_fifo(int chan, const void *buf, size_t len, struct isic_softc *sc) -{ - u_int32_t *ip; - size_t cnt; - isic_Bchan_t *Bchan = &sc->sc_chan[chan]; - - sc->avma1pp_cmd &= ~HSCX_CMD_XME; - sc->avma1pp_txl = 0; - if (Bchan->out_mbuf_cur == NULL) - { - if (Bchan->bprot != BPROT_NONE) - sc->avma1pp_cmd |= HSCX_CMD_XME; - } - if (len != sc->sc_bfifolen) - sc->avma1pp_txl = len; - - cnt = 0; /* borrow cnt */ - AVMA1PPSETCMDLONG(cnt); - hscx_write_reg(chan, HSCX_STAT, cnt, sc); - - ip = (u_int32_t *)buf; - cnt = 0; - while (cnt < len) - { - bus_space_write_4(sc->sc_maps[0].t, sc->sc_maps[0].h, ISAC_REG_OFFSET, *ip); - ip++; - cnt += 4; - } -} -#endif - -/*---------------------------------------------------------------------------* - * AVM write register routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -static void -avma1pp_write_reg(u_char *base, u_int offset, u_int v) -{ - int unit; - struct isic_softc *sc; - u_char reg_bank; - - unit = (int)base & 0xff; - sc = &isic_sc[unit]; - - /* check whether the target is an HSCX */ - if (((int)base & IS_HSCX_MASK) == HSCX0FAKE) - { - hscx_write_reg(0, offset, v, sc); - return; - } - if (((int)base & IS_HSCX_MASK) == HSCX1FAKE) - { - hscx_write_reg(1, offset, v, sc); - return; - } - /* must be the ISAC */ - reg_bank = (offset > MAX_LO_REG_OFFSET) ? ISAC_HI_REG_OFFSET:ISAC_LO_REG_OFFSET; -#ifdef AVMA1PCI_DEBUG - printf("write_reg bank %d off %d.. ", reg_bank, offset); -#endif - /* set the register bank */ - outb(sc->sc_port + ADDR_REG_OFFSET, reg_bank); - outb(sc->sc_port + ISAC_REG_OFFSET + (offset & ISAC_REGSET_MASK), v); -} - -static void -hscx_write_reg(int chan, u_int off, u_int val, struct isic_softc *sc) -{ - /* HACK */ - if (off == H_MASK) - return; - /* point at the correct channel */ - outl(sc->sc_port + ADDR_REG_OFFSET, chan); - outl(sc->sc_port + ISAC_REG_OFFSET + off, val); -} - -#else - -static void -avma1pp_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data) -{ - u_char reg_bank; - switch (what) { - case ISIC_WHAT_ISAC: - reg_bank = (offs > MAX_LO_REG_OFFSET) ? ISAC_HI_REG_OFFSET:ISAC_LO_REG_OFFSET; -#ifdef AVMA1PCI_DEBUG - printf("write_reg bank %d off %ld.. ", (int)reg_bank, (long)offs); -#endif - /* set the register bank */ - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ADDR_REG_OFFSET, reg_bank); - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ISAC_REG_OFFSET + (offs & ISAC_REGSET_MASK), data); - break; - case ISIC_WHAT_HSCXA: - hscx_write_reg(0, offs, data, sc); - break; - case ISIC_WHAT_HSCXB: - hscx_write_reg(1, offs, data, sc); - break; - } -} - -static void -hscx_write_reg(int chan, u_int off, u_int val, struct isic_softc *sc) -{ - /* HACK */ - if (off == H_MASK) - return; - /* point at the correct channel */ - bus_space_write_4(sc->sc_maps[0].t, sc->sc_maps[0].h, ADDR_REG_OFFSET, chan); - bus_space_write_4(sc->sc_maps[0].t, sc->sc_maps[0].h, ISAC_REG_OFFSET + off, val); -} - -#endif - -/*---------------------------------------------------------------------------* - * AVM read register routines - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ - -static u_char -avma1pp_read_reg(u_char *base, u_int offset) -{ - int unit; - struct isic_softc *sc; - u_char reg_bank; - - unit = (int)base & 0xff; - sc = &isic_sc[unit]; - - /* check whether the target is an HSCX */ - if (((int)base & IS_HSCX_MASK) == HSCX0FAKE) - return(hscx_read_reg(0, offset, sc)); - if (((int)base & IS_HSCX_MASK) == HSCX1FAKE) - return(hscx_read_reg(1, offset, sc)); - /* must be the ISAC */ - reg_bank = (offset > MAX_LO_REG_OFFSET) ? ISAC_HI_REG_OFFSET:ISAC_LO_REG_OFFSET; -#ifdef AVMA1PCI_DEBUG - printf("read_reg bank %d off %d.. ", reg_bank, offset); -#endif - /* set the register bank */ - outb(sc->sc_port + ADDR_REG_OFFSET, reg_bank); - return(inb(sc->sc_port + ISAC_REG_OFFSET + - (offset & ISAC_REGSET_MASK))); -} -#else -static u_int8_t -avma1pp_read_reg(struct isic_softc *sc, int what, bus_size_t offs) -{ - u_char reg_bank; - switch (what) { - case ISIC_WHAT_ISAC: - reg_bank = (offs > MAX_LO_REG_OFFSET) ? ISAC_HI_REG_OFFSET:ISAC_LO_REG_OFFSET; -#ifdef AVMA1PCI_DEBUG - printf("read_reg bank %d off %ld.. ", (int)reg_bank, (long)offs); -#endif - /* set the register bank */ - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ADDR_REG_OFFSET, reg_bank); - return(bus_space_read_1(sc->sc_maps[0].t, sc->sc_maps[0].h, ISAC_REG_OFFSET + - (offs & ISAC_REGSET_MASK))); - case ISIC_WHAT_HSCXA: - return hscx_read_reg(0, offs, sc); - case ISIC_WHAT_HSCXB: - return hscx_read_reg(1, offs, sc); - } - return 0; -} -#endif - -static u_char -hscx_read_reg(int chan, u_int off, struct isic_softc *sc) -{ - return(hscx_read_reg_int(chan, off, sc) & 0xff); -} - -/* - * need to be able to return an int because the RBCH is in the 2nd - * byte. - */ -static u_int -hscx_read_reg_int(int chan, u_int off, struct isic_softc *sc) -{ - /* HACK */ - if (off == H_ISTA) - return(0); - /* point at the correct channel */ -#ifdef __FreeBSD__ - outl(sc->sc_port + ADDR_REG_OFFSET, chan); - return(inl(sc->sc_port + ISAC_REG_OFFSET + off)); -#else - bus_space_write_4(sc->sc_maps[0].t, sc->sc_maps[0].h, ADDR_REG_OFFSET, chan); - return(bus_space_read_4(sc->sc_maps[0].t, sc->sc_maps[0].h, ISAC_REG_OFFSET + off)); -#endif -} - -/*---------------------------------------------------------------------------* - * isic_attach_avma1pp - attach Fritz!Card PCI - *---------------------------------------------------------------------------*/ -#ifdef __FreeBSD__ -int -isic_attach_avma1pp(int unit, u_int iobase1, u_int iobase2) -{ - struct isic_softc *sc = &isic_sc[unit]; - u_int v; - - /* check max unit range */ - - if(unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for AVM FRITZ/PCI!\n", - unit, unit); - return(0); - } - sc->sc_unit = unit; - - /* setup iobase */ - - if((iobase1 <= 0) || (iobase1 > 0xffff)) - { - printf("isic%d: Error, invalid iobase 0x%x specified for AVM FRITZ/PCI!\n", - unit, iobase1); - return(0); - } - sc->sc_port = iobase1; - - /* the ISAC lives at offset 0x10, but we can't use that. */ - /* instead, put the unit number into the lower byte - HACK */ - sc->sc_isac = (caddr_t)((int)(iobase1 & ~0xff) + unit); - - /* this thing doesn't have an HSCX, so fake the base addresses */ - /* put the unit number into the lower byte - HACK */ - HSCX_A_BASE = (caddr_t)(HSCX0FAKE + unit); - HSCX_B_BASE = (caddr_t)(HSCX1FAKE + unit); - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = avma1pp_read_reg; - sc->writereg = avma1pp_write_reg; - - sc->readfifo = avma1pp_read_fifo; - sc->writefifo = avma1pp_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_AVMA1PCI; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - /* set up some other miscellaneous things */ - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* reset the card */ - /* the Linux driver does this to clear any pending ISAC interrupts */ - v = 0; - v = ISAC_READ(I_STAR); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_STAR %x...", v); -#endif - v = ISAC_READ(I_MODE); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_MODE %x...", v); -#endif - v = ISAC_READ(I_ADF2); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_ADF2 %x...", v); -#endif - v = ISAC_READ(I_ISTA); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_ISTA %x...", v); -#endif - if (v & ISAC_ISTA_EXI) - { - v = ISAC_READ(I_EXIR); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_EXIR %x...", v); -#endif - } - v = ISAC_READ(I_CIRR); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_CIRR %x...", v); -#endif - ISAC_WRITE(I_MASK, 0xff); - /* the Linux driver does this to clear any pending HSCX interrupts */ - v = hscx_read_reg_int(0, HSCX_STAT, sc); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: 0 HSCX_STAT %x...", v); -#endif - v = hscx_read_reg_int(1, HSCX_STAT, sc); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: 1 HSCX_STAT %x\n", v); -#endif - - outb(sc->sc_port + STAT0_OFFSET, ASL_RESET_ALL|ASL_TIMERDISABLE); - DELAY(SEC_DELAY/100); /* 10 ms */ - outb(sc->sc_port + STAT0_OFFSET, ASL_TIMERRESET|ASL_ENABLE_INT|ASL_TIMERDISABLE); - DELAY(SEC_DELAY/100); /* 10 ms */ -#ifdef AVMA1PCI_DEBUG - outb(sc->sc_port + STAT1_OFFSET, ASL1_ENABLE_IOM|sc->sc_irq); - DELAY(SEC_DELAY/100); /* 10 ms */ - printf("after reset: S1 %#x\n", inb(sc->sc_port + STAT1_OFFSET)); - - v = inl(sc->sc_port); - printf("isic_attach_avma1pp: v %#x\n", v); -#endif - - /* from here to the end would normally be done in isic_pciattach */ - - printf("isic%d: ISAC %s (IOM-%c)\n", unit, - "2085 Version A1/A2 or 2086/2186 Version 1.1", - sc->sc_bustyp == BUS_TYPE_IOM1 ? '1' : '2'); - - /* init the ISAC */ - isic_isac_init(sc); - - /* init the "HSCX" */ - avma1pp_bchannel_setup(sc->sc_unit, HSCX_CH_A, BPROT_NONE, 0); - - avma1pp_bchannel_setup(sc->sc_unit, HSCX_CH_B, BPROT_NONE, 0); - - /* can't use the normal B-Channel stuff */ - avma1pp_init_linktab(sc); - - /* set trace level */ - - sc->sc_trace = TRACE_OFF; - - sc->sc_state = ISAC_IDLE; - - sc->sc_ibuf = NULL; - sc->sc_ib = NULL; - sc->sc_ilen = 0; - - sc->sc_obuf = NULL; - sc->sc_op = NULL; - sc->sc_ol = 0; - sc->sc_freeflag = 0; - - sc->sc_obuf2 = NULL; - sc->sc_freeflag2 = 0; - -#if defined(__FreeBSD__) && __FreeBSD__ >=3 - callout_handle_init(&sc->sc_T3_callout); - callout_handle_init(&sc->sc_T4_callout); -#endif - - /* init higher protocol layers */ - - MPH_Status_Ind(sc->sc_unit, STI_ATTACH, sc->sc_cardtyp); - - return(1); -} - -#else - -void -isic_attach_fritzPci(struct pci_isic_softc *psc, struct pci_attach_args *pa) -{ - struct isic_softc *sc = &psc->sc_isic; - u_int v; - - isic_sc[sc->sc_unit] = sc; /* XXX - hack! */ - - /* setup io mappings */ - sc->sc_num_mappings = 1; - MALLOC_MAPS(sc); - sc->sc_maps[0].size = 0; - if (pci_mapreg_map(pa, FRITZPCI_PORT0_MAPOFF, PCI_MAPREG_TYPE_IO, 0, - &sc->sc_maps[0].t, &sc->sc_maps[0].h, NULL, NULL)) { - printf("%s: can't map i/o space\n", sc->sc_dev.dv_xname); - return; - } - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = avma1pp_read_reg; - sc->writereg = avma1pp_write_reg; - - sc->readfifo = avma1pp_read_fifo; - sc->writefifo = avma1pp_write_fifo; - - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_AVMA1PCI; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - /* this is no IPAC based card */ - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* init the card */ - /* the Linux driver does this to clear any pending ISAC interrupts */ - /* see if it helps any - XXXX */ - v = 0; - v = ISAC_READ(I_STAR); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_STAR %x...", v); -#endif - v = ISAC_READ(I_MODE); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_MODE %x...", v); -#endif - v = ISAC_READ(I_ADF2); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_ADF2 %x...", v); -#endif - v = ISAC_READ(I_ISTA); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_ISTA %x...", v); -#endif - if (v & ISAC_ISTA_EXI) - { - v = ISAC_READ(I_EXIR); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_EXIR %x...", v); -#endif - } - v = ISAC_READ(I_CIRR); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: I_CIRR %x...", v); -#endif - ISAC_WRITE(I_MASK, 0xff); - /* the Linux driver does this to clear any pending HSCX interrupts */ - v = hscx_read_reg_int(0, HSCX_STAT, sc); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: 0 HSCX_STAT %x...", v); -#endif - v = hscx_read_reg_int(1, HSCX_STAT, sc); -#ifdef AVMA1PCI_DEBUG - printf("avma1pp_attach: 1 HSCX_STAT %x\n", v); -#endif - - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, STAT0_OFFSET, ASL_RESET_ALL|ASL_TIMERDISABLE); - DELAY(SEC_DELAY/100); /* 10 ms */ - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, STAT0_OFFSET, ASL_TIMERRESET|ASL_ENABLE_INT|ASL_TIMERDISABLE); - DELAY(SEC_DELAY/100); /* 10 ms */ -#ifdef AVMA1PCI_DEBUG - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, STAT1_OFFSET, ASL1_ENABLE_IOM|sc->sc_irq); - DELAY(SEC_DELAY/100); /* 10 ms */ - v = bus_space_read_1(sc->sc_maps[0].t, sc->sc_maps[0].h, STAT1_OFFSET); - printf("after reset: S1 %#x\n", v); - - v = bus_space_read_4(sc->sc_maps[0].t, sc->sc_maps[0].h, 0); - printf("isic_attach_avma1pp: v %#x\n", v); -#endif - - /* setup i4b infrastructure (have to roll our own here) */ - - /* sc->sc_isac_version = ((ISAC_READ(I_RBCH)) >> 5) & 0x03; */ - printf("%s: ISAC %s (IOM-%c)\n", sc->sc_dev.dv_xname, - "2085 Version A1/A2 or 2086/2186 Version 1.1", - sc->sc_bustyp == BUS_TYPE_IOM1 ? '1' : '2'); - - /* init the ISAC */ - isic_isac_init(sc); - - /* init the "HSCX" */ - avma1pp_bchannel_setup(sc->sc_unit, HSCX_CH_A, BPROT_NONE, 0); - - avma1pp_bchannel_setup(sc->sc_unit, HSCX_CH_B, BPROT_NONE, 0); - - /* can't use the normal B-Channel stuff */ - avma1pp_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 */ - - MPH_Status_Ind(sc->sc_unit, STI_ATTACH, sc->sc_cardtyp); - - /* setup interrupt mapping */ - avma1pp_map_int(psc, pa); -} - -#endif - -/* - * this is the real interrupt routine - */ -static void -avma1pp_hscx_intr(int h_chan, u_int stat, struct isic_softc *sc) -{ - register isic_Bchan_t *chan = &sc->sc_chan[h_chan]; - int activity = -1; - u_int param = 0; - - DBGL1(L1_H_IRQ, "avma1pp_hscx_intr", ("%#x\n", stat)); - - if((stat & HSCX_INT_XDU) && (chan->bprot != BPROT_NONE))/* xmit data underrun */ - { - chan->stat_XDU++; - DBGL1(L1_H_XFRERR, "avma1pp_hscx_intr", ("xmit data underrun\n")); - /* abort the transmission */ - sc->avma1pp_txl = 0; - sc->avma1pp_cmd |= HSCX_CMD_XRS; - AVMA1PPSETCMDLONG(param); - hscx_write_reg(h_chan, HSCX_STAT, param, sc); - sc->avma1pp_cmd &= ~HSCX_CMD_XRS; - AVMA1PPSETCMDLONG(param); - hscx_write_reg(h_chan, HSCX_STAT, param, sc); - - 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; - } - } - - /* - * The following is based on examination of the Linux driver. - * - * The logic here is different than with a "real" HSCX; all kinds - * of information (interrupt/status bits) are in stat. - * HSCX_INT_RPR indicates a receive interrupt - * HSCX_STAT_RDO indicates an overrun condition, abort - - * otherwise read the bytes ((stat & HSCX_STZT_RML_MASK) >> 8) - * HSCX_STAT_RME indicates end-of-frame and apparently any - * CRC/framing errors are only reported in this state. - * if ((stat & HSCX_STAT_CRCVFRRAB) != HSCX_STAT_CRCVFR) - * CRC/framing error - */ - - if(stat & HSCX_INT_RPR) - { - register int fifo_data_len; - int error = 0; - /* always have to read the FIFO, so use a scratch buffer */ - u_char scrbuf[HSCX_FIFO_LEN]; - - if(stat & HSCX_STAT_RDO) - { - chan->stat_RDO++; - DBGL1(L1_H_XFRERR, "avma1pp_hscx_intr", ("receive data overflow\n")); - error++; - } - - fifo_data_len = ((stat & HSCX_STAT_RML_MASK) >> 8); - - if(fifo_data_len == 0) - fifo_data_len = sc->sc_bfifolen; - - /* ALWAYS read data from HSCX fifo */ - - HSCX_RDFIFO(h_chan, scrbuf, fifo_data_len); - chan->rxcount += fifo_data_len; - - /* 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 avma1pp_hscx_intr: RME, cannot allocate mbuf!\n"); - chan->in_cbptr = chan->in_mbuf->m_data; - chan->in_len = 0; - } - - if((chan->in_len + fifo_data_len) <= BCH_MAX_DATALEN) - { - /* OK to copy the data */ - bcopy(scrbuf, chan->in_cbptr, fifo_data_len); - chan->in_cbptr += fifo_data_len; - chan->in_len += 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_t hdr; - hdr.unit = sc->sc_unit; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_NT; - hdr.count = ++sc->sc_trace_bcount; - MICROTIME(hdr.time); - MPH_Trace_Ind(&hdr, chan->in_mbuf->m_len, chan->in_mbuf->m_data); - } - - if (stat & HSCX_STAT_RME) - { - if((stat & HSCX_STAT_CRCVFRRAB) == HSCX_STAT_CRCVFR) - { - (*chan->drvr_linktab->bch_rx_data_ready)(chan->drvr_linktab->unit); - activity = ACT_RX; - - /* mark buffer ptr as unused */ - - chan->in_mbuf = NULL; - chan->in_cbptr = NULL; - chan->in_len = 0; - } - else - { - chan->stat_CRC++; - DBGL1(L1_H_XFRERR, "avma1pp_hscx_intr", ("CRC/RAB\n")); - if (chan->in_mbuf != NULL) - { - i4b_Bfreembuf(chan->in_mbuf); - chan->in_mbuf = NULL; - chan->in_cbptr = NULL; - chan->in_len = 0; - } - } - } - } /* END enough space in mbuf */ - 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_t hdr; - hdr.unit = sc->sc_unit; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_NT; - hdr.count = ++sc->sc_trace_bcount; - MICROTIME(hdr.time); - MPH_Trace_Ind(&hdr, chan->in_mbuf->m_len, chan->in_mbuf->m_data); - } - - /* move rx'd data to rx queue */ - - IF_ENQUEUE(&chan->rx_queue, chan->in_mbuf); - - (*chan->drvr_linktab->bch_rx_data_ready)(chan->drvr_linktab->unit); - - if(!(isic_hscx_silence(chan->in_mbuf->m_data, chan->in_mbuf->m_len))) - activity = ACT_RX; - - /* alloc new buffer */ - - if((chan->in_mbuf = i4b_Bgetmbuf(BCH_MAX_DATALEN)) == NULL) - panic("L1 avma1pp_hscx_intr: RPF, cannot allocate new mbuf!\n"); - - /* setup new data ptr */ - - chan->in_cbptr = chan->in_mbuf->m_data; - - /* OK to copy the data */ - bcopy(scrbuf, chan->in_cbptr, fifo_data_len); - - chan->in_cbptr += fifo_data_len; - chan->in_len = fifo_data_len; - - chan->rxcount += fifo_data_len; - } - else - { - DBGL1(L1_H_XFRERR, "avma1pp_hscx_intr", ("RAWHDLC rx buffer overflow in RPF, in_len=%d\n", chan->in_len)); - chan->in_cbptr = chan->in_mbuf->m_data; - chan->in_len = 0; - } - } - } /* if(error == 0) */ - else - { - /* land here for RDO */ - if (chan->in_mbuf != NULL) - { - i4b_Bfreembuf(chan->in_mbuf); - chan->in_mbuf = NULL; - chan->in_cbptr = NULL; - chan->in_len = 0; - } - sc->avma1pp_txl = 0; - sc->avma1pp_cmd |= HSCX_CMD_RRS; - AVMA1PPSETCMDLONG(param); - hscx_write_reg(h_chan, HSCX_STAT, param, sc); - sc->avma1pp_cmd &= ~HSCX_CMD_RRS; - AVMA1PPSETCMDLONG(param); - hscx_write_reg(h_chan, HSCX_STAT, param, sc); - } - } - - - /* transmit fifo empty, new data can be written to fifo */ - - if(stat & HSCX_INT_XPR) - { - /* - * for a description what is going on here, please have - * a look at isic_bchannel_start() in i4b_bchan.c ! - */ - - DBGL1(L1_H_IRQ, "avma1pp_hscx_intr", ("unit %d, chan %d - XPR, Tx Fifo Empty!\n", sc->sc_unit, 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->drvr_linktab->bch_tx_queue_empty)(chan->drvr_linktab->unit); - } - 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_t hdr; - hdr.unit = sc->sc_unit; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_bcount; - MICROTIME(hdr.time); - MPH_Trace_Ind(&hdr, chan->out_mbuf_cur->m_len, chan->out_mbuf_cur->m_data); - } - - if(chan->bprot == BPROT_NONE) - { - if(!(isic_hscx_silence(chan->out_mbuf_cur->m_data, chan->out_mbuf_cur->m_len))) - activity = ACT_TX; - } - else - { - activity = ACT_TX; - } - } - } - - isic_hscx_fifo(chan, sc); - } - - /* call timeout handling routine */ - - if(activity == ACT_RX || activity == ACT_TX) - (*chan->drvr_linktab->bch_activity)(chan->drvr_linktab->unit, activity); -} - -/* - * this is the main routine which checks each channel and then calls - * the real interrupt routine as appropriate - */ -static void -avma1pp_hscx_int_handler(struct isic_softc *sc) -{ - u_int stat; - - /* has to be a u_int because the byte count is in the 2nd byte */ - stat = hscx_read_reg_int(0, HSCX_STAT, sc); - if (stat & HSCX_INT_MASK) - avma1pp_hscx_intr(0, stat, sc); - stat = hscx_read_reg_int(1, HSCX_STAT, sc); - if (stat & HSCX_INT_MASK) - avma1pp_hscx_intr(1, stat, sc); -} - -static void -avma1pp_disable(struct isic_softc *sc) -{ -#ifdef __FreeBSD__ - outb(sc->sc_port + STAT0_OFFSET, ASL_RESET_ALL|ASL_TIMERDISABLE); -#else - bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, STAT0_OFFSET, ASL_RESET_ALL|ASL_TIMERDISABLE); -#endif -} - -#ifdef __FreeBSD__ -static void -avma1pp_intr(struct isic_softc *sc) -{ -#define OURS /* no return value accumulated */ -#define ISICINTR(sc) isicintr_sc(sc) -#else -static int -avma1pp_intr(void * parm) -{ - struct isic_softc *sc = parm; - int ret = 0; -#define OURS ret = 1 -#define ISICINTR(sc) isicintr(sc) -#endif - u_char stat; - -#ifdef __FreeBSD__ - stat = inb(sc->sc_port + STAT0_OFFSET); -#else - stat = bus_space_read_1(sc->sc_maps[0].t, sc->sc_maps[0].h, STAT0_OFFSET); -#endif - DBGL1(L1_H_IRQ, "avma1pp_intr", ("stat %x\n", stat)); - /* was there an interrupt from this card ? */ - if ((stat & ASL_IRQ_Pending) == ASL_IRQ_Pending) -#ifdef __FreeBSD__ - return; /* no */ -#else - return 0; /* no */ -#endif - /* interrupts are low active */ - if (!(stat & ASL_IRQ_TIMER)) - DBGL1(L1_H_IRQ, "avma1pp_intr", ("timer interrupt ???\n")); - if (!(stat & ASL_IRQ_HSCX)) - { - DBGL1(L1_H_IRQ, "avma1pp_intr", ("HSCX\n")); - avma1pp_hscx_int_handler(sc); - OURS; - } - if (!(stat & ASL_IRQ_ISAC)) - { - DBGL1(L1_H_IRQ, "avma1pp_intr", ("ISAC\n")); - ISICINTR(sc); - OURS; - } -#ifndef __FreeBSD__ - return ret; -#endif -} - -#ifdef __FreeBSD__ -void -avma1pp_map_int(pcici_t config_id, void *pisc, unsigned *net_imask) -{ - struct isic_softc *sc = (struct isic_softc *)pisc; - -#ifdef AVMA1PCI_DEBUG - /* may need the irq later */ -#if __FreeBSD__ < 3 - /* I'd like to call getirq here, but it is static */ - sc->sc_irq = PCI_INTERRUPT_LINE_EXTRACT( - pci_conf_read (config_id, PCI_INTERRUPT_REG)); - - if (sc->sc_irq == 0 || sc->sc_irq == 0xff) - printf ("avma1pp_map_int:int line register not set by bios\n"); - - if (sc->sc_irq >= PCI_MAX_IRQ) - printf ("avma1pp_map_int:irq %d out of bounds (must be < %d)\n", - sc->sc_irq, PCI_MAX_IRQ); -#else - sc->sc_irq = config_id->intline; -#endif -#endif /* AVMA1PCI_DEBUG */ - - if(!(pci_map_int(config_id, (void *)avma1pp_intr, sc, net_imask))) - { - printf("Failed to map interrupt for AVM Fritz!Card PCI\n"); - /* disable the card */ - avma1pp_disable(sc); - } -} -#else -static void -avma1pp_map_int(struct pci_isic_softc *psc, struct pci_attach_args *pa) -{ - struct isic_softc *sc = &psc->sc_isic; - pci_chipset_tag_t pc = pa->pa_pc; - pci_intr_handle_t ih; - const char *intrstr; - - /* Map and establish the interrupt. */ - if (pci_intr_map(pc, pa->pa_intrtag, pa->pa_intrpin, - pa->pa_intrline, &ih)) { - printf("%s: couldn't map interrupt\n", sc->sc_dev.dv_xname); - avma1pp_disable(sc); - return; - } - intrstr = pci_intr_string(pc, ih); - psc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, avma1pp_intr, sc); - if (psc->sc_ih == NULL) { - printf("%s: couldn't establish interrupt", - sc->sc_dev.dv_xname); - if (intrstr != NULL) - printf(" at %s", intrstr); - printf("\n"); - avma1pp_disable(sc); - return; - } - printf("%s: interrupting at %s\n", sc->sc_dev.dv_xname, intrstr); -} -#endif - -static void -avma1pp_hscx_init(struct isic_softc *sc, int h_chan, int activate) -{ - isic_Bchan_t *chan = &sc->sc_chan[h_chan]; - u_int param = 0; - - DBGL1(L1_BCHAN, "avma1pp_hscx_init", ("unit=%d, channel=%d, %s\n", - sc->sc_unit, h_chan, activate ? "activate" : "deactivate")); - - if (activate == 0) - { - /* only deactivate if both channels are idle */ - if (sc->sc_chan[HSCX_CH_A].state != HSCX_IDLE || - sc->sc_chan[HSCX_CH_B].state != HSCX_IDLE) - { - return; - } - sc->avma1pp_cmd = HSCX_CMD_XRS|HSCX_CMD_RRS; - sc->avma1pp_prot = HSCX_MODE_TRANS; - AVMA1PPSETCMDLONG(param); - hscx_write_reg(h_chan, HSCX_STAT, param, sc); - return; - } - if(chan->bprot == BPROT_RHDLC) - { - DBGL1(L1_BCHAN, "avma1pp_hscx_init", ("BPROT_RHDLC\n")); - - /* HDLC Frames, transparent mode 0 */ - sc->avma1pp_cmd = HSCX_CMD_XRS|HSCX_CMD_RRS; - sc->avma1pp_prot = HSCX_MODE_ITF_FLG; - AVMA1PPSETCMDLONG(param); - hscx_write_reg(h_chan, HSCX_STAT, param, sc); - sc->avma1pp_cmd = HSCX_CMD_XRS; - AVMA1PPSETCMDLONG(param); - hscx_write_reg(h_chan, HSCX_STAT, param, sc); - sc->avma1pp_cmd = 0; - } - else - { - DBGL1(L1_BCHAN, "avma1pp_hscx_init", ("BPROT_NONE??\n")); - - /* Raw Telephony, extended transparent mode 1 */ - sc->avma1pp_cmd = HSCX_CMD_XRS|HSCX_CMD_RRS; - sc->avma1pp_prot = HSCX_MODE_TRANS; - AVMA1PPSETCMDLONG(param); - hscx_write_reg(h_chan, HSCX_STAT, param, sc); - sc->avma1pp_cmd = HSCX_CMD_XRS; - AVMA1PPSETCMDLONG(param); - hscx_write_reg(h_chan, HSCX_STAT, param, sc); - sc->avma1pp_cmd = 0; - } -} - -static void -avma1pp_bchannel_setup(int unit, int h_chan, int bprot, int activate) -{ -#ifdef __FreeBSD__ - struct isic_softc *sc = &isic_sc[unit]; -#else - struct isic_softc *sc = isic_find_sc(unit); -#endif - isic_Bchan_t *chan = &sc->sc_chan[h_chan]; - - int s = SPLI4B(); - - if(activate == 0) - { - /* deactivation */ - chan->state &= ~HSCX_AVMA1PP_ACTIVE; - avma1pp_hscx_init(sc, h_chan, activate); - } - - DBGL1(L1_BCHAN, "avma1pp_bchannel_setup", ("unit=%d, channel=%d, %s\n", - sc->sc_unit, h_chan, activate ? "activate" : "deactivate")); - - /* general part */ - - chan->unit = sc->sc_unit; /* unit number */ - 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 */ - avma1pp_hscx_init(sc, h_chan, activate); - chan->state |= HSCX_AVMA1PP_ACTIVE; - } - - splx(s); -} - -static void -avma1pp_bchannel_start(int unit, int h_chan) -{ -#ifdef __FreeBSD__ - struct isic_softc *sc = &isic_sc[unit]; -#else - struct isic_softc *sc = isic_find_sc(unit); -#endif - register isic_Bchan_t *chan = &sc->sc_chan[h_chan]; - int s; - int activity = -1; - - s = SPLI4B(); /* 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(!(isic_hscx_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_t hdr; - hdr.unit = unit; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_bcount; - MICROTIME(hdr.time); - MPH_Trace_Ind(&hdr, chan->out_mbuf_cur->m_len, chan->out_mbuf_cur->m_data); - } - - isic_hscx_fifo(chan, sc); - - /* call timeout handling routine */ - - if(activity == ACT_RX || activity == ACT_TX) - (*chan->drvr_linktab->bch_activity)(chan->drvr_linktab->unit, activity); - - splx(s); -} - -/*---------------------------------------------------------------------------* - * return the address of isic drivers linktab - *---------------------------------------------------------------------------*/ -static isdn_link_t * -avma1pp_ret_linktab(int unit, int channel) -{ -#ifdef __FreeBSD__ - struct isic_softc *sc = &isic_sc[unit]; -#else - struct isic_softc *sc = isic_find_sc(unit); -#endif - isic_Bchan_t *chan = &sc->sc_chan[channel]; - - return(&chan->isdn_linktab); -} - -/*---------------------------------------------------------------------------* - * set the driver linktab in the b channel softc - *---------------------------------------------------------------------------*/ -static void -avma1pp_set_linktab(int unit, int channel, drvr_link_t *dlt) -{ -#ifdef __FreeBSD__ - struct isic_softc *sc = &isic_sc[unit]; -#else - struct isic_softc *sc = isic_find_sc(unit); -#endif - isic_Bchan_t *chan = &sc->sc_chan[channel]; - - chan->drvr_linktab = dlt; -} - - -/*---------------------------------------------------------------------------* - * initialize our local linktab - *---------------------------------------------------------------------------*/ -static void -avma1pp_init_linktab(struct isic_softc *sc) -{ - isic_Bchan_t *chan = &sc->sc_chan[HSCX_CH_A]; - isdn_link_t *lt = &chan->isdn_linktab; - - /* make sure the hardware driver is known to layer 4 */ - /* avoid overwriting if already set */ - if (ctrl_types[CTRL_PASSIVE].set_linktab == NULL) - { - ctrl_types[CTRL_PASSIVE].set_linktab = avma1pp_set_linktab; - ctrl_types[CTRL_PASSIVE].get_linktab = avma1pp_ret_linktab; - } - - /* local setup */ - lt->unit = sc->sc_unit; - lt->channel = HSCX_CH_A; - lt->bch_config = avma1pp_bchannel_setup; - lt->bch_tx_start = avma1pp_bchannel_start; - lt->bch_stat = avma1pp_bchannel_stat; - 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->unit = sc->sc_unit; - lt->channel = HSCX_CH_B; - lt->bch_config = avma1pp_bchannel_setup; - lt->bch_tx_start = avma1pp_bchannel_start; - lt->bch_stat = avma1pp_bchannel_stat; - 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; -} - -/* - * use this instead of isic_bchannel_stat in i4b_bchan.c because it's static - */ -static void -avma1pp_bchannel_stat(int unit, int h_chan, bchan_statistics_t *bsp) -{ -#ifdef __FreeBSD__ - struct isic_softc *sc = &isic_sc[unit]; -#else - struct isic_softc *sc = isic_find_sc(unit); -#endif - isic_Bchan_t *chan = &sc->sc_chan[h_chan]; - int s; - - s = SPLI4B(); - - bsp->outbytes = chan->txcount; - bsp->inbytes = chan->rxcount; - - chan->txcount = 0; - chan->rxcount = 0; - - splx(s); -} - -/*---------------------------------------------------------------------------* - * fill HSCX fifo with data from the current mbuf - * Put this here until it can go into i4b_hscx.c - *---------------------------------------------------------------------------*/ -static int -isic_hscx_fifo(isic_Bchan_t *chan, struct isic_softc *sc) -{ - int len; - int nextlen; - int i; - int cmd; - /* using a scratch buffer simplifies writing to the FIFO */ - u_char scrbuf[HSCX_FIFO_LEN]; - - len = 0; - - /* - * 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(chan->out_mbuf_cur && len != sc->sc_bfifolen) - { - nextlen = min(chan->out_mbuf_cur_len, sc->sc_bfifolen - len); - -#ifdef NOTDEF - printf("i:mh=%p, mc=%p, mcp=%p, 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, - nextlen); -#endif - - cmd |= HSCX_CMDR_XTF; - /* collect the data in the scratch buffer */ - for (i = 0; i < nextlen; i++) - scrbuf[i + len] = chan->out_mbuf_cur_ptr[i]; - - 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_t hdr; - hdr.unit = sc->sc_unit; - hdr.type = (chan->channel == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_bcount; - MICROTIME(hdr.time); - MPH_Trace_Ind(&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; - } - } - } - /* write what we have from the scratch buf to the HSCX fifo */ - if (len != 0) - HSCX_WRFIFO(chan->channel, scrbuf, len); - return(cmd); -} - -#endif /* NISIC > 0 && defined(AVM_A1_PCI) */ diff --git a/sys/i4b/layer1/i4b_avm_fritz_pnp.c b/sys/i4b/layer1/i4b_avm_fritz_pnp.c deleted file mode 100644 index a411c8cb1320..000000000000 --- a/sys/i4b/layer1/i4b_avm_fritz_pnp.c +++ /dev/null @@ -1,1268 +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. - * - *--------------------------------------------------------------------------- - * A lot of code was borrowed from i4b_bchan.c and i4b_hscx.c - * Based on AVM Fritz!PCI driver by Gary Jennejohn - *--------------------------------------------------------------------------- - * In case of trouble please contact Udo Schweigert <ust@cert.siemens.de> - *--------------------------------------------------------------------------- - * - * Fritz!Card PnP specific routines for isic driver - * ------------------------------------------------ - * - * $FreeBSD$ - * - * last edit-date: [Thu 10 Jun 08:50:28 CEST 1999] - * - *---------------------------------------------------------------------------*/ - -#if defined(__FreeBSD__) -#include "isic.h" -#include "opt_i4b.h" - -#if NISIC > 0 && defined(AVM_PNP) - -#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> - -#include <machine/clock.h> -#include <i386/isa/isa_device.h> - -#include <sys/socket.h> -#include <net/if.h> - -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> - -#include <i4b/include/i4b_global.h> -#include <i4b/include/i4b_l1l2.h> -#include <i4b/include/i4b_mbuf.h> - -#include <i4b/layer1/i4b_l1.h> -#include <i4b/layer1/i4b_isac.h> -#include <i4b/layer1/i4b_hscx.h> - -static void hscx_write_reg(int, u_int, struct isic_softc *, int); -static void hscx_write_reg_val(int, u_int, u_char, struct isic_softc *); -static u_char hscx_read_reg(int, u_int, struct isic_softc *); -static void hscx_read_fifo(int, void *, size_t, struct isic_softc *); -static void hscx_write_fifo(int, const void *, size_t, struct isic_softc *); -static void avm_pnp_hscx_int_handler(struct isic_softc *); -static void avm_pnp_hscx_intr(int, int, int, struct isic_softc *); -static void avm_pnp_init_linktab(struct isic_softc *); -static void avm_pnp_bchannel_setup(int, int, int, int); -static void avm_pnp_bchannel_start(int, int); -static void avm_pnp_hscx_init(struct isic_softc *, int, int); -static void avm_pnp_bchannel_stat(int, int, bchan_statistics_t *); -static void avm_pnp_set_linktab(int, int, drvr_link_t *); -static void avm_pnp_intr(int); -static isdn_link_t * avm_pnp_ret_linktab(int, int); -extern void isicintr_sc(struct isic_softc *); - -/*---------------------------------------------------------------------------* - * AVM PnP Fritz!Card special registers - *---------------------------------------------------------------------------*/ - -/* - * register offsets from i/o base - */ -#define STAT0_OFFSET 0x02 -#define STAT1_OFFSET 0x03 -#define ADDR_REG_OFFSET 0x04 - -/* these 2 are used to select an ISAC register set */ -#define ISAC_LO_REG_OFFSET 0x04 -#define ISAC_HI_REG_OFFSET 0x06 - -/* offset higher than this goes to the HI register set */ -#define MAX_LO_REG_OFFSET 0x2f - -/* mask for the offset */ -#define ISAC_REGSET_MASK 0x0f - -/* the offset from the base to the ISAC registers */ -#define ISAC_REG_OFFSET 0x10 - -/* the offset from the base to the ISAC FIFO */ -#define ISAC_FIFO 0x02 - -/* not really the HSCX, but sort of */ -#define HSCX_FIFO 0x00 -#define HSCX_STAT 0x04 - -/* - * AVM PnP Status Latch 0 read only bits - */ -#define ASL_IRQ_ISAC 0x01 /* ISAC interrupt, active low */ -#define ASL_IRQ_HSCX 0x02 /* HSX interrupt, active low */ -#define ASL_IRQ_TIMER 0x04 /* Timer interrupt, active low */ -#define ASL_IRQ_BCHAN ASL_IRQ_HSCX -/* actually active LOW */ -#define ASL_IRQ_Pending 0x07 - -/* - * 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 */ -#define ASL_TESTBIT 0x10 /* active high */ - -/* - * AVM Status Latch 1 write only bits - */ -#define ASL1_INTSEL 0x0f /* active high */ -#define ASL1_ENABLE_IOM 0x80 /* active high */ - -/* - * "HSCX" mode bits - */ -#define HSCX_MODE_ITF_FLG 0x01 -#define HSCX_MODE_TRANS 0x02 -#define HSCX_MODE_CCR_7 0x04 -#define HSCX_MODE_CCR_16 0x08 -#define HSCX_MODE_TESTLOOP 0x80 - -/* - * "HSCX" status bits - */ -#define HSCX_STAT_RME 0x01 -#define HSCX_STAT_RDO 0x10 -#define HSCX_STAT_CRCVFRRAB 0x0E -#define HSCX_STAT_CRCVFR 0x06 -#define HSCX_STAT_RML_MASK 0x3f00 - -/* - * "HSCX" interrupt bits - */ -#define HSCX_INT_XPR 0x80 -#define HSCX_INT_XDU 0x40 -#define HSCX_INT_RPR 0x20 -#define HSCX_INT_MASK 0xE0 - -/* - * "HSCX" command bits - */ -#define HSCX_CMD_XRS 0x80 -#define HSCX_CMD_XME 0x01 -#define HSCX_CMD_RRS 0x20 -#define HSCX_CMD_XML_MASK 0x3f00 - -/* "fake" addresses for the non-existent HSCX */ -/* note: the unit number is in the lower byte for both the ISAC and "HSCX" */ -#define HSCX0FAKE 0xfa000 /* read: fake0 */ -#define HSCX1FAKE 0xfa100 /* read: fake1 */ -#define IS_HSCX_MASK 0xfff00 - -/* - * to prevent deactivating the "HSCX" when both channels are active we - * define an HSCX_ACTIVE flag which is or'd into the channel's state - * flag in avm_pnp_bchannel_setup upon active and cleared upon deactivation. - * It is set high to allow room for new flags. - */ -#define HSCX_AVMPNP_ACTIVE 0x1000 - -/*---------------------------------------------------------------------------* - * AVM read fifo routines - *---------------------------------------------------------------------------*/ - -static void -avm_pnp_read_fifo(void *buf, const void *base, size_t len) -{ - int unit; - struct isic_softc *sc; - - unit = (int)base & 0xff; - sc = &isic_sc[unit]; - - /* check whether the target is an HSCX */ - if (((int)base & IS_HSCX_MASK) == HSCX0FAKE) - { - hscx_read_fifo(0, buf, len, sc); - return; - } - if (((int)base & IS_HSCX_MASK) == HSCX1FAKE) - { - hscx_read_fifo(1, buf, len, sc); - return; - } - /* tell the board to access the ISAC fifo */ - outb(sc->sc_port + ADDR_REG_OFFSET, ISAC_FIFO); - insb(sc->sc_port + ISAC_REG_OFFSET, (u_char *)buf, len); -} - -static void -hscx_read_fifo(int chan, void *buf, size_t len, struct isic_softc *sc) -{ - u_char *ip; - size_t cnt; - - outb(sc->sc_port + ADDR_REG_OFFSET, chan); - ip = (u_char *)buf; - cnt = 0; - - while (cnt < len) - { - *ip++ = inb(sc->sc_port + ISAC_REG_OFFSET); - cnt++; - } -} - -/*---------------------------------------------------------------------------* - * AVM write fifo routines - *---------------------------------------------------------------------------*/ -static void -avm_pnp_write_fifo(void *base, const void *buf, size_t len) -{ - int unit; - struct isic_softc *sc; - - unit = (int)base & 0xff; - sc = &isic_sc[unit]; - - /* check whether the target is an HSCX */ - if (((int)base & IS_HSCX_MASK) == HSCX0FAKE) - { - hscx_write_fifo(0, buf, len, sc); - return; - } - if (((int)base & IS_HSCX_MASK) == HSCX1FAKE) - { - hscx_write_fifo(1, buf, len, sc); - return; - } - /* tell the board to use the ISAC fifo */ - outb(sc->sc_port + ADDR_REG_OFFSET, ISAC_FIFO); - outsb(sc->sc_port + ISAC_REG_OFFSET, (const u_char *)buf, len); -} - -static void -hscx_write_fifo(int chan, const void *buf, size_t len, struct isic_softc *sc) -{ - register const u_char *ip; - register size_t cnt; - isic_Bchan_t *Bchan = &sc->sc_chan[chan]; - - sc->avma1pp_cmd &= ~HSCX_CMD_XME; - sc->avma1pp_txl = 0; - - if (Bchan->out_mbuf_cur == NULL && Bchan->bprot != BPROT_NONE) - sc->avma1pp_cmd |= HSCX_CMD_XME; - - if (len != sc->sc_bfifolen) - sc->avma1pp_txl = len; - - hscx_write_reg(chan, HSCX_STAT, sc, 3); - - ip = (const u_char *)buf; - cnt = 0; - while (cnt < len) - { - outb(sc->sc_port + ISAC_REG_OFFSET, *ip++); - cnt++; - } -} - -/*---------------------------------------------------------------------------* - * AVM write register routines - *---------------------------------------------------------------------------*/ -static void -avm_pnp_write_reg(u_char *base, u_int offset, u_int v) -{ - int unit; - struct isic_softc *sc; - u_char reg_bank; - - unit = (int)base & 0xff; - sc = &isic_sc[unit]; - - /* check whether the target is an HSCX */ - if (((int)base & IS_HSCX_MASK) == HSCX0FAKE) - { - hscx_write_reg_val(0, offset, v, sc); - return; - } - if (((int)base & IS_HSCX_MASK) == HSCX1FAKE) - { - hscx_write_reg_val(1, offset, v, sc); - return; - } - /* must be the ISAC */ - reg_bank = (offset > MAX_LO_REG_OFFSET) ? ISAC_HI_REG_OFFSET:ISAC_LO_REG_OFFSET; - /* set the register bank */ - outb(sc->sc_port + ADDR_REG_OFFSET, reg_bank); - outb(sc->sc_port + ISAC_REG_OFFSET + (offset & ISAC_REGSET_MASK), v); -} - -static void -hscx_write_reg(int chan, u_int off, struct isic_softc *sc, int which) -{ - /* HACK */ - if (off == H_MASK) - return; - /* point at the correct channel */ - outb(sc->sc_port + ADDR_REG_OFFSET, chan); - if (which & 4) - outb(sc->sc_port + ISAC_REG_OFFSET + off + 2, sc->avma1pp_prot); - if (which & 2) - outb(sc->sc_port + ISAC_REG_OFFSET + off + 1, sc->avma1pp_txl); - if (which & 1) - outb(sc->sc_port + ISAC_REG_OFFSET + off, sc->avma1pp_cmd); -} - -static void -hscx_write_reg_val(int chan, u_int off, u_char val, struct isic_softc *sc) -{ - /* HACK */ - if (off == H_MASK) - return; - /* point at the correct channel */ - outb(sc->sc_port + ADDR_REG_OFFSET, chan); - outb(sc->sc_port + ISAC_REG_OFFSET + off, val); -} - -/*---------------------------------------------------------------------------* - * AVM read register routines - *---------------------------------------------------------------------------*/ - -static u_char -avm_pnp_read_reg(u_char *base, u_int offset) -{ - int unit; - struct isic_softc *sc; - u_char reg_bank; - - unit = (int)base & 0xff; - sc = &isic_sc[unit]; - - /* check whether the target is an HSCX */ - if (((int)base & IS_HSCX_MASK) == HSCX0FAKE) - return(hscx_read_reg(0, offset, sc)); - if (((int)base & IS_HSCX_MASK) == HSCX1FAKE) - return(hscx_read_reg(1, offset, sc)); - /* must be the ISAC */ - reg_bank = (offset > MAX_LO_REG_OFFSET) ? ISAC_HI_REG_OFFSET:ISAC_LO_REG_OFFSET; - /* set the register bank */ - outb(sc->sc_port + ADDR_REG_OFFSET, reg_bank); - return(inb(sc->sc_port + ISAC_REG_OFFSET + - (offset & ISAC_REGSET_MASK))); -} - -static u_char -hscx_read_reg(int chan, u_int off, struct isic_softc *sc) -{ - /* HACK */ - if (off == H_ISTA) - return(0); - /* point at the correct channel */ - outb(sc->sc_port + ADDR_REG_OFFSET, chan); - return(inb(sc->sc_port + ISAC_REG_OFFSET + off)); -} - -/*---------------------------------------------------------------------------* - * isic_probe_avm_pnp - probe Fritz!Card PnP - *---------------------------------------------------------------------------*/ - -int -isic_probe_avm_pnp(struct isa_device *dev, unsigned int iobase2) -{ - struct isic_softc *sc = &isic_sc[dev->id_unit]; - - /* check max unit range */ - - if(dev->id_unit >= ISIC_MAXUNIT) - { - printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for AVM Fritz! 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 AVM Fritz! PnP!\n", - dev->id_unit, ffs(dev->id_irq)-1); - return(0); - break; - } - sc->sc_irq = dev->id_irq; - - dev->id_intr = (inthand2_t *) avm_pnp_intr; - - /* check if memory addr specified */ - - if(dev->id_maddr) - { - printf("isic%d: Error, mem addr 0x%lx specified for AVM Fritz! 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 >= 0x160) && (dev->id_iobase <= 0x360))) - { - printf("isic%d: Error, invalid iobase 0x%x specified for AVM Fritz! PnP!\n", - dev->id_unit, dev->id_iobase); - return(0); - } - sc->sc_port = dev->id_iobase; - - - /* setup access routines */ - - sc->clearirq = NULL; - sc->readreg = avm_pnp_read_reg; - sc->writereg = avm_pnp_write_reg; - - sc->readfifo = avm_pnp_read_fifo; - sc->writefifo = avm_pnp_write_fifo; - - /* setup card type */ - - sc->sc_cardtyp = CARD_TYPEP_AVM_PNP; - - /* setup IOM bus type */ - - sc->sc_bustyp = BUS_TYPE_IOM2; - - sc->sc_ipac = 0; - sc->sc_bfifolen = HSCX_FIFO_LEN; - - /* the ISAC lives at offset 0x10, but we can't use that. */ - /* instead, put the unit number into the lower byte - HACK */ - ISAC_BASE = (caddr_t)((int)(dev->id_iobase & ~0xff) + dev->id_unit); - - outb(sc->sc_port + STAT0_OFFSET, ASL_RESET_ALL|ASL_TIMERDISABLE); - ISAC_WRITE(I_MASK, 0x0); - outb(sc->sc_port + STAT0_OFFSET, ASL_TIMERRESET|ASL_ENABLE_INT|ASL_TIMERDISABLE); - ISAC_WRITE(I_MASK, 0x41); - return (1); -} - -/*---------------------------------------------------------------------------* - * isic_attach_avm_pnp - attach Fritz!Card PnP - *---------------------------------------------------------------------------*/ -int -isic_attach_avm_pnp(struct isa_device *dev, unsigned int iobase2) -{ - struct isic_softc *sc; - u_int v; - int unit; - - unit = dev->id_unit; - sc = &isic_sc[unit]; - - /* this thing doesn't have an HSCX, so fake the base addresses */ - /* put the unit number into the lower byte - HACK */ - HSCX_A_BASE = (caddr_t)(HSCX0FAKE + unit); - HSCX_B_BASE = (caddr_t)(HSCX1FAKE + unit); - - - /* reset the card */ - - /* the Linux driver does this to clear any pending ISAC interrupts */ - v = 0; - v = ISAC_READ(I_STAR); - v = ISAC_READ(I_MODE); - v = ISAC_READ(I_ADF2); - v = ISAC_READ(I_ISTA); - if (v & ISAC_ISTA_EXI) - { - v = ISAC_READ(I_EXIR); - } - v = ISAC_READ(I_CIRR); - ISAC_WRITE(I_MASK, 0xff); - - /* the Linux driver does this to clear any pending HSCX interrupts */ - v = hscx_read_reg(0, HSCX_STAT, sc); - v = hscx_read_reg(0, HSCX_STAT+1, sc); - v = hscx_read_reg(0, HSCX_STAT+2, sc); - v = hscx_read_reg(0, HSCX_STAT+3, sc); - v = hscx_read_reg(1, HSCX_STAT, sc); - v = hscx_read_reg(1, HSCX_STAT+1, sc); - v = hscx_read_reg(1, HSCX_STAT+2, sc); - v = hscx_read_reg(1, HSCX_STAT+3, sc); - - outb(sc->sc_port + STAT0_OFFSET, ASL_RESET_ALL|ASL_TIMERDISABLE); - DELAY(SEC_DELAY/100); /* 10 ms */ - outb(sc->sc_port + STAT0_OFFSET, ASL_TIMERRESET|ASL_ENABLE_INT|ASL_TIMERDISABLE); - DELAY(SEC_DELAY/100); /* 10 ms */ - outb(sc->sc_port + STAT1_OFFSET, ASL1_ENABLE_IOM+(ffs(sc->sc_irq)-1)); - DELAY(SEC_DELAY/100); /* 10 ms */ - - printf("isic%d: ISAC %s (IOM-%c)\n", unit, - "2085 Version A1/A2 or 2086/2186 Version 1.1", - sc->sc_bustyp == BUS_TYPE_IOM1 ? '1' : '2'); - - /* init the ISAC */ - isic_isac_init(sc); - - /* init the "HSCX" */ - avm_pnp_bchannel_setup(sc->sc_unit, HSCX_CH_A, BPROT_NONE, 0); - - avm_pnp_bchannel_setup(sc->sc_unit, HSCX_CH_B, BPROT_NONE, 0); - - /* can't use the normal B-Channel stuff */ - avm_pnp_init_linktab(sc); - - /* set trace level */ - - sc->sc_trace = TRACE_OFF; - - sc->sc_state = ISAC_IDLE; - - sc->sc_ibuf = NULL; - sc->sc_ib = NULL; - sc->sc_ilen = 0; - - sc->sc_obuf = NULL; - sc->sc_op = NULL; - sc->sc_ol = 0; - sc->sc_freeflag = 0; - - sc->sc_obuf2 = NULL; - sc->sc_freeflag2 = 0; - -#if defined(__FreeBSD__) && __FreeBSD__ >=3 - callout_handle_init(&sc->sc_T3_callout); - callout_handle_init(&sc->sc_T4_callout); -#endif - - /* init higher protocol layers */ - - MPH_Status_Ind(sc->sc_unit, STI_ATTACH, sc->sc_cardtyp); - - return(0); -} - -/* - * this is the real interrupt routine - */ -static void -avm_pnp_hscx_intr(int h_chan, int stat, int cnt, struct isic_softc *sc) -{ - register isic_Bchan_t *chan = &sc->sc_chan[h_chan]; - int activity = -1; - - DBGL1(L1_H_IRQ, "avm_pnp_hscx_intr", ("%#x\n", stat)); - - if((stat & HSCX_INT_XDU) && (chan->bprot != BPROT_NONE))/* xmit data underrun */ - { - chan->stat_XDU++; - DBGL1(L1_H_XFRERR, "avm_pnp_hscx_intr", ("xmit data underrun\n")); - /* abort the transmission */ - sc->avma1pp_txl = 0; - sc->avma1pp_cmd |= HSCX_CMD_XRS; - hscx_write_reg(h_chan, HSCX_STAT, sc, 1); - sc->avma1pp_cmd &= ~HSCX_CMD_XRS; - hscx_write_reg(h_chan, HSCX_STAT, sc, 1); - - 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; - } - } - - /* - * The following is based on examination of the Linux driver. - * - * The logic here is different than with a "real" HSCX; all kinds - * of information (interrupt/status bits) are in stat. - * HSCX_INT_RPR indicates a receive interrupt - * HSCX_STAT_RDO indicates an overrun condition, abort - - * otherwise read the bytes ((stat & HSCX_STZT_RML_MASK) >> 8) - * HSCX_STAT_RME indicates end-of-frame and apparently any - * CRC/framing errors are only reported in this state. - * if ((stat & HSCX_STAT_CRCVFRRAB) != HSCX_STAT_CRCVFR) - * CRC/framing error - */ - - if(stat & HSCX_INT_RPR) - { - register int fifo_data_len; - int error = 0; - /* always have to read the FIFO, so use a scratch buffer */ - u_char scrbuf[HSCX_FIFO_LEN]; - - if(stat & HSCX_STAT_RDO) - { - chan->stat_RDO++; - DBGL1(L1_H_XFRERR, "avm_pnp_hscx_intr", ("receive data overflow\n")); - error++; - } - - fifo_data_len = cnt; - - if(fifo_data_len == 0) - fifo_data_len = sc->sc_bfifolen; - - /* ALWAYS read data from HSCX fifo */ - - HSCX_RDFIFO(h_chan, scrbuf, fifo_data_len); - chan->rxcount += fifo_data_len; - - /* 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 avm_pnp_hscx_intr: RME, cannot allocate mbuf!\n"); - chan->in_cbptr = chan->in_mbuf->m_data; - chan->in_len = 0; - } - - if((chan->in_len + fifo_data_len) <= BCH_MAX_DATALEN) - { - /* OK to copy the data */ - bcopy(scrbuf, chan->in_cbptr, fifo_data_len); - chan->in_cbptr += fifo_data_len; - chan->in_len += 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_t hdr; - hdr.unit = sc->sc_unit; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_NT; - hdr.count = ++sc->sc_trace_bcount; - MICROTIME(hdr.time); - MPH_Trace_Ind(&hdr, chan->in_mbuf->m_len, chan->in_mbuf->m_data); - } - - if (stat & HSCX_STAT_RME) - { - if((stat & HSCX_STAT_CRCVFRRAB) == HSCX_STAT_CRCVFR) - { - (*chan->drvr_linktab->bch_rx_data_ready)(chan->drvr_linktab->unit); - activity = ACT_RX; - - /* mark buffer ptr as unused */ - - chan->in_mbuf = NULL; - chan->in_cbptr = NULL; - chan->in_len = 0; - } - else - { - chan->stat_CRC++; - DBGL1(L1_H_XFRERR, "avm_pnp_hscx_intr", ("CRC/RAB\n")); - if (chan->in_mbuf != NULL) - { - i4b_Bfreembuf(chan->in_mbuf); - chan->in_mbuf = NULL; - chan->in_cbptr = NULL; - chan->in_len = 0; - } - } - } - } /* END enough space in mbuf */ - 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_t hdr; - hdr.unit = sc->sc_unit; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_NT; - hdr.count = ++sc->sc_trace_bcount; - MICROTIME(hdr.time); - MPH_Trace_Ind(&hdr, chan->in_mbuf->m_len, chan->in_mbuf->m_data); - } - - /* move rx'd data to rx queue */ - - IF_ENQUEUE(&chan->rx_queue, chan->in_mbuf); - - (*chan->drvr_linktab->bch_rx_data_ready)(chan->drvr_linktab->unit); - - if(!(isic_hscx_silence(chan->in_mbuf->m_data, chan->in_mbuf->m_len))) - activity = ACT_RX; - - /* alloc new buffer */ - - if((chan->in_mbuf = i4b_Bgetmbuf(BCH_MAX_DATALEN)) == NULL) - panic("L1 avm_pnp_hscx_intr: RPF, cannot allocate new mbuf!\n"); - - /* setup new data ptr */ - - chan->in_cbptr = chan->in_mbuf->m_data; - - /* OK to copy the data */ - bcopy(scrbuf, chan->in_cbptr, fifo_data_len); - - chan->in_cbptr += fifo_data_len; - chan->in_len = fifo_data_len; - - chan->rxcount += fifo_data_len; - } - else - { - DBGL1(L1_H_XFRERR, "avm_pnp_hscx_intr", ("RAWHDLC rx buffer overflow in RPF, in_len=%d\n", chan->in_len)); - chan->in_cbptr = chan->in_mbuf->m_data; - chan->in_len = 0; - } - } - } /* if(error == 0) */ - else - { - /* land here for RDO */ - if (chan->in_mbuf != NULL) - { - i4b_Bfreembuf(chan->in_mbuf); - chan->in_mbuf = NULL; - chan->in_cbptr = NULL; - chan->in_len = 0; - } - sc->avma1pp_txl = 0; - sc->avma1pp_cmd |= HSCX_CMD_RRS; - hscx_write_reg(h_chan, HSCX_STAT, sc, 1); - sc->avma1pp_cmd &= ~HSCX_CMD_RRS; - hscx_write_reg(h_chan, HSCX_STAT, sc, 1); - } - } - - - /* transmit fifo empty, new data can be written to fifo */ - - if(stat & HSCX_INT_XPR) - { - /* - * for a description what is going on here, please have - * a look at isic_bchannel_start() in i4b_bchan.c ! - */ - - DBGL1(L1_H_IRQ, "avm_pnp_hscx_intr", ("unit %d, chan %d - XPR, Tx Fifo Empty!\n", sc->sc_unit, h_chan)); - - if(chan->out_mbuf_cur == NULL || chan->out_mbuf_head == 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->drvr_linktab->bch_tx_queue_empty)(chan->drvr_linktab->unit); - } - 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_t hdr; - hdr.unit = sc->sc_unit; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_bcount; - MICROTIME(hdr.time); - MPH_Trace_Ind(&hdr, chan->out_mbuf_cur->m_len, chan->out_mbuf_cur->m_data); - } - if(chan->bprot == BPROT_NONE) - { - if(!(isic_hscx_silence(chan->out_mbuf_cur->m_data, chan->out_mbuf_cur->m_len))) - activity = ACT_TX; - } - else - { - activity = ACT_TX; - } - } - } - - isic_hscx_fifo(chan, sc); - } - - /* call timeout handling routine */ - - if(activity == ACT_RX || activity == ACT_TX) - (*chan->drvr_linktab->bch_activity)(chan->drvr_linktab->unit, activity); -} - -/* - * this is the main routine which checks each channel and then calls - * the real interrupt routine as appropriate - */ -static void -avm_pnp_hscx_int_handler(struct isic_softc *sc) -{ - u_char stat = 0; - u_char cnt = 0; - - stat = hscx_read_reg(0, HSCX_STAT, sc); - if (stat & HSCX_INT_RPR) - cnt = hscx_read_reg(0, HSCX_STAT+1, sc); - if (stat & HSCX_INT_MASK) - avm_pnp_hscx_intr(0, stat, cnt, sc); - - cnt = 0; - stat = hscx_read_reg(1, HSCX_STAT, sc); - if (stat & HSCX_INT_RPR) - cnt = hscx_read_reg(1, HSCX_STAT+1, sc); - if (stat & HSCX_INT_MASK) - avm_pnp_hscx_intr(1, stat, cnt, sc); -} - -static void -avm_pnp_hscx_init(struct isic_softc *sc, int h_chan, int activate) -{ - isic_Bchan_t *chan = &sc->sc_chan[h_chan]; - - DBGL1(L1_BCHAN, "avm_pnp_hscx_init", ("unit=%d, channel=%d, %s\n", - sc->sc_unit, h_chan, activate ? "activate" : "deactivate")); - - if (activate == 0) - { - /* only deactivate if both channels are idle */ - if (sc->sc_chan[HSCX_CH_A].state != HSCX_IDLE || - sc->sc_chan[HSCX_CH_B].state != HSCX_IDLE) - { - return; - } - sc->avma1pp_cmd = HSCX_CMD_XRS|HSCX_CMD_RRS; - sc->avma1pp_prot = HSCX_MODE_TRANS; - hscx_write_reg(h_chan, HSCX_STAT, sc, 5); - return; - } - if(chan->bprot == BPROT_RHDLC) - { - DBGL1(L1_BCHAN, "avm_pnp_hscx_init", ("BPROT_RHDLC\n")); - - /* HDLC Frames, transparent mode 0 */ - sc->avma1pp_cmd = HSCX_CMD_XRS|HSCX_CMD_RRS; - sc->avma1pp_prot = HSCX_MODE_ITF_FLG; - hscx_write_reg(h_chan, HSCX_STAT, sc, 5); - sc->avma1pp_cmd = HSCX_CMD_XRS; - hscx_write_reg(h_chan, HSCX_STAT, sc, 1); - sc->avma1pp_cmd = 0; - } - else - { - DBGL1(L1_BCHAN, "avm_pnp_hscx_init", ("BPROT_NONE??\n")); - - /* Raw Telephony, extended transparent mode 1 */ - sc->avma1pp_cmd = HSCX_CMD_XRS|HSCX_CMD_RRS; - sc->avma1pp_prot = HSCX_MODE_TRANS; - hscx_write_reg(h_chan, HSCX_STAT, sc, 5); - sc->avma1pp_cmd = HSCX_CMD_XRS; - hscx_write_reg(h_chan, HSCX_STAT, sc, 1); - sc->avma1pp_cmd = 0; - } -} - -static void -avm_pnp_bchannel_setup(int unit, int h_chan, int bprot, int activate) -{ - struct isic_softc *sc = &isic_sc[unit]; - isic_Bchan_t *chan = &sc->sc_chan[h_chan]; - - int s = SPLI4B(); - - if(activate == 0) - { - /* deactivation */ - chan->state &= ~HSCX_AVMPNP_ACTIVE; - avm_pnp_hscx_init(sc, h_chan, activate); - } - - DBGL1(L1_BCHAN, "avm_pnp_bchannel_setup", ("unit=%d, channel=%d, %s\n", - sc->sc_unit, h_chan, activate ? "activate" : "deactivate")); - - /* general part */ - - chan->unit = sc->sc_unit; /* unit number */ - 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 */ - avm_pnp_hscx_init(sc, h_chan, activate); - chan->state |= HSCX_AVMPNP_ACTIVE; - } - - splx(s); -} - -static void -avm_pnp_bchannel_start(int unit, int h_chan) -{ - struct isic_softc *sc = &isic_sc[unit]; - register isic_Bchan_t *chan = &sc->sc_chan[h_chan]; - int s; - int activity = -1; - - s = SPLI4B(); /* 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(!(isic_hscx_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_t hdr; - hdr.unit = unit; - hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_bcount; - MICROTIME(hdr.time); - MPH_Trace_Ind(&hdr, chan->out_mbuf_cur->m_len, chan->out_mbuf_cur->m_data); - } - - isic_hscx_fifo(chan, sc); - - /* call timeout handling routine */ - - if(activity == ACT_RX || activity == ACT_TX) - (*chan->drvr_linktab->bch_activity)(chan->drvr_linktab->unit, activity); - - splx(s); -} - -/*---------------------------------------------------------------------------* - * return the address of isic drivers linktab - *---------------------------------------------------------------------------*/ -static isdn_link_t * -avm_pnp_ret_linktab(int unit, int channel) -{ - struct isic_softc *sc = &isic_sc[unit]; - isic_Bchan_t *chan = &sc->sc_chan[channel]; - - return(&chan->isdn_linktab); -} - -/*---------------------------------------------------------------------------* - * set the driver linktab in the b channel softc - *---------------------------------------------------------------------------*/ -static void -avm_pnp_set_linktab(int unit, int channel, drvr_link_t *dlt) -{ - struct isic_softc *sc = &isic_sc[unit]; - isic_Bchan_t *chan = &sc->sc_chan[channel]; - - chan->drvr_linktab = dlt; -} - - -/*---------------------------------------------------------------------------* - * initialize our local linktab - *---------------------------------------------------------------------------*/ -static void -avm_pnp_init_linktab(struct isic_softc *sc) -{ - isic_Bchan_t *chan = &sc->sc_chan[HSCX_CH_A]; - isdn_link_t *lt = &chan->isdn_linktab; - - /* make sure the hardware driver is known to layer 4 */ - /* avoid overwriting if already set */ - if (ctrl_types[CTRL_PASSIVE].set_linktab == NULL) - { - ctrl_types[CTRL_PASSIVE].set_linktab = avm_pnp_set_linktab; - ctrl_types[CTRL_PASSIVE].get_linktab = avm_pnp_ret_linktab; - } - - /* local setup */ - lt->unit = sc->sc_unit; - lt->channel = HSCX_CH_A; - lt->bch_config = avm_pnp_bchannel_setup; - lt->bch_tx_start = avm_pnp_bchannel_start; - lt->bch_stat = avm_pnp_bchannel_stat; - 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->unit = sc->sc_unit; - lt->channel = HSCX_CH_B; - lt->bch_config = avm_pnp_bchannel_setup; - lt->bch_tx_start = avm_pnp_bchannel_start; - lt->bch_stat = avm_pnp_bchannel_stat; - 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; -} - -/* - * use this instead of isic_bchannel_stat in i4b_bchan.c because it's static - */ -static void -avm_pnp_bchannel_stat(int unit, int h_chan, bchan_statistics_t *bsp) -{ - struct isic_softc *sc = &isic_sc[unit]; - isic_Bchan_t *chan = &sc->sc_chan[h_chan]; - int s; - - s = SPLI4B(); - - bsp->outbytes = chan->txcount; - bsp->inbytes = chan->rxcount; - - chan->txcount = 0; - chan->rxcount = 0; - - splx(s); -} - -/*---------------------------------------------------------------------------* - * fill HSCX fifo with data from the current mbuf - * Put this here until it can go into i4b_hscx.c - *---------------------------------------------------------------------------*/ -static int -isic_hscx_fifo(isic_Bchan_t *chan, struct isic_softc *sc) -{ - int len; - int nextlen; - int i; - /* using a scratch buffer simplifies writing to the FIFO */ - u_char scrbuf[HSCX_FIFO_LEN]; - - len = 0; - - /* - * 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(chan->out_mbuf_cur && len != sc->sc_bfifolen) - { - nextlen = min(chan->out_mbuf_cur_len, sc->sc_bfifolen - len); - -#ifdef NOTDEF - printf("i:mh=%p, mc=%p, mcp=%p, 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, - nextlen); -#endif - - /* collect the data in the scratch buffer */ - for (i = 0; i < nextlen; i++) - scrbuf[i + len] = chan->out_mbuf_cur_ptr[i]; - - 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_t hdr; - hdr.unit = sc->sc_unit; - hdr.type = (chan->channel == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2); - hdr.dir = FROM_TE; - hdr.count = ++sc->sc_trace_bcount; - MICROTIME(hdr.time); - MPH_Trace_Ind(&hdr, chan->out_mbuf_cur->m_len, chan->out_mbuf_cur->m_data); - } - } - else - { - i4b_Bfreembuf(chan->out_mbuf_head); - chan->out_mbuf_head = NULL; - } - } - } - /* write what we have from the scratch buf to the HSCX fifo */ - if (len != 0) - HSCX_WRFIFO(chan->channel, scrbuf, len); - - return(0); -} - -void -avm_pnp_intr(int unit) -{ - struct isic_softc *sc; - u_char stat; - register u_char isac_irq_stat; - int was_isac = 0; - - sc = &isic_sc[unit]; - - for(;;) { - stat = inb(sc->sc_port + STAT0_OFFSET); - - DBGL1(L1_H_IRQ, "avm_pnp_intr", ("stat %x\n", stat)); - - /* was there an interrupt from this card ? */ - if ((stat & ASL_IRQ_Pending) == ASL_IRQ_Pending) - break; /* no */ - - /* interrupts are low active */ - if (!(stat & ASL_IRQ_TIMER)) - DBGL1(L1_H_IRQ, "avm_pnp_intr", ("timer interrupt ???\n")); - - if (!(stat & ASL_IRQ_ISAC)) - { - DBGL1(L1_H_IRQ, "avm_pnp_intr", ("ISAC\n")); - isac_irq_stat = ISAC_READ(I_ISTA); - isic_isac_irq(sc, isac_irq_stat); - was_isac = 1; - } - - if (!(stat & ASL_IRQ_HSCX)) - { - DBGL1(L1_H_IRQ, "avm_pnp_intr", ("HSCX\n")); - avm_pnp_hscx_int_handler(sc); - } - } - if (was_isac) { - ISAC_WRITE(0x20, 0xFF); - ISAC_WRITE(0x20, 0x0); - } -} -#endif /* NISIC > 0 && defined(AVM_PNP) */ -#endif /* FreeBSD */ diff --git a/sys/i4b/layer1/i4b_siemens_isurf.c b/sys/i4b/layer1/i4b_siemens_isurf.c deleted file mode 100644 index ed48a66d53e6..000000000000 --- a/sys/i4b/layer1/i4b_siemens_isurf.c +++ /dev/null @@ -1,317 +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 - * -------------------------------------------------------- - * - * $FreeBSD$ - * - * last edit-date: [Mon 14 Jun 16:46:27 CEST 1999] - * - *---------------------------------------------------------------------------*/ - -#if defined(__FreeBSD__) -#include "isic.h" -#include "opt_i4b.h" - -#if NISIC > 0 && defined(SIEMENS_ISURF2) - -#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> - -#include <machine/clock.h> -#include <i386/isa/isa_device.h> - -#include <sys/socket.h> -#include <net/if.h> - -#include <machine/i4b_debug.h> -#include <machine/i4b_ioctl.h> - -#include <i4b/include/i4b_global.h> -#include <i4b/include/i4b_l1l2.h> -#include <i4b/include/i4b_mbuf.h> - -#include <i4b/layer1/i4b_l1.h> -#include <i4b/layer1/i4b_ipac.h> -#include <i4b/layer1/i4b_isac.h> -#include <i4b/layer1/i4b_hscx.h> - -/* 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 - *---------------------------------------------------------------------------*/ - -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); - } -} - -/*---------------------------------------------------------------------------* - * Siemens I-Surf 2.0 PnP ISAC put fifo routine - *---------------------------------------------------------------------------*/ - -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); - } -} - -/*---------------------------------------------------------------------------* - * Siemens I-Surf 2.0 PnP ISAC put register routine - *---------------------------------------------------------------------------*/ - -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); - } -} - -/*---------------------------------------------------------------------------* - * Siemens I-Surf 2.0 PnP ISAC get register routine - *---------------------------------------------------------------------------*/ - -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)); - } -} - -/*---------------------------------------------------------------------------* - * isic_probe_siemens_isurf - probe for Siemens I-Surf 2.0 PnP - *---------------------------------------------------------------------------*/ - -int -isic_probe_siemens_isurf(struct isa_device *dev, unsigned int iobase2) -{ - struct isic_softc *sc = &isic_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 <= 0xff0))) - { - 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 = &isic_sc[dev->id_unit]; - - /* setup ISAC and HSCX base addr */ - - ISAC_BASE = (caddr_t) ((u_int)sc->sc_port | SIE_ISURF_IDISAC); - HSCX_A_BASE = (caddr_t) ((u_int)sc->sc_port | SIE_ISURF_IDHSCXA); - HSCX_B_BASE = (caddr_t) ((u_int)sc->sc_port | SIE_ISURF_IDHSCXB); - IPAC_BASE = (caddr_t) ((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); -} -#endif /* NISIC > 0 && defined(SIEMENS_ISURF2) */ -#endif /* FreeBSD */ diff --git a/sys/i4b/layer1/pci_isic.h b/sys/i4b/layer1/pci_isic.h deleted file mode 100644 index a19025c8aaf0..000000000000 --- a/sys/i4b/layer1/pci_isic.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 1999 Martin Husemann. 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. - * - *--------------------------------------------------------------------------- - * - * pci_isic.h - pci bus frontend for i4b_isic driver - * ------------------------------------------------- - * - * $FreeBSD$ - * - * last edit-date: [Wed Mar 10 07:22:08 1999] - * - * -mh original implementation - * - *---------------------------------------------------------------------------*/ - -struct pci_isic_softc { - struct isic_softc sc_isic; /* parent class */ - - /* PCI-specific goo */ - void *sc_ih; /* interrupt handler */ -}; - -extern void isic_attach_Eqs1pp __P((struct pci_isic_softc *psc, struct pci_attach_args *pa)); -extern void isic_attach_fritzPci __P((struct pci_isic_softc *psc, struct pci_attach_args *pa)); - diff --git a/sys/pci/alpm.c b/sys/pci/alpm.c deleted file mode 100644 index ff4c5d3fb435..000000000000 --- a/sys/pci/alpm.c +++ /dev/null @@ -1,666 +0,0 @@ -/*- - * Copyright (c) 1998, 1999 Nicolas Souchu - * 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. - * - * $FreeBSD$ - * - */ - -/* - * Power Management support for the Acer M15x3 chipsets - */ -#include <sys/param.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/module.h> -#include <sys/bus.h> -#include <sys/conf.h> -#include <sys/buf.h> -#include <sys/uio.h> -#include <sys/malloc.h> - -#include <machine/clock.h> - -#include <machine/bus_pio.h> -#include <machine/bus_memio.h> -#include <machine/bus.h> - -#include <pci/pcivar.h> -#include <pci/pcireg.h> - -#include <dev/iicbus/iiconf.h> -#include <dev/smbus/smbconf.h> -#include "smbus_if.h" - -#include "alpm.h" - -#define ALPM_DEBUG(x) if (alpm_debug) (x) - -#ifdef DEBUG -static int alpm_debug = 1; -#else -static int alpm_debug = 0; -#endif - -#define ACER_M1543_PMU_ID 0x710110b9 - -/* Uncomment this line to force another I/O base address for SMB */ -/* #define ALPM_SMBIO_BASE_ADDR 0x3a80 */ - -/* I/O registers offsets - the base address is programmed via the - * SMBBA PCI configuration register - */ -#define SMBSTS 0x0 /* SMBus host/slave status register */ -#define SMBCMD 0x1 /* SMBus host/slave command register */ -#define SMBSTART 0x2 /* start to generate programmed cycle */ -#define SMBHADDR 0x3 /* host address register */ -#define SMBHDATA 0x4 /* data A register for host controller */ -#define SMBHDATB 0x5 /* data B register for host controller */ -#define SMBHBLOCK 0x6 /* block register for host controller */ -#define SMBHCMD 0x7 /* command register for host controller */ - -/* SMBSTS masks */ -#define TERMINATE 0x80 -#define BUS_COLLI 0x40 -#define DEVICE_ERR 0x20 -#define SMI_I_STS 0x10 -#define HST_BSY 0x08 -#define IDL_STS 0x04 -#define HSTSLV_STS 0x02 -#define HSTSLV_BSY 0x01 - -/* SMBCMD masks */ -#define SMB_BLK_CLR 0x80 -#define T_OUT_CMD 0x08 -#define ABORT_HOST 0x04 - -/* SMBus commands */ -#define SMBQUICK 0x00 -#define SMBSRBYTE 0x10 /* send/receive byte */ -#define SMBWRBYTE 0x20 /* write/read byte */ -#define SMBWRWORD 0x30 /* write/read word */ -#define SMBWRBLOCK 0x40 /* write/read block */ - -/* PCI configuration registers and masks - */ -#define COM 0x4 -#define COM_ENABLE_IO 0x1 - -#define SMBBA 0x14 - -#define ATPC 0x5b -#define ATPC_SMBCTRL 0x04 - -#define SMBHSI 0xe0 -#define SMBHSI_SLAVE 0x2 -#define SMBHSI_HOST 0x1 - -#define SMBHCBC 0xe2 -#define SMBHCBC_CLOCK 0x70 - -#define SMBCLOCK_149K 0x0 -#define SMBCLOCK_74K 0x20 -#define SMBCLOCK_37K 0x40 -#define SMBCLOCK_223K 0x80 -#define SMBCLOCK_111K 0xa0 -#define SMBCLOCK_55K 0xc0 - -struct alpm_data { - int base; - bus_space_tag_t smbst; - bus_space_handle_t smbsh; - pcici_t tag; -}; -struct alpm_data alpmdata[NALPM]; - -struct alsmb_softc { - int base; - device_t smbus; - struct alpm_data *alpm; -}; - -#define ALPM_SMBINB(alsmb,register) \ - (bus_space_read_1(alsmb->alpm->smbst, alsmb->alpm->smbsh, register)) -#define ALPM_SMBOUTB(alsmb,register,value) \ - (bus_space_write_1(alsmb->alpm->smbst, alsmb->alpm->smbsh, register, value)) - -static int alsmb_probe(device_t); -static int alsmb_attach(device_t); -static int alsmb_smb_callback(device_t, int, caddr_t *); -static int alsmb_smb_quick(device_t dev, u_char slave, int how); -static int alsmb_smb_sendb(device_t dev, u_char slave, char byte); -static int alsmb_smb_recvb(device_t dev, u_char slave, char *byte); -static int alsmb_smb_writeb(device_t dev, u_char slave, char cmd, char byte); -static int alsmb_smb_readb(device_t dev, u_char slave, char cmd, char *byte); -static int alsmb_smb_writew(device_t dev, u_char slave, char cmd, short word); -static int alsmb_smb_readw(device_t dev, u_char slave, char cmd, short *word); -static int alsmb_smb_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf); -static int alsmb_smb_bread(device_t dev, u_char slave, char cmd, u_char count, char *byte); - -static devclass_t alsmb_devclass; - -static device_method_t alsmb_methods[] = { - /* device interface */ - DEVMETHOD(device_probe, alsmb_probe), - DEVMETHOD(device_attach, alsmb_attach), - - /* bus interface */ - DEVMETHOD(bus_print_child, bus_generic_print_child), - - /* smbus interface */ - DEVMETHOD(smbus_callback, alsmb_smb_callback), - DEVMETHOD(smbus_quick, alsmb_smb_quick), - DEVMETHOD(smbus_sendb, alsmb_smb_sendb), - DEVMETHOD(smbus_recvb, alsmb_smb_recvb), - DEVMETHOD(smbus_writeb, alsmb_smb_writeb), - DEVMETHOD(smbus_readb, alsmb_smb_readb), - DEVMETHOD(smbus_writew, alsmb_smb_writew), - DEVMETHOD(smbus_readw, alsmb_smb_readw), - DEVMETHOD(smbus_bwrite, alsmb_smb_bwrite), - DEVMETHOD(smbus_bread, alsmb_smb_bread), - - { 0, 0 } -}; - -static driver_t alsmb_driver = { - "alsmb", - alsmb_methods, - sizeof(struct alsmb_softc), -}; - -static const char* alpm_pci_probe(pcici_t tag, pcidi_t type); -static void alpm_pci_attach(pcici_t tag, int unit); - -static u_long alpm_count; - -static struct pci_device alpm_device = { - "alpm", - alpm_pci_probe, - alpm_pci_attach, - &alpm_count -}; - -COMPAT_PCI_DRIVER (alpm, alpm_device); - -static const char* -alpm_pci_probe(pcici_t tag, pcidi_t type) -{ - if (type == ACER_M1543_PMU_ID) - return ("AcerLabs M15x3 Power Management Unit"); - - return ((char *)0); -} - -static void -alpm_pci_attach(pcici_t tag, int unit) -{ - struct alpm_data *alpm; - u_long l; - - if (unit >= NALPM) { - printf("alpm%d: attach: only %d units configured.\n", - unit, NALPM); - return; - } - alpm = &alpmdata[unit]; - - alpm->tag = tag; - - /* Unlock SMBIO base register access */ - l = pci_cfgread(tag, ATPC, 1); - pci_cfgwrite(tag, ATPC, l & ~ATPC_SMBCTRL, 1); - - if (bootverbose) { - l = pci_cfgread(tag, SMBHSI, 1); - printf("alsmb%d: %s/%s", unit, - (l & SMBHSI_HOST) ? "host":"nohost", - (l & SMBHSI_SLAVE) ? "slave":"noslave"); - - l = pci_cfgread(tag, SMBHCBC, 1); - switch (l & SMBHCBC_CLOCK) { - case SMBCLOCK_149K: - printf(" 149K"); - break; - case SMBCLOCK_74K: - printf(" 74K"); - break; - case SMBCLOCK_37K: - printf(" 37K"); - break; - case SMBCLOCK_223K: - printf(" 223K"); - break; - case SMBCLOCK_111K: - printf(" 111K"); - break; - case SMBCLOCK_55K: - printf(" 55K"); - break; - } - } - - alpm->smbst = I386_BUS_SPACE_IO; - -#ifdef ALPM_SMBIO_BASE_ADDR - /* disable I/O */ - l = pci_cfgread(tag, COM, 2); - pci_cfgwrite(tag, COM, l & ~COM_ENABLE_IO, 2); - - /* set the I/O base address */ - pci_cfgwrite(tag, SMBBA, ALPM_SMBIO_BASE_ADDR | 0x1, 4); - - /* enable I/O */ - pci_cfgwrite(tag, COM, l | COM_ENABLE_IO, 2); - - alpm->smbsh = ALPM_SMBIO_BASE_ADDR; -#else - alpm->smbsh = pci_cfgread(tag, SMBBA, 4) & ~0x1; -#endif - if (bootverbose) - printf(" at 0x%x\n", alpm->smbsh); - - /* XXX add the I2C interface to the root_bus until pcibus is ready */ - device_add_child(root_bus, "alsmb", unit, NULL); - - return; -} - -/* - * Not a real probe, we know the device exists since the device has - * been added after the successfull pci probe. - */ -static int -alsmb_probe(device_t dev) -{ - struct alsmb_softc *sc = (struct alsmb_softc *)device_get_softc(dev); - - sc->alpm = &alpmdata[device_get_unit(dev)]; - - device_set_desc(dev, "Aladdin IV/V/Pro2 SMBus controller"); - - return (0); -} - -static int -alsmb_attach(device_t dev) -{ - struct alsmb_softc *sc = (struct alsmb_softc *)device_get_softc(dev); - - /* allocate a new smbus device */ - sc->smbus = smbus_alloc_bus(dev); - - /* probe and attach the smbus */ - device_probe_and_attach(sc->smbus); - - return (0); -} - -static int -alsmb_smb_callback(device_t dev, int index, caddr_t *data) -{ - int error = 0; - - switch (index) { - case SMB_REQUEST_BUS: - case SMB_RELEASE_BUS: - /* ok, bus allocation accepted */ - break; - default: - error = EINVAL; - } - - return (error); -} - -static int -alsmb_clear(struct alsmb_softc *sc) -{ - ALPM_SMBOUTB(sc, SMBSTS, 0xff); - DELAY(10); - - return (0); -} - -#if 0 -static int -alsmb_abort(struct alsmb_softc *sc) -{ - ALPM_SMBOUTB(sc, SMBCMD, T_OUT_CMD | ABORT_HOST); - - return (0); -} -#endif - -static int -alsmb_idle(struct alsmb_softc *sc) -{ - u_char sts; - - sts = ALPM_SMBINB(sc, SMBSTS); - - ALPM_DEBUG(printf("alpm: idle? STS=0x%x\n", sts)); - - return (sts & IDL_STS); -} - -/* - * Poll the SMBus controller - */ -static int -alsmb_wait(struct alsmb_softc *sc) -{ - int count = 10000; - u_char sts; - int error; - - /* wait for command to complete and SMBus controller is idle */ - while(count--) { - DELAY(10); - sts = ALPM_SMBINB(sc, SMBSTS); - if (sts & SMI_I_STS) - break; - } - - ALPM_DEBUG(printf("alpm: STS=0x%x\n", sts)); - - error = SMB_ENOERR; - - if (!count) - error |= SMB_ETIMEOUT; - - if (sts & TERMINATE) - error |= SMB_EABORT; - - if (sts & BUS_COLLI) - error |= SMB_ENOACK; - - if (sts & DEVICE_ERR) - error |= SMB_EBUSERR; - - if (error != SMB_ENOERR) - alsmb_clear(sc); - - return (error); -} - -static int -alsmb_smb_quick(device_t dev, u_char slave, int how) -{ - struct alsmb_softc *sc = (struct alsmb_softc *)device_get_softc(dev); - int error; - - alsmb_clear(sc); - if (!alsmb_idle(sc)) - return (EBUSY); - - switch (how) { - case SMB_QWRITE: - ALPM_DEBUG(printf("alpm: QWRITE to 0x%x", slave)); - ALPM_SMBOUTB(sc, SMBHADDR, slave & ~LSB); - break; - case SMB_QREAD: - ALPM_DEBUG(printf("alpm: QREAD to 0x%x", slave)); - ALPM_SMBOUTB(sc, SMBHADDR, slave | LSB); - break; - default: - panic("%s: unknown QUICK command (%x)!", __FUNCTION__, - how); - } - ALPM_SMBOUTB(sc, SMBCMD, SMBQUICK); - ALPM_SMBOUTB(sc, SMBSTART, 0xff); - - error = alsmb_wait(sc); - - ALPM_DEBUG(printf(", error=0x%x\n", error)); - - return (error); -} - -static int -alsmb_smb_sendb(device_t dev, u_char slave, char byte) -{ - struct alsmb_softc *sc = (struct alsmb_softc *)device_get_softc(dev); - int error; - - alsmb_clear(sc); - if (!alsmb_idle(sc)) - return (SMB_EBUSY); - - ALPM_SMBOUTB(sc, SMBHADDR, slave & ~LSB); - ALPM_SMBOUTB(sc, SMBCMD, SMBSRBYTE); - ALPM_SMBOUTB(sc, SMBHDATA, byte); - ALPM_SMBOUTB(sc, SMBSTART, 0xff); - - error = alsmb_wait(sc); - - ALPM_DEBUG(printf("alpm: SENDB to 0x%x, byte=0x%x, error=0x%x\n", slave, byte, error)); - - return (error); -} - -static int -alsmb_smb_recvb(device_t dev, u_char slave, char *byte) -{ - struct alsmb_softc *sc = (struct alsmb_softc *)device_get_softc(dev); - int error; - - alsmb_clear(sc); - if (!alsmb_idle(sc)) - return (SMB_EBUSY); - - ALPM_SMBOUTB(sc, SMBHADDR, slave | LSB); - ALPM_SMBOUTB(sc, SMBCMD, SMBSRBYTE); - ALPM_SMBOUTB(sc, SMBSTART, 0xff); - - if ((error = alsmb_wait(sc)) == SMB_ENOERR) - *byte = ALPM_SMBINB(sc, SMBHDATA); - - ALPM_DEBUG(printf("alpm: RECVB from 0x%x, byte=0x%x, error=0x%x\n", slave, *byte, error)); - - return (error); -} - -static int -alsmb_smb_writeb(device_t dev, u_char slave, char cmd, char byte) -{ - struct alsmb_softc *sc = (struct alsmb_softc *)device_get_softc(dev); - int error; - - alsmb_clear(sc); - if (!alsmb_idle(sc)) - return (SMB_EBUSY); - - ALPM_SMBOUTB(sc, SMBHADDR, slave & ~LSB); - ALPM_SMBOUTB(sc, SMBCMD, SMBWRBYTE); - ALPM_SMBOUTB(sc, SMBHDATA, byte); - ALPM_SMBOUTB(sc, SMBHCMD, cmd); - ALPM_SMBOUTB(sc, SMBSTART, 0xff); - - error = alsmb_wait(sc); - - ALPM_DEBUG(printf("alpm: WRITEB to 0x%x, cmd=0x%x, byte=0x%x, error=0x%x\n", slave, cmd, byte, error)); - - return (error); -} - -static int -alsmb_smb_readb(device_t dev, u_char slave, char cmd, char *byte) -{ - struct alsmb_softc *sc = (struct alsmb_softc *)device_get_softc(dev); - int error; - - alsmb_clear(sc); - if (!alsmb_idle(sc)) - return (SMB_EBUSY); - - ALPM_SMBOUTB(sc, SMBHADDR, slave | LSB); - ALPM_SMBOUTB(sc, SMBCMD, SMBWRBYTE); - ALPM_SMBOUTB(sc, SMBHCMD, cmd); - ALPM_SMBOUTB(sc, SMBSTART, 0xff); - - if ((error = alsmb_wait(sc)) == SMB_ENOERR) - *byte = ALPM_SMBINB(sc, SMBHDATA); - - ALPM_DEBUG(printf("alpm: READB from 0x%x, cmd=0x%x, byte=0x%x, error=0x%x\n", slave, cmd, *byte, error)); - - return (error); -} - -static int -alsmb_smb_writew(device_t dev, u_char slave, char cmd, short word) -{ - struct alsmb_softc *sc = (struct alsmb_softc *)device_get_softc(dev); - int error; - - alsmb_clear(sc); - if (!alsmb_idle(sc)) - return (SMB_EBUSY); - - ALPM_SMBOUTB(sc, SMBHADDR, slave & ~LSB); - ALPM_SMBOUTB(sc, SMBCMD, SMBWRWORD); - ALPM_SMBOUTB(sc, SMBHDATA, word & 0x00ff); - ALPM_SMBOUTB(sc, SMBHDATB, (word & 0xff00) >> 8); - ALPM_SMBOUTB(sc, SMBHCMD, cmd); - ALPM_SMBOUTB(sc, SMBSTART, 0xff); - - error = alsmb_wait(sc); - - ALPM_DEBUG(printf("alpm: WRITEW to 0x%x, cmd=0x%x, word=0x%x, error=0x%x\n", slave, cmd, word, error)); - - return (error); -} - -static int -alsmb_smb_readw(device_t dev, u_char slave, char cmd, short *word) -{ - struct alsmb_softc *sc = (struct alsmb_softc *)device_get_softc(dev); - int error; - u_char high, low; - - alsmb_clear(sc); - if (!alsmb_idle(sc)) - return (SMB_EBUSY); - - ALPM_SMBOUTB(sc, SMBHADDR, slave | LSB); - ALPM_SMBOUTB(sc, SMBCMD, SMBWRWORD); - ALPM_SMBOUTB(sc, SMBHCMD, cmd); - ALPM_SMBOUTB(sc, SMBSTART, 0xff); - - if ((error = alsmb_wait(sc)) == SMB_ENOERR) { - low = ALPM_SMBINB(sc, SMBHDATA); - high = ALPM_SMBINB(sc, SMBHDATB); - - *word = ((high & 0xff) << 8) | (low & 0xff); - } - - ALPM_DEBUG(printf("alpm: READW from 0x%x, cmd=0x%x, word=0x%x, error=0x%x\n", slave, cmd, *word, error)); - - return (error); -} - -static int -alsmb_smb_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf) -{ - struct alsmb_softc *sc = (struct alsmb_softc *)device_get_softc(dev); - u_char remain, len, i; - int error = SMB_ENOERR; - - alsmb_clear(sc); - if(!alsmb_idle(sc)) - return (SMB_EBUSY); - - remain = count; - while (remain) { - len = min(remain, 32); - - ALPM_SMBOUTB(sc, SMBHADDR, slave & ~LSB); - - /* set the cmd and reset the - * 32-byte long internal buffer */ - ALPM_SMBOUTB(sc, SMBCMD, SMBWRBLOCK | SMB_BLK_CLR); - - ALPM_SMBOUTB(sc, SMBHDATA, len); - - /* fill the 32-byte internal buffer */ - for (i=0; i<len; i++) { - ALPM_SMBOUTB(sc, SMBHBLOCK, buf[count-remain+i]); - DELAY(2); - } - ALPM_SMBOUTB(sc, SMBHCMD, cmd); - ALPM_SMBOUTB(sc, SMBSTART, 0xff); - - if ((error = alsmb_wait(sc)) != SMB_ENOERR) - goto error; - - remain -= len; - } - -error: - ALPM_DEBUG(printf("alpm: WRITEBLK to 0x%x, count=0x%x, cmd=0x%x, error=0x%x", slave, count, cmd, error)); - - return (error); -} - -static int -alsmb_smb_bread(device_t dev, u_char slave, char cmd, u_char count, char *buf) -{ - struct alsmb_softc *sc = (struct alsmb_softc *)device_get_softc(dev); - u_char remain, len, i; - int error = SMB_ENOERR; - - alsmb_clear(sc); - if (!alsmb_idle(sc)) - return (SMB_EBUSY); - - remain = count; - while (remain) { - ALPM_SMBOUTB(sc, SMBHADDR, slave | LSB); - - /* set the cmd and reset the - * 32-byte long internal buffer */ - ALPM_SMBOUTB(sc, SMBCMD, SMBWRBLOCK | SMB_BLK_CLR); - - ALPM_SMBOUTB(sc, SMBHCMD, cmd); - ALPM_SMBOUTB(sc, SMBSTART, 0xff); - - if ((error = alsmb_wait(sc)) != SMB_ENOERR) - goto error; - - len = ALPM_SMBINB(sc, SMBHDATA); - - /* read the 32-byte internal buffer */ - for (i=0; i<len; i++) { - buf[count-remain+i] = ALPM_SMBINB(sc, SMBHBLOCK); - DELAY(2); - } - - remain -= len; - } -error: - ALPM_DEBUG(printf("alpm: READBLK to 0x%x, count=0x%x, cmd=0x%x, error=0x%x", slave, count, cmd, error)); - - return (error); -} - -DRIVER_MODULE(alsmb, root, alsmb_driver, alsmb_devclass, 0, 0); diff --git a/sys/pci/if_sisreg.h b/sys/pci/if_sisreg.h deleted file mode 100644 index cef3a5251839..000000000000 --- a/sys/pci/if_sisreg.h +++ /dev/null @@ -1,404 +0,0 @@ -/* - * Copyright (c) 1997, 1998, 1999 - * Bill Paul <wpaul@ee.columbia.edu>. 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Bill Paul. - * 4. 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. - * - * THIS SOFTWARE IS PROVIDED BY Bill Paul 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 Bill Paul OR THE VOICES IN HIS HEAD - * 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$ - */ - -/* - * Register definitions for the SiS 900 and SiS 7016 chipsets. The - * 7016 is actually an older chip and some of its registers differ - * from the 900, however the core operational registers are the same: - * the differences lie in the OnNow/Wake on LAN stuff which we don't - * use anyway. The 7016 needs an external MII compliant PHY while the - * SiS 900 has one built in. All registers are 32-bits wide. - */ - -/* Registers common to SiS 900 and SiS 7016 */ -#define SIS_CSR 0x00 -#define SIS_CFG 0x04 -#define SIS_EECTL 0x08 -#define SIS_PCICTL 0x0C -#define SIS_ISR 0x10 -#define SIS_IMR 0x14 -#define SIS_IER 0x18 -#define SIS_PHYCTL 0x1C -#define SIS_TX_LISTPTR 0x20 -#define SIS_TX_CFG 0x24 -#define SIS_RX_LISTPTR 0x30 -#define SIS_RX_CFG 0x34 -#define SIS_FLOWCTL 0x38 -#define SIS_RXFILT_CTL 0x48 -#define SIS_RXFILT_DATA 0x4C -#define SIS_PWRMAN_CTL 0xB0 -#define SIS_PWERMAN_WKUP_EVENT 0xB4 -#define SIS_WKUP_FRAME_CRC 0xBC -#define SIS_WKUP_FRAME_MASK0 0xC0 -#define SIS_WKUP_FRAME_MASKXX 0xEC - -/* SiS 7016 specific registers */ -#define SIS_SILICON_REV 0x5C -#define SIS_MIB_CTL0 0x60 -#define SIS_MIB_CTL1 0x64 -#define SIS_MIB_CTL2 0x68 -#define SIS_MIB_CTL3 0x6C -#define SIS_MIB 0x80 -#define SIS_LINKSTS 0xA0 -#define SIS_TIMEUNIT 0xA4 -#define SIS_GPIO 0xB8 - -#define SIS_CSR_TX_ENABLE 0x00000001 -#define SIS_CSR_TX_DISABLE 0x00000002 -#define SIS_CSR_RX_ENABLE 0x00000004 -#define SIS_CSR_RX_DISABLE 0x00000008 -#define SIS_CSR_TX_RESET 0x00000010 -#define SIS_CSR_RX_RESET 0x00000020 -#define SIS_CSR_SOFTINTR 0x00000080 -#define SIS_CSR_RESET 0x00000100 - -#define SIS_CFG_BIGENDIAN 0x00000001 -#define SIS_CFG_PERR_DETECT 0x00000008 -#define SIS_CFG_DEFER_DISABLE 0x00000010 -#define SIS_CFG_OUTOFWIN_TIMER 0x00000020 -#define SIS_CFG_SINGLE_BACKOFF 0x00000040 -#define SIS_CFG_PCIREQ_ALG 0x00000080 - -#define SIS_EECTL_DIN 0x00000001 -#define SIS_EECTL_DOUT 0x00000002 -#define SIS_EECTL_CLK 0x00000004 -#define SIS_EECTL_CSEL 0x00000008 - -#define SIS_EECMD_WRITE 0x140 -#define SIS_EECMD_READ 0x180 -#define SIS_EECMD_ERASE 0x1c0 - -#define SIS_EE_NODEADDR 0x8 - -#define SIS_PCICTL_SRAMADDR 0x0000001F -#define SIS_PCICTL_RAMTSTENB 0x00000020 -#define SIS_PCICTL_TXTSTENB 0x00000040 -#define SIS_PCICTL_RXTSTENB 0x00000080 -#define SIS_PCICTL_BMTSTENB 0x00000200 -#define SIS_PCICTL_RAMADDR 0x001F0000 -#define SIS_PCICTL_ROMTIME 0x0F000000 -#define SIS_PCICTL_DISCTEST 0x40000000 - -#define SIS_ISR_RX_OK 0x00000001 -#define SIS_ISR_RX_DESC_OK 0x00000002 -#define SIS_ISR_RX_ERR 0x00000004 -#define SIS_ISR_RX_EARLY 0x00000008 -#define SIS_ISR_RX_IDLE 0x00000010 -#define SIS_ISR_RX_OFLOW 0x00000020 -#define SIS_ISR_TX_OK 0x00000040 -#define SIS_ISR_TX_DESC_OK 0x00000080 -#define SIS_ISR_TX_ERR 0x00000100 -#define SIS_ISR_TX_IDLE 0x00000200 -#define SIS_ISR_TX_UFLOW 0x00000400 -#define SIS_ISR_SOFTINTR 0x00000800 -#define SIS_ISR_HIBITS 0x00008000 -#define SIS_ISR_RX_FIFO_OFLOW 0x00010000 -#define SIS_ISR_TGT_ABRT 0x00100000 -#define SIS_ISR_BM_ABRT 0x00200000 -#define SIS_ISR_SYSERR 0x00400000 -#define SIS_ISR_PARITY_ERR 0x00800000 -#define SIS_ISR_RX_RESET_DONE 0x01000000 -#define SIS_ISR_TX_RESET_DONE 0x02000000 -#define SIS_ISR_TX_PAUSE_START 0x04000000 -#define SIS_ISR_TX_PAUSE_DONE 0x08000000 -#define SIS_ISR_WAKE_EVENT 0x10000000 - -#define SIS_IMR_RX_OK 0x00000001 -#define SIS_IMR_RX_DESC_OK 0x00000002 -#define SIS_IMR_RX_ERR 0x00000004 -#define SIS_IMR_RX_EARLY 0x00000008 -#define SIS_IMR_RX_IDLE 0x00000010 -#define SIS_IMR_RX_OFLOW 0x00000020 -#define SIS_IMR_TX_OK 0x00000040 -#define SIS_IMR_TX_DESC_OK 0x00000080 -#define SIS_IMR_TX_ERR 0x00000100 -#define SIS_IMR_TX_IDLE 0x00000200 -#define SIS_IMR_TX_UFLOW 0x00000400 -#define SIS_IMR_SOFTINTR 0x00000800 -#define SIS_IMR_HIBITS 0x00008000 -#define SIS_IMR_RX_FIFO_OFLOW 0x00010000 -#define SIS_IMR_TGT_ABRT 0x00100000 -#define SIS_IMR_BM_ABRT 0x00200000 -#define SIS_IMR_SYSERR 0x00400000 -#define SIS_IMR_PARITY_ERR 0x00800000 -#define SIS_IMR_RX_RESET_DONE 0x01000000 -#define SIS_IMR_TX_RESET_DONE 0x02000000 -#define SIS_IMR_TX_PAUSE_START 0x04000000 -#define SIS_IMR_TX_PAUSE_DONE 0x08000000 -#define SIS_IMR_WAKE_EVENT 0x10000000 - -#define SIS_INTRS \ - (SIS_IMR_RX_OFLOW|SIS_IMR_TX_UFLOW|SIS_IMR_TX_OK|\ - SIS_IMR_TX_IDLE|SIS_IMR_RX_OK|SIS_IMR_RX_ERR|\ - SIS_IMR_SYSERR) - -#define SIS_IER_INTRENB 0x00000001 - -#define SIS_PHYCTL_ACCESS 0x00000010 -#define SIS_PHYCTL_OP 0x00000020 -#define SIS_PHYCTL_REGADDR 0x000007C0 -#define SIS_PHYCTL_PHYADDR 0x0000F800 -#define SIS_PHYCTL_PHYDATA 0xFFFF0000 - -#define SIS_PHYOP_READ 0x00000020 -#define SIS_PHYOP_WRITE 0x00000000 - -#define SIS_TXCFG_DRAIN_THRESH 0x0000003F /* 32-byte units */ -#define SIS_TXCFG_FILL_THRESH 0x00003F00 /* 32-byte units */ -#define SIS_TXCFG_DMABURST 0x00700000 -#define SIS_TXCFG_AUTOPAD 0x10000000 -#define SIS_TXCFG_LOOPBK 0x20000000 -#define SIS_TXCFG_IGN_HBEAT 0x40000000 -#define SIS_TXCFG_IGN_CARR 0x80000000 - -#define SIS_TXCFG_DRAIN(x) (((x) >> 5) & SIS_TXCFG_DRAIN_THRESH) -#define SIS_TXCFG_FILL(x) ((((x) >> 5) << 8) & SIS_TXCFG_FILL_THRESH) - -#define SIS_TXDMA_512BYTES 0x00000000 -#define SIS_TXDMA_4BYTES 0x00100000 -#define SIS_TXDMA_8BYTES 0x00200000 -#define SIS_TXDMA_16BYTES 0x00300000 -#define SIS_TXDMA_32BYTES 0x00400000 -#define SIS_TXDMA_64BYTES 0x00500000 -#define SIS_TXDMA_128BYTES 0x00600000 -#define SIS_TXDMA_256BYTES 0x00700000 - -#define SIS_TXCFG \ - (SIS_TXDMA_64BYTES|SIS_TXCFG_AUTOPAD|\ - SIS_TXCFG_FILL(64)|SIS_TXCFG_DRAIN(1500)) - -#define SIS_RXCFG_DRAIN_THRESH 0x0000003E /* 8-byte units */ -#define SIS_RXCFG_DMABURST 0x00700000 -#define SIS_RXCFG_RX_JABBER 0x08000000 -#define SIS_RXCFG_RX_TXPKTS 0x10000000 -#define SIS_RXCFG_RX_RUNTS 0x40000000 -#define SIS_RXCFG_RX_GIANTS 0x80000000 - -#define SIS_RXCFG_DRAIN(x) ((((x) >> 3) << 1) & SIS_RXCFG_DRAIN_THRESH) - -#define SIS_RXDMA_512BYTES 0x00000000 -#define SIS_RXDMA_4BYTES 0x00100000 -#define SIS_RXDMA_8BYTES 0x00200000 -#define SIS_RXDMA_16BYTES 0x00300000 -#define SIS_RXDMA_32BYTES 0x00400000 -#define SIS_RXDMA_64BYTES 0x00500000 -#define SIS_RXDMA_128BYTES 0x00600000 -#define SIS_RXDMA_256BYTES 0x00700000 - -#define SIS_RXCFG \ - (SIS_RXCFG_DRAIN(64)|SIS_RXDMA_256BYTES) - -#define SIS_RXFILTCTL_ADDR 0x000F0000 -#define SIS_RXFILTCTL_ALLPHYS 0x10000000 -#define SIS_RXFILTCTL_ALLMULTI 0x20000000 -#define SIS_RXFILTCTL_BROAD 0x40000000 -#define SIS_RXFILTCTL_ENABLE 0x80000000 - -#define SIS_FILTADDR_PAR0 0x00000000 -#define SIS_FILTADDR_PAR1 0x00010000 -#define SIS_FILTADDR_PAR2 0x00020000 -#define SIS_FILTADDR_MAR0 0x00040000 -#define SIS_FILTADDR_MAR1 0x00050000 -#define SIS_FILTADDR_MAR2 0x00060000 -#define SIS_FILTADDR_MAR3 0x00070000 -#define SIS_FILTADDR_MAR4 0x00080000 -#define SIS_FILTADDR_MAR5 0x00090000 -#define SIS_FILTADDR_MAR6 0x000A0000 -#define SIS_FILTADDR_MAR7 0x000B0000 - -/* - * DMA descriptor structures. The first part of the descriptor - * is the hardware descriptor format, which is just three longwords. - * After this, we include some additional structure members for - * use by the driver. Note that for this structure will be a different - * size on the alpha, but that's okay as long as it's a multiple of 4 - * bytes in size. - */ -struct sis_desc { - /* SiS hardware descriptor section */ - u_int32_t sis_next; - u_int32_t sis_cmdsts; -#define sis_rxstat sis_cmdsts -#define sis_txstat sis_cmdsts -#define sis_ctl sis_cmdsts - u_int32_t sis_ptr; - /* Driver software section */ - struct mbuf *sis_mbuf; - struct sis_desc *sis_nextdesc; -}; - -#define SIS_CMDSTS_BUFLEN 0x00000FFF -#define SIS_CMDSTS_PKT_OK 0x08000000 -#define SIS_CMDSTS_CRC 0x10000000 -#define SIS_CMDSTS_INTR 0x20000000 -#define SIS_CMDSTS_MORE 0x40000000 -#define SIS_CMDSTS_OWN 0x80000000 - -#define SIS_LASTDESC(x) (!((x)->sis_ctl & SIS_CMDSTS_MORE))) -#define SIS_OWNDESC(x) ((x)->sis_ctl & SIS_CMDSTS_OWN) -#define SIS_INC(x, y) (x) = (x + 1) % y -#define SIS_RXBYTES(x) ((x)->sis_ctl & SIS_CMDSTS_BUFLEN) - -#define SIS_RXSTAT_COLL 0x00010000 -#define SIS_RXSTAT_LOOPBK 0x00020000 -#define SIS_RXSTAT_ALIGNERR 0x00040000 -#define SIS_RXSTAT_CRCERR 0x00080000 -#define SIS_RXSTAT_SYMBOLERR 0x00100000 -#define SIS_RXSTAT_RUNT 0x00200000 -#define SIS_RXSTAT_GIANT 0x00400000 -#define SIS_RXSTAT_DSTCLASS 0x01800000 -#define SIS_RXSTAT_OVERRUN 0x02000000 -#define SIS_RXSTAT_RX_ABORT 0x04000000 - -#define SIS_DSTCLASS_REJECT 0x00000000 -#define SIS_DSTCLASS_UNICAST 0x00800000 -#define SIS_DSTCLASS_MULTICAST 0x01000000 -#define SIS_DSTCLASS_BROADCAST 0x02000000 - -#define SIS_TXSTAT_COLLCNT 0x000F0000 -#define SIS_TXSTAT_EXCESSCOLLS 0x00100000 -#define SIS_TXSTAT_OUTOFWINCOLL 0x00200000 -#define SIS_TXSTAT_EXCESS_DEFER 0x00400000 -#define SIS_TXSTAT_DEFERED 0x00800000 -#define SIS_TXSTAT_CARR_LOST 0x01000000 -#define SIS_TXSTAT_UNDERRUN 0x02000000 -#define SIS_TXSTAT_TX_ABORT 0x04000000 - -#define SIS_RX_LIST_CNT 64 -#define SIS_TX_LIST_CNT 128 - -struct sis_list_data { - struct sis_desc sis_rx_list[SIS_RX_LIST_CNT]; - struct sis_desc sis_tx_list[SIS_TX_LIST_CNT]; -}; - -struct sis_ring_data { - int sis_rx_prod; - int sis_tx_prod; - int sis_tx_cons; - int sis_tx_cnt; -}; - - -/* - * SiS PCI vendor ID. - */ -#define SIS_VENDORID 0x1039 - -/* - * SiS PCI device IDs - */ -#define SIS_DEVICEID_900 0x0900 -#define SIS_DEVICEID_7016 0x7016 - -struct sis_type { - u_int16_t sis_vid; - u_int16_t sis_did; - char *sis_name; -}; - -#define SIS_TYPE_900 1 -#define SIS_TYPE_7016 2 - -struct sis_softc { - struct arpcom arpcom; /* interface info */ - bus_space_handle_t sis_bhandle; - bus_space_tag_t sis_btag; - struct resource *sis_res; - struct resource *sis_irq; - void *sis_intrhand; - device_t sis_miibus; - u_int8_t sis_unit; - u_int8_t sis_type; - struct sis_list_data *sis_ldata; - struct sis_ring_data sis_cdata; - struct callout_handle sis_stat_ch; -}; - -/* - * register space access macros - */ -#define CSR_WRITE_4(sc, reg, val) \ - bus_space_write_4(sc->sis_btag, sc->sis_bhandle, reg, val) - -#define CSR_READ_4(sc, reg) \ - bus_space_read_4(sc->sis_btag, sc->sis_bhandle, reg) - -#define SIS_TIMEOUT 1000 -#define ETHER_ALIGN 2 -#define SIS_RXLEN 1536 -#define SIS_MIN_FRAMELEN 60 - -/* - * PCI low memory base and low I/O base register, and - * other PCI registers. - */ - -#define SIS_PCI_VENDOR_ID 0x00 -#define SIS_PCI_DEVICE_ID 0x02 -#define SIS_PCI_COMMAND 0x04 -#define SIS_PCI_STATUS 0x06 -#define SIS_PCI_REVID 0x08 -#define SIS_PCI_CLASSCODE 0x09 -#define SIS_PCI_CACHELEN 0x0C -#define SIS_PCI_LATENCY_TIMER 0x0D -#define SIS_PCI_HEADER_TYPE 0x0E -#define SIS_PCI_LOIO 0x10 -#define SIS_PCI_LOMEM 0x14 -#define SIS_PCI_BIOSROM 0x30 -#define SIS_PCI_INTLINE 0x3C -#define SIS_PCI_INTPIN 0x3D -#define SIS_PCI_MINGNT 0x3E -#define SIS_PCI_MINLAT 0x0F -#define SIS_PCI_RESETOPT 0x48 -#define SIS_PCI_EEPROM_DATA 0x4C - -/* power management registers */ -#define SIS_PCI_CAPID 0x50 /* 8 bits */ -#define SIS_PCI_NEXTPTR 0x51 /* 8 bits */ -#define SIS_PCI_PWRMGMTCAP 0x52 /* 16 bits */ -#define SIS_PCI_PWRMGMTCTRL 0x54 /* 16 bits */ - -#define SIS_PSTATE_MASK 0x0003 -#define SIS_PSTATE_D0 0x0000 -#define SIS_PSTATE_D1 0x0001 -#define SIS_PSTATE_D2 0x0002 -#define SIS_PSTATE_D3 0x0003 -#define SIS_PME_EN 0x0010 -#define SIS_PME_STATUS 0x8000 - -#ifdef __alpha__ -#undef vtophys -#define vtophys(va) alpha_XXX_dmamap((vm_offset_t)va) -#endif diff --git a/sys/pci/intpmreg.h b/sys/pci/intpmreg.h deleted file mode 100644 index 73816e7748d5..000000000000 --- a/sys/pci/intpmreg.h +++ /dev/null @@ -1,77 +0,0 @@ -/*- - * Copyright (c) 1998, 1999 Takanori Watanabe - * 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. - * - * $FreeBSD$ - */ - -/*Register Difinition for Intel Chipset with ACPI Support*/ -#define PCI_BASE_ADDR_SMB 0x90 /*Where to MAP IO*/ -#define PCI_BASE_ADDR_PM 0x40 -#define PCI_HST_CFG_SMB 0xd2 /*Host Configuration*/ -#define PCI_INTR_SMB_SMI 0 -#define PCI_INTR_SMB_IRQ9 8 -#define PCI_INTR_SMB_ENABLE 1 -#define PCI_SLV_CMD_SMB 0xd3 /*SLAVE COMMAND*/ -#define PCI_SLV_SDW_SMB_1 0xd4 /*SLAVE SHADOW PORT 1*/ -#define PCI_SLV_SDW_SMB_2 0xd5 /*SLAVE SHADOW PORT 2*/ -#define PCI_REVID_SMB 0xd6 -#define LSB 0x1 -#define PIIX4_SMBHSTSTS 0x00 -#define PIIX4_SMBHSTSTAT_BUSY (1<<0) -#define PIIX4_SMBHSTSTAT_INTR (1<<1) -#define PIIX4_SMBHSTSTAT_ERR (1<<2) -#define PIIX4_SMBHSTSTAT_BUSC (1<<3) -#define PIIX4_SMBHSTSTAT_FAIL (1<<4) -#define PIIX4_SMBSLVSTS 0x01 -#define PIIX4_SMBSLVSTS_ALART (1<<5) -#define PIIX4_SMBSLVSTS_SDW2 (1<<4) -#define PIIX4_SMBSLVSTS_SDW1 (1<<3) -#define PIIX4_SMBSLVSTS_SLV (1<<2) -#define PIIX4_SMBSLVSTS_BUSY (1<<0) -#define PIIX4_SMBHSTCNT 0x02 -#define PIIX4_SMBHSTCNT_START (1<<6) -#define PIIX4_SMBHSTCNT_PROT_QUICK 0 -#define PIIX4_SMBHSTCNT_PROT_BYTE (1<<2) -#define PIIX4_SMBHSTCNT_PROT_BDATA (2<<2) -#define PIIX4_SMBHSTCNT_PROT_WDATA (3<<2) -#define PIIX4_SMBHSTCNT_PROT_BLOCK (5<<2) -#define SMBBLOCKTRANS_MAX 32 -#define PIIX4_SMBHSTCNT_KILL (1<<1) -#define PIIX4_SMBHSTCNT_INTREN (1) -#define PIIX4_SMBHSTCMD 0x03 -#define PIIX4_SMBHSTADD 0x04 -#define PIIX4_SMBHSTDAT0 0x05 -#define PIIX4_SMBHSTDAT1 0x06 -#define PIIX4_SMBBLKDAT 0x07 -#define PIIX4_SMBSLVCNT 0x08 -#define PIIX4_SMBSLVCNT_ALTEN (1<<3) -#define PIIX4_SMBSLVCNT_SD2EN (1<<2) -#define PIIX4_SMBSLVCNT_SD1EN (1<<1) -#define PIIX4_SMBSLVCNT_SLVEN (1) -#define PIIX4_SMBSLVCMD 0x09 -#define PIIX4_SMBSLVEVT 0x0a -#define PIIX4_SMBSLVDAT 0x0c -/*This is SMBus alart response address*/ -#define SMBALTRESP 0x18 |
