mirror of
https://github.com/opnsense/src.git
synced 2026-06-13 18:50:31 -04:00
update to isdn4bsd beta release 0.90
This commit is contained in:
parent
ea8271a8bb
commit
acfb47d41c
67 changed files with 3655 additions and 6405 deletions
|
|
@ -30,9 +30,11 @@
|
|||
* i4b_bsdi_ibc.c - isdn4bsd kernel BSD/OS point to point driver
|
||||
* -------------------------------------------------------------
|
||||
*
|
||||
* $Id: i4b_bsdi_ibc.c,v 1.1 1999/04/23 08:35:07 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Fri Apr 23 10:27:57 1999]
|
||||
* last edit-date: [Tue Dec 14 21:55:37 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_ctl.c - i4b system control port driver
|
||||
* ------------------------------------------
|
||||
*
|
||||
* $Id: i4b_ctl.c,v 1.30 1999/12/13 21:25:23 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Tue Jun 8 09:27:15 1999]
|
||||
* last edit-date: [Mon Dec 13 21:38:15 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -59,6 +61,18 @@
|
|||
#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ == 3
|
||||
#include "opt_devfs.h"
|
||||
#endif
|
||||
|
||||
#ifdef DEVFS
|
||||
#include <sys/devfsext.h>
|
||||
#endif
|
||||
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/i4b_debug.h>
|
||||
#include <machine/i4b_ioctl.h>
|
||||
|
|
@ -93,22 +107,22 @@ static d_poll_t i4bctlpoll;
|
|||
|
||||
#define CDEV_MAJOR 55
|
||||
|
||||
#if defined (__FreeBSD_version) && __FreeBSD_version >= 400006
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 4
|
||||
static struct cdevsw i4bctl_cdevsw = {
|
||||
/* open */ i4bctlopen,
|
||||
/* close */ i4bctlclose,
|
||||
/* read */ noread,
|
||||
/* write */ nowrite,
|
||||
/* ioctl */ i4bctlioctl,
|
||||
/* poll */ POLLFIELD,
|
||||
/* mmap */ nommap,
|
||||
/* strategy */ nostrategy,
|
||||
/* name */ "i4bctl",
|
||||
/* maj */ CDEV_MAJOR,
|
||||
/* dump */ nodump,
|
||||
/* psize */ nopsize,
|
||||
/* flags */ 0,
|
||||
/* bmaj */ -1
|
||||
/* open */ i4bctlopen,
|
||||
/* close */ i4bctlclose,
|
||||
/* read */ noread,
|
||||
/* write */ nowrite,
|
||||
/* ioctl */ i4bctlioctl,
|
||||
/* poll */ POLLFIELD,
|
||||
/* mmap */ nommap,
|
||||
/* strategy */ nostrategy,
|
||||
/* name */ "i4bctl",
|
||||
/* maj */ CDEV_MAJOR,
|
||||
/* dump */ nodump,
|
||||
/* psize */ nopsize,
|
||||
/* flags */ 0,
|
||||
/* bmaj */ -1
|
||||
};
|
||||
#else
|
||||
static struct cdevsw i4bctl_cdevsw =
|
||||
|
|
@ -123,6 +137,12 @@ PSEUDO_SET(i4bctlattach, i4b_i4bctldrv);
|
|||
#define PDEVSTATIC static
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ == 3
|
||||
#ifdef DEVFS
|
||||
static void *devfs_token;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
#define PDEVSTATIC /* */
|
||||
void i4bctlattach __P((void));
|
||||
|
|
@ -142,7 +162,7 @@ int i4bctlioctl __P((dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
|||
static void
|
||||
i4bctlinit(void *unused)
|
||||
{
|
||||
#if defined (__FreeBSD_version) && __FreeBSD_version >= 400006
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 4
|
||||
cdevsw_add(&i4bctl_cdevsw);
|
||||
#else
|
||||
dev_t dev = makedev(CDEV_MAJOR, 0);
|
||||
|
|
@ -195,7 +215,20 @@ i4bctlattach()
|
|||
#ifndef HACK_NO_PSEUDO_ATTACH_MSG
|
||||
printf("i4bctl: ISDN system control port attached\n");
|
||||
#endif
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#if __FreeBSD__ == 3
|
||||
|
||||
#ifdef DEVFS
|
||||
devfs_token = devfs_add_devswf(&i4bctl_cdevsw, 0, DV_CHR,
|
||||
UID_ROOT, GID_WHEEL, 0600,
|
||||
"i4bctl");
|
||||
#endif
|
||||
|
||||
#else
|
||||
make_dev(&i4bctl_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "i4bctl");
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
|
|
@ -267,7 +300,7 @@ i4bctlioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
|||
case I4B_CTL_GET_HSCXSTAT:
|
||||
{
|
||||
hscxstat_t *hst;
|
||||
struct isic_softc *sc;
|
||||
struct l1_softc *sc;
|
||||
hst = (hscxstat_t *)data;
|
||||
|
||||
if( hst->unit < 0 ||
|
||||
|
|
@ -282,7 +315,7 @@ i4bctlioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
|||
#ifndef __FreeBSD__
|
||||
sc = isic_find_sc(hst->unit);
|
||||
#else
|
||||
sc = &isic_sc[hst->unit];
|
||||
sc = &l1_sc[hst->unit];
|
||||
#endif
|
||||
hst->vfr = sc->sc_chan[hst->chan].stat_VFR;
|
||||
hst->rdo = sc->sc_chan[hst->chan].stat_RDO;
|
||||
|
|
@ -296,7 +329,7 @@ i4bctlioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
|||
case I4B_CTL_CLR_HSCXSTAT:
|
||||
{
|
||||
hscxstat_t *hst;
|
||||
struct isic_softc *sc;
|
||||
struct l1_softc *sc;
|
||||
hst = (hscxstat_t *)data;
|
||||
|
||||
if( hst->unit < 0 ||
|
||||
|
|
@ -311,7 +344,7 @@ i4bctlioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
|||
#ifndef __FreeBSD__
|
||||
sc = isic_find_sc(hst->unit);
|
||||
#else
|
||||
sc = &isic_sc[hst->unit];
|
||||
sc = &l1_sc[hst->unit];
|
||||
#endif
|
||||
|
||||
sc->sc_chan[hst->chan].stat_VFR = 0;
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_ipr.c - isdn4bsd IP over raw HDLC ISDN network driver
|
||||
* ---------------------------------------------------------
|
||||
*
|
||||
* $Id: i4b_ipr.c,v 1.55 1999/12/13 21:25:24 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Thu Jul 22 19:46:53 1999]
|
||||
* last edit-date: [Mon Dec 13 21:38:51 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*
|
||||
*
|
||||
|
|
@ -194,6 +196,9 @@ struct ipr_softc {
|
|||
#ifdef I4BIPRADJFRXP
|
||||
int sc_first_pkt; /* flag, first rxd packet */
|
||||
#endif
|
||||
#if IPR_LOG
|
||||
int sc_log_first; /* log first n packets */
|
||||
#endif
|
||||
|
||||
#ifdef IPR_VJ
|
||||
struct slcompress sc_compr; /* tcp compression data */
|
||||
|
|
@ -330,6 +335,9 @@ i4biprattach()
|
|||
sc->sc_loutb = 0;
|
||||
sc->sc_fn = 1;
|
||||
#endif
|
||||
#if IPR_LOG
|
||||
sc->sc_log_first = IPR_LOG;
|
||||
#endif
|
||||
|
||||
#ifdef IPR_VJ
|
||||
#ifdef __FreeBSD__
|
||||
|
|
@ -456,6 +464,14 @@ i4biproutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
|
|||
sc->sc_state = ST_DIALING;
|
||||
}
|
||||
|
||||
#if IPR_LOG
|
||||
if(sc->sc_log_first > 0)
|
||||
{
|
||||
--(sc->sc_log_first);
|
||||
i4b_l4_packet_ind(BDRV_IPR, unit, 1, m );
|
||||
}
|
||||
#endif
|
||||
|
||||
/* update access time */
|
||||
|
||||
microtime(&sc->sc_if.if_lastchange);
|
||||
|
|
@ -801,6 +817,10 @@ ipr_disconnect(int unit, void *cdp)
|
|||
#if I4BIPRACCT
|
||||
sc->sc_if.if_timer = 0;
|
||||
#endif
|
||||
#if IPR_LOG
|
||||
/* show next IPR_LOG packets again */
|
||||
sc->sc_log_first = IPR_LOG;
|
||||
#endif
|
||||
|
||||
i4b_l4_accounting(BDRV_IPR, cd->driver_unit, ACCT_FINAL,
|
||||
sc->sc_ioutb, sc->sc_iinb, 0, 0, sc->sc_outb, sc->sc_inb);
|
||||
|
|
@ -997,6 +1017,13 @@ error:
|
|||
/* NB. do the accounting after decompression! */
|
||||
sc->sc_inb += m->m_pkthdr.len;
|
||||
#endif
|
||||
#if IPR_LOG
|
||||
if(sc->sc_log_first > 0)
|
||||
{
|
||||
--(sc->sc_log_first);
|
||||
i4b_l4_packet_ind(BDRV_IPR, unit, 0, m );
|
||||
}
|
||||
#endif
|
||||
|
||||
#if NBPFILTER > 0 || NBPF > 0
|
||||
if(sc->sc_if.if_bpf)
|
||||
|
|
|
|||
|
|
@ -34,9 +34,11 @@
|
|||
* the "cx" driver for Cronyx's HDLC-in-hardware device). This driver
|
||||
* is only the glue between sppp and i4b.
|
||||
*
|
||||
* $Id: i4b_isppp.c,v 1.35 1999/12/13 21:25:24 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Sat Jul 24 15:23:04 1999]
|
||||
* last edit-date: [Mon Dec 13 21:39:06 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_rbch.c - device driver for raw B channel data
|
||||
* ---------------------------------------------------
|
||||
*
|
||||
* $Id: i4b_rbch.c,v 1.48 1999/12/13 21:25:24 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Fri Jul 9 09:37:02 1999]
|
||||
* last edit-date: [Mon Dec 13 21:39:15 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -54,6 +56,18 @@ extern cc_t ttydefchars;
|
|||
#define termioschars(t) memcpy((t)->c_cc, &ttydefchars, sizeof((t)->c_cc))
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ == 3
|
||||
#include "opt_devfs.h"
|
||||
#endif
|
||||
|
||||
#ifdef DEVFS
|
||||
#include <sys/devfsext.h>
|
||||
#endif
|
||||
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
#ifdef __NetBSD__
|
||||
#include <sys/filio.h>
|
||||
#define bootverbose 0
|
||||
|
|
@ -74,7 +88,6 @@ extern cc_t ttydefchars;
|
|||
#include <i4b/include/i4b_l3l4.h>
|
||||
|
||||
#include <i4b/layer4/i4b_l4.h>
|
||||
/* initialized by L4 */
|
||||
|
||||
#ifdef __bsdi__
|
||||
#include <sys/device.h>
|
||||
|
|
@ -90,15 +103,20 @@ int bootverbose = 0;
|
|||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#if (defined(__FreeBSD_version) && __FreeBSD_version >= 300001)
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#include <sys/filio.h>
|
||||
#endif
|
||||
|
||||
|
||||
static drvr_link_t rbch_drvr_linktab[NI4BRBCH];
|
||||
static isdn_link_t *isdn_linktab[NI4BRBCH];
|
||||
|
||||
#define I4BRBCHACCT 1 /* enable accounting messages */
|
||||
#define I4BRBCHACCTINTVL 2 /* accounting msg interval in secs */
|
||||
|
||||
static struct rbch_softc {
|
||||
|
||||
int sc_unit; /* unit number */
|
||||
|
||||
int sc_devstate; /* state of driver */
|
||||
#define ST_IDLE 0x00
|
||||
#define ST_CONNECTED 0x01
|
||||
|
|
@ -109,13 +127,31 @@ static struct rbch_softc {
|
|||
|
||||
int sc_bprot; /* B-ch protocol used */
|
||||
|
||||
call_desc_t *cd; /* Call Descriptor */
|
||||
call_desc_t *sc_cd; /* Call Descriptor */
|
||||
|
||||
struct termios it_in;
|
||||
|
||||
struct ifqueue sc_hdlcq; /* hdlc read queue */
|
||||
#define I4BRBCHMAXQLEN 10
|
||||
|
||||
struct selinfo selp; /* select / poll */
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ == 3
|
||||
#ifdef DEVFS
|
||||
void *devfs_token; /* device filesystem */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if I4BRBCHACCT
|
||||
#if defined(__FreeBSD__)
|
||||
struct callout_handle sc_callout;
|
||||
#endif
|
||||
int sc_iinb; /* isdn driver # of inbytes */
|
||||
int sc_ioutb; /* isdn driver # of outbytes */
|
||||
int sc_linb; /* last # of bytes rx'd */
|
||||
int sc_loutb; /* last # of bytes tx'd */
|
||||
int sc_fn; /* flag, first null acct */
|
||||
#endif
|
||||
} rbch_softc[NI4BRBCH];
|
||||
|
||||
static void rbch_rx_data_rdy(int unit);
|
||||
|
|
@ -143,11 +179,7 @@ PDEVSTATIC int i4brbchselect __P((dev_t dev, int rw, struct proc *p));
|
|||
|
||||
#if BSD > 199306 && defined(__FreeBSD__)
|
||||
#define PDEVSTATIC static
|
||||
#if !defined(__FreeBSD_version) || __FreeBSD_version < 300003
|
||||
#define IOCTL_CMD_T int
|
||||
#else
|
||||
#define IOCTL_CMD_T u_long
|
||||
#endif
|
||||
|
||||
PDEVSTATIC d_open_t i4brbchopen;
|
||||
PDEVSTATIC d_close_t i4brbchclose;
|
||||
|
|
@ -165,22 +197,22 @@ PDEVSTATIC d_select_t i4brbchselect;
|
|||
|
||||
#define CDEV_MAJOR 57
|
||||
|
||||
#if defined (__FreeBSD_version) && __FreeBSD_version >= 400006
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 4
|
||||
static struct cdevsw i4brbch_cdevsw = {
|
||||
/* open */ i4brbchopen,
|
||||
/* close */ i4brbchclose,
|
||||
/* read */ i4brbchread,
|
||||
/* write */ i4brbchwrite,
|
||||
/* ioctl */ i4brbchioctl,
|
||||
/* poll */ POLLFIELD,
|
||||
/* mmap */ nommap,
|
||||
/* strategy */ nostrategy,
|
||||
/* name */ "i4brbch",
|
||||
/* maj */ CDEV_MAJOR,
|
||||
/* dump */ nodump,
|
||||
/* psize */ nopsize,
|
||||
/* flags */ 0,
|
||||
/* bmaj */ -1
|
||||
/* open */ i4brbchopen,
|
||||
/* close */ i4brbchclose,
|
||||
/* read */ i4brbchread,
|
||||
/* write */ i4brbchwrite,
|
||||
/* ioctl */ i4brbchioctl,
|
||||
/* poll */ POLLFIELD,
|
||||
/* mmap */ nommap,
|
||||
/* strategy */ nostrategy,
|
||||
/* name */ "i4brbch",
|
||||
/* maj */ CDEV_MAJOR,
|
||||
/* dump */ nodump,
|
||||
/* psize */ nopsize,
|
||||
/* flags */ 0,
|
||||
/* bmaj */ -1
|
||||
};
|
||||
#else
|
||||
static struct cdevsw i4brbch_cdevsw = {
|
||||
|
|
@ -203,7 +235,7 @@ PSEUDO_SET(i4brbchattach, i4b_rbch);
|
|||
static void
|
||||
i4brbchinit(void *unused)
|
||||
{
|
||||
#if defined (__FreeBSD_version) && __FreeBSD_version >= 400006
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 4
|
||||
cdevsw_add(&i4brbch_cdevsw);
|
||||
#else
|
||||
dev_t dev = makedev(CDEV_MAJOR, 0);
|
||||
|
|
@ -263,8 +295,29 @@ i4brbchattach()
|
|||
|
||||
for(i=0; i < NI4BRBCH; i++)
|
||||
{
|
||||
#if defined(__FreeBSD__)
|
||||
#if __FreeBSD__ == 3
|
||||
|
||||
#ifdef DEVFS
|
||||
rbch_softc[i].devfs_token =
|
||||
devfs_add_devswf(&i4brbch_cdevsw, i, DV_CHR,
|
||||
UID_ROOT, GID_WHEEL, 0600,
|
||||
"i4brbch%d", i);
|
||||
#endif
|
||||
|
||||
#else
|
||||
make_dev(&i4brbch_cdevsw, i,
|
||||
UID_ROOT, GID_WHEEL, 0600, "i4brbch%d", i);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if I4BRBCHACCT
|
||||
#if defined(__FreeBSD__)
|
||||
callout_handle_init(&rbch_softc[i].sc_callout);
|
||||
#endif
|
||||
rbch_softc[i].sc_fn = 1;
|
||||
#endif
|
||||
rbch_softc[i].sc_unit = i;
|
||||
rbch_softc[i].sc_devstate = ST_IDLE;
|
||||
rbch_softc[i].sc_hdlcq.ifq_maxlen = I4BRBCHMAXQLEN;
|
||||
rbch_softc[i].it_in.c_ispeed = rbch_softc[i].it_in.c_ospeed = 64000;
|
||||
|
|
@ -287,7 +340,9 @@ i4brbchopen(dev_t dev, int flag, int fmt, struct proc *p)
|
|||
if(rbch_softc[unit].sc_devstate & ST_ISOPEN)
|
||||
return(EBUSY);
|
||||
|
||||
#if 0
|
||||
rbch_clrq(unit);
|
||||
#endif
|
||||
|
||||
rbch_softc[unit].sc_devstate |= ST_ISOPEN;
|
||||
|
||||
|
|
@ -303,16 +358,16 @@ PDEVSTATIC int
|
|||
i4brbchclose(dev_t dev, int flag, int fmt, struct proc *p)
|
||||
{
|
||||
int unit = minor(dev);
|
||||
|
||||
if (rbch_softc[unit].cd) {
|
||||
struct rbch_softc *sc = &rbch_softc[unit];
|
||||
|
||||
if(sc->sc_devstate & ST_CONNECTED)
|
||||
i4b_l4_drvrdisc(BDRV_RBCH, unit);
|
||||
rbch_softc[unit].cd = NULL;
|
||||
}
|
||||
rbch_softc[unit].sc_devstate &= ~ST_ISOPEN;
|
||||
|
||||
sc->sc_devstate &= ~ST_ISOPEN;
|
||||
|
||||
rbch_clrq(unit);
|
||||
|
||||
DBGL4(L4_RBCHDBG, "i4brbclose", ("unit %d, close\n", unit));
|
||||
DBGL4(L4_RBCHDBG, "i4brbclose", ("unit %d, closed\n", unit));
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
|
@ -324,32 +379,37 @@ PDEVSTATIC int
|
|||
i4brbchread(dev_t dev, struct uio *uio, int ioflag)
|
||||
{
|
||||
struct mbuf *m;
|
||||
int s;
|
||||
int error = 0;
|
||||
int unit = minor(dev);
|
||||
struct ifqueue *iqp;
|
||||
struct rbch_softc *sc = &rbch_softc[unit];
|
||||
|
||||
CRIT_VAR;
|
||||
|
||||
DBGL4(L4_RBCHDBG, "i4brbchread", ("unit %d, enter read\n", unit));
|
||||
|
||||
if(!(rbch_softc[unit].sc_devstate & ST_ISOPEN))
|
||||
if(!(sc->sc_devstate & ST_ISOPEN))
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchread", ("unit %d, read while not open\n", unit));
|
||||
return(EIO);
|
||||
}
|
||||
|
||||
if((rbch_softc[unit].sc_devstate & ST_NOBLOCK)) {
|
||||
if(!(rbch_softc[unit].sc_devstate & ST_CONNECTED))
|
||||
if((sc->sc_devstate & ST_NOBLOCK))
|
||||
{
|
||||
if(!(sc->sc_devstate & ST_CONNECTED))
|
||||
return(EWOULDBLOCK);
|
||||
|
||||
if(rbch_softc[unit].sc_bprot == BPROT_RHDLC)
|
||||
iqp = &rbch_softc[unit].sc_hdlcq;
|
||||
if(sc->sc_bprot == BPROT_RHDLC)
|
||||
iqp = &sc->sc_hdlcq;
|
||||
else
|
||||
iqp = isdn_linktab[unit]->rx_queue;
|
||||
|
||||
if(IF_QEMPTY(iqp) && (rbch_softc[unit].sc_devstate & ST_ISOPEN))
|
||||
if(IF_QEMPTY(iqp) && (sc->sc_devstate & ST_ISOPEN))
|
||||
return(EWOULDBLOCK);
|
||||
} else {
|
||||
while(!(rbch_softc[unit].sc_devstate & ST_CONNECTED))
|
||||
}
|
||||
else
|
||||
{
|
||||
while(!(sc->sc_devstate & ST_CONNECTED))
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchread", ("unit %d, wait read init\n", unit));
|
||||
|
||||
|
|
@ -362,16 +422,16 @@ i4brbchread(dev_t dev, struct uio *uio, int ioflag)
|
|||
}
|
||||
}
|
||||
|
||||
if(rbch_softc[unit].sc_bprot == BPROT_RHDLC)
|
||||
iqp = &rbch_softc[unit].sc_hdlcq;
|
||||
if(sc->sc_bprot == BPROT_RHDLC)
|
||||
iqp = &sc->sc_hdlcq;
|
||||
else
|
||||
iqp = isdn_linktab[unit]->rx_queue;
|
||||
|
||||
while(IF_QEMPTY(iqp) && (rbch_softc[unit].sc_devstate & ST_ISOPEN))
|
||||
while(IF_QEMPTY(iqp) && (sc->sc_devstate & ST_ISOPEN))
|
||||
{
|
||||
s = splimp();
|
||||
rbch_softc[unit].sc_devstate |= ST_RDWAITDATA;
|
||||
splx(s);
|
||||
CRIT_BEG;
|
||||
sc->sc_devstate |= ST_RDWAITDATA;
|
||||
CRIT_END;
|
||||
|
||||
DBGL4(L4_RBCHDBG, "i4brbchread", ("unit %d, wait read data\n", unit));
|
||||
|
||||
|
|
@ -380,13 +440,13 @@ i4brbchread(dev_t dev, struct uio *uio, int ioflag)
|
|||
"rrbch", 0 )) != 0)
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchread", ("unit %d, error %d tsleep read\n", unit, error));
|
||||
rbch_softc[unit].sc_devstate &= ~ST_RDWAITDATA;
|
||||
sc->sc_devstate &= ~ST_RDWAITDATA;
|
||||
return(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
s = splimp();
|
||||
CRIT_BEG;
|
||||
|
||||
IF_DEQUEUE(iqp, m);
|
||||
|
||||
|
|
@ -405,7 +465,7 @@ i4brbchread(dev_t dev, struct uio *uio, int ioflag)
|
|||
if(m)
|
||||
i4b_Bfreembuf(m);
|
||||
|
||||
splx(s);
|
||||
CRIT_END;
|
||||
|
||||
return(error);
|
||||
}
|
||||
|
|
@ -417,25 +477,30 @@ PDEVSTATIC int
|
|||
i4brbchwrite(dev_t dev, struct uio * uio, int ioflag)
|
||||
{
|
||||
struct mbuf *m;
|
||||
int s;
|
||||
int error = 0;
|
||||
int unit = minor(dev);
|
||||
struct rbch_softc *sc = &rbch_softc[unit];
|
||||
|
||||
CRIT_VAR;
|
||||
|
||||
DBGL4(L4_RBCHDBG, "i4brbchwrite", ("unit %d, write\n", unit));
|
||||
|
||||
if(!(rbch_softc[unit].sc_devstate & ST_ISOPEN))
|
||||
if(!(sc->sc_devstate & ST_ISOPEN))
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchwrite", ("unit %d, write while not open\n", unit));
|
||||
return(EIO);
|
||||
}
|
||||
|
||||
if((rbch_softc[unit].sc_devstate & ST_NOBLOCK)) {
|
||||
if(!(rbch_softc[unit].sc_devstate & ST_CONNECTED))
|
||||
if((sc->sc_devstate & ST_NOBLOCK))
|
||||
{
|
||||
if(!(sc->sc_devstate & ST_CONNECTED))
|
||||
return(EWOULDBLOCK);
|
||||
if(IF_QFULL(isdn_linktab[unit]->tx_queue) && (rbch_softc[unit].sc_devstate & ST_ISOPEN))
|
||||
if(IF_QFULL(isdn_linktab[unit]->tx_queue) && (sc->sc_devstate & ST_ISOPEN))
|
||||
return(EWOULDBLOCK);
|
||||
} else {
|
||||
while(!(rbch_softc[unit].sc_devstate & ST_CONNECTED))
|
||||
}
|
||||
else
|
||||
{
|
||||
while(!(sc->sc_devstate & ST_CONNECTED))
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchwrite", ("unit %d, write wait init\n", unit));
|
||||
|
||||
|
|
@ -444,48 +509,55 @@ i4brbchwrite(dev_t dev, struct uio * uio, int ioflag)
|
|||
"wrrbch", 0 );
|
||||
if(error == ERESTART)
|
||||
return (ERESTART);
|
||||
else if(error == EINTR) {
|
||||
printf("\n ========= i4brbchwrite, EINTR during wait init ======== \n");
|
||||
else if(error == EINTR)
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchwrite", ("unit %d, EINTR during wait init\n", unit));
|
||||
return(EINTR);
|
||||
} else if(error) {
|
||||
}
|
||||
else if(error)
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchwrite", ("unit %d, error %d tsleep init\n", unit, error));
|
||||
return(error);
|
||||
}
|
||||
/*XXX*/ tsleep((caddr_t) &rbch_softc[unit], TTIPRI | PCATCH, "xrbch", (hz*1));
|
||||
tsleep((caddr_t) &rbch_softc[unit], TTIPRI | PCATCH, "xrbch", (hz*1));
|
||||
}
|
||||
|
||||
while(IF_QFULL(isdn_linktab[unit]->tx_queue) && (rbch_softc[unit].sc_devstate & ST_ISOPEN))
|
||||
while(IF_QFULL(isdn_linktab[unit]->tx_queue) && (sc->sc_devstate & ST_ISOPEN))
|
||||
{
|
||||
s = splimp();
|
||||
rbch_softc[unit].sc_devstate |= ST_WRWAITEMPTY;
|
||||
splx(s);
|
||||
CRIT_BEG;
|
||||
sc->sc_devstate |= ST_WRWAITEMPTY;
|
||||
CRIT_END;
|
||||
|
||||
DBGL4(L4_RBCHDBG, "i4brbchwrite", ("unit %d, write queue full\n", unit));
|
||||
|
||||
if ((error = tsleep((caddr_t) &isdn_linktab[unit]->tx_queue,
|
||||
TTIPRI | PCATCH,
|
||||
"wrbch", 0)) != 0) {
|
||||
rbch_softc[unit].sc_devstate &= ~ST_WRWAITEMPTY;
|
||||
if(error == ERESTART) {
|
||||
sc->sc_devstate &= ~ST_WRWAITEMPTY;
|
||||
if(error == ERESTART)
|
||||
{
|
||||
return(ERESTART);
|
||||
} else if(error == EINTR) {
|
||||
printf("\n ========= i4brbchwrite, EINTR during wait write ======== \n");
|
||||
}
|
||||
else if(error == EINTR)
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchwrite", ("unit %d, EINTR during wait write\n", unit));
|
||||
return(error);
|
||||
} else if(error) {
|
||||
DBGL4(L4_RBCHDBG, "i4brbchwrite",
|
||||
("unit %d, error %d tsleep write\n", unit, error));
|
||||
}
|
||||
else if(error)
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchwrite", ("unit %d, error %d tsleep write\n", unit, error));
|
||||
return(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
s = splimp();
|
||||
CRIT_BEG;
|
||||
|
||||
if(!(rbch_softc[unit].sc_devstate & ST_ISOPEN))
|
||||
if(!(sc->sc_devstate & ST_ISOPEN))
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchwrite", ("unit %d, not open anymore\n", unit));
|
||||
splx(s);
|
||||
CRIT_END;
|
||||
return(EIO);
|
||||
}
|
||||
|
||||
|
|
@ -509,7 +581,7 @@ i4brbchwrite(dev_t dev, struct uio * uio, int ioflag)
|
|||
(*isdn_linktab[unit]->bch_tx_start)(isdn_linktab[unit]->unit, isdn_linktab[unit]->channel);
|
||||
}
|
||||
|
||||
splx(s);
|
||||
CRIT_END;
|
||||
|
||||
return(error);
|
||||
}
|
||||
|
|
@ -518,11 +590,12 @@ i4brbchwrite(dev_t dev, struct uio * uio, int ioflag)
|
|||
* rbch device ioctl handlibg
|
||||
*---------------------------------------------------------------------------*/
|
||||
PDEVSTATIC int
|
||||
i4brbchioctl(dev_t dev, IOCTL_CMD_T cmd, caddr_t data, int flag, struct proc* p)
|
||||
i4brbchioctl(dev_t dev, IOCTL_CMD_T cmd, caddr_t data, int flag, struct proc *p)
|
||||
{
|
||||
int error = 0;
|
||||
int unit = minor(dev);
|
||||
|
||||
struct rbch_softc *sc = &rbch_softc[unit];
|
||||
|
||||
switch(cmd)
|
||||
{
|
||||
case FIOASYNC: /* Set async mode */
|
||||
|
|
@ -540,17 +613,17 @@ i4brbchioctl(dev_t dev, IOCTL_CMD_T cmd, caddr_t data, int flag, struct proc* p)
|
|||
if (*(int *)data)
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchioctl", ("unit %d, setting non-blocking mode\n", unit));
|
||||
rbch_softc[unit].sc_devstate |= ST_NOBLOCK;
|
||||
sc->sc_devstate |= ST_NOBLOCK;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchioctl", ("unit %d, clearing non-blocking mode\n", unit));
|
||||
rbch_softc[unit].sc_devstate &= ~ST_NOBLOCK;
|
||||
sc->sc_devstate &= ~ST_NOBLOCK;
|
||||
}
|
||||
break;
|
||||
|
||||
case TIOCCDTR: /* Clear DTR */
|
||||
if(rbch_softc[unit].sc_devstate & ST_CONNECTED)
|
||||
if(sc->sc_devstate & ST_CONNECTED)
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "i4brbchioctl", ("unit %d, disconnecting for DTR down\n", unit));
|
||||
i4b_l4_drvrdisc(BDRV_RBCH, unit);
|
||||
|
|
@ -581,12 +654,12 @@ i4brbchioctl(dev_t dev, IOCTL_CMD_T cmd, caddr_t data, int flag, struct proc* p)
|
|||
break;
|
||||
|
||||
case TIOCGETA: /* Get termios struct */
|
||||
*(struct termios *)data = rbch_softc[unit].it_in;
|
||||
*(struct termios *)data = sc->it_in;
|
||||
break;
|
||||
|
||||
case TIOCMGET:
|
||||
*(int *)data = TIOCM_LE|TIOCM_DTR|TIOCM_RTS|TIOCM_CTS|TIOCM_DSR;
|
||||
if (rbch_softc[unit].sc_devstate & ST_CONNECTED)
|
||||
if (sc->sc_devstate & ST_CONNECTED)
|
||||
*(int *)data |= TIOCM_CD;
|
||||
break;
|
||||
|
||||
|
|
@ -621,12 +694,13 @@ i4brbchpoll(dev_t dev, int events, struct proc *p)
|
|||
int revents = 0; /* Events we found */
|
||||
int s;
|
||||
int unit = minor(dev);
|
||||
|
||||
struct rbch_softc *sc = &rbch_softc[unit];
|
||||
|
||||
/* We can't check for anything but IN or OUT */
|
||||
|
||||
s = splhigh();
|
||||
|
||||
if(!(rbch_softc[unit].sc_devstate & ST_ISOPEN))
|
||||
if(!(sc->sc_devstate & ST_ISOPEN))
|
||||
{
|
||||
splx(s);
|
||||
return(POLLNVAL);
|
||||
|
|
@ -638,7 +712,7 @@ i4brbchpoll(dev_t dev, int events, struct proc *p)
|
|||
*/
|
||||
|
||||
if((events & (POLLOUT|POLLWRNORM)) &&
|
||||
(rbch_softc[unit].sc_devstate & ST_CONNECTED) &&
|
||||
(sc->sc_devstate & ST_CONNECTED) &&
|
||||
!IF_QFULL(isdn_linktab[unit]->tx_queue))
|
||||
{
|
||||
revents |= (events & (POLLOUT|POLLWRNORM));
|
||||
|
|
@ -647,12 +721,12 @@ i4brbchpoll(dev_t dev, int events, struct proc *p)
|
|||
/* ... while reads are OK if we have any data */
|
||||
|
||||
if((events & (POLLIN|POLLRDNORM)) &&
|
||||
(rbch_softc[unit].sc_devstate & ST_CONNECTED))
|
||||
(sc->sc_devstate & ST_CONNECTED))
|
||||
{
|
||||
struct ifqueue *iqp;
|
||||
|
||||
if(rbch_softc[unit].sc_bprot == BPROT_RHDLC)
|
||||
iqp = &rbch_softc[unit].sc_hdlcq;
|
||||
if(sc->sc_bprot == BPROT_RHDLC)
|
||||
iqp = &sc->sc_hdlcq;
|
||||
else
|
||||
iqp = isdn_linktab[unit]->rx_queue;
|
||||
|
||||
|
|
@ -661,7 +735,7 @@ i4brbchpoll(dev_t dev, int events, struct proc *p)
|
|||
}
|
||||
|
||||
if(revents == 0)
|
||||
selrecord(p, &rbch_softc[unit].selp);
|
||||
selrecord(p, &sc->selp);
|
||||
|
||||
splx(s);
|
||||
return(revents);
|
||||
|
|
@ -676,26 +750,27 @@ PDEVSTATIC int
|
|||
i4brbchselect(dev_t dev, int rw, struct proc *p)
|
||||
{
|
||||
int unit = minor(dev);
|
||||
struct rbch_softc *sc = &rbch_softc[unit];
|
||||
int s;
|
||||
|
||||
s = splhigh();
|
||||
|
||||
if(!(rbch_softc[unit].sc_devstate & ST_ISOPEN))
|
||||
if(!(sc->sc_devstate & ST_ISOPEN))
|
||||
{
|
||||
splx(s);
|
||||
DBGL4(L4_RBCHDBG, "i4brbchselect", ("unit %d, not open anymore\n", unit));
|
||||
return(1);
|
||||
}
|
||||
|
||||
if(rbch_softc[unit].sc_devstate & ST_CONNECTED)
|
||||
if(sc->sc_devstate & ST_CONNECTED)
|
||||
{
|
||||
struct ifqueue *iqp;
|
||||
|
||||
switch(rw)
|
||||
{
|
||||
case FREAD:
|
||||
if(rbch_softc[unit].sc_bprot == BPROT_RHDLC)
|
||||
iqp = &rbch_softc[unit].sc_hdlcq;
|
||||
if(sc->sc_bprot == BPROT_RHDLC)
|
||||
iqp = &sc->sc_hdlcq;
|
||||
else
|
||||
iqp = isdn_linktab[unit]->rx_queue;
|
||||
|
||||
|
|
@ -719,13 +794,55 @@ i4brbchselect(dev_t dev, int rw, struct proc *p)
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
selrecord(p, &rbch_softc[unit].selp);
|
||||
selrecord(p, &sc->selp);
|
||||
splx(s);
|
||||
return(0);
|
||||
}
|
||||
|
||||
#endif /* OS_USES_POLL */
|
||||
|
||||
#if I4BRBCHACCT
|
||||
/*---------------------------------------------------------------------------*
|
||||
* watchdog routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
rbch_timeout(struct rbch_softc *sc)
|
||||
{
|
||||
bchan_statistics_t bs;
|
||||
int unit = sc->sc_unit;
|
||||
|
||||
/* get # of bytes in and out from the HSCX driver */
|
||||
|
||||
(*isdn_linktab[unit]->bch_stat)
|
||||
(isdn_linktab[unit]->unit, isdn_linktab[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)/I4BRBCHACCTINTVL;
|
||||
int ro = (sc->sc_ioutb - sc->sc_loutb)/I4BRBCHACCTINTVL;
|
||||
|
||||
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_RBCH, unit, ACCT_DURING,
|
||||
sc->sc_ioutb, sc->sc_iinb, ro, ri, sc->sc_ioutb, sc->sc_iinb);
|
||||
}
|
||||
#if defined(__FreeBSD__)
|
||||
sc->sc_callout =
|
||||
#endif
|
||||
timeout((TIMEOUT_FUNC_T)rbch_timeout,
|
||||
(void *)sc, I4BRBCHACCTINTVL*hz);
|
||||
}
|
||||
#endif /* I4BRBCHACCT */
|
||||
|
||||
/*===========================================================================*
|
||||
* ISDN INTERFACE ROUTINES
|
||||
*===========================================================================*/
|
||||
|
|
@ -737,15 +854,31 @@ static void
|
|||
rbch_connect(int unit, void *cdp)
|
||||
{
|
||||
call_desc_t *cd = (call_desc_t *)cdp;
|
||||
struct rbch_softc *sc = &rbch_softc[unit];
|
||||
|
||||
rbch_softc[unit].sc_bprot = cd->bprot;
|
||||
|
||||
if(!(rbch_softc[unit].sc_devstate & ST_CONNECTED))
|
||||
sc->sc_bprot = cd->bprot;
|
||||
|
||||
#if I4BRBCHACCT
|
||||
if(sc->sc_bprot == BPROT_RHDLC)
|
||||
{
|
||||
sc->sc_iinb = 0;
|
||||
sc->sc_ioutb = 0;
|
||||
sc->sc_linb = 0;
|
||||
sc->sc_loutb = 0;
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
sc->sc_callout =
|
||||
#endif
|
||||
timeout((TIMEOUT_FUNC_T)rbch_timeout,
|
||||
(void *)sc, I4BRBCHACCTINTVL*hz);
|
||||
}
|
||||
#endif
|
||||
if(!(sc->sc_devstate & ST_CONNECTED))
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "rbch_connect", ("unit %d, wakeup\n", unit));
|
||||
rbch_softc[unit].sc_devstate |= ST_CONNECTED;
|
||||
rbch_softc[unit].cd = cdp;
|
||||
wakeup((caddr_t) &rbch_softc[unit]);
|
||||
sc->sc_devstate |= ST_CONNECTED;
|
||||
sc->sc_cd = cdp;
|
||||
wakeup((caddr_t)sc);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -755,11 +888,39 @@ rbch_connect(int unit, void *cdp)
|
|||
static void
|
||||
rbch_disconnect(int unit, void *cdp)
|
||||
{
|
||||
/* call_desc_t *cd = (call_desc_t *)cdp; */
|
||||
call_desc_t *cd = (call_desc_t *)cdp;
|
||||
struct rbch_softc *sc = &rbch_softc[unit];
|
||||
|
||||
DBGL4(L4_RBCHDBG, "rbch_disconnect", ("unit %d, deinit\n", unit));
|
||||
rbch_softc[unit].sc_devstate &= ~ST_CONNECTED;
|
||||
rbch_softc[unit].cd = NULL;
|
||||
CRIT_VAR;
|
||||
|
||||
if(cd != sc->sc_cd)
|
||||
{
|
||||
DBGL4(L4_RBCHDBG, "rbch_disconnect", ("rbch%d: channel %d not active\n",
|
||||
cd->driver_unit, cd->channelid));
|
||||
return;
|
||||
}
|
||||
|
||||
CRIT_BEG;
|
||||
|
||||
DBGL4(L4_RBCHDBG, "rbch_disconnect", ("unit %d, disconnect\n", unit));
|
||||
|
||||
sc->sc_devstate &= ~ST_CONNECTED;
|
||||
|
||||
sc->sc_cd = NULL;
|
||||
|
||||
#if I4BRBCHACCT
|
||||
i4b_l4_accounting(BDRV_RBCH, unit, ACCT_FINAL,
|
||||
sc->sc_ioutb, sc->sc_iinb, 0, 0, sc->sc_ioutb, sc->sc_iinb);
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)rbch_timeout,
|
||||
(void *)sc, sc->sc_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)rbch_timeout, (void *)sc);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
CRIT_END;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
|
|
@ -847,8 +1008,8 @@ rbch_tx_queue_empty(int unit)
|
|||
static void
|
||||
rbch_activity(int unit, int rxtx)
|
||||
{
|
||||
if (rbch_softc[unit].cd)
|
||||
rbch_softc[unit].cd->last_active_time = SECOND;
|
||||
if (rbch_softc[unit].sc_cd)
|
||||
rbch_softc[unit].sc_cd->last_active_time = SECOND;
|
||||
selwakeup(&rbch_softc[unit].selp);
|
||||
}
|
||||
|
||||
|
|
@ -858,14 +1019,15 @@ rbch_activity(int unit, int rxtx)
|
|||
static void
|
||||
rbch_clrq(int unit)
|
||||
{
|
||||
int x;
|
||||
struct mbuf *m;
|
||||
|
||||
CRIT_VAR;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
x = splimp();
|
||||
CRIT_BEG;
|
||||
IF_DEQUEUE(&rbch_softc[unit].sc_hdlcq, m);
|
||||
splx(x);
|
||||
CRIT_END;
|
||||
|
||||
if(m)
|
||||
m_freem(m);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_tel.c - device driver for ISDN telephony
|
||||
* --------------------------------------------
|
||||
*
|
||||
* $Id: i4b_tel.c,v 1.47 1999/12/13 21:25:24 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Sat Aug 28 22:28:25 1999]
|
||||
* last edit-date: [Mon Dec 13 21:39:26 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -42,7 +44,7 @@
|
|||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001 || defined(__NetBSD__)
|
||||
#if (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(__NetBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#include <sys/poll.h>
|
||||
#else
|
||||
|
|
@ -59,6 +61,18 @@
|
|||
#include <sys/proc.h>
|
||||
#include <sys/tty.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ == 3
|
||||
#include "opt_devfs.h"
|
||||
#endif
|
||||
|
||||
#ifdef DEVFS
|
||||
#include <sys/devfsext.h>
|
||||
#endif
|
||||
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
#ifdef __bsdi__
|
||||
#include <sys/device.h>
|
||||
#endif
|
||||
|
|
@ -122,6 +136,13 @@ typedef struct {
|
|||
#define ST_WRWAITEMPTY 0x08 /* userland write waiting */
|
||||
|
||||
struct selinfo selp; /* select / poll */
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ == 3
|
||||
#ifdef DEVFS
|
||||
void *devfs_token; /* token for DEVFS */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
} tel_sc_t;
|
||||
|
||||
static tel_sc_t tel_sc[NI4BTEL][NOFUNCS];
|
||||
|
|
@ -182,22 +203,22 @@ PDEVSTATIC d_select_t i4btelsel;
|
|||
|
||||
#define CDEV_MAJOR 56
|
||||
|
||||
#if defined (__FreeBSD_version) && __FreeBSD_version >= 400006
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 4
|
||||
static struct cdevsw i4btel_cdevsw = {
|
||||
/* open */ i4btelopen,
|
||||
/* close */ i4btelclose,
|
||||
/* read */ i4btelread,
|
||||
/* write */ i4btelwrite,
|
||||
/* ioctl */ i4btelioctl,
|
||||
/* poll */ POLLFIELD,
|
||||
/* mmap */ nommap,
|
||||
/* strategy */ nostrategy,
|
||||
/* name */ "i4btel",
|
||||
/* maj */ CDEV_MAJOR,
|
||||
/* dump */ nodump,
|
||||
/* psize */ nopsize,
|
||||
/* flags */ 0,
|
||||
/* bmaj */ -1
|
||||
/* open */ i4btelopen,
|
||||
/* close */ i4btelclose,
|
||||
/* read */ i4btelread,
|
||||
/* write */ i4btelwrite,
|
||||
/* ioctl */ i4btelioctl,
|
||||
/* poll */ POLLFIELD,
|
||||
/* mmap */ nommap,
|
||||
/* strategy */ nostrategy,
|
||||
/* name */ "i4btel",
|
||||
/* maj */ CDEV_MAJOR,
|
||||
/* dump */ nodump,
|
||||
/* psize */ nopsize,
|
||||
/* flags */ 0,
|
||||
/* bmaj */ -1
|
||||
};
|
||||
#else
|
||||
static struct cdevsw i4btel_cdevsw = {
|
||||
|
|
@ -222,7 +243,7 @@ PSEUDO_SET(i4btelattach, i4b_tel);
|
|||
PDEVSTATIC void
|
||||
i4btelinit(void *unused)
|
||||
{
|
||||
#if defined (__FreeBSD_version) && __FreeBSD_version >= 400006
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 4
|
||||
cdevsw_add(&i4btel_cdevsw);
|
||||
#else
|
||||
dev_t dev = makedev(CDEV_MAJOR, 0);
|
||||
|
|
@ -294,6 +315,18 @@ i4btelattach()
|
|||
tel_sc[i][j].wcvttab = 0;
|
||||
tel_sc[i][j].result = 0;
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#if __FreeBSD__ == 3
|
||||
|
||||
#ifdef DEVFS
|
||||
|
||||
/* XXX */ tel_sc[i][j].devfs_token
|
||||
= devfs_add_devswf(&i4btel_cdevsw, i, DV_CHR,
|
||||
UID_ROOT, GID_WHEEL, 0600,
|
||||
"i4btel%d", i);
|
||||
#endif
|
||||
|
||||
#else
|
||||
switch(j)
|
||||
{
|
||||
case FUNCTEL: /* normal i4btel device */
|
||||
|
|
@ -308,6 +341,8 @@ i4btelattach()
|
|||
0600, "i4bteld%d", i);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
tel_init_linktab(i);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4btrc - device driver for trace data read device
|
||||
* ---------------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_trace.c,v 1.24 1999/12/13 21:25:24 hm Exp $
|
||||
*
|
||||
* last edit-date: [Tue Jun 1 12:15:40 1999]
|
||||
* last edit-date: [Mon Dec 13 21:39:35 1999]
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* NOTE: the code assumes that SPLI4B >= splimp !
|
||||
*
|
||||
|
|
@ -69,43 +71,60 @@
|
|||
#include <sys/tty.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/i4b_trace.h>
|
||||
#include <machine/i4b_ioctl.h>
|
||||
#else
|
||||
#include <i4b/i4b_trace.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
|
||||
#ifdef DEVFS
|
||||
#include <sys/devfsext.h>
|
||||
#endif
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
#define memcpy(d,s,l) bcopy(s,d,l)
|
||||
#include <machine/i4b_trace.h>
|
||||
#include <machine/i4b_ioctl.h>
|
||||
|
||||
#else
|
||||
|
||||
#include <i4b/i4b_trace.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
|
||||
#endif
|
||||
|
||||
#include <i4b/include/i4b_mbuf.h>
|
||||
#include <i4b/include/i4b_global.h>
|
||||
#include <i4b/include/i4b_l3l4.h>
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
#define memcpy(d,s,l) bcopy(s,d,l)
|
||||
#endif
|
||||
|
||||
static struct ifqueue trace_queue[NI4BTRC];
|
||||
static int device_state[NI4BTRC];
|
||||
#define ST_IDLE 0x00
|
||||
#define ST_ISOPEN 0x01
|
||||
#define ST_WAITDATA 0x02
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ == 3
|
||||
#ifdef DEVFS
|
||||
static void *devfs_token[NI4BTRC];
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static int analyzemode = 0;
|
||||
static int rxunit = -1;
|
||||
static int txunit = -1;
|
||||
static int outunit = -1;
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
|
||||
#define PDEVSTATIC /* - not static - */
|
||||
void i4btrcattach __P((void));
|
||||
int i4btrcopen __P((dev_t dev, int flag, int fmt, struct proc *p));
|
||||
int i4btrcclose __P((dev_t dev, int flag, int fmt, struct proc *p));
|
||||
int i4btrcread __P((dev_t dev, struct uio * uio, int ioflag));
|
||||
|
||||
#ifdef __bsdi__
|
||||
int i4btrcioctl __P((dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p));
|
||||
#else
|
||||
int i4btrcioctl __P((dev_t dev, int cmd, caddr_t data, int flag, struct proc *p));
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#if BSD > 199306 && defined(__FreeBSD__)
|
||||
|
|
@ -124,22 +143,22 @@ static d_poll_t i4btrcpoll;
|
|||
|
||||
#define CDEV_MAJOR 59
|
||||
|
||||
#if defined (__FreeBSD_version) && __FreeBSD_version >= 400006
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 4
|
||||
static struct cdevsw i4btrc_cdevsw = {
|
||||
/* open */ i4btrcopen,
|
||||
/* close */ i4btrcclose,
|
||||
/* read */ i4btrcread,
|
||||
/* write */ nowrite,
|
||||
/* ioctl */ i4btrcioctl,
|
||||
/* poll */ POLLFIELD,
|
||||
/* mmap */ nommap,
|
||||
/* strategy */ nostrategy,
|
||||
/* name */ "i4btrc",
|
||||
/* maj */ CDEV_MAJOR,
|
||||
/* dump */ nodump,
|
||||
/* psize */ nopsize,
|
||||
/* flags */ 0,
|
||||
/* bmaj */ -1
|
||||
/* open */ i4btrcopen,
|
||||
/* close */ i4btrcclose,
|
||||
/* read */ i4btrcread,
|
||||
/* write */ nowrite,
|
||||
/* ioctl */ i4btrcioctl,
|
||||
/* poll */ POLLFIELD,
|
||||
/* mmap */ nommap,
|
||||
/* strategy */ nostrategy,
|
||||
/* name */ "i4btrc",
|
||||
/* maj */ CDEV_MAJOR,
|
||||
/* dump */ nodump,
|
||||
/* psize */ nopsize,
|
||||
/* flags */ 0,
|
||||
/* bmaj */ -1
|
||||
};
|
||||
#else
|
||||
static struct cdevsw i4btrc_cdevsw = {
|
||||
|
|
@ -155,7 +174,7 @@ static struct cdevsw i4btrc_cdevsw = {
|
|||
static
|
||||
void i4btrcinit(void *unused)
|
||||
{
|
||||
#if defined (__FreeBSD_version) && __FreeBSD_version >= 400006
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 4
|
||||
cdevsw_add(&i4btrc_cdevsw);
|
||||
#else
|
||||
dev_t dev = makedev(CDEV_MAJOR, 0);
|
||||
|
|
@ -221,8 +240,22 @@ i4btrcattach()
|
|||
|
||||
for(i=0; i < NI4BTRC; i++)
|
||||
{
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#if __FreeBSD__ < 4
|
||||
|
||||
#ifdef DEVFS
|
||||
devfs_token[i]
|
||||
= devfs_add_devswf(&i4btrc_cdevsw, i, DV_CHR,
|
||||
UID_ROOT, GID_WHEEL, 0600,
|
||||
"i4btrc%d", i);
|
||||
#endif
|
||||
|
||||
#else
|
||||
make_dev(&i4btrc_cdevsw, i,
|
||||
UID_ROOT, GID_WHEEL, 0600, "i4btrc%d", i);
|
||||
#endif
|
||||
#endif
|
||||
trace_queue[i].ifq_maxlen = IFQ_MAXLEN;
|
||||
device_state[i] = ST_IDLE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_global.h - i4b global include file
|
||||
* --------------------------------------
|
||||
*
|
||||
* $Id: i4b_global.h,v 1.23 1999/12/13 21:25:24 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Apr 26 11:10:26 1999]
|
||||
* last edit-date: [Mon Dec 13 21:44:17 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -46,6 +48,12 @@
|
|||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/param.h>
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 400000 && __FreeBSD_version < 400011
|
||||
#error "Unsupported FreeBSD-current version,"
|
||||
#error "you need a FreeBSD-current >= 400011"
|
||||
#endif
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
|
||||
#define TIMEOUT_FUNC_T timeout_t *
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_isdnq931.h - DSS1 layer 3 message types
|
||||
* -------------------------------------------
|
||||
*
|
||||
* $Id: i4b_isdnq931.h,v 1.6 1999/12/13 21:25:24 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:04:01 1999]
|
||||
* last edit-date: [Mon Dec 13 21:44:28 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l1l2.h - i4b layer 1 / layer 2 interactions
|
||||
* ---------------------------------------------------
|
||||
*
|
||||
* $Id: i4b_l1l2.h,v 1.9 1999/12/13 21:25:24 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:04:07 1999]
|
||||
* last edit-date: [Mon Dec 13 21:44:39 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l2l3.h - i4b layer 2 / layer 3 interactions
|
||||
* -----------------------------------------------
|
||||
*
|
||||
* $Id: i4b_l2l3.h,v 1.7 1999/12/13 21:25:24 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:04:13 1999]
|
||||
* last edit-date: [Mon Dec 13 21:44:47 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l3l4.h - layer 3 / layer 4 interface
|
||||
* ------------------------------------------
|
||||
*
|
||||
* $Id: i4b_l3l4.h,v 1.27 1999/12/13 21:25:24 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Wed Mar 17 16:16:40 1999]
|
||||
* last edit-date: [Mon Dec 13 21:44:56 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -112,6 +114,13 @@ void tel_set_linktab(int unit, isdn_link_t *ilt);
|
|||
drvr_link_t *i4bisppp_ret_linktab(int unit);
|
||||
void i4bisppp_set_linktab(int unit, isdn_link_t *ilt);
|
||||
|
||||
#ifdef __bsdi__
|
||||
/* global linktab functions for IBC userland driver */
|
||||
|
||||
drvr_link_t *ibc_ret_linktab(int unit);
|
||||
void ibc_set_linktab(int unit, isdn_link_t *ilt);
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* this structure describes one call/connection on one B-channel
|
||||
* and all its parameters
|
||||
|
|
@ -229,6 +238,8 @@ typedef struct
|
|||
int ctrl_type; /* controller type (CTRL_XXX) */
|
||||
int card_type; /* card manufacturer (CARD_XXX) */
|
||||
|
||||
int protocol; /* D-channel protocol type */
|
||||
|
||||
int dl_est; /* layer 2 established */
|
||||
#define DL_DOWN 0
|
||||
#define DL_UP 1
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b - mbuf handling support routines
|
||||
* --------------------------------------
|
||||
*
|
||||
* $Id: i4b_mbuf.h,v 1.8 1999/12/13 21:25:24 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:04:26 1999]
|
||||
* last edit-date: [Mon Dec 13 21:45:05 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
|
|||
|
|
@ -39,63 +39,41 @@
|
|||
* code is modeled after Linux i4l driver written by Karsten
|
||||
* Keil.
|
||||
*
|
||||
* $Id: i4b_asuscom_ipac.c,v 1.4 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon May 31 20:53:17 EEST 1999]
|
||||
* last edit-date: [Mon Dec 13 21:58:27 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
#else
|
||||
#define NISIC 1
|
||||
#endif
|
||||
#define NPNP 1
|
||||
|
||||
#if (NISIC > 0) && (NPNP > 0) && defined(ASUSCOM_IPAC)
|
||||
#if (NISIC > 0) && defined (ASUSCOM_IPAC)
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/ioccom.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <machine/clock.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_ipac.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 */
|
||||
|
||||
|
|
@ -115,259 +93,124 @@
|
|||
#define ASI_OFF_RW 0x01
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Asuscom ISDNlink 128K PnP ISAC get fifo routine
|
||||
* Asuscom ISDNlink 128K ISAC get fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
asi_read_fifo(void *buf, const void *base, size_t len)
|
||||
static void
|
||||
asi_read_fifo(struct l1_softc *sc,int what,void *buf,size_t size)
|
||||
{
|
||||
u_int asus_base;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
#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
|
||||
* Asuscom ISDNlink 128K ISAC put fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
asi_write_fifo(void *base, const void *buf, size_t len)
|
||||
static void
|
||||
asi_write_fifo(struct l1_softc *sc,int what,void *buf,size_t size)
|
||||
{
|
||||
u_int asus_base;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
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;
|
||||
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,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,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,buf,size);
|
||||
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
|
||||
* Asuscom ISDNlink 128K ISAC put register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
asi_write_reg(u_char *base, u_int offset, u_int v)
|
||||
asi_write_reg(struct l1_softc *sc,int what,bus_size_t reg,u_int8_t data)
|
||||
{
|
||||
u_int asus_base;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
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;
|
||||
switch ( what )
|
||||
{
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t,h,ASI_OFF_ALE,reg+IPAC_ISAC_OFF);
|
||||
bus_space_write_1(t,h,ASI_OFF_RW,data);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t,h,ASI_OFF_ALE,reg+IPAC_HSCXA_OFF);
|
||||
bus_space_write_1(t,h,ASI_OFF_RW,data);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t,h,ASI_OFF_ALE,reg+IPAC_HSCXB_OFF);
|
||||
bus_space_write_1(t,h,ASI_OFF_RW,data);
|
||||
break;
|
||||
case ISIC_WHAT_IPAC:
|
||||
bus_space_write_1(t,h,ASI_OFF_ALE,reg+IPAC_IPAC_OFF);
|
||||
bus_space_write_1(t,h,ASI_OFF_RW,data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Asuscom ISDNlink 128K PnP ISAC get register routine
|
||||
* Asuscom ISDNlink 128K 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)
|
||||
asi_read_reg(struct l1_softc *sc,int what,bus_size_t reg)
|
||||
{
|
||||
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);
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch ( what )
|
||||
{
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t,h,ASI_OFF_ALE,reg+IPAC_ISAC_OFF);
|
||||
return bus_space_read_1(t,h,ASI_OFF_RW);
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t,h,ASI_OFF_ALE,reg+IPAC_HSCXA_OFF);
|
||||
return bus_space_read_1(t,h,ASI_OFF_RW);
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t,h,ASI_OFF_ALE,reg+IPAC_HSCXB_OFF);
|
||||
return bus_space_read_1(t,h,ASI_OFF_RW);
|
||||
case ISIC_WHAT_IPAC:
|
||||
bus_space_write_1(t,h,ASI_OFF_ALE,reg+IPAC_IPAC_OFF);
|
||||
return bus_space_read_1(t,h,ASI_OFF_RW);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_asi - attach for Asuscom ISDNlink 128K PnP
|
||||
* isic_attach_siemens_isurf - attach for Asuscom ISDNlink 128K
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
int
|
||||
isic_probe_asi(struct isa_device *dev, unsigned int iobase2)
|
||||
isic_attach_asi(device_t dev)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
int unit = device_get_unit(dev);
|
||||
struct l1_softc *sc = &l1_sc[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;
|
||||
|
|
@ -389,121 +232,17 @@ isic_probe_asi(struct isa_device *dev, unsigned int iobase2)
|
|||
|
||||
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.
|
||||
* (Removed initialization that was not applicaple to
|
||||
* this board or was already register default setting.)
|
||||
*/
|
||||
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);
|
||||
IPAC_WRITE (IPAC_ACFG, 0xff); /* Setup AUX pin modes */
|
||||
IPAC_WRITE (IPAC_AOE, 0x0); /* Setup AUX pin modes */
|
||||
IPAC_WRITE (IPAC_MASK, (IPAC_MASK_INT1 | IPAC_MASK_INT0));
|
||||
|
||||
return (1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
#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) */
|
||||
#endif /* (NISIC > 0) && defined (ASUSCOM_IPAC) */
|
||||
|
|
|
|||
|
|
@ -35,48 +35,32 @@
|
|||
* i4b_avm_a1.c - AVM A1/Fritz passive card driver for isdn4bsd
|
||||
* ------------------------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_avm_a1.c,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:25:11 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 21:58:36 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
#else
|
||||
#define NISIC 1
|
||||
#endif
|
||||
|
||||
#if NISIC > 0 && defined(AVM_A1)
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#else
|
||||
#include <machine/bus.h>
|
||||
#include <sys/device.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
|
||||
#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>
|
||||
|
||||
|
|
@ -84,13 +68,6 @@
|
|||
#include <i4b/layer1/i4b_isac.h>
|
||||
#include <i4b/layer1/i4b_hscx.h>
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
static u_int8_t avma1_read_reg __P((struct isic_softc *sc, int what, bus_size_t offs));
|
||||
static void avma1_write_reg __P((struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data));
|
||||
static void avma1_read_fifo __P((struct isic_softc *sc, int what, void *buf, size_t size));
|
||||
static void avma1_write_fifo __P((struct isic_softc *sc, int what, const void *data, size_t size));
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* AVM A1 and AVM Fritz! Card special registers
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
|
@ -111,106 +88,189 @@ static void avma1_write_fifo __P((struct isic_softc *sc, int what, const void *d
|
|||
#define AVM_CONF_RD_TEST 0x10 /* test bit read back */
|
||||
#define AVM_CONF_RD_ZER2 0x20 /* unused, always read 0 */
|
||||
|
||||
#define AVM_ISAC_R_OFFS (0x1400-0x20)
|
||||
#define AVM_HSCXA_R_OFFS (0x400-0x20)
|
||||
#define AVM_HSCXB_R_OFFS (0xc00-0x20)
|
||||
#define AVM_ISAC_F_OFFS (0x1400-0x20-0x3e0)
|
||||
#define AVM_HSCXA_F_OFFS (0x400-0x20-0x3e0)
|
||||
#define AVM_HSCXB_F_OFFS (0xc00-0x20-0x3e0)
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* AVM read fifo routines
|
||||
* AVM read fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
static void
|
||||
avma1_read_fifo(void *buf, const void *base, size_t len)
|
||||
{
|
||||
insb((int)base - 0x3e0, (u_char *)buf, (u_int)len);
|
||||
}
|
||||
#else
|
||||
static void
|
||||
avma1_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
||||
avma1_read_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+4].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+4].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+4]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+4]);
|
||||
bus_space_read_multi_1(t, h, 0, buf, size);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* AVM write fifo routines
|
||||
* AVM write fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
static void
|
||||
avma1_write_fifo(void *base, const void *buf, size_t len)
|
||||
avma1_write_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
outsb((int)base - 0x3e0, (u_char *)buf, (u_int)len);
|
||||
}
|
||||
#else
|
||||
static void
|
||||
avma1_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+4].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+4].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+4]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+4]);
|
||||
bus_space_write_multi_1(t, h, 0, (u_int8_t*)buf, size);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* AVM write register routines
|
||||
* AVM write register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
static void
|
||||
avma1_write_reg(u_char *base, u_int offset, u_int v)
|
||||
avma1_write_reg(struct l1_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
outb((int)base + offset, (u_char)v);
|
||||
}
|
||||
#else
|
||||
static void
|
||||
avma1_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+1]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+1]);
|
||||
bus_space_write_1(t, h, offs, data);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* AVM read register routines
|
||||
* AVM read register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
static u_char
|
||||
avma1_read_reg(u_char *base, u_int offset)
|
||||
{
|
||||
return (inb((int)base + offset));
|
||||
}
|
||||
#else
|
||||
static u_int8_t
|
||||
avma1_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
||||
avma1_read_reg(struct l1_softc *sc, int what, bus_size_t offs)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+1]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+1]);
|
||||
return bus_space_read_1(t, h, offs);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* allocate an io port
|
||||
*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
isic_alloc_port(device_t dev, int rid, u_int base, u_int len)
|
||||
{
|
||||
size_t unit = device_get_unit(dev);
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
|
||||
sc->sc_resources.io_rid[rid] = rid;
|
||||
|
||||
bus_set_resource(dev, SYS_RES_IOPORT, rid, base, len);
|
||||
|
||||
if(!(sc->sc_resources.io_base[rid] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[rid],
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Error, failed to reserve io #%d!\n", unit, rid);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_probe_avma1 - probe for AVM A1 and compatibles
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
int
|
||||
isic_probe_avma1(struct isa_device *dev)
|
||||
isic_probe_avma1(device_t dev)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
size_t unit = device_get_unit(dev); /* get unit */
|
||||
struct l1_softc *sc = 0; /* pointer to softc */
|
||||
void *ih = 0; /* dummy */
|
||||
bus_space_tag_t t; /* bus things */
|
||||
bus_space_handle_t h;
|
||||
u_char savebyte;
|
||||
u_char byte;
|
||||
|
||||
|
||||
/* check max unit range */
|
||||
|
||||
if(dev->id_unit >= ISIC_MAXUNIT)
|
||||
|
||||
if(unit >= ISIC_MAXUNIT)
|
||||
{
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for AVM A1/Fritz!\n",
|
||||
dev->id_unit, dev->id_unit);
|
||||
return(0);
|
||||
}
|
||||
sc->sc_unit = dev->id_unit;
|
||||
unit, unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
sc = &l1_sc[unit]; /* get pointer to softc */
|
||||
sc->sc_unit = unit; /* set unit */
|
||||
sc->sc_flags = FLAG_AVM_A1; /* set flags */
|
||||
|
||||
/* see if an io base was supplied */
|
||||
|
||||
if(!(sc->sc_resources.io_base[0] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[0],
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not get iobase for AVM A1/Fritz!\n",
|
||||
unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
/* set io base */
|
||||
|
||||
sc->sc_port = rman_get_start(sc->sc_resources.io_base[0]);
|
||||
|
||||
/* release io base */
|
||||
|
||||
bus_release_resource(dev, SYS_RES_IOPORT, sc->sc_resources.io_rid[0],
|
||||
sc->sc_resources.io_base[0]);
|
||||
|
||||
switch(sc->sc_port)
|
||||
{
|
||||
case 0x200:
|
||||
case 0x240:
|
||||
case 0x300:
|
||||
case 0x340:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid iobase 0x%x specified for AVM A1/Fritz!\n",
|
||||
unit, sc->sc_port);
|
||||
return(ENXIO);
|
||||
break;
|
||||
}
|
||||
|
||||
if(isic_alloc_port(dev, 0, sc->sc_port+AVM_CONF_REG, 0x20))
|
||||
return(ENXIO);
|
||||
|
||||
if(isic_alloc_port(dev, 1, sc->sc_port+AVM_ISAC_R_OFFS, 0x20))
|
||||
return(ENXIO);
|
||||
|
||||
if(isic_alloc_port(dev, 2, sc->sc_port+AVM_HSCXA_R_OFFS, 0x20))
|
||||
return(ENXIO);
|
||||
|
||||
if(isic_alloc_port(dev, 3, sc->sc_port+AVM_HSCXB_R_OFFS, 0x20))
|
||||
return(ENXIO);
|
||||
|
||||
if(isic_alloc_port(dev, 4, sc->sc_port+AVM_ISAC_F_OFFS, 0x20))
|
||||
return(ENXIO);
|
||||
|
||||
if(isic_alloc_port(dev, 5, sc->sc_port+AVM_HSCXA_F_OFFS, 0x20))
|
||||
return(ENXIO);
|
||||
|
||||
if(isic_alloc_port(dev, 6, sc->sc_port+AVM_HSCXB_F_OFFS, 0x20))
|
||||
return(ENXIO);
|
||||
|
||||
/* get our irq */
|
||||
|
||||
if(!(sc->sc_resources.irq =
|
||||
bus_alloc_resource(dev, SYS_RES_IRQ,
|
||||
&sc->sc_resources.irq_rid,
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not get an irq for AVM A1/Fritz!\n",unit);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/* get the irq number */
|
||||
sc->sc_irq = rman_get_start(sc->sc_resources.irq);
|
||||
|
||||
/* register interupt routine */
|
||||
bus_setup_intr(dev, sc->sc_resources.irq, INTR_TYPE_NET,
|
||||
(void(*)(void *))(isicintr),
|
||||
sc, &ih);
|
||||
|
||||
/* check IRQ validity */
|
||||
|
||||
switch(ffs(dev->id_irq)-1)
|
||||
|
||||
switch(sc->sc_irq)
|
||||
{
|
||||
case 3:
|
||||
case 4:
|
||||
|
|
@ -228,40 +288,11 @@ isic_probe_avma1(struct isa_device *dev)
|
|||
|
||||
default:
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for AVM A1/Fritz!\n",
|
||||
dev->id_unit, ffs(dev->id_irq)-1);
|
||||
return(0);
|
||||
unit, sc->sc_irq);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
break;
|
||||
}
|
||||
sc->sc_irq = dev->id_irq;
|
||||
|
||||
/* check if memory addr specified */
|
||||
|
||||
if(dev->id_maddr)
|
||||
{
|
||||
printf("isic%d: Error, mem addr 0x%lx specified for AVM A1/Fritz!\n",
|
||||
dev->id_unit, (u_long)dev->id_maddr);
|
||||
return(0);
|
||||
}
|
||||
|
||||
dev->id_msize = 0;
|
||||
|
||||
/* check if we got an iobase */
|
||||
|
||||
switch(dev->id_iobase)
|
||||
{
|
||||
case 0x200:
|
||||
case 0x240:
|
||||
case 0x300:
|
||||
case 0x340:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid iobase 0x%x specified for AVM A1/Fritz!\n",
|
||||
dev->id_unit, dev->id_iobase);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
sc->sc_port = dev->id_iobase;
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = avma1_read_reg;
|
||||
|
|
@ -281,13 +312,6 @@ isic_probe_avma1(struct isa_device *dev)
|
|||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/* setup ISAC and HSCX base addr */
|
||||
|
||||
ISAC_BASE = (caddr_t)dev->id_iobase + 0x1400 - 0x20;
|
||||
|
||||
HSCX_A_BASE = (caddr_t)dev->id_iobase + 0x400 - 0x20;
|
||||
HSCX_B_BASE = (caddr_t)dev->id_iobase + 0xc00 - 0x20;
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR.
|
||||
* Expected value for AVM A1 is 0x04 or 0x05 and for the
|
||||
|
|
@ -300,12 +324,12 @@ isic_probe_avma1(struct isa_device *dev)
|
|||
((HSCX_READ(1, H_VSTR) & 0xf) != 0x4)) )
|
||||
{
|
||||
printf("isic%d: HSCX VSTR test failed for AVM A1/Fritz\n",
|
||||
dev->id_unit);
|
||||
unit);
|
||||
printf("isic%d: HSC0: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(0, H_VSTR));
|
||||
unit, HSCX_READ(0, H_VSTR));
|
||||
printf("isic%d: HSC1: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(1, H_VSTR));
|
||||
return (0);
|
||||
unit, HSCX_READ(1, H_VSTR));
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
/* AVM A1 or Fritz! control register bits: */
|
||||
|
|
@ -323,164 +347,54 @@ isic_probe_avma1(struct isa_device *dev)
|
|||
* fails, we write back the saved byte .....
|
||||
*/
|
||||
|
||||
savebyte = inb(dev->id_iobase + AVM_CONF_REG);
|
||||
t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
savebyte = bus_space_read_1(t, h, 0);
|
||||
|
||||
/* write low to test bit */
|
||||
|
||||
outb(dev->id_iobase + AVM_CONF_REG, 0x00);
|
||||
bus_space_write_1(t, h, 0, 0x00);
|
||||
|
||||
/* test bit and next higher and lower bit must be 0 */
|
||||
|
||||
if((byte = inb(dev->id_iobase + AVM_CONF_REG) & 0x38) != 0x00)
|
||||
if((byte = bus_space_read_1(t, h, 0) & 0x38) != 0x00)
|
||||
{
|
||||
printf("isic%d: Error, probe-1 failed, 0x%02x should be 0x00 for AVM A1/Fritz!\n",
|
||||
dev->id_unit, byte);
|
||||
outb(dev->id_iobase + AVM_CONF_REG, savebyte);
|
||||
return (0);
|
||||
unit, byte);
|
||||
bus_space_write_1(t, h, 0, savebyte);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
/* write high to test bit */
|
||||
|
||||
outb(dev->id_iobase + AVM_CONF_REG, 0x10);
|
||||
bus_space_write_1(t, h, 0, 0x10);
|
||||
|
||||
/* test bit must be high, next higher and lower bit must be 0 */
|
||||
|
||||
if((byte = inb(dev->id_iobase + AVM_CONF_REG) & 0x38) != 0x10)
|
||||
if((byte = bus_space_read_1(t, h, 0) & 0x38) != 0x10)
|
||||
{
|
||||
printf("isic%d: Error, probe-2 failed, 0x%02x should be 0x10 for AVM A1/Fritz!\n",
|
||||
dev->id_unit, byte);
|
||||
outb(dev->id_iobase + AVM_CONF_REG, savebyte);
|
||||
return (0);
|
||||
unit, byte);
|
||||
bus_space_write_1(t, h, 0, savebyte);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
return (1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int
|
||||
isic_probe_avma1(struct isic_attach_args *ia)
|
||||
{
|
||||
u_int8_t savebyte, v1, v2;
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR.
|
||||
* Expected value for AVM A1 is 0x04 or 0x05 and for the
|
||||
* AVM Fritz!Card is 0x05 in the least significant bits.
|
||||
*/
|
||||
|
||||
v1 = bus_space_read_1(ia->ia_maps[ISIC_WHAT_HSCXA+1].t, ia->ia_maps[ISIC_WHAT_HSCXA+1].h, H_VSTR) & 0x0f;
|
||||
v2 = bus_space_read_1(ia->ia_maps[ISIC_WHAT_HSCXB+1].t, ia->ia_maps[ISIC_WHAT_HSCXB+1].h, H_VSTR) & 0x0f;
|
||||
if (v1 != v2 || (v1 != 0x05 && v1 != 0x04))
|
||||
return 0;
|
||||
|
||||
/* AVM A1 or Fritz! control register bits: */
|
||||
/* read write */
|
||||
/* 0x01 hscx irq* RESET */
|
||||
/* 0x02 isac irq* clear counter1 */
|
||||
/* 0x04 counter irq* clear counter2 */
|
||||
/* 0x08 always 0 irq enable */
|
||||
/* 0x10 read test bit set test bit */
|
||||
/* 0x20 always 0 unused */
|
||||
|
||||
/*
|
||||
* XXX the following test may be destructive, to prevent the
|
||||
* worst case, we save the byte first, and in case the test
|
||||
* fails, we write back the saved byte .....
|
||||
*/
|
||||
|
||||
savebyte = bus_space_read_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0);
|
||||
|
||||
/* write low to test bit */
|
||||
|
||||
bus_space_write_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0, 0);
|
||||
|
||||
/* test bit and next higher and lower bit must be 0 */
|
||||
|
||||
if((bus_space_read_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0) & 0x38) != 0x00)
|
||||
{
|
||||
bus_space_write_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0, savebyte);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* write high to test bit */
|
||||
|
||||
bus_space_write_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0, 0x10);
|
||||
|
||||
/* test bit must be high, next higher and lower bit must be 0 */
|
||||
|
||||
if((bus_space_read_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0) & 0x38) != 0x10)
|
||||
{
|
||||
bus_space_write_1(ia->ia_maps[0].t, ia->ia_maps[0].h, 0, savebyte);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_avma1 - attach AVM A1 and compatibles
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
int
|
||||
isic_attach_avma1(struct isa_device *dev)
|
||||
isic_attach_avma1(device_t dev)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
size_t unit = device_get_unit(dev);
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
/* reset the HSCX and ISAC chips */
|
||||
|
||||
outb(dev->id_iobase + AVM_CONF_REG, 0x00);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
/* reset ISAC/HSCX */
|
||||
|
||||
outb(dev->id_iobase + AVM_CONF_REG, AVM_CONF_WR_RESET);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
|
||||
outb(dev->id_iobase + AVM_CONF_REG, 0x00);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
|
||||
/* setup IRQ */
|
||||
|
||||
outb(dev->id_iobase + AVM_CONF_IRQ, (ffs(sc->sc_irq)) - 1);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
|
||||
/* enable IRQ, disable counter IRQ */
|
||||
|
||||
outb(dev->id_iobase + AVM_CONF_REG, AVM_CONF_WR_IRQEN |
|
||||
AVM_CONF_WR_CCH | AVM_CONF_WR_CCL);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int
|
||||
isic_attach_avma1(struct isic_softc *sc)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = avma1_read_reg;
|
||||
sc->writereg = avma1_write_reg;
|
||||
|
||||
sc->readfifo = avma1_read_fifo;
|
||||
sc->writefifo = avma1_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_AVMA1;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/* reset the HSCX and ISAC chips */
|
||||
|
||||
bus_space_write_1(t, h, 0, 0x00);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
|
||||
|
|
@ -498,11 +412,10 @@ isic_attach_avma1(struct isic_softc *sc)
|
|||
/* enable IRQ, disable counter IRQ */
|
||||
|
||||
bus_space_write_1(t, h, 0, AVM_CONF_WR_IRQEN |
|
||||
AVM_CONF_WR_CCH | AVM_CONF_WR_CCL);
|
||||
AVM_CONF_WR_CCH | AVM_CONF_WR_CCL);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
|
||||
return (1);
|
||||
return(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ISIC > 0 */
|
||||
#endif /* NISIC > 0 && defined(AVM_A1) */
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -27,53 +27,33 @@
|
|||
* i4b_bchan.c - B channel handling L1 procedures
|
||||
* ----------------------------------------------
|
||||
*
|
||||
* $Id: i4b_bchan.c,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:25:27 1999]
|
||||
* last edit-date: [Mon Dec 13 21:59:11 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include "isic.h"
|
||||
#else
|
||||
#define NISIC 1
|
||||
#endif
|
||||
|
||||
#if NISIC > 0
|
||||
|
||||
#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/stdarg.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#else
|
||||
#ifndef __bsdi__
|
||||
#include <machine/bus.h>
|
||||
#endif
|
||||
#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>
|
||||
#include <machine/i4b_trace.h>
|
||||
#else
|
||||
#include <i4b/i4b_debug.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
#include <i4b/i4b_trace.h>
|
||||
#endif
|
||||
|
||||
#include <i4b/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_isac.h>
|
||||
|
|
@ -83,14 +63,8 @@
|
|||
#include <i4b/include/i4b_mbuf.h>
|
||||
#include <i4b/include/i4b_global.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
static void isic_bchannel_start(int unit, int h_chan);
|
||||
static void isic_bchannel_stat(int unit, int h_chan, bchan_statistics_t *bsp);
|
||||
#else
|
||||
static void isic_bchannel_start __P((int unit, int h_chan));
|
||||
static void isic_bchannel_stat __P((int unit, int h_chan, bchan_statistics_t *bsp));
|
||||
#endif
|
||||
|
||||
static void isic_set_linktab(int unit, int channel, drvr_link_t *dlt);
|
||||
static isdn_link_t *isic_ret_linktab(int unit, int channel);
|
||||
|
||||
|
|
@ -100,12 +74,8 @@ static isdn_link_t *isic_ret_linktab(int unit, int channel);
|
|||
void
|
||||
isic_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];
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
l1_bchan_state_t *chan = &sc->sc_chan[h_chan];
|
||||
|
||||
int s = SPLI4B();
|
||||
|
||||
|
|
@ -169,13 +139,8 @@ isic_bchannel_setup(int unit, int h_chan, int bprot, int activate)
|
|||
static void
|
||||
isic_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];
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
register l1_bchan_state_t *chan = &sc->sc_chan[h_chan];
|
||||
register int next_len;
|
||||
register int len;
|
||||
|
||||
|
|
@ -356,12 +321,8 @@ isic_bchannel_start(int unit, int h_chan)
|
|||
static void
|
||||
isic_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];
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
l1_bchan_state_t *chan = &sc->sc_chan[h_chan];
|
||||
int s;
|
||||
|
||||
s = SPLI4B();
|
||||
|
|
@ -381,12 +342,8 @@ isic_bchannel_stat(int unit, int h_chan, bchan_statistics_t *bsp)
|
|||
static isdn_link_t *
|
||||
isic_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];
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
l1_bchan_state_t *chan = &sc->sc_chan[channel];
|
||||
|
||||
return(&chan->isdn_linktab);
|
||||
}
|
||||
|
|
@ -397,12 +354,8 @@ isic_ret_linktab(int unit, int channel)
|
|||
static void
|
||||
isic_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];
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
l1_bchan_state_t *chan = &sc->sc_chan[channel];
|
||||
|
||||
chan->drvr_linktab = dlt;
|
||||
}
|
||||
|
|
@ -411,9 +364,9 @@ isic_set_linktab(int unit, int channel, drvr_link_t *dlt)
|
|||
* initialize our local linktab
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
isic_init_linktab(struct isic_softc *sc)
|
||||
isic_init_linktab(struct l1_softc *sc)
|
||||
{
|
||||
isic_Bchan_t *chan = &sc->sc_chan[HSCX_CH_A];
|
||||
l1_bchan_state_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 */
|
||||
|
|
|
|||
|
|
@ -24,60 +24,42 @@
|
|||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
* isic - I4B Siemens ISDN Chipset Driver for Creatix PnP cards
|
||||
* isic - I4B Siemens ISDN Chipset Driver for Creatix/Teles PnP
|
||||
* ============================================================
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_ctx_s0P.c,v 1.4 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:25:33 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 21:59:23 1999]
|
||||
*
|
||||
* Note: this driver works for the Creatix ISDN S0-16 P+P and
|
||||
* for the Teles S0/16.3 PnP card. Although they are not
|
||||
* the same hardware and don't share the same PnP config
|
||||
* information, once the base addresses are set, the
|
||||
* offsets are same and therefore they can use the same
|
||||
* driver.
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
|
||||
#else
|
||||
|
||||
#define NISIC 1
|
||||
|
||||
#endif
|
||||
|
||||
#define NPNP 1
|
||||
|
||||
#if (NISIC > 0) && (NPNP > 0) && defined(CRTX_S0_P)
|
||||
#if (NISIC > 0) && (defined(CRTX_S0_P) || defined(TEL_S0_16_3_P))
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#else
|
||||
#include <machine/bus.h>
|
||||
#include <sys/device.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <machine/clock.h>
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#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>
|
||||
|
||||
|
|
@ -88,186 +70,156 @@
|
|||
#include <i4b/include/i4b_l1l2.h>
|
||||
#include <i4b/include/i4b_mbuf.h>
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
static u_int8_t ctxs0P_read_reg __P((struct isic_softc *sc, int what, bus_size_t offs));
|
||||
static void ctxs0P_write_reg __P((struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data));
|
||||
static void ctxs0P_read_fifo __P((struct isic_softc *sc, int what, void *buf, size_t size));
|
||||
static void ctxs0P_write_fifo __P((struct isic_softc *sc, int what, const void *data, size_t size));
|
||||
void isic_attach_Cs0P(struct isic_softc *sc);
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
/* #include <i386/isa/pnp.h> */
|
||||
extern void isicintr ( int unit );
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Creatix / Teles PnP ISAC get fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
ctxs0P_read_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+2]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+2]);
|
||||
bus_space_read_multi_1(t,h,0x3e,buf,size);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Creatix ISDN-S0 P&P ISAC get fifo routine
|
||||
* Creatix / Teles PnP ISAC put fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
ctxs0P_read_fifo(void *buf, const void *base, size_t len)
|
||||
{
|
||||
insb((int)base + 0x3e, (u_char *)buf, (u_int)len);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
ctxs0P_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
||||
ctxs0P_write_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
bus_space_read_multi_1(t, h, o + 0x3e, buf, size);
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+2]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+2]);
|
||||
bus_space_write_multi_1(t,h,0x3e,buf,size);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Creatix ISDN-S0 P&P ISAC put fifo routine
|
||||
* Creatix / Teles PnP ISAC put register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
ctxs0P_write_fifo(void *base, const void *buf, size_t len)
|
||||
ctxs0P_write_reg(struct l1_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
outsb((int)base + 0x3e, (u_char *)buf, (u_int)len);
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+2]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+2]);
|
||||
bus_space_write_1(t,h,offs,data);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
ctxs0P_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
bus_space_write_multi_1(t, h, o + 0x3e, (u_int8_t*)buf, size);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Creatix ISDN-S0 P&P ISAC put register routine
|
||||
* Creatix / Teles PnP ISAC get register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
ctxs0P_write_reg(u_char *base, u_int offset, u_int v)
|
||||
{
|
||||
outb((int)base + offset, (u_char)v);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
ctxs0P_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
bus_space_write_1(t, h, o + offs, data);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Creatix ISDN-S0 P&P ISAC get register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static u_char
|
||||
ctxs0P_read_reg(u_char *base, u_int offset)
|
||||
{
|
||||
return (inb((int)base + offset));
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static u_int8_t
|
||||
ctxs0P_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
||||
ctxs0P_read_reg(struct l1_softc *sc, int what, bus_size_t offs)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
return bus_space_read_1(t, h, o + offs);
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+2]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+2]);
|
||||
return bus_space_read_1(t,h,offs);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_probe_Cs0P - probe for Creatix ISDN-S0 P&P and compatibles
|
||||
* isic_attach_Cs0P - attach Creatix / Teles PnP
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_probe_Cs0P(struct isa_device *dev, unsigned int iobase2)
|
||||
isic_attach_Cs0P(device_t dev)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
u_int32_t iobase1;
|
||||
u_int32_t iobase2;
|
||||
int unit = device_get_unit(dev);
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
bus_space_tag_t t;
|
||||
bus_space_handle_t h;
|
||||
|
||||
/*
|
||||
* this card needs a second io_base,
|
||||
* free resources if we don't get it
|
||||
*/
|
||||
|
||||
sc->sc_resources.io_rid[1] = 1;
|
||||
|
||||
/* check max unit range */
|
||||
if(!(sc->sc_resources.io_base[1] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[1],
|
||||
0UL, ~0UL, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not get io area 1 for Creatix / Teles PnP!\n", unit);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/* remember the io base addresses */
|
||||
|
||||
if(dev->id_unit >= ISIC_MAXUNIT)
|
||||
{
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Creatix ISDN-S0 P&P!\n",
|
||||
dev->id_unit, dev->id_unit);
|
||||
return(0);
|
||||
}
|
||||
sc->sc_unit = dev->id_unit;
|
||||
|
||||
/* check IRQ validity */
|
||||
|
||||
switch(ffs(dev->id_irq) - 1)
|
||||
{
|
||||
case 3:
|
||||
case 5:
|
||||
case 7:
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for Creatix ISDN-S0 P&P!\n",
|
||||
dev->id_unit, ffs(dev->id_irq)-1);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
sc->sc_irq = dev->id_irq;
|
||||
|
||||
/* check if memory addr specified */
|
||||
|
||||
if(dev->id_maddr)
|
||||
{
|
||||
printf("isic%d: Error, mem addr 0x%lx specified for Creatix ISDN-S0 P&P!\n",
|
||||
dev->id_unit, (u_long)dev->id_maddr);
|
||||
return(0);
|
||||
}
|
||||
dev->id_msize = 0;
|
||||
iobase1 = rman_get_start(sc->sc_resources.io_base[0]);
|
||||
iobase2 = rman_get_start(sc->sc_resources.io_base[1]);
|
||||
|
||||
if(iobase2 == 0)
|
||||
/*
|
||||
* because overlapping resources are invalid,
|
||||
* release the first io port resource
|
||||
*/
|
||||
|
||||
bus_release_resource(dev, SYS_RES_IOPORT, sc->sc_resources.io_rid[0],
|
||||
sc->sc_resources.io_base[0]);
|
||||
|
||||
/* set and allocate a base io address for the ISAC chip */
|
||||
|
||||
sc->sc_resources.io_rid[2] = 2;
|
||||
|
||||
bus_set_resource(dev, SYS_RES_IOPORT, 2, iobase1-0x20, 0x40);
|
||||
|
||||
if(!(sc->sc_resources.io_base[2] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[2],
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Error, iobase2 is 0 for Creatix ISDN-S0 P&P!\n",
|
||||
dev->id_unit);
|
||||
return(0);
|
||||
printf("isic%d: Could not get io area 2 for Creatix / Teles PnP!\n", unit);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/* check if we got an iobase */
|
||||
/*
|
||||
* because overlapping resources are invalid,
|
||||
* release the second io port resource
|
||||
*/
|
||||
|
||||
switch(dev->id_iobase)
|
||||
bus_release_resource(dev, SYS_RES_IOPORT, sc->sc_resources.io_rid[1],
|
||||
sc->sc_resources.io_base[1]);
|
||||
|
||||
/* set and allocate a resource for the HSCX channel A */
|
||||
|
||||
sc->sc_resources.io_rid[3] = 3;
|
||||
|
||||
/*XXX*/ /* FIXME !!!!
|
||||
* the width of the resource is too small, there are accesses
|
||||
* to it with an offset of 0x3e into the next resource. anyway,
|
||||
* it seems to work and i have no idea how to do 2 resources
|
||||
* overlapping each other.
|
||||
*/
|
||||
|
||||
bus_set_resource(dev, SYS_RES_IOPORT, 3, iobase2-0x20, 0x20);
|
||||
|
||||
if(!(sc->sc_resources.io_base[3] =
|
||||
bus_alloc_resource(dev,SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[3],
|
||||
0ul,~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
case 0x120:
|
||||
case 0x180:
|
||||
/*XXX*/ break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid iobase 0x%x specified for Creatix ISDN-S0 P&P!\n",
|
||||
dev->id_unit, dev->id_iobase);
|
||||
return(0);
|
||||
break;
|
||||
printf("isic%d: Could not get io area 3 for Creatix / Teles PnP!\n", unit);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
sc->sc_port = dev->id_iobase;
|
||||
|
||||
/* set and allocate a resources for the HSCX channel B */
|
||||
|
||||
sc->sc_resources.io_rid[4] = 4;
|
||||
|
||||
bus_set_resource(dev, SYS_RES_IOPORT, 4, iobase2, 0x40);
|
||||
|
||||
if(!(sc->sc_resources.io_base[4] =
|
||||
bus_alloc_resource(dev,SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[4],
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not get io area 4 for Creatix / Teles PnP!\n", unit);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/* setup access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
|
|
@ -287,80 +239,20 @@ isic_probe_Cs0P(struct isa_device *dev, unsigned int iobase2)
|
|||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/* enable the card */
|
||||
|
||||
/* setup ISAC and HSCX base addr */
|
||||
t = rman_get_bustag(sc->sc_resources.io_base[2]);
|
||||
h = rman_get_bushandle(sc->sc_resources.io_base[2]);
|
||||
|
||||
ISAC_BASE = (caddr_t) dev->id_iobase - 0x20;
|
||||
HSCX_A_BASE = (caddr_t) iobase2 - 0x20;
|
||||
HSCX_B_BASE = (caddr_t) iobase2;
|
||||
bus_space_write_1(t, h, 0x3c, 0);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR. Expected value for the Creatix PnP card is
|
||||
* 0x05 ( = version 2.1 ) in the least significant bits.
|
||||
*/
|
||||
bus_space_write_1(t, h, 0x3c, 1);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
|
||||
if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) ||
|
||||
((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) )
|
||||
{
|
||||
printf("isic%d: HSCX VSTR test failed for Creatix PnP\n",
|
||||
dev->id_unit);
|
||||
printf("isic%d: HSC0: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(0, H_VSTR));
|
||||
printf("isic%d: HSC1: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(1, H_VSTR));
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_s0163P - attach Creatix ISDN-S0 P&P
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_attach_Cs0P(struct isa_device *dev, unsigned int iobase2)
|
||||
{
|
||||
outb((dev->id_iobase) + 0x1c, 0);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
outb((dev->id_iobase) + 0x1c, 1);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
return(1);
|
||||
}
|
||||
|
||||
#else /* !__FreeBSD__ */
|
||||
|
||||
void
|
||||
isic_attach_Cs0P(struct isic_softc *sc)
|
||||
{
|
||||
/* init card */
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
bus_space_write_1(t, h, 0x1c, 0);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
bus_space_write_1(t, h, 0x1c, 1);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
|
||||
/* setup access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = ctxs0P_read_reg;
|
||||
sc->writereg = ctxs0P_write_reg;
|
||||
|
||||
sc->readfifo = ctxs0P_read_fifo;
|
||||
sc->writefifo = ctxs0P_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_CS0P;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* (NISIC > 0) && (NPNP > 0) && defined(CRTX_S0_P) */
|
||||
#endif /* (NISIC > 0) && (defined(CRTX_S0_P) || defined(TEL_S0_16_3_P)) */
|
||||
|
||||
|
|
|
|||
|
|
@ -27,55 +27,32 @@
|
|||
* i4b_drn_ngo.c - Dr. Neuhaus Niccy GO@ and SAGEM Cybermod
|
||||
* --------------------------------------------------------
|
||||
*
|
||||
* $Id: i4b_drn_ngo.c,v 1.3 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:25:39 1999]
|
||||
* last edit-date: [Mon Dec 13 21:59:30 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
|
||||
#else
|
||||
|
||||
#define NISIC 1
|
||||
|
||||
#endif
|
||||
|
||||
#define NPNP 1
|
||||
|
||||
#if (NISIC > 0) && (NPNP > 0) && defined(DRN_NGO)
|
||||
#if (NISIC > 0) && defined(DRN_NGO)
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#else
|
||||
#include <machine/bus.h>
|
||||
#include <sys/device.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <machine/clock.h>
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#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>
|
||||
|
||||
|
|
@ -112,7 +89,7 @@
|
|||
|
||||
#define HSCX_BOFF 0x40
|
||||
|
||||
#define ADDR_OFF 2 /* address register range offset XXX */
|
||||
#define ADDR_OFF 2 /* address register range offset */
|
||||
|
||||
#define ISAC_DATA 0
|
||||
#define HSCX_DATA 1
|
||||
|
|
@ -120,286 +97,155 @@
|
|||
#define ISAC_ADDR 0
|
||||
#define HSCX_ADDR 1
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#if 0
|
||||
#define HSCXADEBUG
|
||||
#define HSCXBDEBUG
|
||||
#define ISACDEBUG
|
||||
#else
|
||||
#undef HSCXADEBUG
|
||||
#undef HSCXBDEBUG
|
||||
#undef ISACDEBUG
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Dr. Neuhaus Niccy GO@ read fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
drnngo_read_fifo(void *buf, const void *base, size_t len)
|
||||
static void
|
||||
drnngo_read_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
register int offset;
|
||||
register u_int data;
|
||||
bus_space_tag_t tdata, tadr;
|
||||
bus_space_handle_t hdata, hadr;
|
||||
|
||||
int x = SPLI4B();
|
||||
tdata = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
hdata = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
tadr = rman_get_bustag(sc->sc_resources.io_base[1]);
|
||||
hadr = rman_get_bushandle(sc->sc_resources.io_base[1]);
|
||||
|
||||
if((u_int)base & HSCX_ABIT)
|
||||
switch(what)
|
||||
{
|
||||
(u_int)base &= ~HSCX_ABIT;
|
||||
(u_int)data = ((u_int)base + HSCX_DATA);
|
||||
(u_int)base += (ADDR_OFF + HSCX_ADDR);
|
||||
offset = 0;
|
||||
#ifdef HSCXADEBUG
|
||||
printf("GO/A/frd: base=0x%x, data=0x%x, len=%d\n", base, data, len);
|
||||
#endif
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1 (tadr ,hadr, ISAC_ADDR,0x0);
|
||||
bus_space_read_multi_1(tdata,hdata,ISAC_DATA,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1 (tadr ,hadr ,HSCX_ADDR,0x0);
|
||||
bus_space_read_multi_1(tdata,hdata,HSCX_DATA,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1 (tadr ,hadr ,HSCX_ADDR,HSCX_BOFF);
|
||||
bus_space_read_multi_1(tdata,hdata,HSCX_DATA,buf,size);
|
||||
break;
|
||||
}
|
||||
else if((u_int)base & HSCX_BBIT)
|
||||
{
|
||||
(u_int)base &= ~HSCX_BBIT;
|
||||
(u_int)data = ((u_int)base + HSCX_DATA);
|
||||
(u_int)base += (ADDR_OFF + HSCX_ADDR);
|
||||
offset = HSCX_BOFF;
|
||||
#ifdef HSCXBDEBUG
|
||||
printf("GO/B/frd: base=0x%x, data=0x%x, len=%d\n", base, data, len);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
(u_int)data = ((u_int)base + ISAC_DATA);
|
||||
(u_int)base += (ADDR_OFF + ISAC_ADDR);
|
||||
offset = 0;
|
||||
#ifdef ISACDEBUG
|
||||
printf("GO/I/frd: base=0x%x, data=0x%x, len=%d\n", base, data, len);
|
||||
#endif
|
||||
}
|
||||
|
||||
for(;len > 0; len--, offset++)
|
||||
{
|
||||
outb((int)base, (u_char)offset);
|
||||
*((u_char *)buf + offset) = inb((int)data);
|
||||
}
|
||||
|
||||
splx(x);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Dr. Neuhaus Niccy GO@ write fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
drnngo_write_fifo(void *base, const void *buf, size_t len)
|
||||
drnngo_write_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
register int offset;
|
||||
register u_int data;
|
||||
bus_space_tag_t tdata, tadr;
|
||||
bus_space_handle_t hdata, hadr;
|
||||
|
||||
int x = SPLI4B();
|
||||
|
||||
if((u_int)base & HSCX_ABIT)
|
||||
{
|
||||
(u_int)base &= ~HSCX_ABIT;
|
||||
(u_int)data = ((u_int)base + HSCX_DATA);
|
||||
(u_int)base += (ADDR_OFF + HSCX_ADDR);
|
||||
offset = 0;
|
||||
#ifdef HSCXADEBUG
|
||||
printf("GO/A/fwr: base=0x%x, data=0x%x, len=%d\n", base, data, len);
|
||||
#endif
|
||||
}
|
||||
else if((u_int)base & HSCX_BBIT)
|
||||
{
|
||||
(u_int)base &= ~HSCX_BBIT;
|
||||
(u_int)data = ((u_int)base + HSCX_DATA);
|
||||
(u_int)base += (ADDR_OFF + HSCX_ADDR);
|
||||
offset = HSCX_BOFF;
|
||||
#ifdef HSCXBDEBUG
|
||||
printf("GO/B/fwr: base=0x%x, data=0x%x, len=%d\n", base, data, len);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
(u_int)data = ((u_int)base + ISAC_DATA);
|
||||
(u_int)base += (ADDR_OFF + ISAC_ADDR);
|
||||
offset = 0;
|
||||
#ifdef ISACDEBUG
|
||||
printf("GO/I/fwr: base=0x%x, data=0x%x, len=%d\n", base, data, len);
|
||||
#endif
|
||||
}
|
||||
tdata = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
hdata = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
tadr = rman_get_bustag(sc->sc_resources.io_base[1]);
|
||||
hadr = rman_get_bushandle(sc->sc_resources.io_base[1]);
|
||||
|
||||
for(;len > 0; len--, offset++)
|
||||
switch(what)
|
||||
{
|
||||
outb((int)base, (u_char)offset);
|
||||
outb((int)data, *((u_char *)buf + offset));
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1 (tadr ,hadr, ISAC_ADDR,0x0);
|
||||
bus_space_write_multi_1(tdata,hdata,ISAC_DATA,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1 (tadr ,hadr ,HSCX_ADDR,0x0);
|
||||
bus_space_write_multi_1(tdata,hdata,HSCX_DATA,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1 (tadr ,hadr ,HSCX_ADDR,HSCX_BOFF);
|
||||
bus_space_write_multi_1(tdata,hdata,HSCX_DATA,buf,size);
|
||||
break;
|
||||
}
|
||||
|
||||
splx(x);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Dr. Neuhaus Niccy GO@ write register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
drnngo_write_reg(u_char *base, u_int offset, u_int v)
|
||||
static void
|
||||
drnngo_write_reg(struct l1_softc *sc, int what, bus_size_t reg, u_int8_t data)
|
||||
{
|
||||
int x = SPLI4B();
|
||||
if((u_int)base & HSCX_ABIT)
|
||||
bus_space_tag_t tdata, tadr;
|
||||
bus_space_handle_t hdata, hadr;
|
||||
|
||||
tdata = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
hdata = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
tadr = rman_get_bustag(sc->sc_resources.io_base[1]);
|
||||
hadr = rman_get_bushandle(sc->sc_resources.io_base[1]);
|
||||
|
||||
switch(what)
|
||||
{
|
||||
(u_int)base &= ~HSCX_ABIT;
|
||||
outb((int)base + ADDR_OFF + HSCX_ADDR, (u_char)offset);
|
||||
outb((int)base + HSCX_DATA, (u_char)v);
|
||||
#ifdef HSCXADEBUG
|
||||
printf("GO/A/rwr: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n",
|
||||
(int)base + ADDR_OFF + HSCX_ADDR, (int)base + HSCX_DATA,
|
||||
(u_char)offset, (u_char)v);
|
||||
#endif
|
||||
}
|
||||
else if((u_int)base & HSCX_BBIT)
|
||||
{
|
||||
(u_int)base &= ~HSCX_BBIT;
|
||||
outb((int)base + ADDR_OFF + HSCX_ADDR, (u_char)(offset + HSCX_BOFF));
|
||||
outb((int)base + HSCX_DATA, (u_char)v);
|
||||
#ifdef HSCXBDEBUG
|
||||
printf("GO/B/rwr: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n",
|
||||
(int)base + ADDR_OFF + HSCX_ADDR, (int)base + HSCX_DATA,
|
||||
(u_char)(offset + HSCX_BOFF), (u_char)v);
|
||||
#endif
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(tadr ,hadr, ISAC_ADDR,reg);
|
||||
bus_space_write_1(tdata,hdata,ISAC_DATA,data);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(tadr ,hadr ,HSCX_ADDR,reg);
|
||||
bus_space_write_1(tdata,hdata,HSCX_DATA,data);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(tadr ,hadr ,HSCX_ADDR,reg+HSCX_BOFF);
|
||||
bus_space_write_1(tdata,hdata,HSCX_DATA,data);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
outb((int)base + ADDR_OFF + ISAC_ADDR, (u_char)offset);
|
||||
outb((int)base + ISAC_DATA, (u_char)v);
|
||||
#ifdef ISACDEBUG
|
||||
printf("GO/I/rwr: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n",
|
||||
(int)base + ADDR_OFF + ISAC_ADDR, (int)base + ISAC_DATA,
|
||||
(u_char)offset, (u_char)v);
|
||||
#endif
|
||||
}
|
||||
splx(x);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Dr. Neuhaus Niccy GO@ read register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static u_char
|
||||
drnngo_read_reg(u_char *base, u_int offset)
|
||||
static u_int8_t
|
||||
drnngo_read_reg(struct l1_softc *sc, int what, bus_size_t reg)
|
||||
{
|
||||
u_char val;
|
||||
int x = SPLI4B();
|
||||
|
||||
if((u_int)base & HSCX_ABIT)
|
||||
bus_space_tag_t tdata, tadr;
|
||||
bus_space_handle_t hdata, hadr;
|
||||
|
||||
tdata = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
hdata = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
tadr = rman_get_bustag(sc->sc_resources.io_base[1]);
|
||||
hadr = rman_get_bushandle(sc->sc_resources.io_base[1]);
|
||||
|
||||
switch(what)
|
||||
{
|
||||
(u_int)base &= ~HSCX_ABIT;
|
||||
outb((int)base + ADDR_OFF + HSCX_ADDR, (u_char)offset);
|
||||
val = inb((int)base + HSCX_DATA);
|
||||
#ifdef HSCXADEBUG
|
||||
printf("GO/A/rrd: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n",
|
||||
(int)base + ADDR_OFF + HSCX_ADDR, (int)base + HSCX_DATA,
|
||||
(u_char)offset, (u_char)val);
|
||||
#endif
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(tadr ,hadr, ISAC_ADDR,reg);
|
||||
return bus_space_read_1(tdata,hdata,ISAC_DATA);
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(tadr ,hadr ,HSCX_ADDR,reg);
|
||||
return bus_space_read_1(tdata,hdata,HSCX_DATA);
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(tadr ,hadr ,HSCX_ADDR,reg+HSCX_BOFF);
|
||||
return bus_space_read_1(tdata,hdata,HSCX_DATA);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
else if((u_int)base & HSCX_BBIT)
|
||||
{
|
||||
(u_int)base &= ~HSCX_BBIT;
|
||||
outb((int)base + ADDR_OFF + HSCX_ADDR, (u_char)(offset + HSCX_BOFF));
|
||||
val = inb((int)base + HSCX_DATA);
|
||||
#ifdef HSCXBDEBUG
|
||||
printf("GO/B/rrd: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n",
|
||||
(int)base + ADDR_OFF + HSCX_ADDR, (int)base + HSCX_DATA,
|
||||
(u_char)(offset + HSCX_BOFF), (u_char)val);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
outb((int)base + ADDR_OFF + ISAC_ADDR, (u_char)offset);
|
||||
val = inb((int)base + ISAC_DATA);
|
||||
#ifdef ISACDEBUG
|
||||
printf("GO/I/rrd: base=0x%x, addr=0x%x, offset=0x%x, val=0x%x\n",
|
||||
(int)base + ADDR_OFF + ISAC_ADDR, (int)base + ISAC_DATA,
|
||||
(u_char)offset, (u_char)val);
|
||||
#endif
|
||||
}
|
||||
splx(x);
|
||||
return(val);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_probe_drnngo - probe for Dr. Neuhaus Niccy GO@
|
||||
* probe for ISA PnP cards
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_probe_drnngo(struct isa_device *dev, unsigned int iobase2)
|
||||
isic_attach_drnngo(device_t dev)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
|
||||
/* check max unit range */
|
||||
|
||||
if(dev->id_unit >= ISIC_MAXUNIT)
|
||||
int unit = device_get_unit(dev);
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
|
||||
sc->sc_resources.io_rid[1] = 1;
|
||||
|
||||
/*
|
||||
* this card needs a second io_base,
|
||||
* free resources if we don't get it
|
||||
*/
|
||||
|
||||
if(!(sc->sc_resources.io_base[1] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[1],
|
||||
0UL, ~0UL, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Dr. Neuhaus Niccy GO@!\n",
|
||||
dev->id_unit, dev->id_unit);
|
||||
return(0);
|
||||
}
|
||||
sc->sc_unit = dev->id_unit;
|
||||
|
||||
/* check IRQ validity */
|
||||
|
||||
switch(ffs(dev->id_irq)-1)
|
||||
{
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 9:
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
case 15:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for Dr. Neuhaus Niccy GO@!\n",
|
||||
dev->id_unit, ffs(dev->id_irq)-1);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
sc->sc_irq = dev->id_irq;
|
||||
|
||||
/* check if memory addr specified */
|
||||
|
||||
if(dev->id_maddr)
|
||||
{
|
||||
printf("isic%d: Error, mem addr 0x%lx specified for Dr. Neuhaus Niccy GO@!\n",
|
||||
dev->id_unit, (u_long)dev->id_maddr);
|
||||
return(0);
|
||||
}
|
||||
dev->id_msize = 0;
|
||||
|
||||
/* check if we got an iobase */
|
||||
|
||||
if(dev->id_iobase < NICCY_PORT_MIN || dev->id_iobase > NICCY_PORT_MAX)
|
||||
{
|
||||
printf("isic%d: Error, invalid iobase 0x%x specified for Dr. Neuhaus Niccy GO@!\n",
|
||||
dev->id_unit, dev->id_iobase);
|
||||
return(0);
|
||||
}
|
||||
sc->sc_port = dev->id_iobase;
|
||||
|
||||
if(iobase2 == 0)
|
||||
{
|
||||
printf("isic%d: Error, iobase2 is 0 for Dr. Neuhaus Niccy GO@!\n",
|
||||
dev->id_unit);
|
||||
return(0);
|
||||
printf("isic%d: Failed to get second io base.\n", unit);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
if(iobase2 < NICCY_PORT_MIN || iobase2 > NICCY_PORT_MAX)
|
||||
{
|
||||
printf("isic%d: Error, invalid port1 0x%x specified for Dr. Neuhaus Niccy GO@!\n",
|
||||
dev->id_unit, iobase2);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*XXX*/ if((dev->id_iobase + 2) != iobase2)
|
||||
{
|
||||
printf("isic%d: Error, port1 must be (port0+2) for Dr.Neuhaus Niccy GO@!\n",
|
||||
dev->id_unit);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* setup ISAC access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
|
|
@ -420,123 +266,7 @@ isic_probe_drnngo(struct isa_device *dev, unsigned int iobase2)
|
|||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/* setup ISAC and HSCX base addr */
|
||||
|
||||
ISAC_BASE = (caddr_t)dev->id_iobase;
|
||||
HSCX_A_BASE = (caddr_t)(((u_int)dev->id_iobase) | HSCX_ABIT);
|
||||
HSCX_B_BASE = (caddr_t)(((u_int)dev->id_iobase) | HSCX_BBIT);
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR. Expected value for Dr. Neuhaus Niccy GO@ based
|
||||
* boards is 0x05 in the least significant bits.
|
||||
*/
|
||||
|
||||
if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) ||
|
||||
((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) )
|
||||
{
|
||||
printf("isic%d: HSCX VSTR test failed for Dr. Neuhaus Niccy GO@\n",
|
||||
dev->id_unit);
|
||||
printf("isic%d: HSC0: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(0, H_VSTR));
|
||||
printf("isic%d: HSC1: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(1, H_VSTR));
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (1);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_drnngo - attach Dr. Neuhaus Niccy GO@
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_attach_drnngo(struct isa_device *dev, unsigned int iobase2)
|
||||
{
|
||||
return (1);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static u_int8_t drnngo_read_reg __P((struct isic_softc *sc, int what, bus_size_t offs));
|
||||
static void drnngo_write_reg __P((struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data));
|
||||
static void drnngo_read_fifo __P((struct isic_softc *sc, int what, void *buf, size_t size));
|
||||
static void drnngo_write_fifo __P((struct isic_softc *sc, int what, const void *data, size_t size));
|
||||
void isic_attach_drnngo __P((struct isic_softc *sc));
|
||||
|
||||
/*
|
||||
* Mapping from "what" parameter to offsets into the io map
|
||||
*/
|
||||
static struct {
|
||||
bus_size_t oa, /* address register offset */
|
||||
od, /* data register offset */
|
||||
or; /* additional chip register offset */
|
||||
} offset[] =
|
||||
{
|
||||
{ ISAC_ADDR, ISAC_DATA, 0 }, /* ISAC access */
|
||||
{ HSCX_ADDR, HSCX_DATA, 0 }, /* HSCX A access */
|
||||
{ HSCX_ADDR, HSCX_DATA, HSCX_BOFF } /* HSCX B access */
|
||||
};
|
||||
|
||||
static void
|
||||
drnngo_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t hd = sc->sc_maps[0].h, ha = sc->sc_maps[1].h;
|
||||
bus_space_write_1(t, ha, offset[what].oa, offset[what].or);
|
||||
bus_space_read_multi_1(t, hd, offset[what].od, buf, size);
|
||||
}
|
||||
|
||||
static void
|
||||
drnngo_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t hd = sc->sc_maps[0].h, ha = sc->sc_maps[1].h;
|
||||
bus_space_write_1(t, ha, offset[what].oa, offset[what].or);
|
||||
bus_space_write_multi_1(t, hd, offset[what].od, (u_int8_t*)buf, size);
|
||||
}
|
||||
|
||||
static void
|
||||
drnngo_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t hd = sc->sc_maps[0].h, ha = sc->sc_maps[1].h;
|
||||
bus_space_write_1(t, ha, offset[what].oa, offs+offset[what].or);
|
||||
bus_space_write_1(t, hd, offset[what].od, data);
|
||||
}
|
||||
|
||||
static u_int8_t
|
||||
drnngo_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t hd = sc->sc_maps[0].h, ha = sc->sc_maps[1].h;
|
||||
bus_space_write_1(t, ha, offset[what].oa, offs+offset[what].or);
|
||||
return bus_space_read_1(t, hd, offset[what].od);
|
||||
}
|
||||
|
||||
void
|
||||
isic_attach_drnngo(struct isic_softc *sc)
|
||||
{
|
||||
/* setup access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = drnngo_read_reg;
|
||||
sc->writereg = drnngo_write_reg;
|
||||
|
||||
sc->readfifo = drnngo_read_fifo;
|
||||
sc->writefifo = drnngo_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_DRNNGO;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* (NISIC > 0) && (NPNP > 0) && defined(DRN_NGO) */
|
||||
#endif /* (NISIC > 0) && defined(DRN_NGO) */
|
||||
|
|
|
|||
392
sys/i4b/layer1/i4b_elsa_pcc16.c
Normal file
392
sys/i4b/layer1/i4b_elsa_pcc16.c
Normal file
|
|
@ -0,0 +1,392 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
* isic - I4B Siemens ISDN Chipset Driver for ELSA MicroLink ISDN/PCC-16
|
||||
* =====================================================================
|
||||
*
|
||||
* $Id: i4b_elsa_pcc16.c,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 21:59:36 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
|
||||
#if (NISIC > 0) && defined(ELSA_PCC16)
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#include <sys/ioccom.h>
|
||||
#include <machine/clock.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 i4b_epcc16_clrirq(struct l1_softc *sc);
|
||||
|
||||
/* masks for register encoded in base addr */
|
||||
|
||||
#define ELSA_BASE_MASK 0x0ffff
|
||||
#define ELSA_OFF_MASK 0xf0000
|
||||
|
||||
/* register id's to be encoded in base addr */
|
||||
|
||||
#define ELSA_IDISAC 0x00000
|
||||
#define ELSA_IDHSCXA 0x10000
|
||||
#define ELSA_IDHSCXB 0x20000
|
||||
|
||||
/* offsets from base address */
|
||||
|
||||
#define ELSA_OFF_ISAC 0x00
|
||||
#define ELSA_OFF_HSCX 0x02
|
||||
#define ELSA_OFF_OFF 0x03
|
||||
#define ELSA_OFF_CTRL 0x04
|
||||
#define ELSA_OFF_CFG 0x05
|
||||
#define ELSA_OFF_TIMR 0x06
|
||||
#define ELSA_OFF_IRQ 0x07
|
||||
|
||||
/* control register (write access) */
|
||||
|
||||
#define ELSA_CTRL_LED_YELLOW 0x02
|
||||
#define ELSA_CTRL_LED_GREEN 0x08
|
||||
#define ELSA_CTRL_RESET 0x20
|
||||
#define ELSA_CTRL_TIMEREN 0x80
|
||||
#define ELSA_CTRL_SECRET 0x50
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA MicroLink ISDN/PCC-16 clear IRQ routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
i4b_epcc16_clrirq(struct l1_softc *sc)
|
||||
{
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
bus_space_write_1(t, h, ELSA_OFF_IRQ, 0);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA MicroLink ISDN/PCC-16 ISAC get fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
epcc16_read_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch (what) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0);
|
||||
bus_space_read_multi_1(t, h, ELSA_OFF_ISAC, buf, size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0);
|
||||
bus_space_read_multi_1(t, h, ELSA_OFF_HSCX, buf, size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0x40);
|
||||
bus_space_read_multi_1(t, h, ELSA_OFF_HSCX, buf, size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA MicroLink ISDN/PCC-16 ISAC put fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
epcc16_write_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch (what) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0);
|
||||
bus_space_write_multi_1(t, h, ELSA_OFF_ISAC, buf, size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0);
|
||||
bus_space_write_multi_1(t, h, ELSA_OFF_HSCX, buf, size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0x40);
|
||||
bus_space_write_multi_1(t, h, ELSA_OFF_HSCX, buf, size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA MicroLink ISDN/PCC-16 ISAC put register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
epcc16_write_reg(struct l1_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch (what) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, offs);
|
||||
bus_space_write_1(t, h, ELSA_OFF_ISAC, data);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, offs);
|
||||
bus_space_write_1(t, h, ELSA_OFF_HSCX, data);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0x40+offs);
|
||||
bus_space_write_1(t, h, ELSA_OFF_HSCX, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA MicroLink ISDN/PCC-16 ISAC get register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static u_int8_t
|
||||
epcc16_read_reg(struct l1_softc *sc, int what, bus_size_t offs)
|
||||
{
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch (what) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, offs);
|
||||
return bus_space_read_1(t, h, ELSA_OFF_ISAC);
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, offs);
|
||||
return bus_space_read_1(t, h, ELSA_OFF_HSCX);
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0x40+offs);
|
||||
return bus_space_read_1(t, h, ELSA_OFF_HSCX);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_detach_Epcc16 - detach for ELSA MicroLink ISDN/PCC-16
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
isic_detach_Epcc16(device_t dev)
|
||||
{
|
||||
struct l1_softc *sc = &l1_sc[device_get_unit(dev)];
|
||||
|
||||
if ( sc->sc_resources.irq )
|
||||
{
|
||||
bus_teardown_intr(dev,sc->sc_resources.irq,
|
||||
(void(*)(void *))isicintr);
|
||||
bus_release_resource(dev,SYS_RES_IRQ,
|
||||
sc->sc_resources.irq_rid,
|
||||
sc->sc_resources.irq);
|
||||
sc->sc_resources.irq = 0;
|
||||
}
|
||||
|
||||
if ( sc->sc_resources.io_base[0] ) {
|
||||
bus_release_resource(dev,SYS_RES_IOPORT,
|
||||
sc->sc_resources.io_rid[0],
|
||||
sc->sc_resources.io_base[0]);
|
||||
sc->sc_resources.io_base[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_probe_Epcc16 - probe for ELSA MicroLink ISDN/PCC-16
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_probe_Epcc16(device_t dev)
|
||||
{
|
||||
size_t unit = device_get_unit(dev); /* get unit */
|
||||
struct l1_softc *sc = 0; /* pointer to softc */
|
||||
void *ih = 0; /* dummy */
|
||||
|
||||
/* check max unit range */
|
||||
if(unit >= ISIC_MAXUNIT)
|
||||
{
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for ELSA PCC-16!\n",
|
||||
unit, unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
sc = &l1_sc[unit]; /* get pointer to softc */
|
||||
|
||||
sc->sc_unit = unit; /* set unit */
|
||||
|
||||
sc->sc_flags = FLAG_ELSA_PCC16; /* set flags */
|
||||
|
||||
/* see if an io base was supplied */
|
||||
|
||||
if(!(sc->sc_resources.io_base[0] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[0],
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not get iobase for ELSA PCC-16.\n",
|
||||
unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
/* check if we got an iobase */
|
||||
|
||||
sc->sc_port = rman_get_start(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch(sc->sc_port)
|
||||
{
|
||||
case 0x160:
|
||||
case 0x170:
|
||||
case 0x260:
|
||||
case 0x360:
|
||||
break;
|
||||
default:
|
||||
printf("isic%d: Error, invalid iobase 0x%x specified for ELSA MicroLink ISDN/PCC-16!\n",
|
||||
unit, sc->sc_port);
|
||||
isic_detach_Epcc16(dev);
|
||||
return(ENXIO);
|
||||
break;
|
||||
}
|
||||
|
||||
/* setup access routines */
|
||||
|
||||
sc->clearirq = i4b_epcc16_clrirq;
|
||||
sc->readreg = epcc16_read_reg;
|
||||
sc->writereg = epcc16_write_reg;
|
||||
|
||||
sc->readfifo = epcc16_read_fifo;
|
||||
sc->writefifo = epcc16_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_ELSAQS1ISA;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR. Expected value for the ELSA PCC-16
|
||||
* is 0x05 ( = version 2.1 ) in the least significant bits.
|
||||
*/
|
||||
|
||||
if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) ||
|
||||
((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) )
|
||||
{
|
||||
printf("isic%d: HSCX VSTR test failed for ELSA MicroLink ISDN/PCC-16\n",
|
||||
unit);
|
||||
printf("isic%d: HSC0: VSTR: %#x\n",
|
||||
unit, HSCX_READ(0, H_VSTR));
|
||||
printf("isic%d: HSC1: VSTR: %#x\n",
|
||||
unit, HSCX_READ(1, H_VSTR));
|
||||
isic_detach_Epcc16(dev);
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
/* get our irq */
|
||||
|
||||
if(!(sc->sc_resources.irq =
|
||||
bus_alloc_resource(dev, SYS_RES_IRQ,
|
||||
&sc->sc_resources.irq_rid,
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not get an irq.\n",unit);
|
||||
isic_detach_Epcc16(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/* get the irq number */
|
||||
sc->sc_irq = rman_get_start(sc->sc_resources.irq);
|
||||
|
||||
/* check IRQ validity */
|
||||
switch(sc->sc_irq)
|
||||
{
|
||||
case 2:
|
||||
case 9:
|
||||
case 3:
|
||||
case 5:
|
||||
case 10:
|
||||
case 11:
|
||||
case 15:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for ELSA MicroLink ISDN/PCC-16!\n",
|
||||
unit, sc->sc_irq);
|
||||
isic_detach_Epcc16(dev);
|
||||
return(ENXIO);
|
||||
break;
|
||||
}
|
||||
|
||||
/* register interupt routine */
|
||||
bus_setup_intr(dev,sc->sc_resources.irq,INTR_TYPE_NET,
|
||||
(void(*)(void *))(isicintr),
|
||||
sc,&ih);
|
||||
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_Epcc16 - attach for ELSA MicroLink ISDN/PCC-16
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_attach_Epcc16(device_t dev)
|
||||
{
|
||||
int unit = device_get_unit(dev);
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
u_char byte = ELSA_CTRL_SECRET;
|
||||
|
||||
byte &= ~ELSA_CTRL_RESET;
|
||||
bus_space_write_1(t, h, ELSA_OFF_CTRL, byte);
|
||||
DELAY(20);
|
||||
byte |= ELSA_CTRL_RESET;
|
||||
bus_space_write_1(t, h, ELSA_OFF_CTRL, byte);
|
||||
|
||||
DELAY(20);
|
||||
bus_space_write_1(t, h, ELSA_OFF_IRQ, 0xff);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* (NISIC > 0) && defined(ELSA_PCC16) */
|
||||
|
|
@ -27,30 +27,18 @@
|
|||
* isic - I4B Siemens ISDN Chipset Driver for ELSA Quickstep 1000pro ISA
|
||||
* =====================================================================
|
||||
*
|
||||
* $Id: i4b_elsa_qs1i.c,v 1.3 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Tue Mar 16 15:42:10 1999]
|
||||
* last edit-date: [Mon Dec 13 21:59:44 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
|
||||
#else
|
||||
|
||||
#define NISIC 1
|
||||
|
||||
#endif
|
||||
|
||||
#define NPNP 1
|
||||
|
||||
/*
|
||||
* this driver works for both the ELSA QuickStep 1000 PNP and the ELSA
|
||||
* PCC-16
|
||||
*/
|
||||
#if (NISIC > 0) && (((NPNP > 0) && defined(ELSA_QS1ISA)) || defined(ELSA_PCC16))
|
||||
#if (NISIC > 0) && defined(ELSA_QS1ISA)
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
|
|
@ -59,27 +47,11 @@
|
|||
#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>
|
||||
|
|
@ -89,12 +61,7 @@
|
|||
#include <i4b/layer1/i4b_isac.h>
|
||||
#include <i4b/layer1/i4b_hscx.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
static void i4b_eq1i_clrirq(void* base);
|
||||
#else
|
||||
static void i4b_eq1i_clrirq(struct isic_softc *sc);
|
||||
void isic_attach_Eqs1pi __P((struct isic_softc *sc));
|
||||
#endif
|
||||
static void i4b_eq1i_clrirq(struct l1_softc *sc);
|
||||
|
||||
/* masks for register encoded in base addr */
|
||||
|
||||
|
|
@ -128,55 +95,23 @@ void isic_attach_Eqs1pi __P((struct isic_softc *sc));
|
|||
/*---------------------------------------------------------------------------*
|
||||
* ELSA QuickStep 1000pro/ISA clear IRQ routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
static void
|
||||
i4b_eq1i_clrirq(void* base)
|
||||
i4b_eq1i_clrirq(struct l1_softc *sc)
|
||||
{
|
||||
outb((u_int)base + ELSA_OFF_IRQ, 0);
|
||||
}
|
||||
|
||||
#else
|
||||
static void
|
||||
i4b_eq1i_clrirq(struct isic_softc *sc)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
bus_space_write_1(t, h, ELSA_OFF_IRQ, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA QuickStep 1000pro/ISA ISAC get fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
eqs1pi_read_fifo(void *buf, const void *base, size_t len)
|
||||
{
|
||||
if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0x40);
|
||||
insb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0);
|
||||
insb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
else /* if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC) */
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0);
|
||||
insb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ISAC), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
eqs1pi_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
||||
eqs1pi_read_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch (what) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0);
|
||||
|
|
@ -193,89 +128,40 @@ eqs1pi_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
|||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA QuickStep 1000pro/ISA ISAC put fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
eqs1pi_write_fifo(void *base, const void *buf, size_t len)
|
||||
eqs1pi_write_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0x40);
|
||||
outsb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0);
|
||||
outsb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
else /* if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC) */
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, 0);
|
||||
outsb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ISAC), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
}
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
eqs1pi_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
switch (what) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0);
|
||||
bus_space_write_multi_1(t, h, ELSA_OFF_ISAC, (u_int8_t*)buf, size);
|
||||
bus_space_write_multi_1(t, h, ELSA_OFF_ISAC, buf, size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0);
|
||||
bus_space_write_multi_1(t, h, ELSA_OFF_HSCX, (u_int8_t*)buf, size);
|
||||
bus_space_write_multi_1(t, h, ELSA_OFF_HSCX, buf, size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, 0x40);
|
||||
bus_space_write_multi_1(t, h, ELSA_OFF_HSCX, (u_int8_t*)buf, size);
|
||||
bus_space_write_multi_1(t, h, ELSA_OFF_HSCX, buf, size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA QuickStep 1000pro/ISA ISAC put register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
eqs1pi_write_reg(u_char *base, u_int offset, u_int v)
|
||||
eqs1pi_write_reg(struct l1_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB)
|
||||
{
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)(offset+0x40));
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX, (u_char)v);
|
||||
}
|
||||
else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA)
|
||||
{
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)offset);
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX, (u_char)v);
|
||||
}
|
||||
else /* if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC) */
|
||||
{
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)offset);
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ISAC, (u_char)v);
|
||||
}
|
||||
}
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
eqs1pi_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
switch (what) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, offs);
|
||||
|
|
@ -291,40 +177,16 @@ eqs1pi_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data
|
|||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA QuickStep 1000pro/ISA ISAC get register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static u_char
|
||||
eqs1pi_read_reg(u_char *base, u_int offset)
|
||||
{
|
||||
if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)(offset+0x40));
|
||||
return(inb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX));
|
||||
}
|
||||
else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)offset);
|
||||
return(inb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_HSCX));
|
||||
}
|
||||
else /* if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC) */
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_OFF, (u_char)offset);
|
||||
return(inb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ISAC));
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static u_int8_t
|
||||
eqs1pi_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
||||
eqs1pi_read_reg(struct l1_softc *sc, int what, bus_size_t offs)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch (what) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_OFF, offs);
|
||||
|
|
@ -339,69 +201,18 @@ eqs1pi_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_probe_Eqs1pi - probe for ELSA QuickStep 1000pro/ISA and compatibles
|
||||
* isic_attach_Eqs1pi - attach for ELSA QuickStep 1000pro/ISA
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_probe_Eqs1pi(struct isa_device *dev, unsigned int iobase2)
|
||||
isic_attach_Eqs1pi(device_t dev)
|
||||
{
|
||||
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 ELSA QuickStep 1000pro/ISA!\n",
|
||||
dev->id_unit, dev->id_unit);
|
||||
return(0);
|
||||
}
|
||||
sc->sc_unit = dev->id_unit;
|
||||
int unit = device_get_unit(dev);
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
/* check IRQ validity */
|
||||
|
||||
switch(ffs(dev->id_irq) - 1)
|
||||
{
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 7:
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
case 15:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for ELSA QuickStep 1000pro/ISA!\n",
|
||||
dev->id_unit, ffs(dev->id_irq)-1);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
sc->sc_irq = dev->id_irq;
|
||||
|
||||
/* check if memory addr specified */
|
||||
|
||||
if(dev->id_maddr)
|
||||
{
|
||||
printf("isic%d: Error, mem addr 0x%lx specified for ELSA QuickStep 1000pro/ISA!\n",
|
||||
dev->id_unit, (u_long)dev->id_maddr);
|
||||
return(0);
|
||||
}
|
||||
dev->id_msize = 0;
|
||||
|
||||
/* check if we got an iobase */
|
||||
|
||||
if(!((dev->id_iobase >= 0x160) && (dev->id_iobase <= 0x360)))
|
||||
{
|
||||
printf("isic%d: Error, invalid iobase 0x%x specified for ELSA QuickStep 1000pro/ISA!\n",
|
||||
dev->id_unit, dev->id_iobase);
|
||||
return(0);
|
||||
}
|
||||
sc->sc_port = dev->id_iobase;
|
||||
u_char byte = ELSA_CTRL_SECRET;
|
||||
|
||||
/* setup access routines */
|
||||
|
||||
|
|
@ -423,61 +234,8 @@ isic_probe_Eqs1pi(struct isa_device *dev, unsigned int iobase2)
|
|||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/* setup ISAC and HSCX base addr */
|
||||
/* enable the card */
|
||||
|
||||
ISAC_BASE = (caddr_t) ((u_int)dev->id_iobase | ELSA_IDISAC);
|
||||
HSCX_A_BASE = (caddr_t) ((u_int)dev->id_iobase | ELSA_IDHSCXA);
|
||||
HSCX_B_BASE = (caddr_t) ((u_int)dev->id_iobase | ELSA_IDHSCXB);
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR. Expected value for the ELSA QuickStep 1000pro
|
||||
* ISA card is 0x05 ( = version 2.1 ) in the least significant bits.
|
||||
*/
|
||||
|
||||
if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) ||
|
||||
((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) )
|
||||
{
|
||||
printf("isic%d: HSCX VSTR test failed for ELSA QuickStep 1000pro/ISA\n",
|
||||
dev->id_unit);
|
||||
printf("isic%d: HSC0: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(0, H_VSTR));
|
||||
printf("isic%d: HSC1: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(1, H_VSTR));
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_s0163P - attach ELSA QuickStep 1000pro/ISA
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_attach_Eqs1pi(struct isa_device *dev, unsigned int iobase2)
|
||||
{
|
||||
u_char byte = ELSA_CTRL_SECRET;
|
||||
|
||||
byte &= ~ELSA_CTRL_RESET;
|
||||
outb(dev->id_iobase + ELSA_OFF_CTRL, byte);
|
||||
DELAY(20);
|
||||
byte |= ELSA_CTRL_RESET;
|
||||
outb(dev->id_iobase + ELSA_OFF_CTRL, byte);
|
||||
|
||||
DELAY(20);
|
||||
outb(dev->id_iobase + ELSA_OFF_IRQ, 0xff);
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
#else /* !__FreeBSD__ */
|
||||
|
||||
void
|
||||
isic_attach_Eqs1pi(struct isic_softc *sc)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
u_char byte = ELSA_CTRL_SECRET;
|
||||
|
||||
byte &= ~ELSA_CTRL_RESET;
|
||||
bus_space_write_1(t, h, ELSA_OFF_CTRL, byte);
|
||||
DELAY(20);
|
||||
|
|
@ -487,27 +245,6 @@ isic_attach_Eqs1pi(struct isic_softc *sc)
|
|||
DELAY(20);
|
||||
bus_space_write_1(t, h, ELSA_OFF_IRQ, 0xff);
|
||||
|
||||
/* setup access routines */
|
||||
|
||||
sc->clearirq = i4b_eq1i_clrirq;
|
||||
sc->readreg = eqs1pi_read_reg;
|
||||
sc->writereg = eqs1pi_write_reg;
|
||||
|
||||
sc->readfifo = eqs1pi_read_fifo;
|
||||
sc->writefifo = eqs1pi_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_ELSAQS1ISA;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* (NISIC > 0) && (NPNP > 0) && defined(ELSA_QS1ISA) */
|
||||
#endif /* (NISIC > 0) && defined(ELSA_QS1ISA) */
|
||||
|
|
|
|||
|
|
@ -24,24 +24,24 @@
|
|||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
* isic - I4B Siemens ISDN Chipset Driver for ELSA Quickstep 1000pro PCI
|
||||
* =====================================================================
|
||||
* isic - I4B Siemens ISDN Chipset Driver for ELSA MicroLink ISDN/PCI
|
||||
* ==================================================================
|
||||
*
|
||||
* $Id: i4b_elsa_qs1p.c,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Wed Mar 10 07:24:32 1999]
|
||||
* last edit-date: [Mon Dec 13 21:59:51 1999]
|
||||
*
|
||||
* Note: ELSA Quickstep 1000pro PCI = ELSA MicroLink ISDN/PCI
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
#include "pci.h"
|
||||
#else
|
||||
#define NISIC 1
|
||||
#endif
|
||||
|
||||
#if (NISIC > 0) && /* (NPCI > 0) && */ defined(ELSA_QS1PCI)
|
||||
#if (NISIC > 0) && (NPCI > 0) && defined(ELSA_QS1PCI)
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
|
|
@ -50,31 +50,19 @@
|
|||
#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>
|
||||
#else
|
||||
#include <machine/bus.h>
|
||||
#include <sys/device.h>
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/rman.h>
|
||||
|
||||
#include <pci/pcireg.h>
|
||||
#include <pci/pcivar.h>
|
||||
|
||||
#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>
|
||||
|
|
@ -85,9 +73,15 @@
|
|||
#include <i4b/layer1/i4b_hscx.h>
|
||||
#include <i4b/layer1/i4b_ipac.h>
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
#include <i4b/layer1/pci_isic.h>
|
||||
#endif
|
||||
#define MEM0_MAPOFF 0
|
||||
#define PORT0_MAPOFF 4
|
||||
#define PORT1_MAPOFF 12
|
||||
|
||||
#define ELSA_PORT0_MAPOFF (PCI_MAP_REG_START+PORT0_MAPOFF)
|
||||
#define ELSA_PORT1_MAPOFF (PCI_MAP_REG_START+PORT1_MAPOFF)
|
||||
|
||||
#define PCI_QS1000_DID 0x1000
|
||||
#define PCI_QS1000_VID 0x1048
|
||||
|
||||
/* masks for register encoded in base addr */
|
||||
|
||||
|
|
@ -106,42 +100,38 @@
|
|||
#define ELSA_OFF_ALE 0x00
|
||||
#define ELSA_OFF_RW 0x01
|
||||
|
||||
#define ELSA_PORT0_MAPOFF PCI_MAPREG_START+4
|
||||
#define ELSA_PORT1_MAPOFF PCI_MAPREG_START+12
|
||||
|
||||
static int eqs1p_pci_probe(device_t dev);
|
||||
static int eqs1p_pci_attach(device_t dev);
|
||||
|
||||
static device_method_t eqs1p_pci_methods[] = {
|
||||
/* Device interface */
|
||||
DEVMETHOD(device_probe, eqs1p_pci_probe),
|
||||
DEVMETHOD(device_attach, eqs1p_pci_attach),
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
static driver_t eqs1p_pci_driver = {
|
||||
"isic",
|
||||
eqs1p_pci_methods,
|
||||
0
|
||||
};
|
||||
|
||||
static devclass_t eqs1p_pci_devclass;
|
||||
|
||||
DRIVER_MODULE(eqs1p, pci, eqs1p_pci_driver, eqs1p_pci_devclass, 0, 0);
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA QuickStep 1000pro/PCI ISAC get fifo routine
|
||||
* ELSA MicroLink ISDN/PCI fifo read routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
eqs1pp_read_fifo(void *buf, const void *base, size_t len)
|
||||
{
|
||||
if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, IPAC_HSCXB_OFF);
|
||||
insb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, IPAC_HSCXA_OFF);
|
||||
insb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
else /* if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC) */
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, IPAC_ISAC_OFF);
|
||||
insb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
eqs1pp_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
||||
eqs1pp_read_fifo(struct l1_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) {
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[1]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[1]);
|
||||
|
||||
switch(what)
|
||||
{
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_ISAC_OFF);
|
||||
bus_space_read_multi_1(t, h, ELSA_OFF_RW, buf, size);
|
||||
|
|
@ -157,41 +147,17 @@ eqs1pp_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
|||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA QuickStep 1000pro/PCI ISAC put fifo routine
|
||||
* ELSA MicroLink ISDN/PCI fifo write routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
eqs1pp_write_fifo(void *base, const void *buf, size_t len)
|
||||
eqs1pp_write_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, IPAC_HSCXB_OFF);
|
||||
outsb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, IPAC_HSCXA_OFF);
|
||||
outsb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
else /* if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC) */
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, IPAC_ISAC_OFF);
|
||||
outsb((((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW), (u_char *)buf, (u_int)len);
|
||||
}
|
||||
}
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[1]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[1]);
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
eqs1pp_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[1].h;
|
||||
switch (what) {
|
||||
switch(what)
|
||||
{
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_ISAC_OFF);
|
||||
bus_space_write_multi_1(t, h, ELSA_OFF_RW, (u_int8_t*)buf, size);
|
||||
|
|
@ -206,46 +172,18 @@ eqs1pp_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size)
|
|||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA QuickStep 1000pro/PCI ISAC put register routine
|
||||
* ELSA MicroLink ISDN/PCI register write routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
eqs1pp_write_reg(u_char *base, u_int offset, u_int v)
|
||||
eqs1pp_write_reg(struct l1_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB)
|
||||
{
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, (u_char)(offset+IPAC_HSCXB_OFF));
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW, (u_char)v);
|
||||
}
|
||||
else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA)
|
||||
{
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, (u_char)(offset+IPAC_HSCXA_OFF));
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW, (u_char)v);
|
||||
}
|
||||
else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC)
|
||||
{
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, (u_char)(offset+IPAC_ISAC_OFF));
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW, (u_char)v);
|
||||
}
|
||||
else /* IPAC */
|
||||
{
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, (u_char)(offset+IPAC_IPAC_OFF));
|
||||
outb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW, (u_char)v);
|
||||
}
|
||||
}
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[1]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[1]);
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
eqs1pp_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[1].h;
|
||||
switch (what) {
|
||||
switch(what)
|
||||
{
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_ISAC_OFF+offs);
|
||||
bus_space_write_1(t, h, ELSA_OFF_RW, data);
|
||||
|
|
@ -264,46 +202,18 @@ eqs1pp_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data
|
|||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ELSA QuickStep 1000pro/PCI ISAC get register routine
|
||||
* ELSA MicroLink ISDN/PCI register read routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static u_char
|
||||
eqs1pp_read_reg(u_char *base, u_int offset)
|
||||
{
|
||||
if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXB)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, (u_char)(offset+IPAC_HSCXB_OFF));
|
||||
return(inb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW));
|
||||
}
|
||||
else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDHSCXA)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, (u_char)(offset+IPAC_HSCXA_OFF));
|
||||
return(inb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW));
|
||||
}
|
||||
else if(((u_int)base & ELSA_OFF_MASK) == ELSA_IDISAC)
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, (u_char)(offset+IPAC_ISAC_OFF));
|
||||
return(inb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW));
|
||||
}
|
||||
else /* IPAC */
|
||||
{
|
||||
outb((u_int)((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_ALE, (u_char)(offset+IPAC_IPAC_OFF));
|
||||
return(inb(((u_int)base & ELSA_BASE_MASK) + ELSA_OFF_RW));
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static u_int8_t
|
||||
eqs1pp_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
||||
eqs1pp_read_reg(struct l1_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) {
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[1]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[1]);
|
||||
|
||||
switch(what)
|
||||
{
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_ISAC_OFF+offs);
|
||||
return bus_space_read_1(t, h, ELSA_OFF_RW);
|
||||
|
|
@ -314,45 +224,90 @@ eqs1pp_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
|||
bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_HSCXB_OFF+offs);
|
||||
return bus_space_read_1(t, h, ELSA_OFF_RW);
|
||||
case ISIC_WHAT_IPAC:
|
||||
{
|
||||
bus_space_write_1(t, h, ELSA_OFF_ALE, IPAC_IPAC_OFF+offs);
|
||||
return bus_space_read_1(t, h, ELSA_OFF_RW);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*
|
||||
* avma1pp_probe - probe for a card
|
||||
*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
eqs1p_pci_probe(device_t dev)
|
||||
{
|
||||
if((pci_get_vendor(dev) == PCI_QS1000_VID) &&
|
||||
(pci_get_device(dev) == PCI_QS1000_DID))
|
||||
{
|
||||
device_set_desc(dev, "ELSA MicroLink ISDN/PCI");
|
||||
return(0);
|
||||
}
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_Eqs1pp - attach for ELSA QuickStep 1000pro/PCI
|
||||
* isic_attach_Eqs1pp - attach for ELSA MicroLink ISDN/PCI
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
int
|
||||
isic_attach_Eqs1pp(int unit, unsigned int iobase1, unsigned int iobase2)
|
||||
static int
|
||||
eqs1p_pci_attach(device_t dev)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[unit];
|
||||
bus_space_tag_t t;
|
||||
bus_space_handle_t h;
|
||||
struct l1_softc *sc;
|
||||
void *ih = 0;
|
||||
int unit = device_get_unit(dev);
|
||||
|
||||
/* check max unit range */
|
||||
|
||||
if(unit >= ISIC_MAXUNIT)
|
||||
{
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for ELSA QuickStep 1000pro/PCI!\n",
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for ELSA MicroLink ISDN/PCI!\n",
|
||||
unit, unit);
|
||||
return(0);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
sc = &l1_sc[unit]; /* get softc */
|
||||
|
||||
sc->sc_unit = unit;
|
||||
|
||||
/* setup iobase */
|
||||
/* get io_base */
|
||||
|
||||
if((iobase2 <= 0) || (iobase2 > 0xffff))
|
||||
sc->sc_resources.io_rid[0] = ELSA_PORT0_MAPOFF;
|
||||
|
||||
if(!(sc->sc_resources.io_base[0] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[0],
|
||||
0UL, ~0UL, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Error, invalid iobase 0x%x specified for ELSA QuickStep 1000pro/PCI!\n",
|
||||
unit, iobase2);
|
||||
return(0);
|
||||
printf("isic%d: Couldn't get first iobase for ELSA MicroLink ISDN/PCI!\n", unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
sc->sc_port = iobase2;
|
||||
|
||||
sc->sc_resources.io_rid[1] = ELSA_PORT1_MAPOFF;
|
||||
|
||||
if(!(sc->sc_resources.io_base[1] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[1],
|
||||
0UL, ~0UL, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Couldn't get second iobase for ELSA MicroLink ISDN/PCI!\n", unit);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
sc->sc_port = rman_get_start(sc->sc_resources.io_base[1]);
|
||||
|
||||
if(!(sc->sc_resources.irq =
|
||||
bus_alloc_resource(dev, SYS_RES_IRQ,
|
||||
&sc->sc_resources.irq_rid,
|
||||
0UL, ~0UL, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not get irq for ELSA MicroLink ISDN/PCI!\n",unit);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
sc->sc_irq = rman_get_start(sc->sc_resources.irq);
|
||||
|
||||
/* setup access routines */
|
||||
|
||||
|
|
@ -375,15 +330,24 @@ isic_attach_Eqs1pp(int unit, unsigned int iobase1, unsigned int iobase2)
|
|||
|
||||
sc->sc_ipac = 1;
|
||||
sc->sc_bfifolen = IPAC_BFIFO_LEN;
|
||||
|
||||
/* setup ISAC and HSCX base addr */
|
||||
|
||||
ISAC_BASE = (caddr_t) ((u_int)iobase2 | ELSA_IDISAC);
|
||||
HSCX_A_BASE = (caddr_t) ((u_int)iobase2 | ELSA_IDHSCXA);
|
||||
HSCX_B_BASE = (caddr_t) ((u_int)iobase2 | ELSA_IDHSCXB);
|
||||
IPAC_BASE = (caddr_t) ((u_int)iobase2 | ELSA_IDIPAC);
|
||||
|
||||
if(isic_attach_common(dev))
|
||||
{
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
if(bus_setup_intr(dev, sc->sc_resources.irq, INTR_TYPE_NET,
|
||||
(void(*)(void*))isicintr,
|
||||
sc, &ih))
|
||||
{
|
||||
printf("isic%d: Couldn't set up irq for ELSA MicroLink ISDN/PCI!\n", unit);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
/* enable hscx/isac irq's */
|
||||
|
||||
IPAC_WRITE(IPAC_MASK, (IPAC_MASK_INT1 | IPAC_MASK_INT0));
|
||||
|
||||
IPAC_WRITE(IPAC_ACFG, 0); /* outputs are open drain */
|
||||
|
|
@ -391,69 +355,12 @@ isic_attach_Eqs1pp(int unit, unsigned int iobase1, unsigned int iobase2)
|
|||
(IPAC_AOE_OE5 | IPAC_AOE_OE4 | IPAC_AOE_OE3 | IPAC_AOE_OE2));
|
||||
IPAC_WRITE(IPAC_ATX, 0xff); /* set all output lines high */
|
||||
|
||||
outb(iobase1 + 0x4c, 0x41); /* enable card interrupt */
|
||||
t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
bus_space_write_1(t, h, 0x4c, 0x41); /* enable card interrupt */
|
||||
|
||||
return (1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
#else /* !FreeBSD */
|
||||
|
||||
void
|
||||
isic_attach_Eqs1pp(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, ELSA_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, ELSA_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 = eqs1pp_read_reg;
|
||||
sc->writereg = eqs1pp_write_reg;
|
||||
|
||||
sc->readfifo = eqs1pp_read_fifo;
|
||||
sc->writefifo = eqs1pp_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_ELSAQS1PCI;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
/* setup chip type = IPAC ! */
|
||||
|
||||
sc->sc_ipac = 1;
|
||||
sc->sc_bfifolen = IPAC_BFIFO_LEN;
|
||||
|
||||
/* 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
|
||||
|
||||
#endif /* (NISIC > 0) && defined(ELSA_QS1PCI) */
|
||||
#endif /* (NISIC > 0) && (NPCI > 0) && defined(ELSA_QS1PCI) */
|
||||
|
|
|
|||
|
|
@ -27,52 +27,33 @@
|
|||
* i4b - Siemens HSCX chip (B-channel) handling
|
||||
* --------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_hscx.c,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Wed Mar 17 11:59:05 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 21:59:58 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include "isic.h"
|
||||
#else
|
||||
#define NISIC 1 /* doesn't matter in non-FreeBSD, config(8) d.t.r.t. */
|
||||
#endif
|
||||
|
||||
#if NISIC > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <machine/stdarg.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#else
|
||||
#ifndef __bsdi__
|
||||
#include <machine/bus.h>
|
||||
#endif
|
||||
#include <sys/device.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <machine/stdarg.h>
|
||||
#include <machine/clock.h>
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/i4b_debug.h>
|
||||
#include <machine/i4b_ioctl.h>
|
||||
#include <machine/i4b_trace.h>
|
||||
#else
|
||||
#include <i4b/i4b_debug.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
#include <i4b/i4b_trace.h>
|
||||
#endif
|
||||
|
||||
#include <i4b/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_isac.h>
|
||||
|
|
@ -86,9 +67,9 @@
|
|||
* HSCX IRQ Handler
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
isic_hscx_irq(register struct isic_softc *sc, u_char ista, int h_chan, u_char ex_irq)
|
||||
isic_hscx_irq(register struct l1_softc *sc, u_char ista, int h_chan, u_char ex_irq)
|
||||
{
|
||||
register isic_Bchan_t *chan = &sc->sc_chan[h_chan];
|
||||
register l1_bchan_state_t *chan = &sc->sc_chan[h_chan];
|
||||
u_char exir = 0;
|
||||
int activity = -1;
|
||||
u_char cmd = 0;
|
||||
|
|
@ -467,9 +448,9 @@ isic_hscx_irq(register struct isic_softc *sc, u_char ista, int h_chan, u_char ex
|
|||
* for raw hdlc: transparent mode 0
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
isic_hscx_init(struct isic_softc *sc, int h_chan, int activate)
|
||||
isic_hscx_init(struct l1_softc *sc, int h_chan, int activate)
|
||||
{
|
||||
isic_Bchan_t *chan = &sc->sc_chan[h_chan];
|
||||
l1_bchan_state_t *chan = &sc->sc_chan[h_chan];
|
||||
|
||||
HSCX_WRITE(h_chan, H_MASK, 0xff); /* mask irq's */
|
||||
|
||||
|
|
@ -634,7 +615,7 @@ isic_hscx_init(struct isic_softc *sc, int h_chan, int activate)
|
|||
* write command to HSCX command register
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
isic_hscx_cmd(struct isic_softc *sc, int h_chan, unsigned char cmd)
|
||||
isic_hscx_cmd(struct l1_softc *sc, int h_chan, unsigned char cmd)
|
||||
{
|
||||
int timeout = 20;
|
||||
|
||||
|
|
@ -656,7 +637,7 @@ isic_hscx_cmd(struct isic_softc *sc, int h_chan, unsigned char cmd)
|
|||
* wait for HSCX transmit FIFO write enable
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
isic_hscx_waitxfw(struct isic_softc *sc, int h_chan)
|
||||
isic_hscx_waitxfw(struct l1_softc *sc, int h_chan)
|
||||
{
|
||||
#define WAITVAL 50
|
||||
#define WAITTO 200
|
||||
|
|
|
|||
|
|
@ -30,15 +30,13 @@
|
|||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_hscx.h,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:26:56 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* -hm added AVM config register defs
|
||||
* -hm split up for rewrite of Siemens chipset driver
|
||||
* last edit-date: [Mon Dec 13 22:00:49 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef I4B_HSCX_H_
|
||||
#define I4B_HSCX_H_
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_ipac.h - definitions for the Siemens IPAC PSB2115 chip
|
||||
* ==========================================================
|
||||
*
|
||||
* $Id: i4b_ipac.h,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Tue Jun 8 09:53:26 1999]
|
||||
* last edit-date: [Mon Dec 13 22:00:58 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -27,55 +27,35 @@
|
|||
* i4b_isac.c - i4b siemens isdn chipset driver ISAC handler
|
||||
* ---------------------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_isac.c,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:27:09 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:01:05 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include "isic.h"
|
||||
#else
|
||||
#define NISIC 1 /* non-FreeBSD handles this via config(8) */
|
||||
#endif
|
||||
|
||||
#if NISIC > 0
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include "opt_i4b.h"
|
||||
#endif
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <machine/stdarg.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#else
|
||||
#ifndef __bsdi__
|
||||
#include <machine/bus.h>
|
||||
#endif
|
||||
#include <sys/device.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <machine/stdarg.h>
|
||||
#include <machine/clock.h>
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/i4b_debug.h>
|
||||
#include <machine/i4b_ioctl.h>
|
||||
#include <machine/i4b_trace.h>
|
||||
#else
|
||||
#include <i4b/i4b_debug.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
#include <i4b/i4b_trace.h>
|
||||
#endif
|
||||
|
||||
#include <i4b/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_isac.h>
|
||||
|
|
@ -85,14 +65,14 @@
|
|||
#include <i4b/include/i4b_l1l2.h>
|
||||
#include <i4b/include/i4b_mbuf.h>
|
||||
|
||||
static u_char isic_isac_exir_hdlr(register struct isic_softc *sc, u_char exir);
|
||||
static void isic_isac_ind_hdlr(register struct isic_softc *sc, int ind);
|
||||
static u_char isic_isac_exir_hdlr(register struct l1_softc *sc, u_char exir);
|
||||
static void isic_isac_ind_hdlr(register struct l1_softc *sc, int ind);
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* ISAC interrupt service routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
isic_isac_irq(struct isic_softc *sc, int ista)
|
||||
isic_isac_irq(struct l1_softc *sc, int ista)
|
||||
{
|
||||
register u_char c = 0;
|
||||
DBGL1(L1_F_MSG, "isic_isac_irq", ("unit %d: ista = 0x%02x\n", sc->sc_unit, ista));
|
||||
|
|
@ -185,10 +165,15 @@ isic_isac_irq(struct isic_softc *sc, int ista)
|
|||
|
||||
c |= ISAC_CMDR_RMC;
|
||||
|
||||
if(sc->sc_enabled)
|
||||
if(sc->sc_enabled &&
|
||||
(ctrl_desc[sc->sc_unit].protocol != PROTOCOL_D64S))
|
||||
{
|
||||
PH_Data_Ind(sc->sc_unit, sc->sc_ibuf);
|
||||
}
|
||||
else
|
||||
i4b_Dfreembuf(sc->sc_ibuf);
|
||||
{
|
||||
i4b_Dfreembuf(sc->sc_ibuf);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -319,7 +304,7 @@ isic_isac_irq(struct isic_softc *sc, int ista)
|
|||
* ISAC L1 Extended IRQ handler
|
||||
*---------------------------------------------------------------------------*/
|
||||
static u_char
|
||||
isic_isac_exir_hdlr(register struct isic_softc *sc, u_char exir)
|
||||
isic_isac_exir_hdlr(register struct l1_softc *sc, u_char exir)
|
||||
{
|
||||
u_char c = 0;
|
||||
|
||||
|
|
@ -380,7 +365,7 @@ isic_isac_exir_hdlr(register struct isic_softc *sc, u_char exir)
|
|||
* ISAC L1 Indication handler
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
isic_isac_ind_hdlr(register struct isic_softc *sc, int ind)
|
||||
isic_isac_ind_hdlr(register struct l1_softc *sc, int ind)
|
||||
{
|
||||
register int event;
|
||||
|
||||
|
|
@ -467,7 +452,7 @@ isic_isac_ind_hdlr(register struct isic_softc *sc, int ind)
|
|||
* execute a layer 1 command
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
isic_isac_l1_cmd(struct isic_softc *sc, int command)
|
||||
isic_isac_l1_cmd(struct l1_softc *sc, int command)
|
||||
{
|
||||
u_char cmd;
|
||||
|
||||
|
|
@ -541,7 +526,7 @@ isic_isac_l1_cmd(struct isic_softc *sc, int command)
|
|||
* L1 ISAC initialization
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_isac_init(struct isic_softc *sc)
|
||||
isic_isac_init(struct l1_softc *sc)
|
||||
{
|
||||
ISAC_IMASK = 0xff; /* disable all irqs */
|
||||
|
||||
|
|
|
|||
|
|
@ -30,14 +30,13 @@
|
|||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_isac.h,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:27:13 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* -hm split up for rewrite of Siemens chipset driver
|
||||
* last edit-date: [Mon Dec 13 22:01:25 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef I4B_ISAC_H_
|
||||
#define I4B_ISAC_H_
|
||||
|
|
|
|||
|
|
@ -27,55 +27,32 @@
|
|||
* i4b_isic.c - global isic stuff
|
||||
* ==============================
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_isic.c,v 1.3 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Mon Jul 26 10:59:56 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:01:33 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
#else
|
||||
#define NISIC 1
|
||||
#endif
|
||||
|
||||
#if NISIC > 0
|
||||
|
||||
#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 <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#else
|
||||
#include <sys/device.h>
|
||||
#if defined(__NetBSD__) && defined(amiga)
|
||||
#include <machine/bus.h>
|
||||
#else
|
||||
#ifndef __bsdi__
|
||||
#include <dev/isa/isavar.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/i4b_debug.h>
|
||||
#include <machine/i4b_ioctl.h>
|
||||
#include <machine/i4b_trace.h>
|
||||
#else
|
||||
#include <i4b/i4b_debug.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
#include <i4b/i4b_trace.h>
|
||||
#endif
|
||||
|
||||
#include <i4b/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_ipac.h>
|
||||
|
|
@ -89,80 +66,30 @@
|
|||
void isic_settrace(int unit, int val);
|
||||
int isic_gettrace(int unit);
|
||||
|
||||
#ifdef __bsdi__
|
||||
static int isicmatch(struct device *parent, struct cfdata *cf, void *aux);
|
||||
static void isicattach(struct device *parent, struct device *self, void *aux);
|
||||
struct cfdriver isiccd =
|
||||
{ NULL, "isic", isicmatch, isicattach, DV_IFNET,
|
||||
sizeof(struct isic_softc) };
|
||||
static char *ISACversion[] = {
|
||||
"2085 Version A1/A2 or 2086/2186 Version 1.1",
|
||||
"2085 Version B1",
|
||||
"2085 Version B2",
|
||||
"2085 Version V2.3 (B3)",
|
||||
"Unknown Version"
|
||||
};
|
||||
|
||||
int isa_isicmatch(struct device *parent, struct cfdata *cf, struct isa_attach_args *);
|
||||
int isapnp_isicmatch(struct device *parent, struct cfdata *cf, struct isa_attach_args *);
|
||||
int isa_isicattach(struct device *parent, struct device *self, struct isa_attach_args *ia);
|
||||
|
||||
static int
|
||||
isicmatch(struct device *parent, struct cfdata *cf, void *aux)
|
||||
{
|
||||
struct isa_attach_args *ia = (struct isa_attach_args *) aux;
|
||||
if (ia->ia_bustype == BUS_PCMCIA) {
|
||||
ia->ia_irq = IRQNONE;
|
||||
/* return 1; Not yet */
|
||||
return 0; /* for now */
|
||||
}
|
||||
if (ia->ia_bustype == BUS_PNP) {
|
||||
return isapnp_isicmatch(parent, cf, ia);
|
||||
}
|
||||
return isa_isicmatch(parent, cf, ia);
|
||||
}
|
||||
|
||||
static void
|
||||
isicattach(struct device *parent, struct device *self, void *aux)
|
||||
{
|
||||
struct isa_attach_args *ia = (struct isa_attach_args *) aux;
|
||||
struct isic_softc *sc = (struct isic_softc *)self;
|
||||
|
||||
sc->sc_flags = sc->sc_dev.dv_flags;
|
||||
isa_isicattach(parent, self, ia);
|
||||
isa_establish(&sc->sc_id, &sc->sc_dev);
|
||||
sc->sc_ih.ih_fun = isicintr;
|
||||
sc->sc_ih.ih_arg = (void *)sc;
|
||||
intr_establish(ia->ia_irq, &sc->sc_ih, DV_NET);
|
||||
/* Could add a shutdown hook here... */
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
void isicintr_sc(struct isic_softc *sc);
|
||||
#if !(defined(__FreeBSD_version)) || (defined(__FreeBSD_version) && __FreeBSD_version >= 300006)
|
||||
void isicintr(int unit);
|
||||
#endif
|
||||
#else
|
||||
/* XXX - hack, going away soon! */
|
||||
struct isic_softc *isic_sc[ISIC_MAXUNIT];
|
||||
#endif
|
||||
static char *HSCXversion[] = {
|
||||
"82525 Version A1",
|
||||
"Unknown (0x01)",
|
||||
"82525 Version A2",
|
||||
"Unknown (0x03)",
|
||||
"82525 Version A3",
|
||||
"82525 or 21525 Version 2.1",
|
||||
"Unknown Version"
|
||||
};
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic - device driver interrupt routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
void
|
||||
isicintr_sc(struct isic_softc *sc)
|
||||
isicintr(struct l1_softc *sc)
|
||||
{
|
||||
isicintr(sc->sc_unit);
|
||||
}
|
||||
|
||||
void
|
||||
isicintr(int unit)
|
||||
{
|
||||
register struct isic_softc *sc = &isic_sc[unit];
|
||||
#else
|
||||
int
|
||||
isicintr(void *arg)
|
||||
{
|
||||
struct isic_softc *sc = arg;
|
||||
#endif
|
||||
|
||||
if(sc->sc_ipac == 0) /* HSCX/ISAC interupt routine */
|
||||
{
|
||||
u_char was_hscx_irq = 0;
|
||||
|
|
@ -210,22 +137,6 @@ isicintr(void *arg)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef NOTDEF
|
||||
|
||||
#if !defined(amiga) && !defined(atari) /* XXX should be: #if INTS_ARE_SHARED */
|
||||
#ifdef ELSA_QS1ISA
|
||||
if(sc->sc_cardtyp != CARD_TYPEP_ELSAQS1ISA)
|
||||
{
|
||||
#endif
|
||||
if((was_hscx_irq == 0) && (was_isac_irq == 0))
|
||||
DBGL1(L1_ERROR, "isicintr", ("WARNING: unit %d, No IRQ from HSCX/ISAC!\n", sc->sc_unit));
|
||||
#ifdef ELSA_QS1ISA
|
||||
}
|
||||
#endif
|
||||
#endif /* !AMIGA && !ATARI */
|
||||
|
||||
#endif /* NOTDEF */
|
||||
|
||||
HSCX_WRITE(0, H_MASK, 0xff);
|
||||
ISAC_WRITE(I_MASK, 0xff);
|
||||
HSCX_WRITE(1, H_MASK, 0xff);
|
||||
|
|
@ -233,8 +144,7 @@ isicintr(void *arg)
|
|||
#ifdef ELSA_QS1ISA
|
||||
DELAY(80);
|
||||
|
||||
if(sc->sc_cardtyp == CARD_TYPEP_ELSAQS1ISA)
|
||||
if (sc->clearirq)
|
||||
if((sc->sc_cardtyp == CARD_TYPEP_ELSAQS1ISA) && (sc->clearirq))
|
||||
{
|
||||
sc->clearirq(sc);
|
||||
}
|
||||
|
|
@ -245,9 +155,6 @@ isicintr(void *arg)
|
|||
HSCX_WRITE(0, H_MASK, HSCX_A_IMASK);
|
||||
ISAC_WRITE(I_MASK, ISAC_IMASK);
|
||||
HSCX_WRITE(1, H_MASK, HSCX_B_IMASK);
|
||||
#ifndef __FreeBSD__
|
||||
return(was_hscx_irq || was_isac_irq);
|
||||
#endif
|
||||
}
|
||||
else /* IPAC interrupt routine */
|
||||
{
|
||||
|
|
@ -295,17 +202,10 @@ isicintr(void *arg)
|
|||
if(!ipac_irq_stat)
|
||||
break;
|
||||
}
|
||||
#ifdef NOTDEF
|
||||
if(was_ipac_irq == 0)
|
||||
DBGL1(L1_ERROR, "isicintr", ("WARNING: unit %d, No IRQ from IPAC!\n", sc->sc_unit));
|
||||
#endif
|
||||
|
||||
IPAC_WRITE(IPAC_MASK, 0xff);
|
||||
DELAY(50);
|
||||
IPAC_WRITE(IPAC_MASK, 0xc0);
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
return(was_ipac_irq);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -315,11 +215,7 @@ isicintr(void *arg)
|
|||
void
|
||||
isic_settrace(int unit, int val)
|
||||
{
|
||||
#ifdef __FreeBSD__
|
||||
struct isic_softc *sc = &isic_sc[unit];
|
||||
#else
|
||||
struct isic_softc *sc = isic_find_sc(unit);
|
||||
#endif
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
sc->sc_trace = val;
|
||||
}
|
||||
|
||||
|
|
@ -329,19 +225,15 @@ isic_settrace(int unit, int val)
|
|||
int
|
||||
isic_gettrace(int unit)
|
||||
{
|
||||
#ifdef __FreeBSD__
|
||||
struct isic_softc *sc = &isic_sc[unit];
|
||||
#else
|
||||
struct isic_softc *sc = isic_find_sc(unit);
|
||||
#endif
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
return(sc->sc_trace);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_recovery - try to recover from irq lockup
|
||||
* isic_recover - try to recover from irq lockup
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
isic_recover(struct isic_softc *sc)
|
||||
isic_recover(struct l1_softc *sc)
|
||||
{
|
||||
u_char byte;
|
||||
|
||||
|
|
@ -396,5 +288,230 @@ isic_recover(struct isic_softc *sc)
|
|||
ISAC_WRITE(I_MASK, ISAC_IMASK);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_common - common attach routine for all busses
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_attach_common(device_t dev)
|
||||
{
|
||||
int ret;
|
||||
char *drvid = NULL;
|
||||
int unit = device_get_unit(dev);
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
|
||||
sc->sc_unit = unit;
|
||||
|
||||
sc->sc_isac_version = 0;
|
||||
sc->sc_hscx_version = 0;
|
||||
|
||||
if(sc->sc_ipac)
|
||||
{
|
||||
ret = IPAC_READ(IPAC_ID);
|
||||
|
||||
switch(ret)
|
||||
{
|
||||
case 0x01:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, IPAC version %d unknown!\n",
|
||||
unit, ret);
|
||||
return ENXIO;
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sc->sc_isac_version = ((ISAC_READ(I_RBCH)) >> 5) & 0x03;
|
||||
|
||||
switch(sc->sc_isac_version)
|
||||
{
|
||||
case ISAC_VA:
|
||||
case ISAC_VB1:
|
||||
case ISAC_VB2:
|
||||
case ISAC_VB3:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, ISAC version %d unknown!\n",
|
||||
unit, sc->sc_isac_version);
|
||||
return ENXIO;
|
||||
break;
|
||||
}
|
||||
|
||||
sc->sc_hscx_version = HSCX_READ(0, H_VSTR) & 0xf;
|
||||
|
||||
switch(sc->sc_hscx_version)
|
||||
{
|
||||
case HSCX_VA1:
|
||||
case HSCX_VA2:
|
||||
case HSCX_VA3:
|
||||
case HSCX_V21:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, HSCX version %d unknown!\n",
|
||||
unit, sc->sc_hscx_version);
|
||||
return ENXIO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
isic_isac_init(sc); /* ISAC setup */
|
||||
|
||||
/* HSCX setup */
|
||||
|
||||
isic_bchannel_setup(sc->sc_unit, HSCX_CH_A, BPROT_NONE, 0);
|
||||
|
||||
isic_bchannel_setup(sc->sc_unit, HSCX_CH_B, BPROT_NONE, 0);
|
||||
|
||||
isic_init_linktab(sc); /* setup linktab */
|
||||
|
||||
sc->sc_trace = TRACE_OFF; /* set trace level */
|
||||
|
||||
sc->sc_state = ISAC_IDLE; /* set state */
|
||||
|
||||
sc->sc_ibuf = NULL; /* input buffering */
|
||||
sc->sc_ib = NULL;
|
||||
sc->sc_ilen = 0;
|
||||
|
||||
sc->sc_obuf = NULL; /* output buffering */
|
||||
sc->sc_op = NULL;
|
||||
sc->sc_ol = 0;
|
||||
sc->sc_freeflag = 0;
|
||||
|
||||
sc->sc_obuf2 = NULL; /* second output buffer */
|
||||
sc->sc_freeflag2 = 0;
|
||||
|
||||
/* timer setup */
|
||||
|
||||
callout_handle_init(&sc->sc_T3_callout);
|
||||
callout_handle_init(&sc->sc_T4_callout);
|
||||
|
||||
/* init higher protocol layers */
|
||||
|
||||
MPH_Status_Ind(sc->sc_unit, STI_ATTACH, sc->sc_cardtyp);
|
||||
|
||||
/* announce manufacturer and card type for ISA cards */
|
||||
|
||||
switch(sc->sc_flags)
|
||||
{
|
||||
case FLAG_TELES_S0_8:
|
||||
drvid = "Teles S0/8 (or compatible)";
|
||||
break;
|
||||
|
||||
case FLAG_TELES_S0_16:
|
||||
drvid = "Teles S0/16 (or compatible)";
|
||||
break;
|
||||
|
||||
case FLAG_TELES_S0_163:
|
||||
drvid = "Teles S0/16.3";
|
||||
break;
|
||||
|
||||
case FLAG_AVM_A1:
|
||||
drvid = "AVM A1 or Fritz!Card Classic";
|
||||
break;
|
||||
|
||||
case FLAG_AVM_A1_PCMCIA:
|
||||
drvid = "AVM Fritz!Card PCMCIA";
|
||||
break;
|
||||
|
||||
case FLAG_USR_ISDN_TA_INT:
|
||||
drvid = "USRobotics Sportster ISDN TA intern";
|
||||
break;
|
||||
|
||||
case FLAG_ITK_IX1:
|
||||
drvid = "ITK ix1 micro";
|
||||
break;
|
||||
|
||||
case FLAG_ELSA_PCC16:
|
||||
drvid = "ELSA MicroLink ISDN/PCC-16";
|
||||
break;
|
||||
|
||||
default:
|
||||
drvid = NULL; /* pnp/pci cards announce themselves */
|
||||
break;
|
||||
}
|
||||
|
||||
if(drvid)
|
||||
printf("isic%d: %s\n", unit, drvid);
|
||||
|
||||
if(bootverbose)
|
||||
{
|
||||
/* announce chip versions */
|
||||
|
||||
if(sc->sc_ipac)
|
||||
{
|
||||
printf("isic%d: IPAC PSB2115 Version 1.1\n", unit);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("isic%d: ISAC %s (IOM-%c)\n",
|
||||
unit,
|
||||
ISACversion[sc->sc_isac_version],
|
||||
sc->sc_bustyp == BUS_TYPE_IOM1 ? '1' : '2');
|
||||
|
||||
printf("isic%d: HSCX %s\n",
|
||||
unit,
|
||||
HSCXversion[sc->sc_hscx_version]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_detach_common - common detach routine for all busses
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
isic_detach_common(device_t dev)
|
||||
{
|
||||
struct l1_softc *sc = &l1_sc[device_get_unit(dev)];
|
||||
int i;
|
||||
|
||||
sc->sc_flags = 0;
|
||||
|
||||
/* free interrupt resources */
|
||||
|
||||
if(sc->sc_resources.irq)
|
||||
{
|
||||
/* tear down interupt handler */
|
||||
bus_teardown_intr(dev, sc->sc_resources.irq,
|
||||
(void(*)(void *))isicintr);
|
||||
|
||||
/* free irq */
|
||||
bus_release_resource(dev, SYS_RES_IRQ,
|
||||
sc->sc_resources.irq_rid,
|
||||
sc->sc_resources.irq);
|
||||
sc->sc_resources.irq_rid = 0;
|
||||
sc->sc_resources.irq = 0;
|
||||
}
|
||||
|
||||
/* free memory resource */
|
||||
|
||||
if(sc->sc_resources.mem)
|
||||
{
|
||||
bus_release_resource(dev,SYS_RES_MEMORY,
|
||||
sc->sc_resources.mem_rid,
|
||||
sc->sc_resources.mem);
|
||||
sc->sc_resources.mem_rid = 0;
|
||||
sc->sc_resources.mem = 0;
|
||||
}
|
||||
|
||||
/* free iobases */
|
||||
|
||||
for(i=0; i < INFO_IO_BASES ; i++)
|
||||
{
|
||||
if(sc->sc_resources.io_base[i])
|
||||
{
|
||||
bus_release_resource(dev, SYS_RES_IOPORT,
|
||||
sc->sc_resources.io_rid[i],
|
||||
sc->sc_resources.io_base[i]);
|
||||
sc->sc_resources.io_rid[i] = 0;
|
||||
sc->sc_resources.io_base[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* NISIC > 0 */
|
||||
|
||||
|
|
|
|||
|
|
@ -27,58 +27,32 @@
|
|||
* i4b_isic_isa.c - ISA bus interface
|
||||
* ==================================
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_isic_isa.c,v 1.4 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Mon Jul 26 10:59:51 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:01:39 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
#elif defined(__bsdi__)
|
||||
#include "isic.h"
|
||||
#else
|
||||
#define NISIC 1
|
||||
#endif
|
||||
|
||||
#if NISIC > 0
|
||||
|
||||
#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 <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#elif defined(__bsdi__)
|
||||
#include <sys/device.h>
|
||||
#include <i386/isa/isavar.h>
|
||||
#else
|
||||
#include <sys/device.h>
|
||||
#if defined(__NetBSD__) && defined(amiga)
|
||||
#include <machine/bus.h>
|
||||
#else
|
||||
#include <dev/isa/isavar.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/i4b_debug.h>
|
||||
#include <machine/i4b_ioctl.h>
|
||||
#include <machine/i4b_trace.h>
|
||||
#else
|
||||
#include <i4b/i4b_debug.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
#include <i4b/i4b_trace.h>
|
||||
#endif
|
||||
|
||||
#include <i4b/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_ipac.h>
|
||||
|
|
@ -89,88 +63,59 @@
|
|||
#include <i4b/include/i4b_mbuf.h>
|
||||
#include <i4b/include/i4b_global.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/resource.h>
|
||||
#include <sys/bus.h>
|
||||
#include <isa/isavar.h>
|
||||
|
||||
#if !(defined(__FreeBSD_version)) || (defined(__FreeBSD_version) && __FreeBSD_version >= 300006)
|
||||
void isicintr ( int unit );
|
||||
#endif
|
||||
struct l1_softc l1_sc[ISIC_MAXUNIT];
|
||||
|
||||
void isicintr_sc(struct isic_softc *sc);
|
||||
static int isic_isa_probe(device_t dev);
|
||||
static int isic_isa_attach(device_t dev);
|
||||
|
||||
static int isicprobe(struct isa_device *dev);
|
||||
int isicattach(struct isa_device *dev);
|
||||
static device_method_t isic_methods[] = {
|
||||
DEVMETHOD(device_probe, isic_isa_probe),
|
||||
DEVMETHOD(device_attach, isic_isa_attach),
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
struct isa_driver isicdriver = {
|
||||
isicprobe,
|
||||
isicattach,
|
||||
static driver_t isic_driver = {
|
||||
"isic",
|
||||
isic_methods,
|
||||
0
|
||||
};
|
||||
|
||||
int next_isic_unit = 0;
|
||||
struct isic_softc isic_sc[ISIC_MAXUNIT];
|
||||
static devclass_t isic_devclass;
|
||||
|
||||
#elif defined(__bsdi__)
|
||||
/* XXX */
|
||||
#else
|
||||
DRIVER_MODULE(isic, isa, isic_driver, isic_devclass, 0, 0);
|
||||
|
||||
#ifdef NetBSD1_3
|
||||
#if NetBSD1_3 < 2
|
||||
struct cfdriver isic_cd = {
|
||||
NULL, "isic", DV_DULL
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined (__OpenBSD__)
|
||||
struct cfdriver isic_cd = {
|
||||
NULL, "isic", DV_DULL
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* parameter and format for message producing e.g. "isic0: " */
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#define ISIC_FMT "isic%d: "
|
||||
#define ISIC_PARM dev->id_unit
|
||||
#define TERMFMT " "
|
||||
#else
|
||||
#define ISIC_FMT "%s: "
|
||||
#define ISIC_PARM sc->sc_dev.dv_xname
|
||||
#define TERMFMT "\n"
|
||||
#endif
|
||||
|
||||
extern void isic_settrace(int unit, int val); /*XXX*/
|
||||
extern int isic_gettrace(int unit); /*XXX*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic - non-pnp device driver probe routine
|
||||
* probe for ISA non-PnP cards
|
||||
*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
isicprobe(struct isa_device *dev)
|
||||
isic_isa_probe(device_t dev)
|
||||
{
|
||||
int ret = 0;
|
||||
int ret = ENXIO;
|
||||
|
||||
if(dev->id_unit != next_isic_unit)
|
||||
{
|
||||
printf("isicprobe: Error: new unit (%d) != next_isic_unit (%d)!\n", dev->id_unit, next_isic_unit);
|
||||
return(0);
|
||||
}
|
||||
|
||||
switch(dev->id_flags)
|
||||
if(isa_get_vendorid(dev)) /* no PnP probes here */
|
||||
return ENXIO;
|
||||
|
||||
switch(device_get_flags(dev))
|
||||
{
|
||||
#ifdef TEL_S0_16
|
||||
case FLAG_TELES_S0_16:
|
||||
ret = isic_probe_s016(dev);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef TEL_S0_8
|
||||
case FLAG_TELES_S0_8:
|
||||
ret = isic_probe_s08(dev);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef TEL_S0_16
|
||||
case FLAG_TELES_S0_16:
|
||||
ret = isic_probe_s016(dev);
|
||||
#ifdef ELSA_PCC16
|
||||
case FLAG_ELSA_PCC16:
|
||||
ret = isic_probe_Epcc16(dev);
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
|
@ -198,578 +143,83 @@ isicprobe(struct isa_device *dev)
|
|||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ELSA_PCC16
|
||||
case FLAG_ELSA_PCC16:
|
||||
ret = isic_probe_Eqs1pi(dev, 0);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
#elif defined(__bsdi__)
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic - pnp device driver probe routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isapnp_isicmatch(struct device *parent, struct cfdata *cf, struct isa_attach_args *ia)
|
||||
{
|
||||
#ifdef DYNALINK
|
||||
if (isapnp_match_dynalink(parent, cf, ia))
|
||||
return 1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic - non-pnp device driver probe routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isa_isicmatch(struct device *parent, struct cfdata *cf, struct isa_attach_args *ia)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
switch(cf->cf_flags)
|
||||
{
|
||||
#ifdef TEL_S0_8
|
||||
case FLAG_TELES_S0_8:
|
||||
ret = isic_probe_s08(parent, cf, ia);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef TEL_S0_16
|
||||
case FLAG_TELES_S0_16:
|
||||
ret = isic_probe_s016(parent, cf, ia);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef TEL_S0_16_3
|
||||
case FLAG_TELES_S0_163:
|
||||
ret = isic_probe_s0163(parent, cf, ia);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef AVM_A1
|
||||
case FLAG_AVM_A1:
|
||||
ret = isic_probe_avma1(parent, cf, ia);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef USR_STI
|
||||
case FLAG_USR_ISDN_TA_INT:
|
||||
ret = isic_probe_usrtai(parent, cf, ia);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ITKIX1
|
||||
case FLAG_ITK_IX1:
|
||||
ret = isic_probe_itkix1(parent, cf, ia);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ELSA_PCC16
|
||||
case FLAG_ELSA_PCC16:
|
||||
ret = isic_probe_Eqs1pi(dev, 0);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
printf("isic%d: probe, unknown flag: %d\n",
|
||||
device_get_unit(dev), device_get_flags(dev));
|
||||
break;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic - device driver probe routine, dummy for NetBSD/OpenBSD
|
||||
* attach for ISA non-PnP cards
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isicprobe(struct isic_attach_args *args)
|
||||
static int
|
||||
isic_isa_attach(device_t dev)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
int ret = ENXIO;
|
||||
|
||||
#endif /* __FreeBSD__ */
|
||||
struct l1_softc *sc = &l1_sc[device_get_unit(dev)];
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic - non-pnp device driver attach routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isicattach(struct isa_device *dev)
|
||||
{
|
||||
return(isic_realattach(dev, 0));
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic - non-pnp and pnp device driver attach routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_realattach(struct isa_device *dev, unsigned int iobase2)
|
||||
|
||||
#elif defined(__bsdi__)
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic - non-pnp device driver attach routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isa_isicattach(struct device *parent, struct device *self, struct isa_attach_args *ia)
|
||||
|
||||
#else /* ! __FreeBSD__ */
|
||||
|
||||
int
|
||||
isicattach(int flags, struct isic_softc *sc)
|
||||
|
||||
#endif /* __FreeBSD__ */
|
||||
{
|
||||
int ret = 0;
|
||||
char *drvid;
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
#define PARM dev
|
||||
#define PARM2 dev, iobase2
|
||||
#define FLAGS dev->id_flags
|
||||
|
||||
#elif defined(__bsdi__)
|
||||
|
||||
struct isic_softc *sc = (struct isic_softc *)self;
|
||||
#define PARM parent, self, ia
|
||||
#define PARM2 parent, self, ia
|
||||
#define FLAGS sc->sc_flags
|
||||
|
||||
#else
|
||||
|
||||
#define PARM sc
|
||||
#define PARM2 sc
|
||||
#define FLAGS flags
|
||||
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
static char *ISACversion[] = {
|
||||
"2085 Version A1/A2 or 2086/2186 Version 1.1",
|
||||
"2085 Version B1",
|
||||
"2085 Version B2",
|
||||
"2085 Version V2.3 (B3)",
|
||||
"Unknown Version"
|
||||
};
|
||||
|
||||
static char *HSCXversion[] = {
|
||||
"82525 Version A1",
|
||||
"Unknown (0x01)",
|
||||
"82525 Version A2",
|
||||
"Unknown (0x03)",
|
||||
"82525 Version A3",
|
||||
"82525 or 21525 Version 2.1",
|
||||
"Unknown Version"
|
||||
};
|
||||
|
||||
/* done in bus specific attach code for other OS */
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
if(dev->id_unit != next_isic_unit)
|
||||
{
|
||||
/*XXX*/ printf("isicattach: Error: new unit (%d) != next_isic_unit (%d)!\n", dev->id_unit, next_isic_unit);
|
||||
return(0);
|
||||
}
|
||||
|
||||
sc->sc_unit = dev->id_unit;
|
||||
#else
|
||||
isic_sc[sc->sc_unit] = sc;
|
||||
#endif
|
||||
sc->sc_unit = device_get_unit(dev);
|
||||
|
||||
/* card dependent setup */
|
||||
switch(FLAGS)
|
||||
|
||||
switch(sc->sc_flags)
|
||||
{
|
||||
#ifdef DYNALINK
|
||||
case FLAG_DYNALINK:
|
||||
ret = isic_attach_Dyn(PARM2);
|
||||
#ifdef TEL_S0_16
|
||||
case FLAG_TELES_S0_16:
|
||||
ret = isic_attach_s016(dev);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef TEL_S0_8
|
||||
case FLAG_TELES_S0_8:
|
||||
ret = isic_attach_s08(PARM);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef TEL_S0_16
|
||||
case FLAG_TELES_S0_16:
|
||||
ret = isic_attach_s016(PARM);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef TEL_S0_16_3
|
||||
case FLAG_TELES_S0_163:
|
||||
ret = isic_attach_s0163(PARM);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef AVM_A1
|
||||
case FLAG_AVM_A1:
|
||||
ret = isic_attach_avma1(PARM);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef USR_STI
|
||||
case FLAG_USR_ISDN_TA_INT:
|
||||
ret = isic_attach_usrtai(PARM);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ITKIX1
|
||||
case FLAG_ITK_IX1:
|
||||
ret = isic_attach_itkix1(PARM);
|
||||
ret = isic_attach_s08(dev);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ELSA_PCC16
|
||||
case FLAG_ELSA_PCC16:
|
||||
ret = isic_attach_Eqs1pi(dev, 0);
|
||||
ret = isic_attach_Epcc16(dev);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef amiga
|
||||
case FLAG_BLMASTER:
|
||||
ret = 1; /* full detection was done in caller */
|
||||
break;
|
||||
#endif
|
||||
|
||||
/* ======================================================================
|
||||
* Only P&P cards follow below!!!
|
||||
*/
|
||||
|
||||
#ifdef __FreeBSD__ /* we've already splitted all non-ISA stuff
|
||||
out of this ISA specific part for the other
|
||||
OS */
|
||||
|
||||
#ifdef AVM_A1_PCMCIA
|
||||
case FLAG_AVM_A1_PCMCIA:
|
||||
ret = isic_attach_fritzpcmcia(PARM);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef TEL_S0_16_3_P
|
||||
case FLAG_TELES_S0_163_PnP:
|
||||
ret = isic_attach_s0163P(PARM2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CRTX_S0_P
|
||||
case FLAG_CREATIX_S0_PnP:
|
||||
ret = isic_attach_Cs0P(PARM2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef DRN_NGO
|
||||
case FLAG_DRN_NGO:
|
||||
ret = isic_attach_drnngo(PARM2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef SEDLBAUER
|
||||
case FLAG_SWS:
|
||||
ret = isic_attach_sws(PARM);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ELSA_QS1ISA
|
||||
case FLAG_ELSA_QS1P_ISA:
|
||||
ret = isic_attach_Eqs1pi(PARM2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef AVM_PNP
|
||||
case FLAG_AVM_PNP:
|
||||
ret = isic_attach_avm_pnp(PARM2);
|
||||
ret = 0;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef SIEMENS_ISURF2
|
||||
case FLAG_SIEMENS_ISURF2:
|
||||
ret = isic_attach_siemens_isurf(PARM2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ASUSCOM_IPAC
|
||||
case FLAG_ASUSCOM_IPAC:
|
||||
ret = isic_attach_asi(PARM2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#endif /* __FreeBSD__ / P&P specific part */
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if(ret == 0)
|
||||
return(0);
|
||||
|
||||
if(sc->sc_ipac)
|
||||
{
|
||||
ret = IPAC_READ(IPAC_ID);
|
||||
|
||||
if(ret != IPAC_V11)
|
||||
{
|
||||
printf("isic%d: Error, IPAC version %d unknown!\n",
|
||||
sc->sc_unit, ret);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
sc->sc_isac_version = 0;
|
||||
sc->sc_hscx_version = 0;
|
||||
|
||||
if(sc->sc_ipac)
|
||||
{
|
||||
ret = IPAC_READ(IPAC_ID);
|
||||
|
||||
switch(ret)
|
||||
{
|
||||
case 0x01:
|
||||
printf("isic%d: IPAC PSB2115 Version 1.1\n", sc->sc_unit);
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, IPAC version %d unknown!\n",
|
||||
sc->sc_unit, ret);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sc->sc_isac_version = ((ISAC_READ(I_RBCH)) >> 5) & 0x03;
|
||||
|
||||
switch(sc->sc_isac_version)
|
||||
{
|
||||
case ISAC_VA:
|
||||
case ISAC_VB1:
|
||||
case ISAC_VB2:
|
||||
case ISAC_VB3:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf(ISIC_FMT "Error, ISAC version %d unknown!\n",
|
||||
ISIC_PARM, sc->sc_isac_version);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
|
||||
sc->sc_hscx_version = HSCX_READ(0, H_VSTR) & 0xf;
|
||||
|
||||
switch(sc->sc_hscx_version)
|
||||
{
|
||||
case HSCX_VA1:
|
||||
case HSCX_VA2:
|
||||
case HSCX_VA3:
|
||||
case HSCX_V21:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf(ISIC_FMT "Error, HSCX version %d unknown!\n",
|
||||
ISIC_PARM, sc->sc_hscx_version);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ISAC setup */
|
||||
|
||||
isic_isac_init(sc);
|
||||
|
||||
/* HSCX setup */
|
||||
|
||||
isic_bchannel_setup(sc->sc_unit, HSCX_CH_A, BPROT_NONE, 0);
|
||||
|
||||
isic_bchannel_setup(sc->sc_unit, HSCX_CH_B, BPROT_NONE, 0);
|
||||
|
||||
/* setup linktab */
|
||||
|
||||
isic_init_linktab(sc);
|
||||
|
||||
/* set trace level */
|
||||
|
||||
sc->sc_trace = TRACE_OFF;
|
||||
|
||||
sc->sc_state = ISAC_IDLE;
|
||||
|
||||
sc->sc_ibuf = NULL;
|
||||
sc->sc_ib = NULL;
|
||||
sc->sc_ilen = 0;
|
||||
|
||||
sc->sc_obuf = NULL;
|
||||
sc->sc_op = NULL;
|
||||
sc->sc_ol = 0;
|
||||
sc->sc_freeflag = 0;
|
||||
|
||||
sc->sc_obuf2 = NULL;
|
||||
sc->sc_freeflag2 = 0;
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >=3
|
||||
callout_handle_init(&sc->sc_T3_callout);
|
||||
callout_handle_init(&sc->sc_T4_callout);
|
||||
#endif
|
||||
|
||||
/* init higher protocol layers */
|
||||
|
||||
MPH_Status_Ind(sc->sc_unit, STI_ATTACH, sc->sc_cardtyp);
|
||||
|
||||
/* announce manufacturer and card type */
|
||||
|
||||
switch(FLAGS)
|
||||
{
|
||||
case FLAG_TELES_S0_8:
|
||||
drvid = "Teles S0/8 or Niccy 1008";
|
||||
break;
|
||||
|
||||
case FLAG_TELES_S0_16:
|
||||
drvid = "Teles S0/16, Creatix ISDN S0-16 or Niccy 1016";
|
||||
break;
|
||||
|
||||
#ifdef TEL_S0_16_3
|
||||
case FLAG_TELES_S0_163:
|
||||
drvid = "Teles S0/16.3";
|
||||
ret = isic_attach_s0163(dev);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef AVM_A1
|
||||
case FLAG_AVM_A1:
|
||||
drvid = "AVM A1 or AVM Fritz!Card";
|
||||
break;
|
||||
|
||||
case FLAG_AVM_A1_PCMCIA:
|
||||
drvid = "AVM PCMCIA Fritz!Card";
|
||||
break;
|
||||
|
||||
case FLAG_TELES_S0_163_PnP:
|
||||
drvid = "Teles S0/PnP";
|
||||
break;
|
||||
|
||||
case FLAG_CREATIX_S0_PnP:
|
||||
drvid = "Creatix ISDN S0-16 P&P";
|
||||
ret = isic_attach_avma1(dev);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef USR_STI
|
||||
case FLAG_USR_ISDN_TA_INT:
|
||||
drvid = "USRobotics Sportster ISDN TA intern";
|
||||
break;
|
||||
|
||||
case FLAG_DRN_NGO:
|
||||
drvid = "Dr. Neuhaus NICCY Go@";
|
||||
break;
|
||||
|
||||
case FLAG_DYNALINK:
|
||||
drvid = "Dynalink IS64PH";
|
||||
break;
|
||||
|
||||
case FLAG_SWS:
|
||||
drvid = "Sedlbauer WinSpeed";
|
||||
break;
|
||||
|
||||
case FLAG_BLMASTER:
|
||||
/* board announcement was done by caller */
|
||||
drvid = (char *)0;
|
||||
break;
|
||||
|
||||
case FLAG_ELSA_QS1P_ISA:
|
||||
drvid = "ELSA QuickStep 1000pro (ISA)";
|
||||
ret = isic_attach_usrtai(dev);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ITKIX1
|
||||
case FLAG_ITK_IX1:
|
||||
drvid = "ITK ix1 micro";
|
||||
break;
|
||||
|
||||
case FLAG_ELSA_PCC16:
|
||||
drvid = "ELSA PCC-16";
|
||||
break;
|
||||
|
||||
case FLAG_ASUSCOM_IPAC:
|
||||
drvid = "Asuscom ISDNlink 128K PnP";
|
||||
break;
|
||||
|
||||
case FLAG_SIEMENS_ISURF2:
|
||||
drvid = "Siemens I-Surf 2.0";
|
||||
ret = isic_attach_itkix1(dev);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
drvid = "ERROR, unknown flag used";
|
||||
printf("isic%d: attach, unknown flag: %d\n",
|
||||
device_get_unit(dev), device_get_flags(dev));
|
||||
break;
|
||||
}
|
||||
#ifndef __FreeBSD__
|
||||
printf("\n");
|
||||
#endif
|
||||
if (drvid)
|
||||
printf(ISIC_FMT "%s\n", ISIC_PARM, drvid);
|
||||
|
||||
/* announce chip versions */
|
||||
|
||||
if(sc->sc_ipac)
|
||||
{
|
||||
printf(ISIC_FMT "IPAC PSB2115 Version 1.1\n", ISIC_PARM);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(sc->sc_isac_version >= ISAC_UNKN)
|
||||
{
|
||||
printf(ISIC_FMT "ISAC Version UNKNOWN (VN=0x%x)" TERMFMT,
|
||||
ISIC_PARM,
|
||||
sc->sc_isac_version);
|
||||
sc->sc_isac_version = ISAC_UNKN;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf(ISIC_FMT "ISAC %s (IOM-%c)" TERMFMT,
|
||||
ISIC_PARM,
|
||||
ISACversion[sc->sc_isac_version],
|
||||
sc->sc_bustyp == BUS_TYPE_IOM1 ? '1' : '2');
|
||||
}
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
printf("(Addr=0x%lx)\n", (u_long)ISAC_BASE);
|
||||
#endif
|
||||
if(ret)
|
||||
return(ret);
|
||||
|
||||
if(sc->sc_hscx_version >= HSCX_UNKN)
|
||||
{
|
||||
printf(ISIC_FMT "HSCX Version UNKNOWN (VN=0x%x)" TERMFMT,
|
||||
ISIC_PARM,
|
||||
sc->sc_hscx_version);
|
||||
sc->sc_hscx_version = HSCX_UNKN;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf(ISIC_FMT "HSCX %s" TERMFMT,
|
||||
ISIC_PARM,
|
||||
HSCXversion[sc->sc_hscx_version]);
|
||||
}
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
printf("(AddrA=0x%lx, AddrB=0x%lx)\n", (u_long)HSCX_A_BASE, (u_long)HSCX_B_BASE);
|
||||
ret = isic_attach_common(dev);
|
||||
|
||||
#endif /* __FreeBSD__ */
|
||||
}
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
next_isic_unit++;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300003
|
||||
|
||||
/* set the interrupt handler - no need to change isa_device.h */
|
||||
dev->id_intr = (inthand2_t *)isicintr;
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
return(1);
|
||||
#undef PARM
|
||||
#undef FLAGS
|
||||
return(ret);
|
||||
}
|
||||
|
||||
#endif /* NISIC > 0 */
|
||||
|
|
|
|||
|
|
@ -1,477 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
* i4b_isic_pci.c - PCI bus interface
|
||||
* ==================================
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Wed Apr 21 09:57:37 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "isic.h"
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include "opt_i4b.h"
|
||||
#include "pci.h"
|
||||
#endif
|
||||
|
||||
#if (NISIC > 0) && (NPCI > 0)
|
||||
|
||||
#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 <pci/pcireg.h>
|
||||
#include <pci/pcivar.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_ipac.h>
|
||||
#include <i4b/layer1/i4b_isac.h>
|
||||
#include <i4b/layer1/i4b_hscx.h>
|
||||
|
||||
#define PCI_QS1000_ID 0x10001048
|
||||
#define PCI_AVMA1_ID 0x0a001244
|
||||
|
||||
#define MEM0_MAPOFF 0
|
||||
#define PORT0_MAPOFF 4
|
||||
#define PORT1_MAPOFF 12
|
||||
|
||||
static const char *i4b_pci_probe(pcici_t tag, pcidi_t type);
|
||||
static void i4b_pci_attach(pcici_t config_id, int unit);
|
||||
static int isic_pciattach(int unit, u_long type, u_int iobase1, u_int iobase2);
|
||||
|
||||
static u_long i4b_pci_count = 0;
|
||||
|
||||
static struct pci_device i4b_pci_driver = {
|
||||
"isic",
|
||||
i4b_pci_probe,
|
||||
i4b_pci_attach,
|
||||
&i4b_pci_count,
|
||||
NULL
|
||||
};
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 400004
|
||||
#ifndef COMPAT_PCI_DRIVER
|
||||
DATA_SET (pcidevice_set, i4b_pci_driver);
|
||||
#else
|
||||
COMPAT_PCI_DRIVER (isic_pci, i4b_pci_driver);
|
||||
#endif /* COMPAT_PCI_DRIVER */
|
||||
#else /* __FreeBSD_version >= 400004 */
|
||||
DATA_SET (pcidevice_set, i4b_pci_driver);
|
||||
#endif /* __FreeBSD_version >= 400004 */
|
||||
|
||||
static void isic_pci_intr_sc(struct isic_softc *sc);
|
||||
|
||||
#ifdef AVM_A1_PCI
|
||||
extern void avma1pp_map_int(pcici_t, void *, unsigned *);
|
||||
#endif
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* PCI probe routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static const char *
|
||||
i4b_pci_probe(pcici_t tag, pcidi_t type)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case PCI_QS1000_ID:
|
||||
return("ELSA QuickStep 1000pro PCI ISDN adapter");
|
||||
|
||||
case PCI_AVMA1_ID:
|
||||
return("AVM Fritz!Card PCI ISDN adapter");
|
||||
|
||||
default:
|
||||
if(bootverbose)
|
||||
printf("i4b_pci_probe: unknown PCI type %ul!\n", (u_int)type);
|
||||
return(NULL);
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* PCI attach routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
i4b_pci_attach(pcici_t config_id, int unit)
|
||||
{
|
||||
unsigned short iobase1;
|
||||
unsigned short iobase2;
|
||||
unsigned long type;
|
||||
struct isic_softc *sc = &isic_sc[unit];
|
||||
u_long reg1, reg2;
|
||||
|
||||
if(unit != next_isic_unit)
|
||||
{
|
||||
printf("i4b_pci_attach: Error: new unit (%d) != next_isic_unit (%d)!\n", unit, next_isic_unit);
|
||||
return;
|
||||
}
|
||||
|
||||
/* IMHO all the following should be done in the low-level driver - GJ */
|
||||
type = pci_conf_read(config_id, PCI_ID_REG);
|
||||
|
||||
/* not all cards have their ports at the same location !!! */
|
||||
switch(type)
|
||||
{
|
||||
case PCI_QS1000_ID:
|
||||
reg1 = PCI_MAP_REG_START+PORT0_MAPOFF;
|
||||
reg2 = PCI_MAP_REG_START+PORT1_MAPOFF;
|
||||
break;
|
||||
|
||||
case PCI_AVMA1_ID:
|
||||
reg1 = PCI_MAP_REG_START+PORT0_MAPOFF;
|
||||
reg2 = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
reg1 = PCI_MAP_REG_START+PORT0_MAPOFF;
|
||||
reg2 = PCI_MAP_REG_START+PORT1_MAPOFF;
|
||||
break;
|
||||
}
|
||||
|
||||
if(reg1 && !(pci_map_port(config_id, reg1, &iobase1)))
|
||||
{
|
||||
printf("i4b_pci_attach: pci_map_port 1 failed!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if(reg2 && !(pci_map_port(config_id, reg2, &iobase2)))
|
||||
{
|
||||
printf("i4b_pci_attach: pci_map_port 2 failed!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if(bootverbose)
|
||||
printf("i4b_pci_attach: unit %d, port0 0x%x, port1 0x%x\n", unit, iobase1, iobase2);
|
||||
|
||||
if((isic_pciattach(unit, type, iobase1, iobase2)) == 0)
|
||||
return;
|
||||
|
||||
#ifdef AVM_A1_PCI
|
||||
/* the AVM FRTIZ!PCI needs to handle its own interrupts */
|
||||
if (type == PCI_AVMA1_ID)
|
||||
{
|
||||
avma1pp_map_int(config_id, (void *)sc, &net_imask);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* seems like this should be done before the attach in case it fails */
|
||||
if(!(pci_map_int(config_id, (void *)isic_pci_intr_sc, (void *)sc, &net_imask)))
|
||||
return;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic - pci device driver attach routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
isic_pciattach(int unit, u_long type, u_int iobase1, u_int iobase2)
|
||||
{
|
||||
int ret = 0;
|
||||
struct isic_softc *sc = &isic_sc[unit];
|
||||
|
||||
static char *ISACversion[] = {
|
||||
"2085 Version A1/A2 or 2086/2186 Version 1.1",
|
||||
"2085 Version B1",
|
||||
"2085 Version B2",
|
||||
"2085 Version V2.3 (B3)",
|
||||
"Unknown Version"
|
||||
};
|
||||
|
||||
static char *HSCXversion[] = {
|
||||
"82525 Version A1",
|
||||
"Unknown (0x01)",
|
||||
"82525 Version A2",
|
||||
"Unknown (0x03)",
|
||||
"82525 Version A3",
|
||||
"82525 or 21525 Version 2.1",
|
||||
"Unknown Version"
|
||||
};
|
||||
|
||||
switch(type)
|
||||
{
|
||||
#ifdef ELSA_QS1PCI
|
||||
case PCI_QS1000_ID:
|
||||
ret = isic_attach_Eqs1pp(unit, iobase1, iobase2);
|
||||
break;
|
||||
#endif
|
||||
#ifdef AVM_A1_PCI
|
||||
case PCI_AVMA1_ID:
|
||||
ret = isic_attach_avma1pp(unit, iobase1, iobase2);
|
||||
if (ret)
|
||||
next_isic_unit++;
|
||||
return(ret);
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if(ret == 0)
|
||||
return(ret);
|
||||
|
||||
sc->sc_isac_version = 0;
|
||||
sc->sc_hscx_version = 0;
|
||||
|
||||
sc->sc_unit = unit;
|
||||
|
||||
if(sc->sc_ipac)
|
||||
{
|
||||
ret = IPAC_READ(IPAC_ID);
|
||||
|
||||
switch(ret)
|
||||
{
|
||||
case 0x01:
|
||||
printf("isic%d: IPAC PSB2115 Version 1.1\n", unit);
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, IPAC version %d unknown!\n",
|
||||
unit, ret);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sc->sc_isac_version = ((ISAC_READ(I_RBCH)) >> 5) & 0x03;
|
||||
|
||||
switch(sc->sc_isac_version)
|
||||
{
|
||||
case ISAC_VA:
|
||||
case ISAC_VB1:
|
||||
case ISAC_VB2:
|
||||
case ISAC_VB3:
|
||||
printf("isic%d: ISAC %s (IOM-%c)\n",
|
||||
unit,
|
||||
ISACversion[sc->sc_isac_version],
|
||||
sc->sc_bustyp == BUS_TYPE_IOM1 ? '1' : '2');
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, ISAC version %d unknown!\n",
|
||||
unit, sc->sc_isac_version);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
|
||||
sc->sc_hscx_version = HSCX_READ(0, H_VSTR) & 0xf;
|
||||
|
||||
switch(sc->sc_hscx_version)
|
||||
{
|
||||
case HSCX_VA1:
|
||||
case HSCX_VA2:
|
||||
case HSCX_VA3:
|
||||
case HSCX_V21:
|
||||
printf("isic%d: HSCX %s\n",
|
||||
unit,
|
||||
HSCXversion[sc->sc_hscx_version]);
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, HSCX version %d unknown!\n",
|
||||
unit, sc->sc_hscx_version);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* ISAC setup */
|
||||
|
||||
isic_isac_init(sc);
|
||||
|
||||
/* HSCX setup */
|
||||
|
||||
isic_bchannel_setup(sc->sc_unit, HSCX_CH_A, BPROT_NONE, 0);
|
||||
|
||||
isic_bchannel_setup(sc->sc_unit, HSCX_CH_B, BPROT_NONE, 0);
|
||||
|
||||
/* setup linktab */
|
||||
|
||||
isic_init_linktab(sc);
|
||||
|
||||
/* set trace level */
|
||||
|
||||
sc->sc_trace = TRACE_OFF;
|
||||
|
||||
sc->sc_state = ISAC_IDLE;
|
||||
|
||||
sc->sc_ibuf = NULL;
|
||||
sc->sc_ib = NULL;
|
||||
sc->sc_ilen = 0;
|
||||
|
||||
sc->sc_obuf = NULL;
|
||||
sc->sc_op = NULL;
|
||||
sc->sc_ol = 0;
|
||||
sc->sc_freeflag = 0;
|
||||
|
||||
sc->sc_obuf2 = NULL;
|
||||
sc->sc_freeflag2 = 0;
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >=3
|
||||
callout_handle_init(&sc->sc_T3_callout);
|
||||
callout_handle_init(&sc->sc_T4_callout);
|
||||
#endif
|
||||
|
||||
/* init higher protocol layers */
|
||||
|
||||
MPH_Status_Ind(sc->sc_unit, STI_ATTACH, sc->sc_cardtyp);
|
||||
|
||||
next_isic_unit++;
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic - PCI device driver interrupt routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
isic_pci_intr_sc(struct isic_softc *sc)
|
||||
{
|
||||
if(sc->sc_ipac == 0) /* HSCX/ISAC interupt routine */
|
||||
{
|
||||
register u_char hscx_irq_stat;
|
||||
register u_char isac_irq_stat;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
/* get hscx irq status from hscx b ista */
|
||||
hscx_irq_stat =
|
||||
HSCX_READ(HSCX_CH_B, H_ISTA) & ~HSCX_B_IMASK;
|
||||
|
||||
/* get isac irq status */
|
||||
isac_irq_stat = ISAC_READ(I_ISTA);
|
||||
|
||||
/* do as long as there are pending irqs in the chips */
|
||||
if(!hscx_irq_stat && !isac_irq_stat)
|
||||
break;
|
||||
|
||||
if(hscx_irq_stat & (HSCX_ISTA_RME | HSCX_ISTA_RPF |
|
||||
HSCX_ISTA_RSC | HSCX_ISTA_XPR |
|
||||
HSCX_ISTA_TIN | HSCX_ISTA_EXB))
|
||||
{
|
||||
isic_hscx_irq(sc, hscx_irq_stat,
|
||||
HSCX_CH_B,
|
||||
hscx_irq_stat & HSCX_ISTA_EXB);
|
||||
}
|
||||
|
||||
if(hscx_irq_stat & (HSCX_ISTA_ICA | HSCX_ISTA_EXA))
|
||||
{
|
||||
isic_hscx_irq(sc,
|
||||
HSCX_READ(HSCX_CH_A, H_ISTA) & ~HSCX_A_IMASK,
|
||||
HSCX_CH_A,
|
||||
hscx_irq_stat & HSCX_ISTA_EXA);
|
||||
}
|
||||
|
||||
if(isac_irq_stat)
|
||||
{ /* isac handler */
|
||||
isic_isac_irq(sc, isac_irq_stat);
|
||||
}
|
||||
}
|
||||
|
||||
HSCX_WRITE(0, H_MASK, 0xff);
|
||||
ISAC_WRITE(I_MASK, 0xff);
|
||||
HSCX_WRITE(1, H_MASK, 0xff);
|
||||
|
||||
DELAY(100);
|
||||
|
||||
HSCX_WRITE(0, H_MASK, HSCX_A_IMASK);
|
||||
ISAC_WRITE(I_MASK, ISAC_IMASK);
|
||||
HSCX_WRITE(1, H_MASK, HSCX_B_IMASK);
|
||||
}
|
||||
else /* IPAC interrupt routine */
|
||||
{
|
||||
register u_char ipac_irq_stat;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
/* get global irq status */
|
||||
|
||||
ipac_irq_stat = (IPAC_READ(IPAC_ISTA)) & 0x3f;
|
||||
|
||||
/* do as long as there are pending irqs in the chip */
|
||||
if(!ipac_irq_stat)
|
||||
break;
|
||||
|
||||
/* check hscx a */
|
||||
|
||||
if(ipac_irq_stat & (IPAC_ISTA_ICA | IPAC_ISTA_EXA))
|
||||
{
|
||||
/* HSCX A interrupt */
|
||||
isic_hscx_irq(sc, HSCX_READ(HSCX_CH_A, H_ISTA),
|
||||
HSCX_CH_A,
|
||||
ipac_irq_stat & IPAC_ISTA_EXA);
|
||||
}
|
||||
if(ipac_irq_stat & (IPAC_ISTA_ICB | IPAC_ISTA_EXB))
|
||||
{
|
||||
/* HSCX B interrupt */
|
||||
isic_hscx_irq(sc, HSCX_READ(HSCX_CH_B, H_ISTA),
|
||||
HSCX_CH_B,
|
||||
ipac_irq_stat & IPAC_ISTA_EXB);
|
||||
}
|
||||
if(ipac_irq_stat & (IPAC_ISTA_ICD | IPAC_ISTA_EXD))
|
||||
{
|
||||
/* ISAC interrupt */
|
||||
isic_isac_irq(sc, ISAC_READ(I_ISTA));
|
||||
}
|
||||
}
|
||||
|
||||
IPAC_WRITE(IPAC_MASK, 0xff);
|
||||
DELAY(50);
|
||||
IPAC_WRITE(IPAC_MASK, 0xc0);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* (NISIC > 0) && (NPCI > 0) */
|
||||
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 1998 Eivind Eklund. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 1998 German Tischler. All rights reserved.
|
||||
* Copyright (c) 1998, 1999 German Tischler. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 1998, 1999 Hellmuth Michaelis. All rights reserved.
|
||||
*
|
||||
|
|
@ -37,24 +37,18 @@
|
|||
* i4b_isic_pnp.c - i4b pnp support
|
||||
* --------------------------------
|
||||
*
|
||||
* $Id: i4b_isic_pnp.c,v 1.5 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Jul 5 15:57:01 1999]
|
||||
* last edit-date: [Mon Dec 13 22:01:48 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#define NPNP 1
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
|
||||
#if NPNP > 0
|
||||
#warning "Fix i4b pnp!"
|
||||
#undef NPNP
|
||||
#endif
|
||||
|
||||
#if (NISIC > 0) && (NPNP > 0)
|
||||
#if (NISIC > 0)
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
|
|
@ -62,25 +56,14 @@
|
|||
#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ < 3
|
||||
#include "ioconf.h"
|
||||
extern void isicintr(int unit); /* XXX this gives a compiler warning */
|
||||
/* on one 2.2.7 machine but no */
|
||||
/* warning on another one !? (-hm) */
|
||||
#endif
|
||||
|
||||
#if (defined(__FreeBSD_version) && __FreeBSD_version >= 300006)
|
||||
extern void isicintr(int unit);
|
||||
#endif
|
||||
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
/* #include <i386/isa/pnp.h> */
|
||||
|
||||
#include <i4b/include/i4b_global.h>
|
||||
#include <machine/i4b_ioctl.h>
|
||||
#include <i4b/layer1/i4b_l1.h>
|
||||
|
||||
#include <isa/isavar.h>
|
||||
|
||||
#define VID_TEL163PNP 0x10212750 /* Teles 16.3 PnP */
|
||||
#define VID_CREATIXPP 0x0000980e /* Creatix S0/16 P+P */
|
||||
#define VID_DYNALINK 0x88167506 /* Dynalink */
|
||||
|
|
@ -92,53 +75,73 @@ extern void isicintr(int unit);
|
|||
#define VID_SIESURF2 0x2000254d /* Siemens I-Surf 2.0 PnP*/
|
||||
#define VID_ASUSCOM_IPAC 0x90167506 /* Asuscom (with IPAC) */
|
||||
|
||||
static struct i4b_pnp_ids {
|
||||
static struct isic_pnp_ids {
|
||||
u_long vend_id;
|
||||
char *id_str;
|
||||
} i4b_pnp_ids[] = {
|
||||
{ VID_TEL163PNP, "Teles 16.3 PnP" },
|
||||
{ VID_CREATIXPP, "Creatix S0/16 P+P" },
|
||||
} isic_pnp_ids[] = {
|
||||
#if defined(TEL_S0_16_3_P) || defined(CRTX_S0_P)
|
||||
{ VID_TEL163PNP, "Teles S0/16.3 PnP" },
|
||||
{ VID_CREATIXPP, "Creatix S0/16 PnP" },
|
||||
#endif
|
||||
#ifdef DYNALINK
|
||||
{ VID_DYNALINK, "Dynalink IS64PH" },
|
||||
#endif
|
||||
#ifdef SEDLBAUER
|
||||
{ VID_SEDLBAUER, "Sedlbauer WinSpeed" },
|
||||
#endif
|
||||
#ifdef DRN_NGO
|
||||
{ VID_NICCYGO, "Dr.Neuhaus Niccy Go@" },
|
||||
#endif
|
||||
#ifdef ELSA_QS1ISA
|
||||
{ VID_ELSAQS1P, "ELSA QuickStep 1000pro" },
|
||||
#endif
|
||||
#ifdef ITKIX1
|
||||
{ VID_ITK0025, "ITK ix1 Micro V3.0" },
|
||||
#endif
|
||||
#ifdef AVM_PNP
|
||||
{ VID_AVMPNP, "AVM Fritz!Card PnP" },
|
||||
#endif
|
||||
#ifdef SIEMENS_ISURF2
|
||||
{ VID_SIESURF2, "Siemens I-Surf 2.0 PnP" },
|
||||
#endif
|
||||
#ifdef ASUSCOM_IPAC
|
||||
{ VID_ASUSCOM_IPAC, "Asuscom ISDNLink 128 PnP" },
|
||||
{ 0 }
|
||||
#endif
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
extern struct isa_driver isicdriver;
|
||||
static int isic_pnp_probe(device_t dev);
|
||||
static int isic_pnp_attach(device_t dev);
|
||||
|
||||
static int isic_pnpprobe(struct isa_device *dev, unsigned int iobase2);
|
||||
static char *i4b_pnp_probe(u_long csn, u_long vend_id);
|
||||
static void i4b_pnp_attach(u_long csn, u_long vend_id, char *name, struct isa_device *dev);
|
||||
|
||||
static u_long ni4b_pnp = 0;
|
||||
|
||||
static struct pnp_device i4b_pnp = {
|
||||
"i4b_pnp",
|
||||
i4b_pnp_probe,
|
||||
i4b_pnp_attach,
|
||||
&ni4b_pnp,
|
||||
&net_imask
|
||||
static device_method_t isic_pnp_methods[] = {
|
||||
DEVMETHOD(device_probe, isic_pnp_probe),
|
||||
DEVMETHOD(device_attach, isic_pnp_attach),
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
static driver_t isic_pnp_driver = {
|
||||
"isic",
|
||||
isic_pnp_methods,
|
||||
0,
|
||||
};
|
||||
|
||||
DATA_SET(pnpdevice_set, i4b_pnp);
|
||||
static devclass_t isic_devclass;
|
||||
|
||||
DRIVER_MODULE(isicpnp, isa, isic_pnp_driver, isic_devclass, 0, 0);
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* PnP probe routine
|
||||
* probe for ISA PnP cards
|
||||
*---------------------------------------------------------------------------*/
|
||||
static char *
|
||||
i4b_pnp_probe(u_long csn, u_long vend_id)
|
||||
int
|
||||
isic_pnp_probe(device_t dev)
|
||||
{
|
||||
struct i4b_pnp_ids *ids;
|
||||
char *string = NULL;
|
||||
struct isic_pnp_ids *ids; /* pnp id's */
|
||||
char *string = NULL; /* the name */
|
||||
u_int32_t vend_id = isa_get_vendorid(dev); /* vendor id */
|
||||
|
||||
/* search table of knowd id's */
|
||||
|
||||
for(ids = i4b_pnp_ids; ids->vend_id != 0; ids++)
|
||||
for(ids = isic_pnp_ids; ids->vend_id != 0; ids++)
|
||||
{
|
||||
if(vend_id == ids->vend_id)
|
||||
{
|
||||
|
|
@ -146,204 +149,169 @@ i4b_pnp_probe(u_long csn, u_long vend_id)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(string)
|
||||
{
|
||||
struct pnp_cinfo spci;
|
||||
|
||||
read_pnp_parms(&spci, 0);
|
||||
|
||||
if((spci.enable == 0) || (spci.flags & 0x01))
|
||||
{
|
||||
printf("CSN %d (%s) is disabled.\n", (int)csn, string);
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
return(string);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* PnP attach routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
i4b_pnp_attach(u_long csn, u_long vend_id, char *name, struct isa_device *dev)
|
||||
{
|
||||
struct pnp_cinfo spci;
|
||||
#if !((defined(__FreeBSD_version) && __FreeBSD_version >= 400004))
|
||||
struct isa_device *isa_devp;
|
||||
#endif
|
||||
|
||||
if(dev->id_unit != next_isic_unit)
|
||||
{
|
||||
printf("i4b_pnp_attach: Error: new unit (%d) != next_isic_unit (%d)!\n", dev->id_unit, next_isic_unit);
|
||||
return;
|
||||
}
|
||||
|
||||
if(dev->id_unit >= ISIC_MAXUNIT)
|
||||
{
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for %s\n",
|
||||
dev->id_unit, dev->id_unit, name);
|
||||
return;
|
||||
}
|
||||
|
||||
if(read_pnp_parms(&spci, 0) == 0)
|
||||
{
|
||||
printf("isic%d: read_pnp_parms error for %s\n",
|
||||
dev->id_unit, name);
|
||||
return;
|
||||
}
|
||||
|
||||
if(bootverbose)
|
||||
{
|
||||
printf("isic%d: vendorid = 0x%08x port0 = 0x%04x, port1 = 0x%04x, irq = %d\n",
|
||||
dev->id_unit, spci.vendor_id, spci.port[0], spci.port[1], spci.irq[0]);
|
||||
}
|
||||
|
||||
dev->id_iobase = spci.port[0];
|
||||
dev->id_irq = (1 << spci.irq[0]);
|
||||
dev->id_intr = (inthand2_t *) isicintr;
|
||||
dev->id_drq = -1;
|
||||
|
||||
/* XXX add dev->id_alive init here ! ?? */
|
||||
|
||||
switch(spci.vendor_id)
|
||||
if(string) /* set name if we have one */
|
||||
{
|
||||
case VID_TEL163PNP:
|
||||
dev->id_flags = FLAG_TELES_S0_163_PnP;
|
||||
break;
|
||||
case VID_CREATIXPP:
|
||||
dev->id_flags = FLAG_CREATIX_S0_PnP;
|
||||
break;
|
||||
case VID_DYNALINK:
|
||||
dev->id_flags = FLAG_DYNALINK;
|
||||
break;
|
||||
case VID_SEDLBAUER:
|
||||
dev->id_flags = FLAG_SWS;
|
||||
break;
|
||||
case VID_NICCYGO:
|
||||
dev->id_flags = FLAG_DRN_NGO;
|
||||
break;
|
||||
case VID_ELSAQS1P:
|
||||
dev->id_flags = FLAG_ELSA_QS1P_ISA;
|
||||
break;
|
||||
case VID_ITK0025:
|
||||
dev->id_flags = FLAG_ITK_IX1;
|
||||
break;
|
||||
case VID_AVMPNP:
|
||||
dev->id_flags = FLAG_AVM_PNP;
|
||||
break;
|
||||
case VID_SIESURF2:
|
||||
dev->id_flags = FLAG_SIEMENS_ISURF2;
|
||||
break;
|
||||
case VID_ASUSCOM_IPAC:
|
||||
dev->id_flags = FLAG_ASUSCOM_IPAC;
|
||||
break;
|
||||
}
|
||||
|
||||
write_pnp_parms(&spci, 0);
|
||||
enable_pnp_card();
|
||||
|
||||
if(dev->id_driver == NULL)
|
||||
{
|
||||
dev->id_driver = &isicdriver;
|
||||
#if(defined(__FreeBSD_version) && __FreeBSD_version >= 400004)
|
||||
dev->id_id = isa_compat_nextid();
|
||||
#else
|
||||
isa_devp = find_isadev(isa_devtab_net, &isicdriver, 0);
|
||||
|
||||
if(isa_devp != NULL)
|
||||
{
|
||||
dev->id_id = isa_devp->id_id;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if((dev->id_alive = isic_pnpprobe(dev, spci.port[1])) != 0)
|
||||
{
|
||||
/* XXX dev->id_alive is the size of the port area used ! */
|
||||
isic_realattach(dev, spci.port[1]);
|
||||
device_set_desc(dev, string); /* set description */
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("isic%d: probe failed!\n", dev->id_unit);
|
||||
return ENXIO;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic - pnp device driver probe routine
|
||||
* attach for ISA PnP cards
|
||||
*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
isic_pnpprobe(struct isa_device *dev, unsigned int iobase2)
|
||||
int
|
||||
isic_pnp_attach(device_t dev)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
switch(dev->id_flags)
|
||||
u_int32_t vend_id = isa_get_vendorid(dev); /* vendor id */
|
||||
unsigned int unit = device_get_unit(dev); /* get unit */
|
||||
const char *name = device_get_desc(dev); /* get description */
|
||||
struct l1_softc *sc = 0; /* softc */
|
||||
void *ih = 0; /* a dummy */
|
||||
int ret;
|
||||
|
||||
/* see if we are out of bounds */
|
||||
|
||||
if(unit >= ISIC_MAXUNIT)
|
||||
{
|
||||
#ifdef TEL_S0_16_3_P
|
||||
case FLAG_TELES_S0_163_PnP:
|
||||
ret = isic_probe_s0163P(dev, iobase2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CRTX_S0_P
|
||||
case FLAG_CREATIX_S0_PnP:
|
||||
ret = isic_probe_Cs0P(dev, iobase2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef DRN_NGO
|
||||
case FLAG_DRN_NGO:
|
||||
ret = isic_probe_drnngo(dev, iobase2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef SEDLBAUER
|
||||
case FLAG_SWS:
|
||||
ret = 8; /* pnp only, nothing to probe */
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef DYNALINK
|
||||
case FLAG_DYNALINK:
|
||||
ret = isic_probe_Dyn(dev, iobase2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ELSA_QS1ISA
|
||||
case FLAG_ELSA_QS1P_ISA:
|
||||
ret = isic_probe_Eqs1pi(dev, iobase2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ITKIX1
|
||||
case FLAG_ITK_IX1:
|
||||
ret = isic_probe_itkix1(dev);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef AVM_PNP
|
||||
case FLAG_AVM_PNP:
|
||||
ret = isic_probe_avm_pnp(dev, iobase2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef SIEMENS_ISURF2
|
||||
case FLAG_SIEMENS_ISURF2:
|
||||
ret = isic_probe_siemens_isurf(dev, iobase2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ASUSCOM_IPAC
|
||||
case FLAG_ASUSCOM_IPAC:
|
||||
ret = isic_probe_asi(dev, iobase2);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
break;
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for %s\n", unit, unit, name);
|
||||
return ENXIO;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
#endif /* (NISIC > 0) && (NPNP > 0) */
|
||||
#endif /* __FreeBSD__ */
|
||||
/* get information structure for this unit */
|
||||
|
||||
sc = &l1_sc[unit];
|
||||
|
||||
/* get io_base */
|
||||
if(!(sc->sc_resources.io_base[0] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[0],
|
||||
0UL, ~0UL, 1, RF_ACTIVE ) ))
|
||||
{
|
||||
printf("isic_pnp_attach: Couldn't get my io_base.\n");
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/* will not be used for pnp devices */
|
||||
|
||||
sc->sc_port = rman_get_start(sc->sc_resources.io_base[0]);
|
||||
|
||||
/* get irq, release io_base if we don't get it */
|
||||
|
||||
if(!(sc->sc_resources.irq =
|
||||
bus_alloc_resource(dev, SYS_RES_IRQ,
|
||||
&sc->sc_resources.irq_rid,
|
||||
0UL, ~0UL, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not get irq.\n",unit);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/* not needed */
|
||||
sc->sc_irq = rman_get_start(sc->sc_resources.irq);
|
||||
|
||||
|
||||
/* set flag so we know what this card is */
|
||||
|
||||
ret = ENXIO;
|
||||
|
||||
switch(vend_id)
|
||||
{
|
||||
#if defined(TEL_S0_16_3_P) || defined(CRTX_S0_P)
|
||||
case VID_TEL163PNP:
|
||||
sc->sc_flags = FLAG_TELES_S0_163_PnP;
|
||||
ret = isic_attach_Cs0P(dev);
|
||||
break;
|
||||
|
||||
case VID_CREATIXPP:
|
||||
sc->sc_flags = FLAG_CREATIX_S0_PnP;
|
||||
ret = isic_attach_Cs0P(dev);
|
||||
break;
|
||||
#endif
|
||||
#ifdef DYNALINK
|
||||
case VID_DYNALINK:
|
||||
sc->sc_flags = FLAG_DYNALINK;
|
||||
ret = isic_attach_Dyn(dev);
|
||||
break;
|
||||
#endif
|
||||
#ifdef SEDLBAUER
|
||||
case VID_SEDLBAUER:
|
||||
sc->sc_flags = FLAG_SWS;
|
||||
ret = isic_attach_sws(dev);
|
||||
break;
|
||||
#endif
|
||||
#ifdef DRN_NGO
|
||||
case VID_NICCYGO:
|
||||
sc->sc_flags = FLAG_DRN_NGO;
|
||||
ret = isic_attach_drnngo(dev);
|
||||
break;
|
||||
#endif
|
||||
#ifdef ELSA_QS1ISA
|
||||
case VID_ELSAQS1P:
|
||||
sc->sc_flags = FLAG_ELSA_QS1P_ISA;
|
||||
ret = isic_attach_Eqs1pi(dev);
|
||||
break;
|
||||
#endif
|
||||
#ifdef ITKIX1
|
||||
case VID_ITK0025:
|
||||
sc->sc_flags = FLAG_ITK_IX1;
|
||||
ret = isic_attach_itkix1(dev);
|
||||
break;
|
||||
#endif
|
||||
#ifdef AVM_PNP
|
||||
case VID_AVMPNP:
|
||||
sc->sc_flags = FLAG_AVM_PNP;
|
||||
ret = isic_attach_avm_pnp(dev);
|
||||
break;
|
||||
#endif
|
||||
#ifdef SIEMENS_ISURF2
|
||||
case VID_SIESURF2:
|
||||
sc->sc_flags = FLAG_SIEMENS_ISURF2;
|
||||
ret = isic_attach_siemens_isurf(dev);
|
||||
break;
|
||||
#endif
|
||||
#ifdef ASUSCOM_IPAC
|
||||
case VID_ASUSCOM_IPAC:
|
||||
sc->sc_flags = FLAG_ASUSCOM_IPAC;
|
||||
ret = isic_attach_asi(dev);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
printf("isic%d: Error, no driver for %s\n", unit, name);
|
||||
ret = ENXIO;
|
||||
break;
|
||||
}
|
||||
|
||||
if(ret)
|
||||
{
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
if(isic_attach_common(dev))
|
||||
{
|
||||
/* unset flag */
|
||||
sc->sc_flags = 0;
|
||||
|
||||
/* free irq here, it hasn't been attached yet */
|
||||
bus_release_resource(dev,SYS_RES_IRQ,sc->sc_resources.irq_rid,
|
||||
sc->sc_resources.irq);
|
||||
sc->sc_resources.irq = 0;
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* setup intr routine */
|
||||
bus_setup_intr(dev,sc->sc_resources.irq,INTR_TYPE_NET,
|
||||
(void(*)(void*))isicintr,
|
||||
sc,&ih);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif /* (NISIC > 0) */
|
||||
|
|
|
|||
|
|
@ -27,52 +27,33 @@
|
|||
* i4b_l1.c - isdn4bsd layer 1 handler
|
||||
* -----------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l1.c,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:28:10 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:01:55 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include "isic.h"
|
||||
#else
|
||||
#define NISIC 1 /* don't bother */
|
||||
#endif
|
||||
|
||||
#if NISIC > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <machine/stdarg.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#else
|
||||
#ifndef __bsdi__
|
||||
#include <machine/bus.h>
|
||||
#endif
|
||||
#include <sys/device.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <machine/stdarg.h>
|
||||
#include <machine/clock.h>
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/i4b_debug.h>
|
||||
#include <machine/i4b_ioctl.h>
|
||||
#include <machine/i4b_trace.h>
|
||||
#else
|
||||
#include <i4b/i4b_debug.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
#include <i4b/i4b_trace.h>
|
||||
#endif
|
||||
|
||||
#include <i4b/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_isac.h>
|
||||
|
|
@ -145,12 +126,7 @@ ph_data_req(int unit, struct mbuf *m, int freeflag)
|
|||
{
|
||||
u_char cmd;
|
||||
int s;
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
struct isic_softc *sc = &isic_sc[unit];
|
||||
#else
|
||||
struct isic_softc *sc = isic_find_sc(unit);
|
||||
#endif
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
|
||||
#ifdef NOTDEF
|
||||
DBGL1(L1_PRIM, "PH-DATA-REQ", ("unit %d, freeflag=%d\n", unit, freeflag));
|
||||
|
|
@ -269,13 +245,7 @@ ph_data_req(int unit, struct mbuf *m, int freeflag)
|
|||
static int
|
||||
ph_activate_req(int unit)
|
||||
{
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
struct isic_softc *sc = &isic_sc[unit];
|
||||
#else
|
||||
struct isic_softc *sc = isic_find_sc(unit);
|
||||
#endif
|
||||
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
DBGL1(L1_PRIM, "PH-ACTIVATE-REQ", ("unit %d\n", unit));
|
||||
isic_next_state(sc, EV_PHAR);
|
||||
return(0);
|
||||
|
|
@ -287,12 +257,8 @@ ph_activate_req(int unit)
|
|||
static int
|
||||
i4b_mph_command_req(int unit, int command, int parm)
|
||||
{
|
||||
#ifdef __FreeBSD__
|
||||
struct isic_softc *sc = &isic_sc[unit];
|
||||
#else
|
||||
struct isic_softc *sc = isic_find_sc(unit);
|
||||
#endif
|
||||
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
|
||||
switch(command)
|
||||
{
|
||||
case CMR_DOPEN: /* daemon running */
|
||||
|
|
@ -314,4 +280,3 @@ i4b_mph_command_req(int unit, int command, int parm)
|
|||
}
|
||||
|
||||
#endif /* NISIC > 0 */
|
||||
|
||||
|
|
|
|||
|
|
@ -27,21 +27,22 @@
|
|||
* i4b_l1.h - isdn4bsd layer 1 header file
|
||||
* ---------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l1.h,v 1.3 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Mon Jul 5 15:32:02 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:02:07 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef I4B_L1_H_
|
||||
#define I4B_L1_H_
|
||||
|
||||
#ifdef __bsdi__
|
||||
#include <sys/device.h> /* XXX */
|
||||
#ifndef ISA_NPORT_CHECK /* Double yuck XXX */
|
||||
#include <i386/isa/isavar.h> /* XXX */
|
||||
#endif
|
||||
#endif
|
||||
#include <sys/resource.h>
|
||||
#include <sys/bus.h>
|
||||
#include <i386/include/bus.h>
|
||||
#include <sys/rman.h>
|
||||
#include <i386/include/resource.h>
|
||||
|
||||
#include <i4b/include/i4b_l3l4.h>
|
||||
|
||||
|
|
@ -76,56 +77,29 @@
|
|||
|
||||
#define MAX_DFRAME_LEN 264 /* max length of a D frame */
|
||||
|
||||
#ifndef __bsdi__
|
||||
#define min(a,b) ((a)<(b)?(a):(b))
|
||||
#endif
|
||||
|
||||
#if !defined(__FreeBSD__) && !defined(__bsdi__)
|
||||
/* We try to map as few as possible as small as possible io and/or
|
||||
memory regions. Each card defines its own interpretation of this
|
||||
mapping array. At probe time we have a fixed size array, later
|
||||
(when the card type is known) we allocate a minimal array
|
||||
dynamically. */
|
||||
#define INFO_IO_BASES 50 /* 49 needed for USR */
|
||||
|
||||
#define ISIC_MAX_IO_MAPS 49 /* no cardtype needs more yet */
|
||||
|
||||
/* one entry in mapping array */
|
||||
struct isic_io_map {
|
||||
bus_space_tag_t t; /* which bus-space is this? */
|
||||
bus_space_handle_t h; /* handle of mapped bus space region */
|
||||
bus_size_t offset; /* offset into region */
|
||||
bus_size_t size; /* size of region, zero if not ours
|
||||
(i.e.: don't ever unmap it!) */
|
||||
struct i4b_info {
|
||||
struct resource * io_base[INFO_IO_BASES];
|
||||
int io_rid [INFO_IO_BASES];
|
||||
struct resource * irq;
|
||||
int irq_rid;
|
||||
struct resource * mem;
|
||||
int mem_rid;
|
||||
};
|
||||
|
||||
/* this is passed around at probe time (no struct isic_softc yet) */
|
||||
struct isic_attach_args {
|
||||
int ia_flags; /* flags from config file */
|
||||
int ia_num_mappings; /* number of io mappings provided */
|
||||
struct isic_io_map ia_maps[ISIC_MAX_IO_MAPS];
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
extern int next_isic_unit;
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_Bchan: the state of one B channel
|
||||
* l1_bchan_state: the state of one B channel
|
||||
*---------------------------------------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
int unit; /* cards unit number */
|
||||
int channel; /* which channel is this*/
|
||||
|
||||
#if defined(__FreeBSD__) || defined(__bsdi__)
|
||||
caddr_t hscx; /* HSCX address */
|
||||
#endif
|
||||
|
||||
u_char hscx_mask; /* HSCX interrupt mask */
|
||||
|
||||
int bprot; /* B channel protocol */
|
||||
|
||||
int state; /* this channels state */
|
||||
#define HSCX_IDLE 0x00 /* channel idle */
|
||||
#define HSCX_TX_ACTIVE 0x01 /* tx running */
|
||||
|
|
@ -170,39 +144,19 @@ typedef struct
|
|||
int stat_XDU; /* HSCX EXIR tx data underrun */
|
||||
int stat_RFO; /* HSCX EXIR rx frame overflow */
|
||||
|
||||
} isic_Bchan_t;
|
||||
} l1_bchan_state_t;
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_softc: the state of the layer 1 of the D channel
|
||||
* l1_softc: the state of the layer 1 of the D channel
|
||||
*---------------------------------------------------------------------------*/
|
||||
struct isic_softc
|
||||
struct l1_softc
|
||||
{
|
||||
#if !defined(__FreeBSD__)
|
||||
/* We are inherited from this class. All drivers must have this
|
||||
as their first entry in struct softc. */
|
||||
struct device sc_dev;
|
||||
#endif
|
||||
|
||||
int sc_unit; /* unit number */
|
||||
int sc_irq; /* interrupt vector */
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
int sc_port; /* port base address */
|
||||
#elif defined(__bsdi__)
|
||||
struct isadev sc_id; /* ISA/PCI device */
|
||||
struct intrhand sc_ih; /* interrupt vectoring */
|
||||
struct i4b_info sc_resources;
|
||||
int sc_flags;
|
||||
int sc_port;
|
||||
caddr_t sc_maddr;
|
||||
int sc_abustype; /* PCI, ISA etcetera */
|
||||
#else
|
||||
u_int sc_maddr; /* "memory address" for card config register */
|
||||
int sc_num_mappings; /* number of io mappings provided */
|
||||
struct isic_io_map *sc_maps;
|
||||
|
||||
#define MALLOC_MAPS(sc) \
|
||||
(sc)->sc_maps = (struct isic_io_map*)malloc(sizeof((sc)->sc_maps[0])*(sc)->sc_num_mappings, M_DEVBUF, 0)
|
||||
#endif
|
||||
int sc_port; /* port base address */
|
||||
|
||||
int sc_cardtyp; /* CARD_TYPEP_xxxx */
|
||||
|
||||
|
|
@ -220,19 +174,17 @@ struct isic_softc
|
|||
|
||||
int sc_init_tries; /* no of out tries to access S0 */
|
||||
|
||||
#if defined(__FreeBSD__) || defined(__bsdi__)
|
||||
caddr_t sc_vmem_addr; /* card RAM virtual memory base */
|
||||
caddr_t sc_isac; /* ISAC port base addr */
|
||||
#define ISAC_BASE (sc->sc_isac)
|
||||
|
||||
caddr_t sc_ipacbase; /* IPAC port base addr */
|
||||
#define IPAC_BASE (sc->sc_ipacbase)
|
||||
#endif
|
||||
|
||||
u_char sc_isac_mask; /* ISAC IRQ mask */
|
||||
#define ISAC_IMASK (sc->sc_isac_mask)
|
||||
|
||||
isic_Bchan_t sc_chan[2]; /* B-channel state */
|
||||
l1_bchan_state_t sc_chan[2]; /* B-channel state */
|
||||
#define HSCX_A_BASE (sc->sc_chan[0].hscx)
|
||||
#define HSCX_A_IMASK (sc->sc_chan[0].hscx_mask)
|
||||
#define HSCX_B_BASE (sc->sc_chan[1].hscx)
|
||||
|
|
@ -256,15 +208,12 @@ struct isic_softc
|
|||
int sc_I430state; /* I.430 state F3 .... F8 */
|
||||
|
||||
int sc_I430T3; /* I.430 Timer T3 running */
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
|
||||
struct callout_handle sc_T3_callout;
|
||||
#endif
|
||||
|
||||
|
||||
int sc_I430T4; /* Timer T4 running */
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >=3
|
||||
struct callout_handle sc_T4_callout;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* byte fields for the AVM Fritz!Card PCI. These are packed into
|
||||
|
|
@ -278,40 +227,17 @@ struct isic_softc
|
|||
|
||||
int sc_ipac; /* flag, running on ipac */
|
||||
int sc_bfifolen; /* length of b channel fifos */
|
||||
|
||||
#if defined(__FreeBSD__) || defined(__bsdi__)
|
||||
|
||||
u_char (*readreg)(u_char *, u_int);
|
||||
void (*writereg)(u_char *, u_int, u_int);
|
||||
void (*readfifo)(void *, const void *, size_t);
|
||||
void (*writefifo)(void *, const void *, size_t);
|
||||
void (*clearirq)(void *);
|
||||
|
||||
#define ISAC_READ(r) (*sc->readreg)(ISAC_BASE, (r))
|
||||
#define ISAC_WRITE(r,v) (*sc->writereg)(ISAC_BASE, (r), (v));
|
||||
#define ISAC_RDFIFO(b,s) (*sc->readfifo)((b), ISAC_BASE, (s))
|
||||
#define ISAC_WRFIFO(b,s) (*sc->writefifo)(ISAC_BASE, (b), (s))
|
||||
|
||||
#define HSCX_READ(n,r) (*sc->readreg)(sc->sc_chan[(n)].hscx, (r))
|
||||
#define HSCX_WRITE(n,r,v) (*sc->writereg)(sc->sc_chan[(n)].hscx, (r), (v))
|
||||
#define HSCX_RDFIFO(n,b,s) (*sc->readfifo)((b), sc->sc_chan[(n)].hscx, (s))
|
||||
#define HSCX_WRFIFO(n,b,s) (*sc->writefifo)(sc->sc_chan[(n)].hscx, (b), (s))
|
||||
|
||||
#define IPAC_READ(r) (*sc->readreg)(IPAC_BASE, (r))
|
||||
#define IPAC_WRITE(r,v) (*sc->writereg)(IPAC_BASE, (r), (v));
|
||||
|
||||
#else /* ! __FreeBSD__ */
|
||||
|
||||
#define ISIC_WHAT_ISAC 0
|
||||
#define ISIC_WHAT_HSCXA 1
|
||||
#define ISIC_WHAT_HSCXB 2
|
||||
#define ISIC_WHAT_IPAC 3
|
||||
|
||||
u_int8_t (*readreg) __P((struct isic_softc *sc, int what, bus_size_t offs));
|
||||
void (*writereg) __P((struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data));
|
||||
void (*readfifo) __P((struct isic_softc *sc, int what, void *buf, size_t size));
|
||||
void (*writefifo) __P((struct isic_softc *sc, int what, const void *data, size_t size));
|
||||
void (*clearirq) __P((struct isic_softc *sc));
|
||||
u_int8_t (*readreg) (struct l1_softc *sc, int what, bus_size_t offs);
|
||||
void (*writereg) (struct l1_softc *sc, int what, bus_size_t offs, u_int8_t data);
|
||||
void (*readfifo) (struct l1_softc *sc, int what, void *buf, size_t size);
|
||||
void (*writefifo) (struct l1_softc *sc, int what, void *data, size_t size);
|
||||
void (*clearirq) (struct l1_softc *sc);
|
||||
|
||||
#define ISAC_READ(r) (*sc->readreg)(sc, ISIC_WHAT_ISAC, (r))
|
||||
#define ISAC_WRITE(r,v) (*sc->writereg)(sc, ISIC_WHAT_ISAC, (r), (v))
|
||||
|
|
@ -325,8 +251,6 @@ struct isic_softc
|
|||
|
||||
#define IPAC_READ(r) (*sc->readreg)(sc, ISIC_WHAT_IPAC, (r))
|
||||
#define IPAC_WRITE(r, v) (*sc->writereg)(sc, ISIC_WHAT_IPAC, (r), (v))
|
||||
|
||||
#endif /* __FreeBSD__ */
|
||||
};
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
|
|
@ -373,148 +297,51 @@ enum I430commands {
|
|||
|
||||
#define N_COMMANDS CMD_ILL
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
extern struct isic_softc isic_sc[];
|
||||
extern struct l1_softc l1_sc[];
|
||||
|
||||
extern void isicintr(struct l1_softc *sc);
|
||||
extern int isic_attach_common(device_t dev);
|
||||
extern void isic_detach_common(device_t dev);
|
||||
extern void isic_recover(struct l1_softc *sc);
|
||||
|
||||
extern void isic_recover(struct isic_softc *sc);
|
||||
extern int isic_realattach(struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_attach_avma1 ( struct isa_device *dev );
|
||||
extern int isic_attach_fritzpcmcia ( struct isa_device *dev );
|
||||
extern int isic_attach_Cs0P ( struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_attach_Dyn ( struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_attach_s016 ( struct isa_device *dev );
|
||||
extern int isic_attach_s0163 ( struct isa_device *dev );
|
||||
extern int isic_attach_s0163P ( struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_attach_s08 ( struct isa_device *dev );
|
||||
extern int isic_attach_usrtai ( struct isa_device *dev );
|
||||
extern int isic_attach_itkix1 ( struct isa_device *dev );
|
||||
extern int isic_attach_drnngo ( struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_attach_sws ( struct isa_device *dev );
|
||||
extern int isic_attach_Eqs1pi(struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_attach_avm_pnp(struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_attach_siemens_isurf(struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_attach_Eqs1pp(int unit, unsigned int iobase1, unsigned int iobase2);
|
||||
extern int isic_attach_asi(struct isa_device *dev, unsigned int iobase2);
|
||||
extern void isic_bchannel_setup (int unit, int hscx_channel, int bprot, int activate );
|
||||
extern int isic_hscx_fifo(isic_Bchan_t *, struct isic_softc *);
|
||||
extern void isic_hscx_init ( struct isic_softc *sc, int hscx_channel, int activate );
|
||||
extern void isic_hscx_irq ( struct isic_softc *sc, u_char ista, int hscx_channel, u_char ex_irq );
|
||||
extern int isic_hscx_silence ( unsigned char *data, int len );
|
||||
extern void isic_hscx_cmd( struct isic_softc *sc, int h_chan, unsigned char cmd );
|
||||
extern void isic_hscx_waitxfw( struct isic_softc *sc, int h_chan );
|
||||
extern void isic_init_linktab ( struct isic_softc *sc );
|
||||
extern int isic_isac_init ( struct isic_softc *sc );
|
||||
extern void isic_isac_irq ( struct isic_softc *sc, int r );
|
||||
extern void isic_isac_l1_cmd ( struct isic_softc *sc, int command );
|
||||
extern void isic_next_state ( struct isic_softc *sc, int event );
|
||||
extern char *isic_printstate ( struct isic_softc *sc );
|
||||
extern int isic_probe_avma1 ( struct isa_device *dev );
|
||||
extern int isic_probe_avma1_pcmcia ( struct isa_device *dev );
|
||||
extern int isic_probe_avm_pnp ( struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_probe_siemens_isurf ( struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_probe_Cs0P ( struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_probe_Dyn ( struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_probe_s016 ( struct isa_device *dev );
|
||||
extern int isic_probe_s0163 ( struct isa_device *dev );
|
||||
extern int isic_probe_s0163P ( struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_probe_s08 ( struct isa_device *dev );
|
||||
extern int isic_probe_usrtai ( struct isa_device *dev );
|
||||
extern int isic_probe_itkix1 ( struct isa_device *dev );
|
||||
extern int isic_probe_drnngo ( struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_probe_sws ( struct isa_device *dev );
|
||||
extern int isic_probe_Eqs1pi(struct isa_device *dev, unsigned int iobase2);
|
||||
extern int isic_probe_asi(struct isa_device *dev, unsigned int iobase2);
|
||||
|
||||
#elif defined(__bsdi__)
|
||||
extern void isic_init_linktab ( struct l1_softc *sc );
|
||||
extern int isic_isac_init ( struct l1_softc *sc );
|
||||
extern void isic_isac_irq ( struct l1_softc *sc, int r );
|
||||
extern void isic_isac_l1_cmd ( struct l1_softc *sc, int command );
|
||||
extern void isic_next_state ( struct l1_softc *sc, int event );
|
||||
extern char *isic_printstate ( struct l1_softc *sc );
|
||||
|
||||
extern struct isic_softc *isic_sc[];
|
||||
#define isic_find_sc(unit) (isic_sc[(unit)])
|
||||
extern int isic_hscx_fifo(l1_bchan_state_t *, struct l1_softc *);
|
||||
extern void isic_hscx_init ( struct l1_softc *sc, int hscx_channel, int activate );
|
||||
extern void isic_hscx_irq ( struct l1_softc *sc, u_char ista, int hscx_channel, u_char ex_irq );
|
||||
extern int isic_hscx_silence ( unsigned char *data, int len );
|
||||
extern void isic_hscx_cmd( struct l1_softc *sc, int h_chan, unsigned char cmd );
|
||||
extern void isic_hscx_waitxfw( struct l1_softc *sc, int h_chan );
|
||||
|
||||
#define ATTACHARGS struct device *, struct device *, struct isa_attach_args *
|
||||
#define MATCHARGS struct device *, struct cfdata *, struct isa_attach_args *
|
||||
extern int isa_isicmatch(MATCHARGS);
|
||||
extern int isa_isicattach(ATTACHARGS);
|
||||
extern int isicintr(void *);
|
||||
extern void isic_recover(struct isic_softc *sc);
|
||||
extern int isic_realattach(ATTACHARGS);
|
||||
extern int isic_attach_avma1(ATTACHARGS);
|
||||
extern int isic_attach_fritzpcmcia(ATTACHARGS);
|
||||
extern int isic_attach_Cs0P(ATTACHARGS);
|
||||
extern int isic_attach_Dyn(ATTACHARGS);
|
||||
extern int isic_attach_s016(ATTACHARGS);
|
||||
extern int isic_attach_s0163(ATTACHARGS);
|
||||
extern int isic_attach_s0163P(ATTACHARGS);
|
||||
extern int isic_attach_s08(ATTACHARGS);
|
||||
extern int isic_attach_usrtai(ATTACHARGS);
|
||||
extern int isic_attach_itkix1(ATTACHARGS);
|
||||
extern int isic_attach_drnngo(ATTACHARGS);
|
||||
extern int isic_attach_sws(ATTACHARGS);
|
||||
extern int isic_attach_Eqs1pi(ATTACHARGS);
|
||||
extern int isic_attach_Eqs1pp(ATTACHARGS);
|
||||
extern void isic_bchannel_setup(int unit, int hscx_channel, int bprot, int activate );
|
||||
extern void isic_hscx_init(struct isic_softc *sc, int hscx_channel, int activate );
|
||||
extern void isic_hscx_irq(struct isic_softc *sc, u_char ista, int hscx_channel, u_char ex_irq );
|
||||
extern int isic_hscx_silence(unsigned char *data, int len );
|
||||
extern void isic_hscx_cmd(struct isic_softc *sc, int h_chan, unsigned char cmd );
|
||||
extern void isic_hscx_waitxfw(struct isic_softc *sc, int h_chan );
|
||||
extern void isic_init_linktab(struct isic_softc *sc );
|
||||
extern int isic_isac_init(struct isic_softc *sc );
|
||||
extern void isic_isac_irq(struct isic_softc *sc, int r );
|
||||
extern void isic_isac_l1_cmd(struct isic_softc *sc, int command );
|
||||
extern void isic_next_state(struct isic_softc *sc, int event );
|
||||
extern char *isic_printstate(struct isic_softc *sc );
|
||||
extern int isic_probe_avma1(MATCHARGS);
|
||||
extern int isic_probe_avma1_pcmcia(MATCHARGS);
|
||||
extern int isic_probe_Cs0P(MATCHARGS);
|
||||
extern int isic_probe_Dyn(MATCHARGS);
|
||||
extern int isic_probe_s016(MATCHARGS);
|
||||
extern int isic_probe_s0163(MATCHARGS);
|
||||
extern int isic_probe_s0163P(MATCHARGS);
|
||||
extern int isic_probe_s08(MATCHARGS);
|
||||
extern int isic_probe_usrtai(MATCHARGS);
|
||||
extern int isic_probe_itkix1(MATCHARGS);
|
||||
extern int isic_probe_drnngo(MATCHARGS);
|
||||
extern int isic_probe_sws(MATCHARGS);
|
||||
extern int isic_probe_Eqs1pi(MATCHARGS);
|
||||
extern int isic_probe_s016 (device_t dev);
|
||||
extern int isic_attach_s016 (device_t dev);
|
||||
|
||||
#undef MATCHARGS
|
||||
#undef ATTACHARGS
|
||||
#else /* not FreeBSD/__bsdi__ */
|
||||
extern int isic_probe_s08 (device_t dev);
|
||||
extern int isic_attach_s08 (device_t dev);
|
||||
|
||||
extern void isic_recover __P((struct isic_softc *sc));
|
||||
extern int isicattach __P((int flags, struct isic_softc *sc));
|
||||
extern int isicintr __P((void *));
|
||||
extern int isicprobe __P((struct isic_attach_args *ia));
|
||||
extern int isic_attach_avma1 __P((struct isic_softc *sc));
|
||||
extern int isic_attach_s016 __P((struct isic_softc *sc));
|
||||
extern int isic_attach_s0163 __P((struct isic_softc *sc));
|
||||
extern int isic_attach_s08 __P((struct isic_softc *sc));
|
||||
extern int isic_attach_usrtai __P((struct isic_softc *sc));
|
||||
extern int isic_attach_itkix1 __P((struct isic_softc *sc));
|
||||
extern void isic_bchannel_setup __P((int unit, int hscx_channel, int bprot, int activate));
|
||||
extern void isic_hscx_init __P((struct isic_softc *sc, int hscx_channel, int activate));
|
||||
extern void isic_hscx_irq __P((struct isic_softc *sc, u_char ista, int hscx_channel, u_char ex_irq));
|
||||
extern int isic_hscx_silence __P(( unsigned char *data, int len ));
|
||||
extern void isic_hscx_cmd __P(( struct isic_softc *sc, int h_chan, unsigned char cmd ));
|
||||
extern void isic_hscx_waitxfw __P(( struct isic_softc *sc, int h_chan ));
|
||||
extern void isic_init_linktab __P((struct isic_softc *sc));
|
||||
extern int isic_isac_init __P((struct isic_softc *sc));
|
||||
extern void isic_isac_irq __P((struct isic_softc *sc, int r));
|
||||
extern void isic_isac_l1_cmd __P((struct isic_softc *sc, int command));
|
||||
extern void isic_next_state __P((struct isic_softc *sc, int event));
|
||||
extern char * isic_printstate __P((struct isic_softc *sc));
|
||||
extern int isic_probe_avma1 __P((struct isic_attach_args *ia));
|
||||
extern int isic_probe_s016 __P((struct isic_attach_args *ia));
|
||||
extern int isic_probe_s0163 __P((struct isic_attach_args *ia));
|
||||
extern int isic_probe_s08 __P((struct isic_attach_args *ia));
|
||||
extern int isic_probe_usrtai __P((struct isic_attach_args *ia));
|
||||
extern int isic_probe_itkix1 __P((struct isic_attach_args *ia));
|
||||
extern int isic_probe_Epcc16 (device_t dev);
|
||||
extern int isic_attach_Epcc16 (device_t dev);
|
||||
|
||||
extern struct isic_softc *isic_sc[];
|
||||
extern int isic_probe_s0163 (device_t dev);
|
||||
extern int isic_attach_s0163 (device_t dev);
|
||||
|
||||
#define isic_find_sc(unit) (isic_sc[(unit)])
|
||||
extern int isic_probe_avma1 (device_t dev);
|
||||
extern int isic_attach_avma1 (device_t dev);
|
||||
|
||||
extern int isic_attach_drnngo (device_t dev);
|
||||
extern int isic_attach_Cs0P (device_t dev);
|
||||
extern int isic_attach_Eqs1pi(device_t dev);
|
||||
extern int isic_attach_sws(device_t dev);
|
||||
extern int isic_attach_siemens_isurf(device_t dev);
|
||||
extern int isic_attach_asi(device_t dev);
|
||||
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
#endif /* I4B_L1_H_ */
|
||||
|
|
|
|||
|
|
@ -27,52 +27,32 @@
|
|||
* i4b_l1fsm.c - isdn4bsd layer 1 I.430 state machine
|
||||
* --------------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l1fsm.c,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:28:26 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:02:16 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(__FreeBSD__) || defined(__bsdi__)
|
||||
#include "isic.h"
|
||||
#else
|
||||
#define NISIC 1
|
||||
#endif
|
||||
|
||||
#if NISIC > 0
|
||||
|
||||
#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 <sys/socket.h>
|
||||
|
||||
#include <machine/stdarg.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#else
|
||||
#ifndef __bsdi__
|
||||
#include <machine/bus.h>
|
||||
#endif
|
||||
#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 <i4b/i4b_debug.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <i4b/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_isac.h>
|
||||
|
|
@ -110,27 +90,27 @@ static char *event_text[N_EVENTS] = {
|
|||
|
||||
/* Function prototypes */
|
||||
|
||||
static void timer3_expired (struct isic_softc *sc);
|
||||
static void T3_start (struct isic_softc *sc);
|
||||
static void T3_stop (struct isic_softc *sc);
|
||||
static void F_T3ex (struct isic_softc *sc);
|
||||
static void timer4_expired (struct isic_softc *sc);
|
||||
static void T4_start (struct isic_softc *sc);
|
||||
static void T4_stop (struct isic_softc *sc);
|
||||
static void F_AI8 (struct isic_softc *sc);
|
||||
static void F_AI10 (struct isic_softc *sc);
|
||||
static void F_I01 (struct isic_softc *sc);
|
||||
static void F_I02 (struct isic_softc *sc);
|
||||
static void F_I03 (struct isic_softc *sc);
|
||||
static void F_I2 (struct isic_softc *sc);
|
||||
static void F_ill (struct isic_softc *sc);
|
||||
static void F_NULL (struct isic_softc *sc);
|
||||
static void timer3_expired (struct l1_softc *sc);
|
||||
static void T3_start (struct l1_softc *sc);
|
||||
static void T3_stop (struct l1_softc *sc);
|
||||
static void F_T3ex (struct l1_softc *sc);
|
||||
static void timer4_expired (struct l1_softc *sc);
|
||||
static void T4_start (struct l1_softc *sc);
|
||||
static void T4_stop (struct l1_softc *sc);
|
||||
static void F_AI8 (struct l1_softc *sc);
|
||||
static void F_AI10 (struct l1_softc *sc);
|
||||
static void F_I01 (struct l1_softc *sc);
|
||||
static void F_I02 (struct l1_softc *sc);
|
||||
static void F_I03 (struct l1_softc *sc);
|
||||
static void F_I2 (struct l1_softc *sc);
|
||||
static void F_ill (struct l1_softc *sc);
|
||||
static void F_NULL (struct l1_softc *sc);
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* I.430 Timer T3 expire function
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
timer3_expired(struct isic_softc *sc)
|
||||
timer3_expired(struct l1_softc *sc)
|
||||
{
|
||||
if(sc->sc_I430T3)
|
||||
{
|
||||
|
|
@ -180,23 +160,18 @@ timer3_expired(struct isic_softc *sc)
|
|||
* I.430 Timer T3 start
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
T3_start(struct isic_softc *sc)
|
||||
T3_start(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_T_MSG, "T3_start", ("state = %s\n", isic_printstate(sc)));
|
||||
sc->sc_I430T3 = 1;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
sc->sc_T3_callout = timeout((TIMEOUT_FUNC_T)timer3_expired,(struct isic_softc *)sc, 2*hz);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)timer3_expired,(struct isic_softc *)sc, 2*hz);
|
||||
#endif
|
||||
sc->sc_T3_callout = timeout((TIMEOUT_FUNC_T)timer3_expired,(struct l1_softc *)sc, 2*hz);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* I.430 Timer T3 stop
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
T3_stop(struct isic_softc *sc)
|
||||
T3_stop(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_T_MSG, "T3_stop", ("state = %s\n", isic_printstate(sc)));
|
||||
|
||||
|
|
@ -205,11 +180,7 @@ T3_stop(struct isic_softc *sc)
|
|||
if(sc->sc_I430T3)
|
||||
{
|
||||
sc->sc_I430T3 = 0;
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
untimeout((TIMEOUT_FUNC_T)timer3_expired,(struct isic_softc *)sc, sc->sc_T3_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)timer3_expired,(struct isic_softc *)sc);
|
||||
#endif
|
||||
untimeout((TIMEOUT_FUNC_T)timer3_expired,(struct l1_softc *)sc, sc->sc_T3_callout);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -217,21 +188,22 @@ T3_stop(struct isic_softc *sc)
|
|||
* I.430 Timer T3 expiry
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
F_T3ex(struct isic_softc *sc)
|
||||
F_T3ex(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_F_MSG, "F_T3ex", ("FSM function F_T3ex executing\n"));
|
||||
PH_Deact_Ind(sc->sc_unit);
|
||||
if(ctrl_desc[sc->sc_unit].protocol != PROTOCOL_D64S)
|
||||
PH_Deact_Ind(sc->sc_unit);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Timer T4 expire function
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
timer4_expired(struct isic_softc *sc)
|
||||
timer4_expired(struct l1_softc *sc)
|
||||
{
|
||||
if(sc->sc_I430T4)
|
||||
{
|
||||
DBGL1(L1_T_ERR, "timer4_expired", ("state = %s\n", isic_printstate(sc)));
|
||||
DBGL1(L1_T_MSG, "timer4_expired", ("state = %s\n", isic_printstate(sc)));
|
||||
sc->sc_I430T4 = 0;
|
||||
MPH_Status_Ind(sc->sc_unit, STI_PDEACT, 0);
|
||||
}
|
||||
|
|
@ -245,34 +217,25 @@ timer4_expired(struct isic_softc *sc)
|
|||
* Timer T4 start
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
T4_start(struct isic_softc *sc)
|
||||
T4_start(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_T_MSG, "T4_start", ("state = %s\n", isic_printstate(sc)));
|
||||
sc->sc_I430T4 = 1;
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >=3
|
||||
sc->sc_T4_callout = timeout((TIMEOUT_FUNC_T)timer4_expired,(struct isic_softc *)sc, hz);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)timer4_expired,(struct isic_softc *)sc, hz);
|
||||
#endif
|
||||
sc->sc_T4_callout = timeout((TIMEOUT_FUNC_T)timer4_expired,(struct l1_softc *)sc, hz);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Timer T4 stop
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
T4_stop(struct isic_softc *sc)
|
||||
T4_stop(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_T_MSG, "T4_stop", ("state = %s\n", isic_printstate(sc)));
|
||||
|
||||
if(sc->sc_I430T4)
|
||||
{
|
||||
sc->sc_I430T4 = 0;
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >=3
|
||||
untimeout((TIMEOUT_FUNC_T)timer4_expired,(struct isic_softc *)sc, sc->sc_T4_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)timer4_expired,(struct isic_softc *)sc);
|
||||
#endif
|
||||
untimeout((TIMEOUT_FUNC_T)timer4_expired,(struct l1_softc *)sc, sc->sc_T4_callout);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -280,13 +243,14 @@ T4_stop(struct isic_softc *sc)
|
|||
* FSM function: received AI8
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
F_AI8(struct isic_softc *sc)
|
||||
F_AI8(struct l1_softc *sc)
|
||||
{
|
||||
T4_stop(sc);
|
||||
|
||||
DBGL1(L1_F_MSG, "F_AI8", ("FSM function F_AI8 executing\n"));
|
||||
|
||||
PH_Act_Ind(sc->sc_unit);
|
||||
if(ctrl_desc[sc->sc_unit].protocol != PROTOCOL_D64S)
|
||||
PH_Act_Ind(sc->sc_unit);
|
||||
|
||||
T3_stop(sc);
|
||||
|
||||
|
|
@ -308,13 +272,14 @@ F_AI8(struct isic_softc *sc)
|
|||
* FSM function: received AI10
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
F_AI10(struct isic_softc *sc)
|
||||
F_AI10(struct l1_softc *sc)
|
||||
{
|
||||
T4_stop(sc);
|
||||
|
||||
DBGL1(L1_F_MSG, "F_AI10", ("FSM function F_AI10 executing\n"));
|
||||
|
||||
PH_Act_Ind(sc->sc_unit);
|
||||
if(ctrl_desc[sc->sc_unit].protocol != PROTOCOL_D64S)
|
||||
PH_Act_Ind(sc->sc_unit);
|
||||
|
||||
T3_stop(sc);
|
||||
|
||||
|
|
@ -336,7 +301,7 @@ F_AI10(struct isic_softc *sc)
|
|||
* FSM function: received INFO 0 in states F3 .. F5
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
F_I01(struct isic_softc *sc)
|
||||
F_I01(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_F_MSG, "F_I01", ("FSM function F_I01 executing\n"));
|
||||
|
||||
|
|
@ -358,11 +323,12 @@ F_I01(struct isic_softc *sc)
|
|||
* FSM function: received INFO 0 in state F6
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
F_I02(struct isic_softc *sc)
|
||||
F_I02(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_F_MSG, "F_I02", ("FSM function F_I02 executing\n"));
|
||||
|
||||
PH_Deact_Ind(sc->sc_unit);
|
||||
if(ctrl_desc[sc->sc_unit].protocol != PROTOCOL_D64S)
|
||||
PH_Deact_Ind(sc->sc_unit);
|
||||
|
||||
if(sc->sc_trace & TRACE_I)
|
||||
{
|
||||
|
|
@ -382,11 +348,12 @@ F_I02(struct isic_softc *sc)
|
|||
* FSM function: received INFO 0 in state F7 or F8
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
F_I03(struct isic_softc *sc)
|
||||
F_I03(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_F_MSG, "F_I03", ("FSM function F_I03 executing\n"));
|
||||
|
||||
PH_Deact_Ind(sc->sc_unit);
|
||||
if(ctrl_desc[sc->sc_unit].protocol != PROTOCOL_D64S)
|
||||
PH_Deact_Ind(sc->sc_unit);
|
||||
|
||||
T4_start(sc);
|
||||
|
||||
|
|
@ -408,7 +375,7 @@ F_I03(struct isic_softc *sc)
|
|||
* FSM function: activate request
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
F_AR(struct isic_softc *sc)
|
||||
F_AR(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_F_MSG, "F_AR", ("FSM function F_AR executing\n"));
|
||||
|
||||
|
|
@ -434,7 +401,7 @@ F_AR(struct isic_softc *sc)
|
|||
* FSM function: received INFO2
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
F_I2(struct isic_softc *sc)
|
||||
F_I2(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_F_MSG, "F_I2", ("FSM function F_I2 executing\n"));
|
||||
|
||||
|
|
@ -457,7 +424,7 @@ F_I2(struct isic_softc *sc)
|
|||
* illegal state default action
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
F_ill(struct isic_softc *sc)
|
||||
F_ill(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_F_ERR, "F_ill", ("FSM function F_ill executing\n"));
|
||||
}
|
||||
|
|
@ -466,7 +433,7 @@ F_ill(struct isic_softc *sc)
|
|||
* No action
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
F_NULL(struct isic_softc *sc)
|
||||
F_NULL(struct l1_softc *sc)
|
||||
{
|
||||
DBGL1(L1_F_MSG, "F_NULL", ("FSM function F_NULL executing\n"));
|
||||
}
|
||||
|
|
@ -476,7 +443,7 @@ F_NULL(struct isic_softc *sc)
|
|||
* layer 1 state transition table
|
||||
*---------------------------------------------------------------------------*/
|
||||
struct isic_state_tab {
|
||||
void (*func) (struct isic_softc *sc); /* function to execute */
|
||||
void (*func) (struct l1_softc *sc); /* function to execute */
|
||||
int newstate; /* next state */
|
||||
} isic_state_tab[N_EVENTS][N_STATES] = {
|
||||
|
||||
|
|
@ -500,7 +467,7 @@ struct isic_state_tab {
|
|||
* event handler
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
isic_next_state(struct isic_softc *sc, int event)
|
||||
isic_next_state(struct l1_softc *sc, int event)
|
||||
{
|
||||
int currstate, newstate;
|
||||
|
||||
|
|
@ -539,7 +506,7 @@ isic_next_state(struct isic_softc *sc, int event)
|
|||
* return pointer to current state description
|
||||
*---------------------------------------------------------------------------*/
|
||||
char *
|
||||
isic_printstate(struct isic_softc *sc)
|
||||
isic_printstate(struct l1_softc *sc)
|
||||
{
|
||||
return((char *) state_text[sc->sc_I430state]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,32 +37,28 @@
|
|||
* Siemens I-Surf 2.0 PnP specific routines for isic driver
|
||||
* --------------------------------------------------------
|
||||
*
|
||||
* $Id: i4b_siemens_isurf.c,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon 14 Jun 16:46:27 CEST 1999]
|
||||
* last edit-date: [Mon Dec 13 22:02:28 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 <sys/socket.h>
|
||||
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#include <machine/i4b_debug.h>
|
||||
|
|
@ -97,171 +93,122 @@
|
|||
/*---------------------------------------------------------------------------*
|
||||
* Siemens I-Surf 2.0 PnP ISAC get fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
static void
|
||||
siemens_isurf_read_fifo(void *buf, const void *base, size_t len)
|
||||
static void
|
||||
siemens_isurf_read_fifo(struct l1_softc *sc,int what,void *buf,size_t size)
|
||||
{
|
||||
if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXB)
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch ( what )
|
||||
{
|
||||
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);
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,IPAC_ISAC_OFF);
|
||||
bus_space_read_multi_1(t,h,SIE_ISURF_OFF_RW,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,IPAC_HSCXA_OFF);
|
||||
bus_space_read_multi_1(t,h,SIE_ISURF_OFF_RW,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,IPAC_HSCXB_OFF);
|
||||
bus_space_read_multi_1(t,h,SIE_ISURF_OFF_RW,buf,size);
|
||||
break;
|
||||
}
|
||||
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)
|
||||
static void
|
||||
siemens_isurf_write_fifo(struct l1_softc *sc,int what,void *buf,size_t size)
|
||||
{
|
||||
if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXB)
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch ( what )
|
||||
{
|
||||
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);
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,IPAC_ISAC_OFF);
|
||||
bus_space_write_multi_1(t,h,SIE_ISURF_OFF_RW,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,IPAC_HSCXA_OFF);
|
||||
bus_space_write_multi_1(t,h,SIE_ISURF_OFF_RW,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,IPAC_HSCXB_OFF);
|
||||
bus_space_write_multi_1(t,h,SIE_ISURF_OFF_RW,buf,size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* 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)
|
||||
siemens_isurf_write_reg(struct l1_softc *sc,int what,bus_size_t reg,u_int8_t data)
|
||||
{
|
||||
if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXB)
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch ( what )
|
||||
{
|
||||
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);
|
||||
}
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,reg+IPAC_ISAC_OFF);
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_RW,data);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,reg+IPAC_HSCXA_OFF);
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_RW,data);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,reg+IPAC_HSCXB_OFF);
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_RW,data);
|
||||
break;
|
||||
case ISIC_WHAT_IPAC:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,reg+IPAC_IPAC_OFF);
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_RW,data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Siemens I-Surf 2.0 PnP ISAC get register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
static u_char
|
||||
siemens_isurf_read_reg(u_char *base, u_int offset)
|
||||
static u_int8_t
|
||||
siemens_isurf_read_reg(struct l1_softc *sc,int what,bus_size_t reg)
|
||||
{
|
||||
if(((u_int)base & SIE_ISURF_OFF_MASK) == SIE_ISURF_IDHSCXB)
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch ( what )
|
||||
{
|
||||
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));
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,reg+IPAC_ISAC_OFF);
|
||||
return bus_space_read_1(t,h,SIE_ISURF_OFF_RW);
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,reg+IPAC_HSCXA_OFF);
|
||||
return bus_space_read_1(t,h,SIE_ISURF_OFF_RW);
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,reg+IPAC_HSCXB_OFF);
|
||||
return bus_space_read_1(t,h,SIE_ISURF_OFF_RW);
|
||||
case ISIC_WHAT_IPAC:
|
||||
bus_space_write_1(t,h,SIE_ISURF_OFF_ALE,reg+IPAC_IPAC_OFF);
|
||||
return bus_space_read_1(t,h,SIE_ISURF_OFF_RW);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
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
|
||||
* isic_attach_siemens_isurf - attach for Siemens I-Surf 2.0 PnP
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
int
|
||||
isic_probe_siemens_isurf(struct isa_device *dev, unsigned int iobase2)
|
||||
isic_attach_siemens_isurf(device_t dev)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
int unit = device_get_unit(dev);
|
||||
struct l1_softc *sc = &l1_sc[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;
|
||||
|
|
@ -283,27 +230,9 @@ isic_probe_siemens_isurf(struct isa_device *dev, unsigned int iobase2)
|
|||
|
||||
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 */
|
||||
|
|
@ -311,7 +240,6 @@ isic_attach_siemens_isurf(struct isa_device *dev, unsigned int iobase2)
|
|||
(IPAC_AOE_OE5 | IPAC_AOE_OE4 | IPAC_AOE_OE3 | IPAC_AOE_OE2));
|
||||
IPAC_WRITE(IPAC_ATX, 0xff); /* set all output lines high */
|
||||
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
#endif /* NISIC > 0 && defined(SIEMENS_ISURF2) */
|
||||
#endif /* FreeBSD */
|
||||
|
|
|
|||
|
|
@ -44,29 +44,17 @@
|
|||
* isic - I4B Siemens ISDN Chipset Driver for SWS cards
|
||||
* ====================================================
|
||||
*
|
||||
* EXPERIMENTAL !!!!
|
||||
* =================
|
||||
* $Id: i4b_sws.c,v 1.2 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:28:31 1999]
|
||||
*
|
||||
* -hm adding driver to i4b
|
||||
* -hm adjustments for FreeBSD < 2.2.6, no PnP support yet
|
||||
* last edit-date: [Mon Dec 13 22:02:39 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
|
||||
#else
|
||||
|
||||
#define NISIC 1
|
||||
|
||||
#endif
|
||||
|
||||
#if defined (SEDLBAUER) && NISIC > 0
|
||||
|
||||
#define SWS_RESON 0 /* reset on */
|
||||
|
|
@ -79,40 +67,19 @@
|
|||
|
||||
#define SWS_REGS 8 /* we use an area of 8 bytes for io */
|
||||
|
||||
#define SWS_BASE(X) ((unsigned int)X&~(SWS_REGS-1))
|
||||
#define SWS_PART(X) ((unsigned int)X& (SWS_REGS-1))
|
||||
#define SWS_ADDR(X) ((SWS_PART(X) == SWS_ISAC) ? (SWS_BASE(X)+SWS_ISAC) : (SWS_BASE(X)+SWS_HSCX0) )
|
||||
#define SWS_REG(X,Y) ((SWS_PART(X) != SWS_HSCX1) ? Y : (Y+0x40) )
|
||||
#define SWS_IDO(X) (SWS_BASE(X)+SWS_RW)
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#else
|
||||
#include <machine/bus.h>
|
||||
#include <sys/device.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <machine/clock.h>
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#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/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_isac.h>
|
||||
|
|
@ -122,191 +89,113 @@
|
|||
#include <i4b/include/i4b_l1l2.h>
|
||||
#include <i4b/include/i4b_mbuf.h>
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
static u_int8_t sws_read_reg __P((struct isic_softc *sc, int what, bus_size_t offs));
|
||||
static void sws_write_reg __P((struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data));
|
||||
static void sws_read_fifo __P((struct isic_softc *sc, int what, void *buf, size_t size));
|
||||
static void sws_write_fifo __P((struct isic_softc *sc, int what, const void *data, size_t size));
|
||||
void isic_attach_sws __P((struct isic_softc *sc));
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* SWS P&P ISAC get fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
sws_read_fifo(void *buf, const void *base, size_t len)
|
||||
{
|
||||
outb(SWS_IDO(base),SWS_REG(base,0));
|
||||
insb(SWS_ADDR(base),buf,len);
|
||||
}
|
||||
sws_read_fifo(struct l1_softc *sc,int what,void *buf,size_t size) {
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
sws_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
switch (what) {
|
||||
switch ( what ) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, SWS_RW, 0);
|
||||
bus_space_read_multi_1(t, h, SWS_ISAC, buf, size);
|
||||
bus_space_write_1(t,h,SWS_RW,0x0);
|
||||
bus_space_read_multi_1(t,h,SWS_ISAC,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t, h, SWS_RW, 0);
|
||||
bus_space_read_multi_1(t, h, SWS_HSCX0, buf, size);
|
||||
bus_space_write_1(t,h,SWS_RW,0x0);
|
||||
bus_space_read_multi_1(t,h,SWS_HSCX0,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t, h, SWS_RW, 0x40);
|
||||
bus_space_read_multi_1(t, h, SWS_HSCX0, buf, size);
|
||||
bus_space_write_1(t,h,SWS_RW,0x0+0x40);
|
||||
bus_space_read_multi_1(t,h,SWS_HSCX0,buf,size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* SWS P&P ISAC put fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
sws_write_fifo(void *base, const void *buf, size_t len)
|
||||
{
|
||||
outb (SWS_IDO(base),SWS_REG(base,0));
|
||||
outsb(SWS_ADDR(base),buf,len);
|
||||
}
|
||||
sws_write_fifo(struct l1_softc *sc,int what,void *buf,size_t size) {
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
sws_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
switch (what) {
|
||||
switch ( what ) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, SWS_RW, 0);
|
||||
bus_space_write_multi_1(t, h, SWS_ISAC, (u_int8_t*)buf, size);
|
||||
bus_space_write_1(t,h,SWS_RW,0x0);
|
||||
bus_space_write_multi_1(t,h,SWS_ISAC,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t, h, SWS_RW, 0);
|
||||
bus_space_write_multi_1(t, h, SWS_HSCX0, (u_int8_t*)buf, size);
|
||||
bus_space_write_1(t,h,SWS_RW,0x0);
|
||||
bus_space_write_multi_1(t,h,SWS_HSCX0,buf,size);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t, h, SWS_RW, 0x40);
|
||||
bus_space_write_multi_1(t, h, SWS_HSCX0, (u_int8_t*)buf, size);
|
||||
bus_space_write_1(t,h,SWS_RW,0x0+0x40);
|
||||
bus_space_write_multi_1(t,h,SWS_HSCX0,buf,size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* SWS P&P ISAC put register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
sws_write_reg(u_char *base, u_int offset, u_int v)
|
||||
{
|
||||
outb(SWS_IDO(base),SWS_REG(base,offset));
|
||||
outb(SWS_ADDR(base),v);
|
||||
}
|
||||
sws_write_reg(struct l1_softc *sc,int what,bus_size_t reg,u_int8_t data) {
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
sws_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
switch (what) {
|
||||
switch ( what ) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, SWS_RW, offs);
|
||||
bus_space_write_1(t, h, SWS_ISAC, data);
|
||||
bus_space_write_1(t,h,SWS_RW,reg);
|
||||
bus_space_write_1(t,h,SWS_ISAC,data);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t, h, SWS_RW, offs);
|
||||
bus_space_write_1(t, h, SWS_HSCX0, data);
|
||||
bus_space_write_1(t,h,SWS_RW,reg);
|
||||
bus_space_write_1(t,h,SWS_HSCX0,data);
|
||||
break;
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t, h, SWS_RW, 0x40+offs);
|
||||
bus_space_write_1(t, h, SWS_HSCX0, data);
|
||||
bus_space_write_1(t,h,SWS_RW,reg+0x40);
|
||||
bus_space_write_1(t,h,SWS_HSCX0,data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* SWS P&P ISAC get register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static u_char
|
||||
sws_read_reg(u_char *base, u_int offset)
|
||||
{
|
||||
outb(SWS_IDO(base),SWS_REG(base,offset));
|
||||
return inb(SWS_ADDR(base));
|
||||
}
|
||||
sws_read_reg (struct l1_softc *sc,int what,bus_size_t reg) {
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
#else
|
||||
|
||||
static u_int8_t
|
||||
sws_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
switch (what) {
|
||||
switch ( what ) {
|
||||
case ISIC_WHAT_ISAC:
|
||||
bus_space_write_1(t, h, SWS_RW, offs);
|
||||
return bus_space_read_1(t, h, SWS_ISAC);
|
||||
bus_space_write_1(t,h,SWS_RW,reg);
|
||||
return bus_space_read_1(t,h,SWS_ISAC);
|
||||
case ISIC_WHAT_HSCXA:
|
||||
bus_space_write_1(t, h, SWS_RW, offs);
|
||||
return bus_space_read_1(t, h, SWS_HSCX0);
|
||||
bus_space_write_1(t,h,SWS_RW,reg);
|
||||
return bus_space_read_1(t,h,SWS_HSCX0);
|
||||
case ISIC_WHAT_HSCXB:
|
||||
bus_space_write_1(t, h, SWS_RW, 0x40+offs);
|
||||
return bus_space_read_1(t, h, SWS_HSCX0);
|
||||
bus_space_write_1(t,h,SWS_RW,reg+0x40);
|
||||
return bus_space_read_1(t,h,SWS_HSCX0);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
/* attach callback routine */
|
||||
|
||||
int
|
||||
isic_attach_sws(struct isa_device *dev)
|
||||
isic_attach_sws(device_t dev)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
|
||||
/* fill in isic_softc structure */
|
||||
int unit = device_get_unit(dev);
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
|
||||
struct i4b_info * info = &(sc->sc_resources);
|
||||
bus_space_tag_t t = rman_get_bustag(info->io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(info->io_base[0]);
|
||||
|
||||
/* fill in l1_softc structure */
|
||||
sc->readreg = sws_read_reg;
|
||||
sc->writereg = sws_write_reg;
|
||||
sc->readfifo = sws_read_fifo;
|
||||
sc->writefifo = sws_write_fifo;
|
||||
sc->clearirq = NULL;
|
||||
sc->sc_unit = dev->id_unit;
|
||||
sc->sc_irq = dev->id_irq;
|
||||
sc->sc_port = dev->id_iobase;
|
||||
sc->sc_cardtyp = CARD_TYPEP_SWS;
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
dev->id_msize = 0;
|
||||
|
||||
ISAC_BASE = (caddr_t) (((u_int) sc->sc_port) + SWS_ISAC);
|
||||
HSCX_A_BASE = (caddr_t) (((u_int) sc->sc_port) + SWS_HSCX0);
|
||||
HSCX_B_BASE = (caddr_t) (((u_int) sc->sc_port) + SWS_HSCX1);
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR. Expected value for the SWS PnP card is
|
||||
|
|
@ -317,76 +206,20 @@ isic_attach_sws(struct isa_device *dev)
|
|||
((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) )
|
||||
{
|
||||
printf("isic%d: HSCX VSTR test failed for SWS PnP\n",
|
||||
dev->id_unit);
|
||||
sc->sc_unit);
|
||||
printf("isic%d: HSC0: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(0, H_VSTR));
|
||||
sc->sc_unit, HSCX_READ(0, H_VSTR));
|
||||
printf("isic%d: HSC1: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(1, H_VSTR));
|
||||
return (0);
|
||||
sc->sc_unit, HSCX_READ(1, H_VSTR));
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
/* reset card */
|
||||
|
||||
outb( ((u_int) sc->sc_port) + SWS_RESON , 0x3);
|
||||
bus_space_write_1(t,h,SWS_RESON,0x3);
|
||||
DELAY(SEC_DELAY / 5);
|
||||
outb( ((u_int) sc->sc_port) + SWS_RESOFF, 0);
|
||||
bus_space_write_1(t,h,SWS_RESOFF,0x0);
|
||||
DELAY(SEC_DELAY / 5);
|
||||
|
||||
return(1);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
#else /* !__FreeBSD__ */
|
||||
|
||||
void
|
||||
isic_attach_sws(struct isic_softc *sc)
|
||||
{
|
||||
/* setup access routines */
|
||||
|
||||
sc->readreg = sws_read_reg;
|
||||
sc->writereg = sws_write_reg;
|
||||
|
||||
sc->readfifo = sws_read_fifo;
|
||||
sc->writefifo = sws_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_SWS;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR. Expected value for the SWS PnP card is
|
||||
* 0x05 ( = version 2.1 ) in the least significant bits.
|
||||
*/
|
||||
|
||||
if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) ||
|
||||
((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) )
|
||||
{
|
||||
printf("%s: HSCX VSTR test failed for SWS PnP\n",
|
||||
sc->sc_dev.dv_xname);
|
||||
printf("%s: HSC0: VSTR: %#x\n",
|
||||
sc->sc_dev.dv_xname, HSCX_READ(0, H_VSTR));
|
||||
printf("%s: HSC1: VSTR: %#x\n",
|
||||
sc->sc_dev.dv_xname, HSCX_READ(1, H_VSTR));
|
||||
return;
|
||||
}
|
||||
|
||||
/* reset card */
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
bus_space_write_1(t, h, SWS_RESON, 0x3);
|
||||
DELAY(SEC_DELAY / 5);
|
||||
bus_space_write_1(t, h, SWS_RESOFF, 0);
|
||||
DELAY(SEC_DELAY / 5);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* !__FreeBSD__ */
|
||||
|
||||
#endif /* defined(SEDLBAUER) && NISIC > 0 */
|
||||
|
|
|
|||
|
|
@ -37,55 +37,33 @@
|
|||
* isic - I4B Siemens ISDN Chipset Driver for Teles S0/16 and clones
|
||||
* =================================================================
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_tel_s016.c,v 1.3 1999/12/13 21:25:26 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:28:38 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* -hm clean up
|
||||
* -hm checked with a Creatix ISDN-S0 (PCB version: mp 130.1)
|
||||
* -hm more cleanup
|
||||
* -hm NetBSD patches from Martin
|
||||
* -hm converting asm -> C
|
||||
* last edit-date: [Mon Dec 13 22:02:47 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
#else
|
||||
#define NISIC 1
|
||||
#endif
|
||||
|
||||
#if NISIC > 0 && defined(TEL_S0_16)
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <machine/md_var.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#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 <i4b/i4b_debug.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <i4b/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_isac.h>
|
||||
|
|
@ -95,66 +73,36 @@
|
|||
#include <i4b/include/i4b_l1l2.h>
|
||||
#include <i4b/include/i4b_mbuf.h>
|
||||
|
||||
static u_char intr_no[] = { 1, 1, 0, 2, 4, 6, 1, 1, 1, 0, 8, 10, 12, 1, 1, 14 };
|
||||
#define TELES_S016_MEMSIZE 0x1000
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
static u_int8_t tels016_read_reg __P((struct isic_softc *sc, int what, bus_size_t offs));
|
||||
static void tels016_write_reg __P((struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data));
|
||||
static void tels016_read_fifo __P((struct isic_softc *sc, int what, void *buf, size_t size));
|
||||
static void tels016_write_fifo __P((struct isic_softc *sc, int what, const void *data, size_t size));
|
||||
#endif
|
||||
static u_char intr_no[] = { 1, 1, 0, 2, 4, 6, 1, 1, 1, 0, 8, 10, 12, 1, 1, 14 };
|
||||
static const bus_size_t offset[] = { 0x100, 0x180, 0x1c0 };
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16 write register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
tels016_write_reg(u_char *base, u_int i, u_int v)
|
||||
tels016_write_reg(struct l1_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
if(i & 0x01)
|
||||
i |= 0x200;
|
||||
base[i] = v;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static const bus_size_t offset[] = { 0x100, 0x180, 0x1c0 };
|
||||
|
||||
static void
|
||||
tels016_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[1].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.mem);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.mem);
|
||||
|
||||
offs += offset[what];
|
||||
|
||||
if (offs & 0x01)
|
||||
offs |= 0x200;
|
||||
|
||||
bus_space_write_1(t, h, offs, data);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16 read register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static u_char
|
||||
tels016_read_reg(u_char *base, u_int i)
|
||||
{
|
||||
if(i & 0x1)
|
||||
i |= 0x200;
|
||||
return(base[i]);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static u_int8_t
|
||||
tels016_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
||||
tels016_read_reg(struct l1_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;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.mem);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.mem);
|
||||
|
||||
offs += offset[what];
|
||||
|
||||
|
|
@ -163,72 +111,75 @@ tels016_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
|||
|
||||
return bus_space_read_1(t, h, offs);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16 fifo read/write routines
|
||||
* Teles S0/16 fifo write routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
tels016_memcpyb(void *to, const void *from, size_t len)
|
||||
{
|
||||
for(;len > 0; len--)
|
||||
*((unsigned char *)to)++ = *((unsigned char *)from)++;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
tels016_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size)
|
||||
tels016_write_fifo(struct l1_softc *sc, int what, void *data, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[1].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.mem);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.mem);
|
||||
bus_space_write_region_1(t, h, offset[what], data, size);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16 fifo read routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
tels016_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
||||
tels016_read_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[1].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.mem);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.mem);
|
||||
bus_space_read_region_1(t, h, offset[what], buf, size);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_probe_s016 - probe for Teles S0/16 and compatibles
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
int
|
||||
isic_probe_s016(struct isa_device *dev)
|
||||
isic_probe_s016(device_t dev)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
u_char byte;
|
||||
size_t unit = device_get_unit(dev); /* get unit */
|
||||
struct l1_softc *sc = 0; /* softc */
|
||||
void *ih = 0; /* dummy */
|
||||
u_int8_t b0,b1,b2; /* for signature */
|
||||
bus_space_tag_t t; /* bus things */
|
||||
bus_space_handle_t h;
|
||||
|
||||
/* check max unit range */
|
||||
|
||||
if(dev->id_unit >= ISIC_MAXUNIT)
|
||||
|
||||
if(unit >= ISIC_MAXUNIT)
|
||||
{
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Teles S0/16!\n",
|
||||
dev->id_unit, dev->id_unit);
|
||||
return(0);
|
||||
}
|
||||
sc->sc_unit = dev->id_unit;
|
||||
|
||||
/* check IRQ validity */
|
||||
|
||||
if((intr_no[ffs(dev->id_irq) - 1]) == 1)
|
||||
{
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/16!\n",
|
||||
dev->id_unit, ffs(dev->id_irq)-1);
|
||||
return(0);
|
||||
unit, unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
sc->sc_irq = dev->id_irq;
|
||||
|
||||
/* check if we got an iobase */
|
||||
sc = &l1_sc[unit]; /* get pointer to softc */
|
||||
|
||||
switch(dev->id_iobase)
|
||||
sc->sc_unit = unit; /* set unit */
|
||||
|
||||
sc->sc_flags = FLAG_TELES_S0_16; /* set flags */
|
||||
|
||||
/* see if an io base was supplied */
|
||||
|
||||
if(!(sc->sc_resources.io_base[0] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[0],
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not allocate i/o port for Teles S0/16.\n", unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
sc->sc_port = rman_get_start(sc->sc_resources.io_base[0]);
|
||||
|
||||
/*
|
||||
* check if the provided io port is valid
|
||||
*/
|
||||
|
||||
switch(sc->sc_port)
|
||||
{
|
||||
case 0xd80:
|
||||
case 0xe80:
|
||||
|
|
@ -237,15 +188,34 @@ isic_probe_s016(struct isa_device *dev)
|
|||
|
||||
default:
|
||||
printf("isic%d: Error, invalid iobase 0x%x specified for Teles S0/16!\n",
|
||||
dev->id_unit, dev->id_iobase);
|
||||
return(0);
|
||||
unit, sc->sc_port);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
break;
|
||||
}
|
||||
sc->sc_port = dev->id_iobase;
|
||||
|
||||
/* check if valid memory addr */
|
||||
|
||||
switch((unsigned int)kvtop(dev->id_maddr))
|
||||
/* allocate memory resource */
|
||||
|
||||
if(!(sc->sc_resources.mem =
|
||||
bus_alloc_resource(dev, SYS_RES_MEMORY,
|
||||
&sc->sc_resources.mem_rid,
|
||||
0ul, ~0ul, TELES_S016_MEMSIZE,
|
||||
RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not allocate memory for Teles S0/16.\n", unit);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
/*
|
||||
* get virtual addr.
|
||||
*/
|
||||
sc->sc_vmem_addr = rman_get_virtual(sc->sc_resources.mem);
|
||||
|
||||
/*
|
||||
* check for valid adresses
|
||||
*/
|
||||
switch(kvtop(sc->sc_vmem_addr))
|
||||
{
|
||||
case 0xc0000:
|
||||
case 0xc2000:
|
||||
|
|
@ -266,112 +236,17 @@ isic_probe_s016(struct isa_device *dev)
|
|||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid mem addr 0x%lx for Teles S0/16!\n",
|
||||
dev->id_unit, kvtop(dev->id_maddr));
|
||||
return(0);
|
||||
printf("isic%d: Error, invalid memory address 0x%lx for Teles S0/16!\n",
|
||||
unit, kvtop(sc->sc_vmem_addr));
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
break;
|
||||
}
|
||||
sc->sc_vmem_addr = (caddr_t) dev->id_maddr;
|
||||
dev->id_msize = 0x1000;
|
||||
|
||||
/* check card signature */
|
||||
|
||||
if((byte = inb(sc->sc_port)) != 0x51)
|
||||
{
|
||||
printf("isic%d: Error, signature 1 0x%x != 0x51 for Teles S0/16!\n",
|
||||
dev->id_unit, byte);
|
||||
return(0);
|
||||
}
|
||||
|
||||
if((byte = inb(sc->sc_port + 1)) != 0x93)
|
||||
{
|
||||
printf("isic%d: Error, signature 2 0x%x != 0x93 for Teles S0/16!\n",
|
||||
dev->id_unit, byte);
|
||||
return(0);
|
||||
}
|
||||
|
||||
byte = inb(sc->sc_port + 2);
|
||||
|
||||
if((byte != 0x1e) && (byte != 0x1f))
|
||||
{
|
||||
printf("isic%d: Error, signature 3 0x%x != 0x1e or 0x1f for Teles S0/16!\n",
|
||||
dev->id_unit, byte);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* setup access routines */
|
||||
/* setup ISAC access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = tels016_read_reg;
|
||||
sc->writereg = tels016_write_reg;
|
||||
|
||||
sc->readfifo = tels016_memcpyb;
|
||||
sc->writefifo = tels016_memcpyb;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp= CARD_TYPEP_16;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM1;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/* setup ISAC base addr */
|
||||
|
||||
ISAC_BASE = (caddr_t) ((dev->id_maddr) + 0x100);
|
||||
|
||||
/* setup HSCX base addr */
|
||||
|
||||
HSCX_A_BASE = (caddr_t) ((dev->id_maddr) + 0x180);
|
||||
HSCX_B_BASE = (caddr_t) ((dev->id_maddr) + 0x1c0);
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int
|
||||
isic_probe_s016(struct isic_attach_args *ia)
|
||||
{
|
||||
bus_space_tag_t t = ia->ia_maps[0].t;
|
||||
bus_space_handle_t h = ia->ia_maps[0].h;
|
||||
u_int8_t b0, b1, b2;
|
||||
|
||||
b0 = bus_space_read_1(t, h, 0);
|
||||
b1 = bus_space_read_1(t, h, 1);
|
||||
b2 = bus_space_read_1(t, h, 2);
|
||||
|
||||
if (b0 == 0x51 && b1 == 0x93 && (b2 == 0x1e || b2 == 0x1f))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_s016 - attach Teles S0/16 and compatibles
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
#ifdef __FreeBSD__
|
||||
isic_attach_s016(struct isa_device *dev)
|
||||
#else
|
||||
isic_attach_s016(struct isic_softc *sc)
|
||||
#endif
|
||||
{
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
#endif
|
||||
|
||||
u_long irq;
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
/* setup access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = tels016_read_reg;
|
||||
sc->writereg = tels016_write_reg;
|
||||
|
||||
|
|
@ -379,8 +254,7 @@ isic_attach_s016(struct isic_softc *sc)
|
|||
sc->writefifo = tels016_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp= CARD_TYPEP_16;
|
||||
sc->sc_cardtyp = CARD_TYPEP_16;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
|
|
@ -389,67 +263,123 @@ isic_attach_s016(struct isic_softc *sc)
|
|||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
#endif
|
||||
/* setup ISAC base addr, though we don't really need it */
|
||||
|
||||
ISAC_BASE = (caddr_t)((sc->sc_vmem_addr) + 0x100);
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
if((irq = intr_no[ffs(dev->id_irq) - 1]) == 1)
|
||||
/* setup HSCX base addr */
|
||||
|
||||
HSCX_A_BASE = (caddr_t)((sc->sc_vmem_addr) + 0x180);
|
||||
HSCX_B_BASE = (caddr_t)((sc->sc_vmem_addr) + 0x1c0);
|
||||
|
||||
t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
/* get signature bytes */
|
||||
b0 = bus_space_read_1(t, h, 0);
|
||||
b1 = bus_space_read_1(t, h, 1);
|
||||
b2 = bus_space_read_1(t, h, 2);
|
||||
|
||||
/* check signature bytes */
|
||||
if(b0 != 0x51)
|
||||
{
|
||||
printf("isic%d: Attach error, invalid IRQ [%d] specified for Teles S0/16!\n",
|
||||
dev->id_unit, ffs(dev->id_irq)-1);
|
||||
return(0);
|
||||
printf("isic%d: Error, signature 1 0x%x != 0x51 for Teles S0/16!\n",
|
||||
unit, b0);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
}
|
||||
#else
|
||||
|
||||
if(b1 != 0x93)
|
||||
{
|
||||
printf("isic%d: Error, signature 2 0x%x != 0x93 for Teles S0/16!\n",
|
||||
unit, b1);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
if((b2 != 0x1e) && (b2 != 0x1f))
|
||||
{
|
||||
printf("isic%d: Error, signature 3 0x%x != 0x1e or 0x1f for Teles S0/16!\n",
|
||||
unit, b2);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
/* get our irq */
|
||||
|
||||
if(!(sc->sc_resources.irq =
|
||||
bus_alloc_resource(dev, SYS_RES_IRQ,
|
||||
&sc->sc_resources.irq_rid,
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not allocate irq for Teles S0/16.\n", unit);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/* register interupt routine */
|
||||
|
||||
bus_setup_intr(dev, sc->sc_resources.irq,
|
||||
INTR_TYPE_NET,
|
||||
(void(*)(void *))(isicintr),
|
||||
sc, &ih);
|
||||
|
||||
/* get the irq number */
|
||||
|
||||
sc->sc_irq = rman_get_start(sc->sc_resources.irq);
|
||||
|
||||
/* check IRQ validity */
|
||||
|
||||
if((intr_no[sc->sc_irq]) == 1)
|
||||
{
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/16!\n",
|
||||
unit, sc->sc_irq);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_s016 - attach Teles S0/16 and compatibles
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_attach_s016(device_t dev)
|
||||
{
|
||||
struct l1_softc *sc = &l1_sc[device_get_unit(dev)];
|
||||
u_long irq;
|
||||
|
||||
bus_space_tag_t ta = rman_get_bustag(sc->sc_resources.mem);
|
||||
bus_space_handle_t ha = rman_get_bushandle(sc->sc_resources.mem);
|
||||
bus_space_tag_t tb = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t hb = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
/* is this right for FreeBSD or off by one ? */
|
||||
irq = intr_no[sc->sc_irq];
|
||||
#endif
|
||||
|
||||
/* configure IRQ */
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
irq |= ((u_long) sc->sc_vmem_addr) >> 9;
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
outb(sc->sc_port + 4, irq);
|
||||
bus_space_write_1(tb, hb, 4, irq);
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
outb(sc->sc_port + 4, irq | 0x01);
|
||||
bus_space_write_1(tb, hb, 4, irq | 0x01);
|
||||
|
||||
DELAY(SEC_DELAY / 5);
|
||||
|
||||
/* set card bit off */
|
||||
|
||||
sc->sc_vmem_addr[0x80] = 0;
|
||||
bus_space_write_1(ta, ha, 0x80, 0);
|
||||
DELAY(SEC_DELAY / 5);
|
||||
|
||||
/* set card bit on */
|
||||
|
||||
sc->sc_vmem_addr[0x80] = 1;
|
||||
bus_space_write_1(ta, ha, 0x80, 1);
|
||||
DELAY(SEC_DELAY / 5);
|
||||
|
||||
#else
|
||||
|
||||
irq |= ((sc->sc_maddr >> 9) & 0x000000f0);
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, 4, irq);
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
bus_space_write_1(sc->sc_maps[0].t, sc->sc_maps[0].h, 4, irq | 0x01);
|
||||
|
||||
DELAY(SEC_DELAY / 5);
|
||||
|
||||
/* set card bit off */
|
||||
|
||||
bus_space_write_1(sc->sc_maps[1].t, sc->sc_maps[1].h, 0x80, 0);
|
||||
DELAY(SEC_DELAY / 5);
|
||||
|
||||
/* set card bit on */
|
||||
|
||||
bus_space_write_1(sc->sc_maps[1].t, sc->sc_maps[1].h, 0x80, 1);
|
||||
DELAY(SEC_DELAY / 5);
|
||||
#endif
|
||||
|
||||
return (1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* ISIC > 0 */
|
||||
|
||||
|
|
|
|||
|
|
@ -37,55 +37,32 @@
|
|||
* isic - I4B Siemens ISDN Chipset Driver for Teles S0/16.3
|
||||
* ========================================================
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_tel_s0163.c,v 1.2 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Mon Jul 26 10:59:38 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* -hm clean up
|
||||
* -hm more cleanup
|
||||
* -hm NetBSD patches from Martin
|
||||
* -hm VSTR detection for older 16.3 cards
|
||||
* last edit-date: [Mon Dec 13 22:02:55 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
#else
|
||||
#define NISIC 1
|
||||
#endif
|
||||
|
||||
#if NISIC > 0 && defined(TEL_S0_16_3)
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#elif defined(__bsdi__)
|
||||
/* XXX */
|
||||
#else
|
||||
#include <machine/bus.h>
|
||||
#include <sys/device.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <machine/clock.h>
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#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/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_isac.h>
|
||||
|
|
@ -97,184 +74,167 @@
|
|||
|
||||
static u_char intr_no[] = { 1, 1, 0, 2, 4, 6, 1, 1, 1, 0, 8, 10, 12, 1, 1, 14 };
|
||||
|
||||
#if !defined(__FreeBSD__) && !defined(__bsdi__)
|
||||
static u_int8_t tels0163_read_reg __P((struct isic_softc *sc, int what, bus_size_t offs));
|
||||
static void tels0163_write_reg __P((struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data));
|
||||
static void tels0163_read_fifo __P((struct isic_softc *sc, int what, void *buf, size_t size));
|
||||
static void tels0163_write_fifo __P((struct isic_softc *sc, int what, const void *data, size_t size));
|
||||
#endif
|
||||
#define ISAC_OFFS 0x420
|
||||
#define HSCXA_OFFS 0xc20
|
||||
#define HSCXB_OFFS 0x820
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16.3 read fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#if defined(__FreeBSD__) || defined(__bsdi__)
|
||||
|
||||
static void
|
||||
tels0163_read_fifo(void *buf, const void *base, size_t len)
|
||||
{
|
||||
insb((int)base + 0x3e, (u_char *)buf, (u_int)len);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
tels0163_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
||||
tels0163_read_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
bus_space_read_multi_1(t, h, o + 0x1e, buf, size);
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+1]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+1]);
|
||||
bus_space_read_multi_1(t,h,0x3e,buf,size);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16.3 write fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#if defined(__FreeBSD__) || defined(__bsdi__)
|
||||
|
||||
static void
|
||||
tels0163_write_fifo(void *base, const void *buf, size_t len)
|
||||
tels0163_write_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
outsb((int)base + 0x3e, (u_char *)buf, (u_int)len);
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+1]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+1]);
|
||||
bus_space_write_multi_1(t,h,0x3e,buf,size);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
tels0163_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
bus_space_write_multi_1(t, h, o + 0x1e, (u_int8_t*)buf, size);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16.3 ISAC put register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#if defined(__FreeBSD__) || defined(__bsdi__)
|
||||
|
||||
static void
|
||||
tels0163_write_reg(u_char *base, u_int offset, u_int v)
|
||||
tels0163_write_reg(struct l1_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
outb((int)base + offset, (u_char)v);
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+1]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+1]);
|
||||
bus_space_write_1(t,h,offs,data);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
tels0163_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
bus_space_write_1(t, h, o + offs - 0x20, data);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16.3 ISAC get register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#if defined(__FreeBSD__) || defined(__bsdi__)
|
||||
|
||||
static u_char
|
||||
tels0163_read_reg(u_char *base, u_int offset)
|
||||
{
|
||||
return (inb((int)base + offset));
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static u_int8_t
|
||||
tels0163_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
||||
tels0163_read_reg(struct l1_softc *sc, int what, bus_size_t offs)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
return bus_space_read_1(t, h, o + offs - 0x20);
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[what+1]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[what+1]);
|
||||
return bus_space_read_1(t,h,offs);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_probe_s0163 - probe for Teles S0/16.3 and compatibles
|
||||
* isic_probe_s0163 - probe routine for Teles S0/16.3
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
int
|
||||
isic_probe_s0163(struct isa_device *dev)
|
||||
isic_probe_s0163(device_t dev)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
u_char byte;
|
||||
|
||||
size_t unit = device_get_unit(dev); /* get unit */
|
||||
struct l1_softc *sc = 0; /* pointer to softc */
|
||||
void *ih = 0; /* dummy */
|
||||
bus_space_tag_t t; /* bus things */
|
||||
bus_space_handle_t h;
|
||||
u_int8_t b0,b1,b2; /* signature */
|
||||
|
||||
/* check max unit range */
|
||||
|
||||
if(dev->id_unit >= ISIC_MAXUNIT)
|
||||
{
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Teles S0/16.3!\n",
|
||||
dev->id_unit, dev->id_unit);
|
||||
return(0);
|
||||
}
|
||||
sc->sc_unit = dev->id_unit;
|
||||
|
||||
/* check IRQ validity */
|
||||
|
||||
if((intr_no[ffs(dev->id_irq) - 1]) == 1)
|
||||
if(unit >= ISIC_MAXUNIT)
|
||||
{
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/16.3!\n",
|
||||
dev->id_unit, ffs(dev->id_irq)-1);
|
||||
return(0);
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Teles 16.3!\n",
|
||||
unit, unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
sc->sc_irq = dev->id_irq;
|
||||
|
||||
/* check if memory addr specified */
|
||||
sc = &l1_sc[unit]; /* get pointer to softc */
|
||||
sc->sc_unit = unit; /* set unit */
|
||||
sc->sc_flags = FLAG_TELES_S0_163; /* set flags */
|
||||
|
||||
if(dev->id_maddr)
|
||||
{
|
||||
printf("isic%d: Error, mem addr 0x%lx specified for Teles S0/16.3!\n",
|
||||
dev->id_unit, (u_long)dev->id_maddr);
|
||||
return(0);
|
||||
}
|
||||
|
||||
dev->id_msize = 0;
|
||||
/* see if an io base was supplied */
|
||||
|
||||
/* check if we got an iobase */
|
||||
if(!(sc->sc_resources.io_base[0] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[0],
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not get iobase for Teles S0/16.3.\n",
|
||||
unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
switch(dev->id_iobase)
|
||||
/* set io base */
|
||||
|
||||
sc->sc_port = rman_get_start(sc->sc_resources.io_base[0]);
|
||||
|
||||
switch(sc->sc_port)
|
||||
{
|
||||
case 0xd80:
|
||||
case 0xe80:
|
||||
case 0xf80:
|
||||
break;
|
||||
|
||||
case 0x180:
|
||||
case 0x280:
|
||||
case 0x380:
|
||||
printf("isic%d: Error, instead of using iobase 0x%x for your Teles S0/16.3,\n",
|
||||
unit, sc->sc_port);
|
||||
printf("isic%d: please use 0x%x in the kernel configuration file!\n",
|
||||
unit, sc->sc_port+0xc00);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid iobase 0x%x specified for Teles S0/16.3!\n",
|
||||
dev->id_unit, dev->id_iobase);
|
||||
return(0);
|
||||
unit, sc->sc_port);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
break;
|
||||
}
|
||||
sc->sc_port = dev->id_iobase;
|
||||
|
||||
if(((byte = inb(sc->sc_port)) != 0x51) && (byte != 0x10))
|
||||
/* set io port resources */
|
||||
|
||||
sc->sc_resources.io_rid[1] = 1;
|
||||
bus_set_resource(dev, SYS_RES_IOPORT, 1,
|
||||
sc->sc_port-ISAC_OFFS, 0x40);
|
||||
sc->sc_resources.io_base[1] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[1],
|
||||
0ul, ~0ul, 1, RF_ACTIVE);
|
||||
if(!sc->sc_resources.io_base[1])
|
||||
{
|
||||
printf("isic%d: Error, signature 1 0x%x != 0x51 or 0x10 for Teles S0/16.3!\n",
|
||||
dev->id_unit, byte);
|
||||
return(0);
|
||||
printf("isic%d: Error allocating io at 0x%x for Teles S0/16.3!\n",
|
||||
unit, sc->sc_port-ISAC_OFFS);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
if((byte = inb(sc->sc_port + 1)) != 0x93)
|
||||
sc->sc_resources.io_rid[2] = 2;
|
||||
bus_set_resource(dev, SYS_RES_IOPORT, 2,
|
||||
sc->sc_port-HSCXA_OFFS, 0x40);
|
||||
sc->sc_resources.io_base[2] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[2],
|
||||
0ul, ~0ul, 1, RF_ACTIVE);
|
||||
if(!sc->sc_resources.io_base[2])
|
||||
{
|
||||
printf("isic%d: Error, signature 2 0x%x != 0x93 for Teles S0/16.3!\n",
|
||||
dev->id_unit, byte);
|
||||
return(0);
|
||||
printf("isic%d: Error allocating io at 0x%x for Teles S0/16.3!\n",
|
||||
unit, sc->sc_port-HSCXA_OFFS);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
if((byte = inb(sc->sc_port + 2)) != 0x1c)
|
||||
sc->sc_resources.io_rid[3] = 3;
|
||||
bus_set_resource(dev, SYS_RES_IOPORT, 3,
|
||||
sc->sc_port-HSCXB_OFFS, 0x40);
|
||||
sc->sc_resources.io_base[3] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[3],
|
||||
0ul, ~0ul, 1, RF_ACTIVE);
|
||||
if(!sc->sc_resources.io_base[3])
|
||||
{
|
||||
printf("isic%d: Error, signature 3 0x%x != 0x1c for Teles S0/16.3!\n",
|
||||
dev->id_unit, byte);
|
||||
return(0);
|
||||
printf("isic%d: Error allocating io at 0x%x for Teles S0/16.3!\n",
|
||||
unit, sc->sc_port-HSCXB_OFFS);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/* setup access routines */
|
||||
|
|
@ -294,310 +254,119 @@ isic_probe_s0163(struct isa_device *dev)
|
|||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/* setup ISAC and HSCX base addr */
|
||||
|
||||
switch(dev->id_iobase)
|
||||
{
|
||||
case 0xd80:
|
||||
ISAC_BASE = (caddr_t) 0x960;
|
||||
HSCX_A_BASE = (caddr_t) 0x160;
|
||||
HSCX_B_BASE = (caddr_t) 0x560;
|
||||
break;
|
||||
|
||||
case 0xe80:
|
||||
ISAC_BASE = (caddr_t) 0xa60;
|
||||
HSCX_A_BASE = (caddr_t) 0x260;
|
||||
HSCX_B_BASE = (caddr_t) 0x660;
|
||||
break;
|
||||
|
||||
case 0xf80:
|
||||
ISAC_BASE = (caddr_t) 0xb60;
|
||||
HSCX_A_BASE = (caddr_t) 0x360;
|
||||
HSCX_B_BASE = (caddr_t) 0x760;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR. Expected value for the S0/16.3 card is
|
||||
* 0x05 or 0x04 (for older 16.3's) in the least significant bits.
|
||||
*/
|
||||
|
||||
if( (((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) &&
|
||||
((HSCX_READ(0, H_VSTR) & 0xf) != 0x4)) ||
|
||||
(((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) &&
|
||||
((HSCX_READ(1, H_VSTR) & 0xf) != 0x4)) )
|
||||
{
|
||||
printf("isic%d: HSCX VSTR test failed for Teles S0/16.3\n",
|
||||
dev->id_unit);
|
||||
printf("isic%d: HSC0: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(0, H_VSTR));
|
||||
printf("isic%d: HSC1: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(1, H_VSTR));
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
#elif defined(__bsdi__)
|
||||
|
||||
static int
|
||||
set_softc(struct isic_softc *sc, struct isa_attach_args *ia, int unit)
|
||||
{
|
||||
sc->sc_irq = ia->ia_irq;
|
||||
|
||||
/* check if we got an iobase */
|
||||
|
||||
switch(ia->ia_iobase)
|
||||
{
|
||||
case 0xd80:
|
||||
case 0xe80:
|
||||
case 0xf80:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid iobase 0x%x specified for Teles S0/16.3!\n",
|
||||
unit, ia->ia_iobase);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
sc->sc_port = ia->ia_iobase;
|
||||
|
||||
/* setup access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = tels0163_read_reg;
|
||||
sc->writereg = tels0163_write_reg;
|
||||
|
||||
sc->readfifo = tels0163_read_fifo;
|
||||
sc->writefifo = tels0163_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp= CARD_TYPEP_16_3;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/* setup ISAC and HSCX base addr */
|
||||
|
||||
switch(ia->ia_iobase)
|
||||
{
|
||||
case 0xd80:
|
||||
ISAC_BASE = (caddr_t) 0x960;
|
||||
HSCX_A_BASE = (caddr_t) 0x160;
|
||||
HSCX_B_BASE = (caddr_t) 0x560;
|
||||
break;
|
||||
|
||||
case 0xe80:
|
||||
ISAC_BASE = (caddr_t) 0xa60;
|
||||
HSCX_A_BASE = (caddr_t) 0x260;
|
||||
HSCX_B_BASE = (caddr_t) 0x660;
|
||||
break;
|
||||
|
||||
case 0xf80:
|
||||
ISAC_BASE = (caddr_t) 0xb60;
|
||||
HSCX_A_BASE = (caddr_t) 0x360;
|
||||
HSCX_B_BASE = (caddr_t) 0x760;
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
isic_probe_s0163(struct device *dev, struct cfdata *cf,
|
||||
struct isa_attach_args *ia)
|
||||
{
|
||||
u_char byte;
|
||||
struct isic_softc dummysc, *sc = &dummysc;
|
||||
|
||||
if((intr_no[ffs(ia->ia_irq) - 1]) == 1)
|
||||
{
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/16.3!\n",
|
||||
cf->cf_unit, ffs(ia->ia_irq)-1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* check if memory addr specified */
|
||||
|
||||
if(ia->ia_maddr)
|
||||
{
|
||||
printf("isic%d: Error, mem addr 0x%lx specified for Teles S0/16.3!\n",
|
||||
cf->cf_unit, (u_long)ia->ia_maddr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Set up a temporary softc for the probe */
|
||||
|
||||
if (set_softc(sc, ia, cf->cf_unit) == 0)
|
||||
return 0;
|
||||
|
||||
if((byte = inb(sc->sc_port)) != 0x51)
|
||||
{
|
||||
printf("isic%d: Error, signature 1 0x%x != 0x51 for Teles S0/16.3!\n",
|
||||
cf->cf_unit, byte);
|
||||
return(0);
|
||||
}
|
||||
|
||||
if((byte = inb(sc->sc_port + 1)) != 0x93)
|
||||
{
|
||||
printf("isic%d: Error, signature 2 0x%x != 0x93 for Teles S0/16.3!\n",
|
||||
cf->cf_unit, byte);
|
||||
return(0);
|
||||
}
|
||||
|
||||
if((byte = inb(sc->sc_port + 2)) != 0x1c)
|
||||
{
|
||||
printf("isic%d: Error, signature 3 0x%x != 0x1c for Teles S0/16.3!\n",
|
||||
cf->cf_unit, byte);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR. Expected value for the S0/16.3 card is
|
||||
* 0x05 or 0x04 (for older 16.3's) in the least significant bits.
|
||||
*/
|
||||
|
||||
if( (((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) &&
|
||||
((HSCX_READ(0, H_VSTR) & 0xf) != 0x4)) ||
|
||||
(((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) &&
|
||||
((HSCX_READ(1, H_VSTR) & 0xf) != 0x4)) )
|
||||
{
|
||||
printf("isic%d: HSCX VSTR test failed for Teles S0/16.3\n",
|
||||
cf->cf_unit);
|
||||
printf("isic%d: HSC0: VSTR: %#x\n",
|
||||
cf->cf_unit, HSCX_READ(0, H_VSTR));
|
||||
printf("isic%d: HSC1: VSTR: %#x\n",
|
||||
cf->cf_unit, HSCX_READ(1, H_VSTR));
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
|
||||
int
|
||||
isic_probe_s0163(struct isic_attach_args *ia)
|
||||
{
|
||||
bus_space_tag_t t = ia->ia_maps[0].t;
|
||||
bus_space_handle_t h = ia->ia_maps[0].h;
|
||||
u_int8_t b0, b1, b2;
|
||||
|
||||
b0 = bus_space_read_1(t, h, 0);
|
||||
b1 = bus_space_read_1(t, h, 1);
|
||||
b2 = bus_space_read_1(t, h, 2);
|
||||
|
||||
if (b0 == 0x51 && b1 == 0x93 && b2 == 0x1c)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_s0163 - attach Teles S0/16.3 and compatibles
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
int
|
||||
isic_attach_s0163(struct isa_device *dev)
|
||||
{
|
||||
u_char irq;
|
||||
|
||||
if((irq = intr_no[ffs(dev->id_irq) - 1]) == 1)
|
||||
{
|
||||
printf("isic%d: Attach error, invalid IRQ [%d] specified for Teles S0/16.3!\n",
|
||||
dev->id_unit, ffs(dev->id_irq)-1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* configure IRQ */
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
outb(dev->id_iobase + 4, irq);
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
outb(dev->id_iobase + 4, irq | 0x01);
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
#elif defined(__bsdi__)
|
||||
|
||||
extern int
|
||||
isic_attach_s0163(struct device *parent, struct device *self, struct isa_attach_args *ia)
|
||||
{
|
||||
u_char irq;
|
||||
struct isic_softc *sc = (struct isic_softc *)self;
|
||||
int unit = sc->sc_dev.dv_unit;
|
||||
|
||||
/* Commit the probed attachement values */
|
||||
|
||||
if (set_softc(sc, ia, unit) == 0)
|
||||
panic("isic_attach_s0163: set_softc");
|
||||
|
||||
if (((unsigned)sc->sc_unit) >= NISIC)
|
||||
panic("attach isic%d; NISIC=%d", sc->sc_unit, NISIC);
|
||||
isic_sc[sc->sc_unit] = sc;
|
||||
irq = intr_no[ffs(sc->sc_irq) - 1];
|
||||
/* configure IRQ */
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
outb(sc->sc_port + 4, irq);
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
outb(sc->sc_port + 4, irq | 0x01);
|
||||
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
|
||||
int
|
||||
isic_attach_s0163(struct isic_softc *sc)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
u_int8_t irq = intr_no[sc->sc_irq];
|
||||
|
||||
/* configure IRQ */
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
bus_space_write_1(t, h, 4, irq);
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
bus_space_write_1(t, h, 4, irq | 0x01);
|
||||
|
||||
/* setup access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = tels0163_read_reg;
|
||||
sc->writereg = tels0163_write_reg;
|
||||
|
||||
sc->readfifo = tels0163_read_fifo;
|
||||
sc->writefifo = tels0163_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp= CARD_TYPEP_16_3;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
return (1);
|
||||
t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
b0 = bus_space_read_1(t, h, 0);
|
||||
b1 = bus_space_read_1(t, h, 1);
|
||||
b2 = bus_space_read_1(t, h, 2);
|
||||
|
||||
if ( b0 != 0x51 && b0 != 0x10 ) {
|
||||
printf("isic%d: Error, signature 1 0x%x != 0x51 or 0x10 for Teles S0/16.3!\n",
|
||||
unit, b0);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
if ( b1 != 0x93 ) {
|
||||
printf("isic%d: Error, signature 2 0x%x != 0x93 for Teles S0/16.3!\n",
|
||||
unit, b1);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
if ( b2 != 0x1c ) {
|
||||
printf("isic%d: Error, signature 3 0x%x != 0x1c for Teles S0/16.3!\n",
|
||||
unit, b2);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR. Expected value for the S0/16.3 card is
|
||||
* 0x05 or 0x04 (for older 16.3's) in the least significant bits.
|
||||
*/
|
||||
|
||||
if( (((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) &&
|
||||
((HSCX_READ(0, H_VSTR) & 0xf) != 0x4)) ||
|
||||
(((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) &&
|
||||
((HSCX_READ(1, H_VSTR) & 0xf) != 0x4)) )
|
||||
{
|
||||
printf("isic%d: HSCX VSTR test failed for Teles S0/16.3\n",
|
||||
unit);
|
||||
printf("isic%d: HSC0: VSTR: %#x\n",
|
||||
unit, HSCX_READ(0, H_VSTR));
|
||||
printf("isic%d: HSC1: VSTR: %#x\n",
|
||||
unit, HSCX_READ(1, H_VSTR));
|
||||
isic_detach_common(dev);
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
/* get our irq */
|
||||
|
||||
if(!(sc->sc_resources.irq =
|
||||
bus_alloc_resource(dev, SYS_RES_IRQ,
|
||||
&sc->sc_resources.irq_rid,
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not get IRQ for Teles S0/16.3.\n",unit);
|
||||
isic_detach_common(dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/* get the irq number */
|
||||
sc->sc_irq = rman_get_start(sc->sc_resources.irq);
|
||||
|
||||
switch(sc->sc_irq)
|
||||
{
|
||||
case 2:
|
||||
case 9:
|
||||
case 5:
|
||||
case 10:
|
||||
case 12:
|
||||
case 15:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/16.3!\n",
|
||||
unit, sc->sc_irq);
|
||||
isic_detach_common(dev);
|
||||
return(ENXIO);
|
||||
break;
|
||||
}
|
||||
|
||||
/* register interupt routine */
|
||||
bus_setup_intr(dev, sc->sc_resources.irq,
|
||||
INTR_TYPE_NET,
|
||||
(void(*)(void *))(isicintr),
|
||||
sc, &ih);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_s0163 - attach Teles S0/16.3 and compatibles
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
isic_attach_s0163(device_t dev)
|
||||
{
|
||||
unsigned int unit = device_get_unit(dev); /* get unit */
|
||||
struct l1_softc *sc = &l1_sc[unit];
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.io_base[0]);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.io_base[0]);
|
||||
|
||||
/* configure IRQ */
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
bus_space_write_1(t, h, 4, intr_no[sc->sc_irq]);
|
||||
|
||||
DELAY(SEC_DELAY / 10);
|
||||
bus_space_write_1(t, h, 4, intr_no[sc->sc_irq] | 0x01);
|
||||
|
||||
return (0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ISIC > 0 */
|
||||
|
||||
|
|
|
|||
|
|
@ -37,55 +37,33 @@
|
|||
* isic - I4B Siemens ISDN Chipset Driver for Teles S0/8 and clones
|
||||
* ================================================================
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_tel_s08.c,v 1.2 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:28:53 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* -hm clean up
|
||||
* -hm more cleanup
|
||||
* -hm NetBSD patches from Martin
|
||||
* -hm making it finally work (checked with board revision 1.2)
|
||||
* -hm converting asm -> C
|
||||
* last edit-date: [Mon Dec 13 22:03:06 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
#else
|
||||
#define NISIC 1
|
||||
#endif
|
||||
|
||||
#if NISIC > 0 && defined(TEL_S0_8)
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <machine/md_var.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#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 <i4b/i4b_debug.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <i4b/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_isac.h>
|
||||
|
|
@ -95,35 +73,18 @@
|
|||
#include <i4b/include/i4b_l1l2.h>
|
||||
#include <i4b/include/i4b_mbuf.h>
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
static u_int8_t tels08_read_reg __P((struct isic_softc *sc, int what, bus_size_t offs));
|
||||
static void tels08_write_reg __P((struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data));
|
||||
static void tels08_write_fifo __P((struct isic_softc *sc, int what, const void *data, size_t size));
|
||||
static void tels08_read_fifo __P((struct isic_softc *sc, int what, void *buf, size_t size));
|
||||
#endif
|
||||
#define TELES_S08_MEMSIZE 0x1000
|
||||
|
||||
static const bus_size_t offset[] = { 0x100, 0x180, 0x1c0 };
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/8 write register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
tels08_write_reg(u_char *base, u_int i, u_int v)
|
||||
tels08_write_reg(struct l1_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
if(i & 0x01)
|
||||
i |= 0x200;
|
||||
base[i] = v;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static const bus_size_t offset[] = { 0x100, 0x180, 0x1c0 };
|
||||
|
||||
static void
|
||||
tels08_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.mem);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.mem);
|
||||
|
||||
offs += offset[what];
|
||||
|
||||
|
|
@ -132,28 +93,15 @@ tels08_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data
|
|||
|
||||
bus_space_write_1(t, h, offs, data);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/8 read register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static u_char
|
||||
tels08_read_reg(u_char *base, u_int i)
|
||||
{
|
||||
if(i & 0x1)
|
||||
i |= 0x200;
|
||||
return(base[i]);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static u_int8_t
|
||||
tels08_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
||||
tels08_read_reg(struct l1_softc *sc, int what, bus_size_t offs)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.mem);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.mem);
|
||||
|
||||
offs += offset[what];
|
||||
|
||||
|
|
@ -162,62 +110,152 @@ tels08_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
|||
|
||||
return bus_space_read_1(t, h, offs);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/8 fifo read/write access
|
||||
* Teles S0/8 fifo write access
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
tels08_memcpyb(void *to, const void *from, size_t len)
|
||||
{
|
||||
for(;len > 0; len--)
|
||||
*((unsigned char *)to)++ = *((unsigned char *)from)++;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
tels08_write_fifo(struct isic_softc *sc, int what, const void *data, size_t size)
|
||||
tels08_write_fifo(struct l1_softc *sc, int what, void *data, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.mem);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.mem);
|
||||
bus_space_write_region_1(t, h, offset[what], data, size);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/8 fifo read access
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
tels08_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
||||
tels08_read_fifo(struct l1_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.mem);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.mem);
|
||||
bus_space_read_region_1(t, h, offset[what], buf, size);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_probe_s08 - probe for Teles S0/8 and compatibles
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
int
|
||||
isic_probe_s08(struct isa_device *dev)
|
||||
isic_probe_s08(device_t dev)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
size_t unit = device_get_unit(dev); /* get unit */
|
||||
struct l1_softc *sc = 0; /* pointer to softc */
|
||||
void *ih = 0; /* dummy */
|
||||
|
||||
/* check max unit range */
|
||||
|
||||
if(dev->id_unit >= ISIC_MAXUNIT)
|
||||
|
||||
if(unit >= ISIC_MAXUNIT)
|
||||
{
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Teles S0/8!\n",
|
||||
dev->id_unit, dev->id_unit);
|
||||
return(0);
|
||||
}
|
||||
sc->sc_unit = dev->id_unit;
|
||||
unit, unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
/* check IRQ validity */
|
||||
sc = &l1_sc[unit]; /* get pointer to softc */
|
||||
|
||||
sc->sc_unit = unit; /* set unit */
|
||||
|
||||
sc->sc_flags = FLAG_TELES_S0_8; /* set flags */
|
||||
|
||||
/* see if an io base was supplied */
|
||||
|
||||
if((sc->sc_resources.io_base[0] =
|
||||
bus_alloc_resource(dev, SYS_RES_IOPORT,
|
||||
&sc->sc_resources.io_rid[0],
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
/* the S0/8 is completely memory mapped ! */
|
||||
|
||||
bus_release_resource(dev,SYS_RES_IOPORT,
|
||||
sc->sc_resources.io_rid[0],
|
||||
sc->sc_resources.io_base[0]);
|
||||
printf("isic%d: Error, iobase specified for Teles S0/8!\n", unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
/* allocate memory */
|
||||
|
||||
if(!(sc->sc_resources.mem =
|
||||
bus_alloc_resource(dev, SYS_RES_MEMORY,
|
||||
&sc->sc_resources.mem_rid,
|
||||
0ul, ~0ul, TELES_S08_MEMSIZE, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not allocate memory for Teles S0/8!\n", unit);
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
/*
|
||||
* get virtual addr. it's just needed to see if it is in
|
||||
* the valid range
|
||||
*/
|
||||
|
||||
sc->sc_vmem_addr = rman_get_virtual(sc->sc_resources.mem);
|
||||
|
||||
/* check if inside memory range of 0xA0000 .. 0xDF000 */
|
||||
|
||||
if((kvtop(sc->sc_vmem_addr) < 0xa0000) ||
|
||||
(kvtop(sc->sc_vmem_addr) > 0xdf000))
|
||||
{
|
||||
printf("isic%d: Error, mem addr 0x%lx outside 0xA0000-0xDF000 for Teles S0/8!\n",
|
||||
unit, kvtop(sc->sc_vmem_addr));
|
||||
bus_release_resource(dev,SYS_RES_MEMORY,
|
||||
sc->sc_resources.mem_rid,
|
||||
sc->sc_resources.mem);
|
||||
sc->sc_resources.mem = 0;
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
switch(ffs(dev->id_irq)-1)
|
||||
/* setup ISAC access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
|
||||
sc->readreg = tels08_read_reg;
|
||||
sc->writereg = tels08_write_reg;
|
||||
|
||||
sc->readfifo = tels08_read_fifo;
|
||||
sc->writefifo = tels08_write_fifo;
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_8; /* setup card type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM1; /* setup IOM bus type */
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/* setup ISAC base addr, though we don't really need it */
|
||||
|
||||
ISAC_BASE = (caddr_t)((sc->sc_vmem_addr) + 0x100);
|
||||
|
||||
/* setup HSCX base addr */
|
||||
|
||||
HSCX_A_BASE = (caddr_t)((sc->sc_vmem_addr) + 0x180);
|
||||
HSCX_B_BASE = (caddr_t)((sc->sc_vmem_addr) + 0x1c0);
|
||||
|
||||
/* allocate our irq */
|
||||
|
||||
if(!(sc->sc_resources.irq =
|
||||
bus_alloc_resource(dev, SYS_RES_IRQ,
|
||||
&sc->sc_resources.irq_rid,
|
||||
0ul, ~0ul, 1, RF_ACTIVE)))
|
||||
{
|
||||
printf("isic%d: Could not allocate irq for Teles S0/8!\n",unit);
|
||||
|
||||
bus_release_resource(dev,SYS_RES_MEMORY,
|
||||
sc->sc_resources.mem_rid,
|
||||
sc->sc_resources.mem);
|
||||
|
||||
sc->sc_resources.mem = 0;
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/* get the irq number */
|
||||
|
||||
sc->sc_irq = rman_get_start(sc->sc_resources.irq);
|
||||
|
||||
/* check IRQ validity */
|
||||
|
||||
switch(sc->sc_irq)
|
||||
{
|
||||
case 2:
|
||||
case 9: /* XXX */
|
||||
|
|
@ -230,160 +268,51 @@ isic_probe_s08(struct isa_device *dev)
|
|||
|
||||
default:
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/8!\n",
|
||||
dev->id_unit, ffs(dev->id_irq)-1);
|
||||
return(0);
|
||||
unit, sc->sc_irq);
|
||||
bus_release_resource(dev,SYS_RES_IRQ,
|
||||
sc->sc_resources.irq_rid,
|
||||
sc->sc_resources.irq);
|
||||
sc->sc_resources.irq = 0;
|
||||
bus_release_resource(dev,SYS_RES_MEMORY,
|
||||
sc->sc_resources.mem_rid,
|
||||
sc->sc_resources.mem);
|
||||
sc->sc_resources.mem = 0;
|
||||
return(ENXIO);
|
||||
break;
|
||||
}
|
||||
sc->sc_irq = dev->id_irq;
|
||||
|
||||
/* check if we got an iobase */
|
||||
|
||||
if(dev->id_iobase > 0)
|
||||
{
|
||||
printf("isic%d: Error, iobase specified for Teles S0/8!\n",
|
||||
dev->id_unit);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* check if inside memory range of 0xA0000 .. 0xDF000 */
|
||||
|
||||
if( (kvtop(dev->id_maddr) < 0xa0000) ||
|
||||
(kvtop(dev->id_maddr) > 0xdf000) )
|
||||
{
|
||||
printf("isic%d: Error, mem addr 0x%lx outside 0xA0000-0xDF000 for Teles S0/8!\n",
|
||||
dev->id_unit, kvtop(dev->id_maddr));
|
||||
return(0);
|
||||
}
|
||||
|
||||
sc->sc_vmem_addr = (caddr_t) dev->id_maddr;
|
||||
dev->id_msize = 0x1000;
|
||||
|
||||
/* setup ISAC access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = tels08_read_reg;
|
||||
sc->writereg = tels08_write_reg;
|
||||
/* register interupt routine */
|
||||
|
||||
sc->readfifo = tels08_memcpyb;
|
||||
sc->writefifo = tels08_memcpyb;
|
||||
bus_setup_intr(dev, sc->sc_resources.irq,
|
||||
INTR_TYPE_NET,
|
||||
(void(*)(void *))(isicintr),
|
||||
sc, &ih);
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_8;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM1;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/* setup ISAC base addr */
|
||||
|
||||
ISAC_BASE = (caddr_t)((dev->id_maddr) + 0x100);
|
||||
|
||||
/* setup HSCX base addr */
|
||||
|
||||
HSCX_A_BASE = (caddr_t)((dev->id_maddr) + 0x180);
|
||||
HSCX_B_BASE = (caddr_t)((dev->id_maddr) + 0x1c0);
|
||||
|
||||
return (1);
|
||||
return (0);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int
|
||||
isic_probe_s08(struct isic_attach_args *ia)
|
||||
{
|
||||
/* no real sensible probe is easy - write to fifo memory
|
||||
and read back to verify there is memory doesn't work,
|
||||
because you talk to tx fifo and rcv fifo. So, just check
|
||||
HSCX version, which at least fails if no card present
|
||||
at the given location. */
|
||||
bus_space_tag_t t = ia->ia_maps[0].t;
|
||||
bus_space_handle_t h = ia->ia_maps[0].h;
|
||||
u_int8_t v1, v2;
|
||||
|
||||
/* HSCX A VSTR */
|
||||
v1 = bus_space_read_1(t, h, offset[1] + H_VSTR) & 0x0f;
|
||||
if (v1 != HSCX_VA1 && v1 != HSCX_VA2 && v1 != HSCX_VA3 && v1 != HSCX_V21)
|
||||
return 0;
|
||||
|
||||
/* HSCX B VSTR */
|
||||
v2 = bus_space_read_1(t, h, offset[2] + H_VSTR) & 0x0f;
|
||||
if (v2 != HSCX_VA1 && v2 != HSCX_VA2 && v2 != HSCX_VA3 && v2 != HSCX_V21)
|
||||
return 0;
|
||||
|
||||
/* both HSCX channels should have the same version... */
|
||||
if (v1 != v2)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_s08 - attach Teles S0/8 and compatibles
|
||||
*---------------------------------------------------------------------------*/
|
||||
int
|
||||
#ifdef __FreeBSD__
|
||||
isic_attach_s08(struct isa_device *dev)
|
||||
#else
|
||||
isic_attach_s08(struct isic_softc *sc)
|
||||
#endif
|
||||
isic_attach_s08(device_t dev)
|
||||
{
|
||||
#ifdef __FreeBSD__
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
#else
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
#endif
|
||||
struct l1_softc *sc = &l1_sc[device_get_unit(dev)];
|
||||
bus_space_tag_t t = rman_get_bustag(sc->sc_resources.mem);
|
||||
bus_space_handle_t h = rman_get_bushandle(sc->sc_resources.mem);
|
||||
|
||||
/* set card off */
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
sc->sc_vmem_addr[0x80] = 0;
|
||||
#else
|
||||
bus_space_write_1(t, h, 0x80, 0);
|
||||
#endif
|
||||
|
||||
DELAY(SEC_DELAY / 5);
|
||||
|
||||
/* set card on */
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
sc->sc_vmem_addr[0x80] = 1;
|
||||
#else
|
||||
bus_space_write_1(t, h, 0x80, 1);
|
||||
#endif
|
||||
|
||||
DELAY(SEC_DELAY / 5);
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
|
||||
/* setup ISAC access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = tels08_read_reg;
|
||||
sc->writereg = tels08_write_reg;
|
||||
sc->readfifo = tels08_read_fifo;
|
||||
sc->writefifo = tels08_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_8;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM1;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
#endif
|
||||
|
||||
return (1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* ISIC > 0 */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,374 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 1997 Andrew Gordon. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
* 4. Altered versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software and/or documentation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
* isic - I4B Siemens ISDN Chipset Driver for Teles S0 PnP
|
||||
* =======================================================
|
||||
*
|
||||
* EXPERIMENTAL !!!
|
||||
* ================
|
||||
*
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Tue Mar 16 10:39:14 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include "isic.h"
|
||||
#include "opt_i4b.h"
|
||||
#else
|
||||
#define NISIC 1
|
||||
#endif
|
||||
#if NISIC > 0 && defined(TEL_S0_16_3_P)
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/clock.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#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 <i4b/i4b_debug.h>
|
||||
#include <i4b/i4b_ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <i4b/layer1/i4b_l1.h>
|
||||
#include <i4b/layer1/i4b_isac.h>
|
||||
#include <i4b/layer1/i4b_hscx.h>
|
||||
|
||||
#include <i4b/include/i4b_global.h>
|
||||
#include <i4b/include/i4b_l1l2.h>
|
||||
#include <i4b/include/i4b_mbuf.h>
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
static u_int8_t tels0163P_read_reg __P((struct isic_softc *sc, int what, bus_size_t offs));
|
||||
static void tels0163P_write_reg __P((struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data));
|
||||
static void tels0163P_read_fifo __P((struct isic_softc *sc, int what, void *buf, size_t size));
|
||||
static void tels0163P_write_fifo __P((struct isic_softc *sc, int what, const void *data, size_t size));
|
||||
void isic_attach_s0163P __P((struct isic_softc *sc));
|
||||
#endif
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16.3 PnP read fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
tels0163P_read_fifo(void *buf, const void *base, size_t len)
|
||||
{
|
||||
insb((int)base + 0x3e, (u_char *)buf, (u_int)len);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
tels0163P_read_fifo(struct isic_softc *sc, int what, void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
bus_space_read_multi_1(t, h, o + 0x3e, buf, size);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16.3 PnP write fifo routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
tels0163P_write_fifo(void *base, const void *buf, size_t len)
|
||||
{
|
||||
outsb((int)base + 0x3e, (u_char *)buf, (u_int)len);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
tels0163P_write_fifo(struct isic_softc *sc, int what, const void *buf, size_t size)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
bus_space_write_multi_1(t, h, o + 0x3e, (u_int8_t*)buf, size);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16.3 PnP write register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static void
|
||||
tels0163P_write_reg(u_char *base, u_int offset, u_int v)
|
||||
{
|
||||
outb((int)base + offset, (u_char)v);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
tels0163P_write_reg(struct isic_softc *sc, int what, bus_size_t offs, u_int8_t data)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
bus_space_write_1(t, h, o + offs, data);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Teles S0/16.3 PnP read register routine
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
static u_char
|
||||
tels0163P_read_reg(u_char *base, u_int offset)
|
||||
{
|
||||
return (inb((int)base + offset));
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static u_int8_t
|
||||
tels0163P_read_reg(struct isic_softc *sc, int what, bus_size_t offs)
|
||||
{
|
||||
bus_space_tag_t t = sc->sc_maps[what+1].t;
|
||||
bus_space_handle_t h = sc->sc_maps[what+1].h;
|
||||
bus_size_t o = sc->sc_maps[what+1].offset;
|
||||
return bus_space_read_1(t, h, o + offs);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_probe_s0163P - probe for Teles S0/16.3 PnP and compatibles
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
int
|
||||
isic_probe_s0163P(struct isa_device *dev, unsigned int iobase2)
|
||||
{
|
||||
struct isic_softc *sc = &isic_sc[dev->id_unit];
|
||||
|
||||
/* check max unit range */
|
||||
|
||||
if(dev->id_unit >= ISIC_MAXUNIT)
|
||||
{
|
||||
printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for Teles S0/16.3 PnP!\n",
|
||||
dev->id_unit, dev->id_unit);
|
||||
return(0);
|
||||
}
|
||||
sc->sc_unit = dev->id_unit;
|
||||
|
||||
/* check IRQ validity */
|
||||
|
||||
switch(ffs(dev->id_irq) - 1)
|
||||
{
|
||||
case 3:
|
||||
case 5:
|
||||
case 7:
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid IRQ [%d] specified for Teles S0/16.3 PnP!\n",
|
||||
dev->id_unit, ffs(dev->id_irq)-1);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
sc->sc_irq = dev->id_irq;
|
||||
|
||||
/* check if memory addr specified */
|
||||
|
||||
if(dev->id_maddr)
|
||||
{
|
||||
printf("isic%d: Error, mem addr 0x%lx specified for Teles S0/16.3 PnP!\n",
|
||||
dev->id_unit, (u_long)dev->id_maddr);
|
||||
return(0);
|
||||
}
|
||||
dev->id_msize = 0;
|
||||
|
||||
/* check if we got an iobase */
|
||||
|
||||
switch(dev->id_iobase)
|
||||
{
|
||||
case 0x580:
|
||||
case 0x500:
|
||||
case 0x680:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("isic%d: Error, invalid iobase 0x%x specified for Teles S0/16.3 PnP!\n",
|
||||
dev->id_unit, dev->id_iobase);
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
sc->sc_port = dev->id_iobase;
|
||||
|
||||
/* setup access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = tels0163P_read_reg;
|
||||
sc->writereg = tels0163P_write_reg;
|
||||
|
||||
sc->readfifo = tels0163P_read_fifo;
|
||||
sc->writefifo = tels0163P_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_163P;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
|
||||
/* setup ISAC and HSCX base addr */
|
||||
|
||||
switch(dev->id_iobase)
|
||||
{
|
||||
case 0x580:
|
||||
ISAC_BASE = (caddr_t) 0x580 - 0x20;
|
||||
HSCX_A_BASE = (caddr_t) 0x180 - 0x20;
|
||||
HSCX_B_BASE = (caddr_t) 0x180;
|
||||
break;
|
||||
|
||||
case 0x500:
|
||||
ISAC_BASE = (caddr_t) 0x500 - 0x20;
|
||||
HSCX_A_BASE = (caddr_t) 0x100 - 0x20;
|
||||
HSCX_B_BASE = (caddr_t) 0x100;
|
||||
break;
|
||||
|
||||
case 0x680:
|
||||
ISAC_BASE = (caddr_t) 0x680 - 0x20;
|
||||
HSCX_A_BASE = (caddr_t) 0x280 - 0x20;
|
||||
HSCX_B_BASE = (caddr_t) 0x280;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read HSCX A/B VSTR. Expected value for the S0/16.3 PnP card is
|
||||
* 0x05 in the least significant bits.
|
||||
*/
|
||||
|
||||
if( ((HSCX_READ(0, H_VSTR) & 0xf) != 0x5) ||
|
||||
((HSCX_READ(1, H_VSTR) & 0xf) != 0x5) )
|
||||
{
|
||||
printf("isic%d: HSCX VSTR test failed for Teles S0/16.3 PnP\n",
|
||||
dev->id_unit);
|
||||
printf("isic%d: HSC0: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(0, H_VSTR));
|
||||
printf("isic%d: HSC1: VSTR: %#x\n",
|
||||
dev->id_unit, HSCX_READ(1, H_VSTR));
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* isic_attach_s0163P - attach Teles S0/16.3 PnP and compatibles
|
||||
*---------------------------------------------------------------------------*/
|
||||
#ifdef __FreeBSD__
|
||||
int
|
||||
isic_attach_s0163P(struct isa_device *dev, unsigned int iobase2)
|
||||
{
|
||||
outb((dev->id_iobase) + 0x1c, 0);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
outb((dev->id_iobase) + 0x1c, 1);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
return(1);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
isic_attach_s0163P(struct isic_softc *sc)
|
||||
{
|
||||
/* init card */
|
||||
bus_space_tag_t t = sc->sc_maps[0].t;
|
||||
bus_space_handle_t h = sc->sc_maps[0].h;
|
||||
bus_space_write_1(t, h, 0x1c, 0);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
bus_space_write_1(t, h, 0x1c, 1);
|
||||
DELAY(SEC_DELAY / 10);
|
||||
|
||||
/* setup access routines */
|
||||
|
||||
sc->clearirq = NULL;
|
||||
sc->readreg = tels0163P_read_reg;
|
||||
sc->writereg = tels0163P_write_reg;
|
||||
|
||||
sc->readfifo = tels0163P_read_fifo;
|
||||
sc->writefifo = tels0163P_write_fifo;
|
||||
|
||||
/* setup card type */
|
||||
|
||||
sc->sc_cardtyp = CARD_TYPEP_163P;
|
||||
|
||||
/* setup IOM bus type */
|
||||
|
||||
sc->sc_bustyp = BUS_TYPE_IOM2;
|
||||
|
||||
sc->sc_ipac = 0;
|
||||
sc->sc_bfifolen = HSCX_FIFO_LEN;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ISIC > 0 */
|
||||
|
||||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_iframe.c - i frame handling routines
|
||||
* ------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_iframe.c,v 1.22 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Fri May 28 15:52:41 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:03:16 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ921 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
@ -236,7 +240,8 @@ i4b_i_frame_queued_up(l2_softc_t *l2sc)
|
|||
if(!(IF_QEMPTY(&l2sc->i_queue)))
|
||||
{
|
||||
DBGL2(L2_I_MSG, "i4b_i_frame_queued_up", ("re-scheduling IFQU call!\n"));
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
l2sc->IFQU_callout = timeout((TIMEOUT_FUNC_T)i4b_i_frame_queued_up, (void *)l2sc, IFQU_DLY);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)i4b_i_frame_queued_up, (void *)l2sc, IFQU_DLY);
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l2.c - ISDN layer 2 (Q.921)
|
||||
* -------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l2.c,v 1.30 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Fri May 28 16:15:39 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:03:23 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ921 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
@ -284,7 +288,7 @@ i4b_mph_status_ind(int unit, int status, int parm)
|
|||
bzero(&l2sc->stat, sizeof(lapdstat_t));
|
||||
i4b_l2_unit_init(unit);
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
/* initialize the callout handles for timeout routines */
|
||||
callout_handle_init(&l2sc->T200_callout);
|
||||
callout_handle_init(&l2sc->T202_callout);
|
||||
|
|
@ -297,7 +301,7 @@ i4b_mph_status_ind(int unit, int status, int parm)
|
|||
break;
|
||||
|
||||
case STI_PDEACT: /* Timer 4 expired */
|
||||
if((l2sc->Q921_state >= ST_AW_EST) &&
|
||||
/*XXX*/ if((l2sc->Q921_state >= ST_AW_EST) &&
|
||||
(l2sc->Q921_state <= ST_TIMREC))
|
||||
{
|
||||
DBGL2(L2_ERROR, "i4b_mph_status_ind", ("unit %d, persistent deactivation!\n", unit));
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l2.h - ISDN layer 2 (Q.921) definitions
|
||||
* ---------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l2.h,v 1.20 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Fri May 28 15:51:17 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:03:29 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -61,7 +63,7 @@ typedef struct {
|
|||
void(*T202func)(void *);/* function to be called when T202 expires */
|
||||
int T203; /* max line idle time */
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
struct callout_handle T200_callout;
|
||||
struct callout_handle T202_callout;
|
||||
struct callout_handle T203_callout;
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l2fsm.c - layer 2 FSM
|
||||
* -------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l2fsm.c,v 1.17 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Tue Mar 16 16:27:12 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:03:36 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ921 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l2fsm.h - layer 2 FSM
|
||||
* -------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l2fsm.h,v 1.5 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:31:43 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:03:48 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l2timer.c - layer 2 timer handling
|
||||
* --------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l2timer.c,v 1.17 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Wed Apr 21 09:17:58 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:03:56 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,7 +43,8 @@
|
|||
#if NI4BQ921 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
|
|
@ -91,7 +94,7 @@ i4b_T200_start(l2_softc_t *l2sc)
|
|||
DBGL2(L2_T_MSG, "i4b_T200_start", ("unit %d\n", l2sc->unit));
|
||||
l2sc->T200 = TIMER_ACTIVE;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
l2sc->T200_callout = timeout((TIMEOUT_FUNC_T)i4b_T200_timeout, (void *)l2sc, T200DEF);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)i4b_T200_timeout, (void *)l2sc, T200DEF);
|
||||
|
|
@ -108,7 +111,7 @@ i4b_T200_stop(l2_softc_t *l2sc)
|
|||
CRIT_BEG;
|
||||
if(l2sc->T200 != TIMER_IDLE)
|
||||
{
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_T200_timeout, (void *)l2sc, l2sc->T200_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_T200_timeout, (void *)l2sc);
|
||||
|
|
@ -129,7 +132,7 @@ i4b_T200_restart(l2_softc_t *l2sc)
|
|||
CRIT_BEG;
|
||||
if(l2sc->T200 != TIMER_IDLE)
|
||||
{
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_T200_timeout, (void *)l2sc, l2sc->T200_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_T200_timeout, (void *)l2sc);
|
||||
|
|
@ -140,7 +143,7 @@ i4b_T200_restart(l2_softc_t *l2sc)
|
|||
l2sc->T200 = TIMER_ACTIVE;
|
||||
}
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
l2sc->T200_callout = timeout((TIMEOUT_FUNC_T)i4b_T200_timeout, (void *)l2sc, T200DEF);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)i4b_T200_timeout, (void *)l2sc, T200DEF);
|
||||
|
|
@ -176,7 +179,7 @@ i4b_T202_start(l2_softc_t *l2sc)
|
|||
l2sc->N202 = N202DEF;
|
||||
l2sc->T202 = TIMER_ACTIVE;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
l2sc->T202_callout = timeout((TIMEOUT_FUNC_T)i4b_T202_timeout, (void *)l2sc, T202DEF);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)i4b_T202_timeout, (void *)l2sc, T202DEF);
|
||||
|
|
@ -193,7 +196,7 @@ i4b_T202_stop(l2_softc_t *l2sc)
|
|||
CRIT_BEG;
|
||||
if(l2sc->T202 != TIMER_IDLE)
|
||||
{
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_T202_timeout, (void *)l2sc, l2sc->T202_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_T202_timeout, (void *)l2sc);
|
||||
|
|
@ -229,7 +232,7 @@ i4b_T203_start(l2_softc_t *l2sc)
|
|||
DBGL2(L2_T_MSG, "i4b_T203_start", ("unit %d\n", l2sc->unit));
|
||||
l2sc->T203 = TIMER_ACTIVE;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
l2sc->T203_callout = timeout((TIMEOUT_FUNC_T)i4b_T203_timeout, (void *)l2sc, T203DEF);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)i4b_T203_timeout, (void *)l2sc, T203DEF);
|
||||
|
|
@ -248,7 +251,7 @@ i4b_T203_stop(l2_softc_t *l2sc)
|
|||
CRIT_BEG;
|
||||
if(l2sc->T203 != TIMER_IDLE)
|
||||
{
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_T203_timeout, (void *)l2sc, l2sc->T203_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_T203_timeout, (void *)l2sc);
|
||||
|
|
@ -272,7 +275,7 @@ i4b_T203_restart(l2_softc_t *l2sc)
|
|||
|
||||
if(l2sc->T203 != TIMER_IDLE)
|
||||
{
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_T203_timeout, (void *)l2sc, l2sc->T203_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_T203_timeout, (void *)l2sc);
|
||||
|
|
@ -283,7 +286,7 @@ i4b_T203_restart(l2_softc_t *l2sc)
|
|||
l2sc->T203 = TIMER_ACTIVE;
|
||||
}
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
l2sc->T203_callout = timeout((TIMEOUT_FUNC_T)i4b_T203_timeout, (void *)l2sc, T203DEF);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)i4b_T203_timeout, (void *)l2sc, T203DEF);
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_lme.c - layer management entity
|
||||
* -------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_lme.c,v 1.11 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:31:55 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:04:03 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ921 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
|
|||
|
|
@ -27,20 +27,24 @@
|
|||
* i4b - mbuf handling support routines
|
||||
* ------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_mbuf.c,v 1.13 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:32:00 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:04:10 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/tty.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/uio.h>
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_sframe.c - s frame handling routines
|
||||
* ----------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_sframe.c,v 1.12 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Fri May 28 16:14:04 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:04:17 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ921 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_tei.c - tei handling procedures
|
||||
* -----------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_tei.c,v 1.17 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Fri May 28 16:14:14 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:04:24 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ921 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/syslog.h>
|
||||
|
|
@ -61,7 +65,7 @@
|
|||
#include <i4b/i4b_ioctl.h>
|
||||
#endif
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#if defined(__FreeBSD__)
|
||||
#include <machine/random.h>
|
||||
#endif
|
||||
|
||||
|
|
@ -289,7 +293,7 @@ void
|
|||
i4b_make_rand_ri(l2_softc_t *l2sc)
|
||||
{
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#if defined(__FreeBSD__)
|
||||
|
||||
u_short val;
|
||||
read_random((char *)&val, sizeof(val));
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_uframe.c - routines for handling U-frames
|
||||
* -----------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_uframe.c,v 1.10 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Fri May 28 16:14:32 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:04:30 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ921 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_util.c - layer 2 utility routines
|
||||
* -------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_util.c,v 1.22 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Thu Apr 15 10:47:52 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:04:37 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ921 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l2if.c - Layer 3 interface to Layer 2
|
||||
* -------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l2if.c,v 1.18 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Tue May 25 11:55:15 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:04:48 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ931 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l3.h - layer 3 header file
|
||||
* ------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l3.h,v 1.10 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:33:19 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:04:55 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l3fsm.c - layer 3 FSM
|
||||
* -------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l3fsm.c,v 1.18 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Wed Apr 21 09:42:26 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:05:02 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -39,12 +41,15 @@
|
|||
#define NI4BQ931 1
|
||||
#endif
|
||||
#if NI4BQ931 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l3fsm.c - layer 3 FSM
|
||||
* -------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l3fsm.h,v 1.7 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:33:31 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:05:09 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l3timer.c - timer and timeout handling for layer 3
|
||||
* ------------------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l3timer.c,v 1.14 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Wed Apr 21 09:46:59 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:05:18 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ931 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
@ -107,7 +111,7 @@ T303_start(call_desc_t *cd)
|
|||
DBGL3(L3_T_MSG, "T303_start", ("cr = %d\n", cd->cr));
|
||||
cd->T303 = TIMER_ACTIVE;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
cd->T303_callout = timeout((TIMEOUT_FUNC_T)T303_timeout, (void *)cd, T303VAL);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)T303_timeout, (void *)cd, T303VAL);
|
||||
|
|
@ -125,7 +129,7 @@ T303_stop(call_desc_t *cd)
|
|||
|
||||
if(cd->T303 != TIMER_IDLE)
|
||||
{
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)T303_timeout, (void *)cd, cd->T303_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)T303_timeout, (void *)cd);
|
||||
|
|
@ -158,7 +162,7 @@ T305_start(call_desc_t *cd)
|
|||
DBGL3(L3_T_MSG, "T305_start", ("cr = %d\n", cd->cr));
|
||||
cd->T305 = TIMER_ACTIVE;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
cd->T305_callout = timeout((TIMEOUT_FUNC_T)T305_timeout, (void *)cd, T305VAL);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)T305_timeout, (void *)cd, T305VAL);
|
||||
|
|
@ -176,7 +180,7 @@ T305_stop(call_desc_t *cd)
|
|||
|
||||
if(cd->T305 != TIMER_IDLE)
|
||||
{
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)T305_timeout, (void *)cd, cd->T305_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)T305_timeout, (void *)cd);
|
||||
|
|
@ -210,7 +214,7 @@ T308_start(call_desc_t *cd)
|
|||
DBGL3(L3_T_MSG, "T308_start", ("cr = %d\n", cd->cr));
|
||||
cd->T308 = TIMER_ACTIVE;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
cd->T308_callout = timeout((TIMEOUT_FUNC_T)T308_timeout, (void *)cd, T308VAL);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)T308_timeout, (void *)cd, T308VAL);
|
||||
|
|
@ -228,7 +232,7 @@ T308_stop(call_desc_t *cd)
|
|||
|
||||
if(cd->T308 != TIMER_IDLE)
|
||||
{
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)T308_timeout, (void *)cd, cd->T308_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)T308_timeout, (void *)cd);
|
||||
|
|
@ -262,7 +266,7 @@ T309_start(call_desc_t *cd)
|
|||
DBGL3(L3_T_MSG, "T309_start", ("cr = %d\n", cd->cr));
|
||||
cd->T309 = TIMER_ACTIVE;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
cd->T309_callout = timeout((TIMEOUT_FUNC_T)T309_timeout, (void *)cd, T309VAL);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)T309_timeout, (void *)cd, T309VAL);
|
||||
|
|
@ -280,7 +284,7 @@ T309_stop(call_desc_t *cd)
|
|||
|
||||
if(cd->T309 != TIMER_IDLE)
|
||||
{
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)T309_timeout, (void *)cd, cd->T309_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)T309_timeout, (void *)cd);
|
||||
|
|
@ -314,7 +318,7 @@ T310_start(call_desc_t *cd)
|
|||
DBGL3(L3_T_MSG, "T310_start", ("cr = %d\n", cd->cr));
|
||||
cd->T310 = TIMER_ACTIVE;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
cd->T310_callout = timeout((TIMEOUT_FUNC_T)T310_timeout, (void *)cd, T310VAL);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)T310_timeout, (void *)cd, T310VAL);
|
||||
|
|
@ -332,7 +336,7 @@ T310_stop(call_desc_t *cd)
|
|||
|
||||
if(cd->T310 != TIMER_IDLE)
|
||||
{
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)T310_timeout, (void *)cd, cd->T310_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)T310_timeout, (void *)cd);
|
||||
|
|
@ -366,7 +370,7 @@ T313_start(call_desc_t *cd)
|
|||
DBGL3(L3_T_MSG, "T313_start", ("cr = %d\n", cd->cr));
|
||||
cd->T313 = TIMER_ACTIVE;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
cd->T313_callout = timeout((TIMEOUT_FUNC_T)T313_timeout, (void *)cd, T313VAL);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)T313_timeout, (void *)cd, T313VAL);
|
||||
|
|
@ -385,7 +389,7 @@ T313_stop(call_desc_t *cd)
|
|||
if(cd->T313 != TIMER_IDLE)
|
||||
{
|
||||
cd->T313 = TIMER_IDLE;
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)T313_timeout, (void *)cd, cd->T313_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)T313_timeout, (void *)cd);
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l4if.c - Layer 3 interface to Layer 4
|
||||
* -------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l4if.c,v 1.22 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Tue Apr 27 16:46:51 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:05:25 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ931 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
@ -160,6 +164,7 @@ i4b_mdl_status_ind(int unit, int status, int parm)
|
|||
if( (ctrl_desc[call_desc[i].controller].ctrl_type == CTRL_PASSIVE) &&
|
||||
(ctrl_desc[call_desc[i].controller].unit == unit))
|
||||
{
|
||||
i4b_l3_stop_all_timers(&(call_desc[i]));
|
||||
if(call_desc[i].cdid != CDID_UNUSED)
|
||||
sendup++;
|
||||
}
|
||||
|
|
@ -171,7 +176,10 @@ i4b_mdl_status_ind(int unit, int status, int parm)
|
|||
ctrl_desc[utoc_tab[unit]].tei = -1;
|
||||
|
||||
if(sendup)
|
||||
{
|
||||
i4b_l4_pdeact(unit, sendup);
|
||||
call_desc[i].cdid = CDID_UNUSED;
|
||||
}
|
||||
break;
|
||||
|
||||
case STI_NOL1ACC: /* no outgoing access to S0 */
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_q931.c - Q931 received messages handling
|
||||
* --------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_q931.c,v 1.23 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Tue Apr 27 12:04:35 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:05:33 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -42,11 +44,13 @@
|
|||
#if NI4BQ931 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_q931.h - Q931 handling header file
|
||||
* --------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_q931.h,v 1.8 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:33:56 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:05:44 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -114,3 +116,5 @@
|
|||
#define MSG_ALERT_LEN 4 /* length of a alert message */
|
||||
|
||||
#endif /* _I4B_Q931_H_ */
|
||||
|
||||
/* EOF */
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_q932fac.c - Q932 facility handling
|
||||
* --------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_q932fac.c,v 1.8 1999/12/13 21:25:27 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:34:02 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:05:51 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -41,11 +43,13 @@
|
|||
#if NI4BQ931 > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_q932fac.h - Q932 facility handling header file
|
||||
* --------------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_q932fac.h,v 1.7 1999/12/13 21:25:28 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:34:08 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:06:00 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_i4bdrv.c - i4b userland interface driver
|
||||
* --------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_i4bdrv.c,v 1.52 1999/12/13 21:25:28 hm Exp $
|
||||
*
|
||||
* last edit-date: [Tue Jun 8 19:48:16 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:06:11 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -51,7 +53,7 @@
|
|||
|
||||
#include <sys/param.h>
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/uio.h>
|
||||
|
|
@ -69,6 +71,18 @@
|
|||
#include <sys/select.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ == 3
|
||||
#include "opt_devfs.h"
|
||||
#endif
|
||||
|
||||
#ifdef DEVFS
|
||||
#include <sys/devfsext.h>
|
||||
#endif
|
||||
|
||||
#endif /* __FreeBSD__*/
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/i4b_debug.h>
|
||||
#include <machine/i4b_ioctl.h>
|
||||
|
|
@ -96,6 +110,12 @@ static int openflag = 0;
|
|||
static int selflag = 0;
|
||||
static int readflag = 0;
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ == 3
|
||||
#ifdef DEVFS
|
||||
static void *devfs_token;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
|
||||
#define PDEVSTATIC /* - not static - */
|
||||
|
|
@ -137,22 +157,22 @@ PDEVSTATIC d_select_t i4bselect;
|
|||
|
||||
#define CDEV_MAJOR 60
|
||||
|
||||
#if defined (__FreeBSD_version) && __FreeBSD_version >= 400006
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 4
|
||||
static struct cdevsw i4b_cdevsw = {
|
||||
/* open */ i4bopen,
|
||||
/* close */ i4bclose,
|
||||
/* read */ i4bread,
|
||||
/* write */ nowrite,
|
||||
/* ioctl */ i4bioctl,
|
||||
/* poll */ POLLFIELD,
|
||||
/* mmap */ nommap,
|
||||
/* strategy */ nostrategy,
|
||||
/* name */ "i4b",
|
||||
/* maj */ CDEV_MAJOR,
|
||||
/* dump */ nodump,
|
||||
/* psize */ nopsize,
|
||||
/* flags */ 0,
|
||||
/* bmaj */ -1
|
||||
/* open */ i4bopen,
|
||||
/* close */ i4bclose,
|
||||
/* read */ i4bread,
|
||||
/* write */ nowrite,
|
||||
/* ioctl */ i4bioctl,
|
||||
/* poll */ POLLFIELD,
|
||||
/* mmap */ nommap,
|
||||
/* strategy */ nostrategy,
|
||||
/* name */ "i4b",
|
||||
/* maj */ CDEV_MAJOR,
|
||||
/* dump */ nodump,
|
||||
/* psize */ nopsize,
|
||||
/* flags */ 0,
|
||||
/* bmaj */ -1
|
||||
};
|
||||
#else
|
||||
static struct cdevsw i4b_cdevsw = {
|
||||
|
|
@ -168,7 +188,7 @@ PSEUDO_SET(i4battach, i4b_i4bdrv);
|
|||
static void
|
||||
i4b_drvinit(void *unused)
|
||||
{
|
||||
#if defined (__FreeBSD_version) && __FreeBSD_version >= 400006
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 4
|
||||
cdevsw_add(&i4b_cdevsw);
|
||||
#else
|
||||
static int i4b_devsw_installed = 0;
|
||||
|
|
@ -231,7 +251,20 @@ i4battach()
|
|||
printf("i4b: ISDN call control device attached\n");
|
||||
#endif
|
||||
i4b_rdqueue.ifq_maxlen = IFQ_MAXLEN;
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#if __FreeBSD__ == 3
|
||||
|
||||
#ifdef DEVFS
|
||||
devfs_token = devfs_add_devswf(&i4b_cdevsw, 0, DV_CHR,
|
||||
UID_ROOT, GID_WHEEL, 0600,
|
||||
"i4b");
|
||||
#endif
|
||||
|
||||
#else
|
||||
make_dev(&i4b_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "i4b");
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
|
|
@ -332,7 +365,7 @@ i4bioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
|||
|
||||
case I4B_CDID_REQ:
|
||||
{
|
||||
msg_cdid_req_t *mir;
|
||||
msg_cdid_req_t *mir;
|
||||
mir = (msg_cdid_req_t *)data;
|
||||
cd = reserve_cd();
|
||||
mir->cdid = cd->cdid;
|
||||
|
|
@ -353,6 +386,16 @@ i4bioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
|||
break;
|
||||
}
|
||||
|
||||
/* prevent dialling on leased lines */
|
||||
if(ctrl_desc[mcr->controller].protocol == PROTOCOL_D64S)
|
||||
{
|
||||
SET_CAUSE_TYPE(cd->cause_in, CAUSET_I4B);
|
||||
SET_CAUSE_VAL(cd->cause_in, CAUSE_I4B_LLDIAL);
|
||||
i4b_l4_disconnect_ind(cd);
|
||||
freecd_by_cd(cd);
|
||||
break;
|
||||
}
|
||||
|
||||
cd->controller = mcr->controller; /* fill cd */
|
||||
cd->bprot = mcr->bprot;
|
||||
cd->driver = mcr->driver;
|
||||
|
|
@ -683,6 +726,19 @@ i4bioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
|||
mvr->step = STEP;
|
||||
break;
|
||||
}
|
||||
|
||||
/* set D-channel protocol for a controller */
|
||||
|
||||
case I4B_PROT_IND:
|
||||
{
|
||||
msg_prot_ind_t *mpi;
|
||||
|
||||
mpi = (msg_prot_ind_t *)data;
|
||||
|
||||
ctrl_desc[mpi->controller].protocol = mpi->protocol;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Download request */
|
||||
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l4.c - kernel interface to userland
|
||||
* -----------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l4.c,v 1.45 1999/12/13 21:25:28 hm Exp $
|
||||
*
|
||||
* last edit-date: [Thu Apr 8 17:31:52 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:06:17 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -47,7 +49,7 @@
|
|||
#if NI4B > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
|
|
@ -77,6 +79,10 @@
|
|||
#include <i4b/layer3/i4b_l3.h>
|
||||
#include <i4b/layer4/i4b_l4.h>
|
||||
|
||||
#if !defined(__FreeBSD__) && !defined(__NetBSD__)
|
||||
#define memcpy(dst, src, len) bcopy((src), (dst), (len))
|
||||
#endif
|
||||
|
||||
unsigned int i4b_l4_debug = L4_DEBUG_DEFAULT;
|
||||
|
||||
struct ctrl_type_desc ctrl_types[CTRL_NUMTYPES] = { { NULL, NULL} };
|
||||
|
|
@ -109,7 +115,7 @@ i4b_l4_pdeact(int controller, int numactive)
|
|||
|
||||
if(cd->timeout_active)
|
||||
{
|
||||
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_idle_check,(void *)cd, cd->idle_timeout_handle);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)i4b_idle_check,(void *)cd);
|
||||
|
|
@ -553,6 +559,31 @@ i4b_l4_proceeding_ind(call_desc_t *cd)
|
|||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* send MSG_PACKET_IND message to userland
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
i4b_l4_packet_ind(int driver, int driver_unit, int dir, struct mbuf *pkt)
|
||||
{
|
||||
struct mbuf *m;
|
||||
int len = pkt->m_pkthdr.len;
|
||||
unsigned char *ip = pkt->m_data;
|
||||
|
||||
if((m = i4b_Dgetmbuf(sizeof(msg_packet_ind_t))) != NULL)
|
||||
{
|
||||
msg_packet_ind_t *mp = (msg_packet_ind_t *)m->m_data;
|
||||
|
||||
mp->header.type = MSG_PACKET_IND;
|
||||
mp->header.cdid = -1;
|
||||
mp->driver = driver;
|
||||
mp->driver_unit = driver_unit;
|
||||
mp->direction = dir;
|
||||
memcpy(mp->pktdata, ip,
|
||||
len <MAX_PACKET_LOG ? len : MAX_PACKET_LOG);
|
||||
i4bputqueue(m);
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* link a driver(unit) to a B-channel(controller,unit,channel)
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l4.h - kernel interface to userland header file
|
||||
* ---------------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l4.h,v 1.17 1999/12/13 21:25:28 hm Exp $
|
||||
*
|
||||
* last edit-date: [Wed Mar 17 16:20:10 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:06:24 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -53,6 +55,7 @@ extern void i4b_l4_negcomplete( call_desc_t *cd );
|
|||
extern void i4b_l4_ifstate_changed( call_desc_t *cd, int new_state );
|
||||
extern void i4b_l4_idle_timeout_ind( call_desc_t *cd );
|
||||
extern void i4b_l4_info_ind ( call_desc_t *cd );
|
||||
extern void i4b_l4_packet_ind(int, int, int, struct mbuf *pkt);
|
||||
extern void i4b_l4_l12stat(int controller, int layer, int state);
|
||||
extern void i4b_l4_pdeact(int controller, int numactive);
|
||||
extern void i4b_l4_teiasg(int controller, int tei);
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l4mgmt.c - layer 4 calldescriptor management utilites
|
||||
* -----------------------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l4mgmt.c,v 1.26 1999/12/13 21:25:28 hm Exp $
|
||||
*
|
||||
* last edit-date: [Sun Feb 14 10:35:13 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:06:32 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -38,11 +40,13 @@
|
|||
#if NI4B > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
@ -50,11 +54,12 @@
|
|||
#include <net/if.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/i4b_debug.h>
|
||||
#include <machine/i4b_ioctl.h>
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#include <machine/random.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>
|
||||
|
|
@ -74,7 +79,7 @@ static unsigned int get_cdid(void);
|
|||
|
||||
int nctrl; /* number of attached controllers */
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
void init_callout(call_desc_t *);
|
||||
#endif
|
||||
|
||||
|
|
@ -157,7 +162,7 @@ reserve_cd(void)
|
|||
if(cd == NULL)
|
||||
panic("reserve_cd: no free call descriptor available!");
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
init_callout(cd);
|
||||
#endif
|
||||
|
||||
|
|
@ -212,7 +217,7 @@ cd_by_cdid(unsigned int cdid)
|
|||
{
|
||||
DBGL4(L4_MSG, "cd_by_cdid", ("found cdid - index=%d cdid=%u cr=%d\n",
|
||||
i, call_desc[i].cdid, call_desc[i].cr));
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
init_callout(&call_desc[i]);
|
||||
#endif
|
||||
return(&(call_desc[i]));
|
||||
|
|
@ -243,7 +248,7 @@ cd_by_unitcr(int unit, int cr, int crf)
|
|||
{
|
||||
DBGL4(L4_MSG, "cd_by_unitcr", ("found cd, index=%d cdid=%u cr=%d\n",
|
||||
i, call_desc[i].cdid, call_desc[i].cr));
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
init_callout(&call_desc[i]);
|
||||
#endif
|
||||
return(&(call_desc[i]));
|
||||
|
|
@ -268,7 +273,7 @@ get_rand_cr(int unit)
|
|||
{
|
||||
int found = 1;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
read_random((char *)&val, sizeof(val));
|
||||
#else
|
||||
val |= unit+i;
|
||||
|
|
@ -300,9 +305,9 @@ get_rand_cr(int unit)
|
|||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* initialize the callout handles for FreeBSD-current 3.0
|
||||
* initialize the callout handles for FreeBSD
|
||||
*---------------------------------------------------------------------------*/
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
void
|
||||
init_callout(call_desc_t *cd)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
* i4b_l4timer.c - timer and timeout handling for layer 4
|
||||
* --------------------------------------------------------
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $Id: i4b_l4timer.c,v 1.15 1999/12/13 21:25:28 hm Exp $
|
||||
*
|
||||
* last edit-date: [Wed Apr 21 09:49:08 1999]
|
||||
* $FreeBSD$
|
||||
*
|
||||
* last edit-date: [Mon Dec 13 22:06:39 1999]
|
||||
*
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -38,11 +40,13 @@
|
|||
#if NI4B > 0
|
||||
|
||||
#include <sys/param.h>
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/ioccom.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
|
|
@ -84,7 +88,7 @@ T400_start(call_desc_t *cd)
|
|||
DBGL4(L4_MSG, "T400_start", ("cr = %d\n", cd->cr));
|
||||
cd->T400 = TIMER_ACTIVE;
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
cd->T400_callout = timeout((TIMEOUT_FUNC_T)T400_timeout, (void *)cd, T400DEF);
|
||||
#else
|
||||
timeout((TIMEOUT_FUNC_T)T400_timeout, (void *)cd, T400DEF);
|
||||
|
|
@ -102,7 +106,7 @@ T400_stop(call_desc_t *cd)
|
|||
|
||||
if(cd->T400 == TIMER_ACTIVE)
|
||||
{
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
|
||||
#if defined(__FreeBSD__)
|
||||
untimeout((TIMEOUT_FUNC_T)T400_timeout, (void *)cd, cd->T400_callout);
|
||||
#else
|
||||
untimeout((TIMEOUT_FUNC_T)T400_timeout, (void *)cd);
|
||||
|
|
|
|||
Loading…
Reference in a new issue