diff options
author | phk <phk@FreeBSD.org> | 1996-10-20 18:24:17 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1996-10-20 18:24:17 +0000 |
commit | ea3476f34db58155dd54a57b1f484cda34b4799d (patch) | |
tree | 490c229a5f1fd7bb348bdb449d91368c3020b03c /sys/gnu/i386 | |
parent | 64291ea9abdfb9c1ed60f0a3ef2e8ff6893a6545 (diff) | |
download | FreeBSD-src-ea3476f34db58155dd54a57b1f484cda34b4799d.zip FreeBSD-src-ea3476f34db58155dd54a57b1f484cda34b4799d.tar.gz |
Removing old isdn stuff.
Diffstat (limited to 'sys/gnu/i386')
-rw-r--r-- | sys/gnu/i386/isa/nic3008.c | 1293 | ||||
-rw-r--r-- | sys/gnu/i386/isa/nic3008.h | 123 | ||||
-rw-r--r-- | sys/gnu/i386/isa/nic3009.c | 1358 | ||||
-rw-r--r-- | sys/gnu/i386/isa/nic3009.h | 88 | ||||
-rw-r--r-- | sys/gnu/i386/isa/niccyreg.h | 167 |
5 files changed, 0 insertions, 3029 deletions
diff --git a/sys/gnu/i386/isa/nic3008.c b/sys/gnu/i386/isa/nic3008.c deleted file mode 100644 index 3561e6f..0000000 --- a/sys/gnu/i386/isa/nic3008.c +++ /dev/null @@ -1,1293 +0,0 @@ -/* @(#)$Id: nic3008.c,v 1.15 1996/03/28 14:27:27 scrappy Exp $ - ******************************************************************************* - * II - Version 0.1 $Revision: 1.15 $ $State: Exp $ - * - * Copyright 1994 Dietmar Friede - ******************************************************************************* - * Bug reports, patches, comments, suggestions should be sent to: - * - * jkr@saarlink.de or jkrause@guug.de - * - ******************************************************************************* - * $Log: nic3008.c,v $ - * Revision 1.15 1996/03/28 14:27:27 scrappy - * Switched from using devfs_add_sw() to using devfs_add_swf() - * - * Reviewed by: julian@freebsd.org - * - * Revision 1.14 1995/12/17 21:14:34 phk - * Staticize. - * - * Revision 1.13 1995/12/08 23:19:29 phk - * Julian forgot to make the *devsw structures static. - * - * Revision 1.12 1995/12/08 11:12:45 julian - * Pass 3 of the great devsw changes - * most devsw referenced functions are now static, as they are - * in the same file as their devsw structure. I've also added DEVFS - * support for nearly every device in the system, however - * many of the devices have 'incorrect' names under DEVFS - * because I couldn't quickly work out the correct naming conventions. - * (but devfs won't be coming on line for a month or so anyhow so that doesn't - * matter) - * - * If you "OWN" a device which would normally have an entry in /dev - * then search for the devfs_add_devsw() entries and munge to make them right.. - * check out similar devices to see what I might have done in them in you - * can't see what's going on.. - * for a laugh compare conf.c conf.h defore and after... :) - * I have not doen DEVFS entries for any DISKSLICE devices yet as that will be - * a much more complicated job.. (pass 5 :) - * - * pass 4 will be to make the devsw tables of type (cdevsw * ) - * rather than (cdevsw) - * seems to work here.. - * complaints to the usual places.. :) - * - * Revision 1.11 1995/11/29 14:39:07 julian - * If you're going to mechanically replicate something in 50 files - * it's best to not have a (compiles cleanly) typo in it! (sigh) - * - * Revision 1.10 1995/11/29 10:47:04 julian - * OK, that's it.. - * That's EVERY SINGLE driver that has an entry in conf.c.. - * my next trick will be to define cdevsw[] and bdevsw[] - * as empty arrays and remove all those DAMNED defines as well.. - * - * Revision 1.9 1995/11/21 14:56:01 bde - * Completed function declarations, added prototypes and removed redundant - * declarations. - * - * Revision 1.8 1995/11/18 04:19:44 bde - * Fixed the type of nic_listen(). A trailing arg was missing. - * - * Fixed calls to s_intr(). There was sometimes an extra trailing arg. - * - * Revision 1.7 1995/09/08 11:06:46 bde - * Fix benign type mismatches in devsw functions. 82 out of 299 devsw - * functions were wrong. - * - * Revision 1.6 1995/05/30 07:57:57 rgrimes - * Remove trailing whitespace. - * - * Revision 1.5 1995/05/11 19:25:55 rgrimes - * Fix -Wformat warnings from LINT kernel. - * - * Revision 1.4 1995/03/28 07:54:31 bde - * Add and move declarations to fix all of the warnings from `gcc -Wimplicit' - * (except in netccitt, netiso and netns) that I didn't notice when I fixed - * "all" such warnings before. - * - * Revision 1.3 1995/03/19 14:28:35 davidg - * Removed redundant newlines that were in some panic strings. - * - * Revision 1.2 1995/02/15 11:59:40 jkh - * Fix a few more nits. Should compile better now! :_) - * - * Revision 1.1 1995/02/14 15:00:10 jkh - * An ISDN driver that supports the EDSS1 and the 1TR6 ISDN interfaces. - * EDSS1 is the "Euro-ISDN", 1TR6 is the soon obsolete german ISDN Interface. - * Obtained from: Dietmar Friede <dfriede@drnhh.neuhaus.de> and - * Juergen Krause <jkr@saarlink.de> - * - * This is only one part - the rest to follow in a couple of hours. - * This part is a benign import, since it doesn't affect anything else. - * - * - ******************************************************************************/ - -/* - * Copyright (c) 1994 Dietmar Friede (dietmar@friede.de) All rights reserved. - * FSF/FSAG GNU Copyright applies - * - * A low level driver for the NICCY-3008 ISDN Card. - * - */ - -#include "nic.h" -#if NNIC > 0 - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/conf.h> -#include <sys/proc.h> -#ifdef DEVFS -#include <sys/devfsext.h> -#endif /*DEVFS*/ - -#include <i386/isa/isa_device.h> -#include <gnu/i386/isa/nic3008.h> -#include <gnu/i386/isa/niccyreg.h> -#include <gnu/isdn/isdn_ioctl.h> - - -#define OPEN 1 -#define LOAD_HEAD 3 -#define LOAD_DATA 5 -#define IS_DIAL(p) (((p)&0x20)==0) -#define IS_LISTEN(p) ((p)&0x20) -#define CHAN(pl) (((pl)&7)-1) -#define C_CHAN(x) ((x)&1) -#define APPL(pl) ((((pl)>>6)&0x7f)-1) -#define CARD(pl) (((pl)>>13)&7) -#define MK_APPL(pl) (((pl)+1)<<6) - -#define con_act_resp(sc,pl) en_q_d(sc,DD_CONN_ACT_RSP, pl ,0,NULL) -#define discon_resp(sc,pl) en_q_d(sc,DD_DISC_RSP, pl ,0,NULL) -#define inf_resp(sc,pl) en_q_d(sc,DD_INFO_RSP, pl ,0,NULL) -#define listen_b3_req(sc,mb,pl) en_q_b(sc,mb,BD_LIST_B3_REQ,pl,0,NULL) -#define con_b3_req(sc,mb,pl) en_q_b(sc,mb,BD_CONN_B3_REQ,pl,0,NULL) -#define min(a,b) ((a)<(b)?(a):(b)) - -extern isdn_appl_t isdn_appl[]; -extern u_short isdn_state; -extern isdn_ctrl_t isdn_ctrl[]; -extern int ispy_applnr; -extern int Isdn_Appl, Isdn_Ctrl, Isdn_Typ; - -static old_spy= 0; - -static int nicattach __P((struct isa_device *is)); -static int nicprobe __P((struct isa_device *is)); -static int nic_accept __P((int cn, int an, int rea)); -static int nic_connect __P((int cn, int ap, int b_channel, int inf_mask, - int out_serv, int out_serv_add, - int src_subadr, unsigned ad_len, - char *dest_addr, int spv)); -static int nic_disconnect __P((int cn, int rea)); -static int nic_listen __P((int cn, int ap, int inf_mask, int subadr_mask, - int si_mask, int spv)); -static int nic_output __P((int cn)); - -static short bsintr; - -struct isa_driver nicdriver = {nicprobe, nicattach, "nic"}; - -static d_open_t nicopen; -static d_close_t nicclose; -static d_ioctl_t nicioctl; - -#define CDEV_MAJOR 54 -static struct cdevsw nic_cdevsw = - { nicopen, nicclose, noread, nowrite, /*54*/ - nicioctl, nostop, nullreset, nodevtotty,/* nic */ - seltrue, nommap, NULL, "nic", NULL, -1 }; - -typedef enum -{ - DISCON, ISDISCON, DIAL, CALLED, CONNECT, IDLE, ACTIVE -} io_state; -typedef struct -{ - char ctrl; - u_char msg_nr; - u_char morenr; - short plci; - short ncci; - short state; - short i_len; - char i_buf[2048]; - char o_buf[2048]; - u_short more; - char *more_b; -} chan_t; - -static struct nic_softc -{ - dpr_type *sc_dpr; /* card RAM virtual memory base */ - u_short sc_vector; /* interrupt vector */ - short sc_port; - u_char sc_flags; - u_char sc_unit; - u_char sc_ctrl; - short sc_stat; - chan_t sc_chan[2]; -#ifdef DEVFS - void *devfs_token; -#endif -} nic_sc[NNIC]; - -static void badstate __P((mbx_type *mbx, int n, int mb, dpr_type *dpr)); -static void b_intr __P((int mb, int c, struct nic_softc *sc)); -static void bs_intr __P((int mb, int c, struct nic_softc *sc)); -static void con_b3_resp __P((struct nic_softc *sc, int mb, u_short ncci, - u_char reject)); -static void con_resp __P((struct nic_softc *sc, int pl, int rea)); -static void d_intr __P((struct nic_softc *sc)); -static int discon_req __P((int w, struct nic_softc *sc, int pl, int rea, - int err)); -static int en_q_b __P((struct nic_softc *sc, int mb, int t, int pl, int l, - u_char *b)); -static int en_q_d __P((struct nic_softc *sc, int t, int pl, int l, - u_char *b)); -static int cstrcmp __P((char *str1, char *str2)); -static void make_intr __P((int box, struct nic_softc *sc)); -static void reset_card __P((struct nic_softc *sc)); -static int reset_plci __P((int w_is_defined_bletch, chan_t *chan, int p)); -static void reset_req __P((struct nic_softc *sc, unsigned box, int w)); -static void s_intr __P((struct nic_softc *sc)); -static int sel_b2_prot_req __P((struct nic_softc *sc, int c, int pl, - dlpd_t *dlpd)); -static void sel_b3_prot_req __P((struct nic_softc *sc, int mb, u_short pl, - ncpd_t *ncpd)); - -int -nicprobe(struct isa_device * is) -{ - register struct nic_softc *sc = &nic_sc[is->id_unit & 127]; - dpr_type *dpr; - - sc->sc_vector = is->id_irq; - sc->sc_port = is->id_iobase; - sc->sc_unit = is->id_unit; - dpr = sc->sc_dpr = (dpr_type *) is->id_maddr; - - if (cstrcmp(dpr->niccy_ver, "NICCY V ") == 0) - { - printf("NICCY NICCY-Card %d not found at %p\n" - ,is->id_unit, is->id_maddr); - return (0); - } - while (dpr->card_state & 1); /* self test running */ - - if (dpr->card_state & 0x8A) - { - printf("Check Niccy Card, error state %d \n", dpr->card_state); - return (0); - } - dpr->card_number = is->id_unit; - is->id_msize = 8192; - reset_card(sc); - return (8); -} - -/* - * nicattach() Install device - */ -int -nicattach(struct isa_device * is) -{ - struct nic_softc *sc; - dpr_type *dpr; - int cn; - isdn_ctrl_t *ctrl0, *ctrl1; - - sc = &nic_sc[is->id_unit]; - dpr = sc->sc_dpr; - sc->sc_ctrl = -1; - if ((cn = isdn_ctrl_attach(2)) == -1) - { - return (0); - } - sc->sc_ctrl = cn; - - sc->sc_chan[0].plci = sc->sc_chan[1].plci = -1; - - ctrl0 = &isdn_ctrl[cn]; - ctrl1 = &isdn_ctrl[cn + 1]; - sc->sc_chan[0].ctrl = ctrl0->ctrl = cn; - sc->sc_chan[1].ctrl = ctrl1->ctrl = cn + 1; - ctrl0->o_buf = sc->sc_chan[0].o_buf; - ctrl1->o_buf = sc->sc_chan[1].o_buf; - ctrl0->listen = ctrl1->listen = nic_listen; - ctrl0->disconnect = ctrl1->disconnect = nic_disconnect; - ctrl0->accept = ctrl1->accept = nic_accept; - ctrl0->connect = ctrl1->connect = nic_connect; - ctrl0->output = ctrl1->output = nic_output; - ctrl0->unit = ctrl1->unit = is->id_unit; - ctrl0->appl = ctrl1->appl = -1; - ctrl0->o_len = ctrl1->o_len = -1; - - while (dpr->card_state & 1); /* self test running */ - dpr->card_number = is->id_unit; - dpr->int_flg_pc = 0xff; - reset_req(sc, MBX_MU, 4); -#ifdef DEVFS - sc->devfs_token = - devfs_add_devswf(&nic_cdevsw, is->id_unit, DV_CHR, 0, 0, - 0600, "/isdn/nic%d", is->id_unit); -#endif - return (1); -} - -static int -cstrcmp(char *str1, char *str2) -{ - while (*str2 && (*str2 == *str1)) - { - str1++; - str2++; - } - if (!*str2) - return (1); - return (0); -} - -/* If the niccy card wants it: Interupt it. */ -static void -make_intr(int box, struct nic_softc * sc) -{ - dpr_type *dpr = sc->sc_dpr; - - dpr->watchdog_cnt = 0xFF; - if ((dpr->int_flg_nic & (1 << box)) == 0) - return; - if (dpr->ext_hw_config == 1) - { - u_char s; - s = inb(sc->sc_port + 4); - outb(sc->sc_port + 4, s & 0xfb); - outb(sc->sc_port + 4, s | 4); - outb(sc->sc_port + 4, s); - return; - } - outb(sc->sc_port + 2, 1); -} - -static void -reset_req(struct nic_softc * sc, unsigned box, int w) -{ - if(box >= 8) - return; - - (sc->sc_dpr)->msg_flg[box] = 0; - make_intr(box, sc); -} - -static int -en_q_d(struct nic_softc * sc, int t, int pl, int l, u_char * b) -{ - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx = &dpr->dpr_mbx[3]; - - if (dpr->card_state & ~4) - return (ENODEV); - if (dpr->msg_flg[3]) - return (EBUSY); - - bzero(mbx, 18); - mbx->type = t; - mbx->add_info = pl; - if (l) - { - mbx->data_len = l; - bcopy(b, mbx->data, l); - } - dpr->msg_flg[3] = 1; - make_intr(3, sc); - return (0); -} - -static int -en_q_b(struct nic_softc * sc, int mb, int t, int pl, int l, u_char * b) -{ - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx = &dpr->dpr_mbx[++mb]; - - if (mb == 7) - t |= 0x40; - - if (dpr->card_state) - return (ENODEV); - if (dpr->msg_flg[mb]) - return (EBUSY); - - bzero(mbx, 18); - mbx->type = t; - mbx->add_info = pl; - if (l) - { - mbx->data_len = l; - bcopy(b, mbx->data, l); - } - dpr->msg_flg[mb] = 1; - make_intr(mb, sc); - return (0); -} - -static void -badstate(mbx_type * mbx, int n, int mb, dpr_type *dpr) -{ - printf("Niccy: not implemented %x len %d at %d.", mbx->type,mbx->data_len,n); - if(mbx->data_len) - { - u_char *b = (u_char *) dpr; - int i; - - b += dpr->buf_ptr[mb]; - for(i=0; i<mbx->data_len; i++) printf(" %x",mbx->data[i]); - printf("."); - for(i=0; i<mbx->data_len; i++) printf(" %x",b[i]); - } - printf("\n"); -} - -static int -nic_connect(int cn, int ap, int b_channel, int inf_mask, int out_serv - ,int out_serv_add, int src_subadr, unsigned ad_len - ,char *dest_addr, int spv) -{ - char buf[128]; - - if (ad_len > 22) - return (-1); - - buf[0] = spv ? 0x53 : 0; - buf[1] = b_channel; - if (spv) - inf_mask |= 0x40000000; - *(u_long *) & buf[2] = inf_mask; - buf[6] = out_serv; - buf[7] = out_serv_add; - buf[8] = src_subadr; - buf[9] = ad_len; - bcopy(dest_addr, &buf[10], ad_len); - return (en_q_d(&nic_sc[isdn_ctrl[cn].unit], DD_CONN_REQ, MK_APPL(ap), ad_len + 10, buf)); -} - -static int -nic_listen(int cn, int ap, int inf_mask, int subadr_mask, int si_mask, int spv) -{ - u_short sbuf[4]; - - *(u_long *) sbuf = inf_mask; - sbuf[2] = subadr_mask; - sbuf[3] = si_mask; - return (en_q_d(&nic_sc[isdn_ctrl[cn].unit], DD_LISTEN_REQ, MK_APPL(ap), 8, (u_char *) sbuf)); -} - -static int -nic_disconnect(int cn, int rea) -{ - isdn_ctrl_t *ctrl = &isdn_ctrl[cn]; - struct nic_softc *sc = &nic_sc[ctrl->unit]; - chan_t *chan = &sc->sc_chan[C_CHAN(cn)]; - u_char buf[16]; - int l = 3; - int p; - int err; - - if(chan->ncci != -1) - { - bzero(buf,16); - *(u_short *) buf = chan->ncci; - l += sizeof(ncpi_t); - err= en_q_b(sc, C_CHAN(cn)?6:4, BD_DISC_B3_REQ, chan->plci, l, buf); - if(err==0) - { - chan->more= 0; - ctrl->o_len= -1; - } - return(err); - } - - p = chan->plci; - if((p == 0) || (p == -1)) - return (ENODEV); - - err= en_q_d(sc, DD_DISC_REQ, p, 1, (u_char *) & rea); - if(err==0) - { - chan->more= 0; - ctrl->o_len= -1; - } - return(err); -} - -static int -nic_accept(int cn, int an, int rea) -{ - isdn_ctrl_t *ctrl = &isdn_ctrl[cn]; - struct nic_softc *sc = &nic_sc[ctrl->unit]; - chan_t *chan = &sc->sc_chan[C_CHAN(cn)]; - isdn_appl_t *appl = &isdn_appl[an]; - - if (rea) - { - ctrl->appl= -1; - return(discon_req(1, sc, chan->plci, rea, 0)); - } - ctrl->appl= an; - ctrl->lastact = time.tv_sec; - appl->ctrl= cn; - appl->state= 4; - - return(sel_b2_prot_req(sc, C_CHAN(cn), chan->plci, &appl->dlpd)); -} - -static int -nic_output(int cn) -{ - isdn_ctrl_t *ctrl = &isdn_ctrl[cn]; - struct nic_softc *sc = &nic_sc[ctrl->unit]; - chan_t *chan = &sc->sc_chan[C_CHAN(cn)]; - int mb = C_CHAN(cn) ? 7 : 5; - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx = &dpr->dpr_mbx[mb]; - int l; - u_char *b = (u_char *) dpr; - int len= ctrl->o_len; - char *buf= ctrl->o_buf; - - if (dpr->card_state /* & ~4 */) - return (ENODEV); - - if ((chan->ncci == -1) || dpr->msg_flg[mb] || (chan->state != IDLE)) - return (EBUSY); - - chan->state = ACTIVE; - - bzero(mbx, 20); - mbx->type = BD_DATA_B3_REQ; - if (C_CHAN(cn)) - mbx->type |= 0x40; - *(u_short *) mbx->data = chan->ncci; - mbx->data[4] = chan->msg_nr++; - b += dpr->buf_ptr[mb]; - l = min(1024, len); - mbx->data_len = l; - bcopy(buf, b, l); - - if (l < len) - { - chan->more = min(len - l, 1024); /* This is a bug, but */ - /* max. blocks length is 2048 bytes including protokoll */ - chan->more_b = buf + l; - mbx->more_data = 1; - } else - { - chan->more = 0; - ctrl->o_len = -1; - } - - dpr->msg_flg[mb] = 3; - bsintr |= (1 << C_CHAN(cn)); - make_intr(mb, sc); - ctrl->lastact = time.tv_sec; - return (0); -} - -static void -con_resp(struct nic_softc * sc, int pl, int rea) -{ - en_q_d(sc, DD_CONN_RSP, pl, 1, (u_char *) & rea); -} - -static int -discon_req(int w, struct nic_softc * sc, int pl, int rea, int err) -{ - if ((pl == 0) || (pl == -1)) - return(0); - return(en_q_d(sc, DD_DISC_REQ, pl, 1, (u_char *) & rea)); -} - -static int -sel_b2_prot_req(struct nic_softc * sc, int c, int pl, dlpd_t * dlpd) -{ - return(en_q_b(sc, c ? 6 : 4, BD_SEL_PROT_REQ | 0x200, pl, - sizeof(dlpd_t), (u_char *) dlpd)); -} - -static void -sel_b3_prot_req(struct nic_softc * sc, int mb, u_short pl, ncpd_t * ncpd) -{ - en_q_b(sc, mb, BD_SEL_PROT_REQ | 0x300, pl, sizeof(ncpd_t), (u_char *) ncpd); -} - -static void -con_b3_resp(struct nic_softc * sc, int mb, u_short ncci, u_char reject) -{ - u_char buf[32]; - int l = 4; - - bzero(buf, 32); - *(u_short *) buf = ncci; - buf[2] = reject; - buf[3] = 0; /* ncpi ???? */ - l += 15; - en_q_b(sc, mb, BD_CONN_B3_RSP, 0, l, buf); -} - -static int -reset_plci(int w, chan_t * chan, int p) -{ - isdn_ctrl_t *ctrl; - - if (p == -1) - return (-1); - - if(chan == NULL) - return(p); - - ctrl = &isdn_ctrl[chan->ctrl]; - if (chan->plci == p) - { - if (ISBUSY(ctrl->appl)) - { - isdn_disconn_ind(ctrl->appl); - isdn_appl[ctrl->appl].ctrl = -1; - isdn_appl[ctrl->appl].state = 0; - } - ctrl->appl = -1; - ctrl->o_len = -1; - chan->plci = -1; - chan->ncci = -1; - chan->state = DISCON; - chan->i_len = 0; - chan->more = 0; - } - return (p); -} - -static void -reset_card(struct nic_softc * sc) -{ - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx = &dpr->dpr_mbx[1]; - bzero(mbx, 16); - mbx->type = MD_RESET_REQ; - dpr->msg_flg[1] = 1; - make_intr(1, sc); -} - -/* - * nicopen() New open on device. - * - * We forbid all but first open - */ -static int -nicopen(dev_t dev, int flags, int fmt, struct proc *p) -{ - struct nic_softc *sc; - u_char unit; - dpr_type *dpr; - int x; - - unit = minor(dev); - - /* minor number out of limits ? */ - if (unit >= NNIC) - return (ENXIO); - sc = &nic_sc[unit]; - - sc->sc_flags |= OPEN; - dpr = sc->sc_dpr; - dpr->card_number = sc->sc_unit; - dpr->int_flg_pc = 0xff; - if (dpr->msg_flg[0]) - { - x = splhigh(); - s_intr(sc); - splx(x); - } - return (0); -} - -/* - * nicclose() Close device - */ -static int -nicclose(dev_t dev, int flags, int fmt, struct proc *p) -{ - struct nic_softc *sc = &nic_sc[minor(dev)]; - - sc->sc_flags = 0; - return (0); -} - -static int -nicioctl(dev_t dev, int cmd, caddr_t data, int flags, struct proc *p) -{ - int error; - int x; - struct nic_softc *sc = &nic_sc[minor(dev)]; - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx; - - dpr->int_flg_pc = 0xff; - - error = 0; - switch (cmd) - { - case NICCY_DEBUG: - data[0]= 0x38; - bcopy((char *)dpr, data+1, sizeof(dpr_type)); - break; - case NICCY_LOAD: - { - struct head *head = (struct head *) data; - u_char *b = (u_char *) dpr; - int len, l, off; - - x = splhigh(); - while (dpr->msg_flg[1]) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "nic1head", 1); - if (error != EWOULDBLOCK) - { - splx(x); - return (error); - } - } - mbx = &dpr->dpr_mbx[1]; - bzero(mbx, 16); - mbx->type = MD_DNL_MOD_REQ | ((u_short) head->typ << 8); - mbx->data_len = 12; - bcopy(head->nam, mbx->data, 8); - *(u_long *) (mbx->data + 8) = head->len; - - sc->sc_flags = LOAD_HEAD; - sc->sc_stat = -1; - dpr->msg_flg[1] = 1; - make_intr(1, sc); - while (sc->sc_flags == LOAD_HEAD) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "nic2head", 1); - if (error != EWOULDBLOCK) - break; - } - - len= head->d_len; - off= 0; - b += dpr->buf_ptr[1]; - - while(len > 0) - { - while (dpr->msg_flg[1]) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "nic1load", 1); - if (error != EWOULDBLOCK) - { - splx(x); - return (error); - } - } - bzero(mbx, 16); - mbx->type = MD_DNL_MOD_DATA | ((u_short) head->typ << 8); - l= min(len,1024); - len-= l; - mbx->buf_valid = 1; - mbx->more_data = len > 0; - mbx->data_len = l; - bcopy(head->nam, mbx->data, 8); - - if(error= copyin(head->data+off, b, l)) - { - splx(x); - return(error); - } - off+= l; - sc->sc_flags = LOAD_DATA; - sc->sc_stat = -1; - dpr->msg_flg[1] = 3; - make_intr(1, sc); - } - - while ((sc->sc_flags == LOAD_DATA) || (dpr->card_state & 0x20)) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "nic2load", 1); - if (error != EWOULDBLOCK) - break; - } - if (sc->sc_flags) - sc->sc_flags = OPEN; - head->status = sc->sc_stat; - splx(x); - return (0); - } - case NICCY_SET_CLOCK: - x = splhigh(); - if (dpr->msg_flg[1]) - { - splx(x); - return (EBUSY); - } - mbx = &dpr->dpr_mbx[1]; - bzero(mbx, 16); - mbx->type = MD_SET_CLOCK_REQ; - mbx->data_len = 14; - bcopy(data, mbx->data, 14); - - dpr->msg_flg[1] = 1; - if (dpr->int_flg_nic & 2) - make_intr(1, sc); - splx(x); - return (0); - case NICCY_SPY: - x = splhigh(); - if (dpr->msg_flg[1]) - { - splx(x); - return (EBUSY); - } - mbx = &dpr->dpr_mbx[1]; - bzero(mbx, 16); - mbx->type = MD_MANUFACT_REQ | (18<<8); - mbx->data_len = 1; - mbx->add_info = MK_APPL(ispy_applnr); -/* There are ilegal states. So I use them to toggle */ - if((data[0] == 0) && (old_spy == 0)) data[0]= 255; - else if(data[0] && old_spy ) data[0]= 0; - old_spy= mbx->data[0]= data[0]; - - dpr->msg_flg[1] = 1; - if (dpr->int_flg_nic & 2) - make_intr(1, sc); - splx(x); - return (0); - case NICCY_RESET: - x = splhigh(); - - reset_card(sc); - - while (dpr->card_state & 1) /* self test running */ - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "nic: reset", 10); - if (error != EWOULDBLOCK) - break; - } - dpr->card_number = sc->sc_unit; - dpr->int_flg_pc = 0xff; - if (dpr->msg_flg[0]) - s_intr(sc); - splx(x); - return (0); - - default: - error = ENODEV; - } - return (error); -} - -static void -b_intr(int mb, int c, struct nic_softc * sc) -{ - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx = &dpr->dpr_mbx[mb]; - chan_t *chan = &sc->sc_chan[c]; - u_short ap, n, err = 0; - u_short pl = mbx->add_info; - isdn_ctrl_t *ctrl = &isdn_ctrl[chan->ctrl]; - - if(((unsigned)(mbx->type >> 8) > 3) || ((pl & 0xff00) == 0xff00)) - panic("3008 conflict with 16 bit card\nReconfig your system"); - - if (dpr->msg_flg[mb+1]) - return; /* can happen. Should make no problems */ - - if (ISBUSY(ap = ctrl->appl)) - switch (mbx->type & 0x1f) - { - case 0: /* SELECT PROT CONF */ - err = *(u_short *) mbx->data; - if (err) - { - discon_req(2, sc, pl, 0, err); - break; - } - - switch ((mbx->type >> 8) & 3) - { - case 2:/* SELECT B2 PROTOCOL */ - sel_b3_prot_req(sc, mb, pl, &isdn_appl[ap].ncpd); - break; - - case 3:/* SELECT B3 PROTOCOL */ - if (IS_DIAL(pl)) - con_b3_req(sc, mb, pl); - else - listen_b3_req(sc, mb, pl); - break; - } - break; - - case 1: /* LISTEN B3 CONF */ - err = *(u_short *) mbx->data; - if (err) - { - discon_req(4, sc, pl, 0, err); - break; - } - con_resp(sc, pl, 0); - break; - - case 2: /* CONNECT B3 CONF */ - err = *(u_short *) (mbx->data + 2); - n = *(u_short *) mbx->data; - - if (err) - { - discon_req(5, sc, pl, 0, err); - break; - } - chan->ncci = n; - chan->state = CONNECT; - break; - - case 3: /* CONNECT B3 IND */ - n = *(u_short *) mbx->data; - chan->ncci = n; - chan->state = CONNECT; - con_b3_resp(sc, mb, n, 0); - break; - - case 4: /* CONNECT B3 ACTIVE IND */ - if (chan->state < IDLE) - { - chan->state = IDLE; - ctrl->o_len = 0; - /* - * XXX the chan->ctrl arg is very bogus. - * Don't just use a cast to "fix" it. - */ - timeout(isdn_start_out, chan->ctrl, hz / 5); - break; - } - break; - - case 5: /* DISCONNECT B3 CONF */ - chan->state = ISDISCON; - err = *(u_short *) (mbx->data + 2); - if (err) - { - discon_req(6, sc, chan->plci, 0, err); - break; - } - break; - case 6: /* DISCONNECT B3 IND */ - chan->state = ISDISCON; - err = *(u_short *) (mbx->data + 2); - discon_req(7, sc, chan->plci, 0, err); - break; - - case 8: /* DATA B3 CONF */ - err = *(u_short *) (mbx->data + 2); - if (err) - { - ctrl->send_err++; - isdn_appl[ap].send_err++; - } - ctrl->o_len = 0; - chan->state= IDLE; - isdn_start_out(chan->ctrl); - break; - - case 9: /* DATA B3 IND */ - { - u_char *b = (u_char *) dpr; - - b += dpr->buf_ptr[mb]; - if (mbx->more_data) - { - chan->morenr= mbx->data[4]; - if(chan->i_len) - { - chan->i_len= 0; - break; - } - bcopy(b, &chan->i_buf[chan->i_len], mbx->data_len); - chan->i_len = mbx->data_len; - break; - } /* mbx->more_data == 0 */ - if (chan->i_len) - { - int l; - if(chan->morenr != mbx->data[4]) - break; - - if ((l = chan->i_len + mbx->data_len) <= 2048) - { - bcopy(b, &chan->i_buf[chan->i_len], mbx->data_len); - if(isdn_input(ap, l, chan->i_buf, ctrl->islisten)) - ctrl->lastact = time.tv_sec; - } - chan->i_len = 0; - break; - } /* chan->i_len == 0 && mbx->more_data == 0 */ - if(isdn_input(ap, mbx->data_len, b, ctrl->islisten)) - ctrl->lastact = time.tv_sec; - break; - } - break; - - default: - badstate(mbx,1,mb,dpr); - } -/* - else badstate(mbx,2,mb,dpr); -*/ - - reset_req(sc, mb,1); -} - -static void -d_intr(struct nic_softc * sc) -{ - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx = &dpr->dpr_mbx[2]; - chan_t *chan; - u_short ap, c, pl, err = 0; - isdn_ctrl_t *ctrl; - isdn_appl_t *appl; - - if (dpr->msg_flg[3]) - return; /* should not happen. might make problems */ - /* but there should be another intr., so what? */ - - pl = mbx->add_info; - if ((c = CHAN(pl)) < 2) - { - chan = &sc->sc_chan[c]; - ctrl = &isdn_ctrl[chan->ctrl]; - } else - { - c = 0xffff; - chan = NULL; - ctrl = NULL; - } - - ap= APPL(pl); - if(ctrl && (ctrl->appl & 0xC0) == 0) - appl= &isdn_appl[ctrl->appl]; - else if(ap < 0x30) - appl = &isdn_appl[ap]; - else if(ap < 0x40) - appl = NULL; - else - { - reset_req(sc, 2,2); - return; - } - - switch (mbx->type & 0x1f) - { - case 0: /* CONNECT CONF */ - err = *(u_short *) mbx->data; - if(err || (appl == NULL) || (chan == NULL) || (ctrl == NULL)) - { - if(chan) reset_plci(1, chan, pl); - if(appl) appl->state= 0; - break; - } - - if (ISBUSY(ctrl->appl)) - { - discon_req(8, sc, pl, 0, 0); - break; - } - chan->plci = pl; - chan->msg_nr= 0; - chan->ncci = -1; - ctrl->lastact = time.tv_sec; - ctrl->appl = ap; - appl->ctrl = chan->ctrl; - ctrl->islisten= 0; - chan->state = DIAL; - appl->state = 3; - break; - - case 1: /* CONNECT IND */ - if (ISBUSY(ctrl->appl)) - { - discon_req(9, sc, pl, 0, 0); - break; - } - chan->plci = pl; - chan->msg_nr= 0; - chan->ncci = -1; - ctrl->lastact = time.tv_sec; - ctrl->appl = 0x7f; - ctrl->islisten= 1; - chan->state = CALLED; - mbx->data[mbx->data[3] + 4] = 0; - isdn_accept_con_ind(ap, chan->ctrl, mbx->data[0], mbx->data[1] - ,mbx->data[2], mbx->data[3], (char *) &mbx->data[4]); - break; - - case 2: /* CONNECT ACTIVE IND */ - con_act_resp(sc, pl); - if (IS_LISTEN(pl)) - { - isdn_conn_ind(ctrl->appl,chan->ctrl,0); - break; - } - isdn_conn_ind(APPL(pl),chan->ctrl,1); - chan->state = CONNECT; - ctrl->appl = ap; - appl->ctrl = chan->ctrl; - break; - - case 3: /* DISCONNECT CONF */ - reset_plci(2, chan, pl); - break; - - case 4: /* DISCONNECT IND */ - discon_resp(sc, reset_plci(3, chan, pl)); - break; - - case 7: /* LISTEN CONF */ - isdn_state = *(u_short *) mbx->data; - break; - - case 10: /* INFO IND */ - isdn_info(ap,*(u_short *)mbx->data, mbx->data[2], mbx->data+3); - inf_resp(sc, pl); - break; - - default: - badstate(mbx,3,2,dpr); - } - reset_req(sc, 2,2); -} - -static void -s_intr(struct nic_softc * sc) -{ - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx = &dpr->dpr_mbx[0]; - mbx_type *smbx = &dpr->dpr_mbx[1]; - - if (dpr->msg_flg[1]) - return; /* should not happen. might make problems */ - /* but there should be another intr., so what? */ - - bzero(smbx, 16); - - switch (mbx->type & 0x1f) - { - case 0: /* INIT CONF */ - break; - case 1: /* INIT IND */ - smbx->type = mbx->type + 0x20; - dpr->msg_flg[1] = 1; - make_intr(1, sc); - break; - case 4: /* DNL MOD CONF */ - sc->sc_stat = mbx->data[0]; - if (sc->sc_flags) - sc->sc_flags = OPEN; - break; - case 6: /* DNL MOD IND */ - smbx->type = mbx->type + 0x20; - smbx->data_len = 1; - smbx->data[0] = mbx->data[1]; - sc->sc_stat = mbx->data[0]; - if (sc->sc_flags) - sc->sc_flags = OPEN; - dpr->msg_flg[1] = 1; - make_intr(1, sc); - break; - case 0x0e: /* SET CLOCK CONF */ - dpr->watchdog_cnt = 0xFF; - dpr->int_flg_pc = 0xFF; - dpr->api_active = 1; - break; - case 0x15: /* POLL IND */ - dpr->watchdog_cnt = 0xFF; - dpr->int_flg_pc = 0xFF; - dpr->api_active = 1; - smbx->type = mbx->type + 0x20; - dpr->msg_flg[1] = 1; - make_intr(1, sc); - break; - case 0x1e: /* MANUFACT CONF */ - if(((mbx->type >> 8) == 18 ) && (*mbx->data == 0)) /* LISTEN */ - break; - badstate(mbx,4,0,dpr); - break; - case 0x1f: /* MANUFACT IND */ - if((mbx->type >> 8) == 19 ) /* DATA */ - { - u_char *b = (u_char *) dpr; - b += dpr->buf_ptr[0]; - isdn_input(ispy_applnr, mbx->data_len, b, 0); - smbx->type = mbx->type + 0x20; - dpr->msg_flg[1] = 1; - make_intr(1, sc); - break; - } - default: - badstate(mbx,5,0,dpr); - } - reset_req(sc, 0, 3); -} - -static void -bs_intr(int mb, int c, struct nic_softc * sc) -{ - chan_t *chan = &sc->sc_chan[c]; - isdn_ctrl_t *ctrl = &isdn_ctrl[chan->ctrl]; - - if (chan->state == ACTIVE) - { - if (chan->more) - { - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx = &dpr->dpr_mbx[mb]; - u_char *b = (u_char *) dpr; - - bzero(mbx, 20); - mbx->type = BD_DATA_B3_REQ; - if (mb == 7) - mbx->type |= 0x40; - *(u_short *) mbx->data = chan->ncci; - mbx->data[4] = chan->msg_nr; - b += dpr->buf_ptr[mb]; - mbx->data_len = chan->more; - bcopy(chan->more_b, b, chan->more); - - chan->more = 0; - ctrl->o_len = -1; - - dpr->msg_flg[mb] = 3; - make_intr(mb, sc); - - ctrl->lastact = time.tv_sec; - return; - } - bsintr &= ~(1 << c); - } -} - -void -nicintr(int unit) -{ - register struct nic_softc *sc = &nic_sc[unit]; - dpr_type *dpr = sc->sc_dpr; - - if (dpr->msg_flg[2]) - d_intr(sc); - if (dpr->msg_flg[0]) - s_intr(sc); - if (dpr->msg_flg[6]) - b_intr(6, 1, sc); - if (dpr->msg_flg[4]) - b_intr(4, 0, sc); - if (bsintr) - { - if (dpr->msg_flg[7] == 0) - bs_intr(7, 1, sc); - if (dpr->msg_flg[5] == 0) - bs_intr(5, 0, sc); - } -} - - -static nic_devsw_installed = 0; - -static void nic_drvinit(void *unused) -{ - dev_t dev; - - if( ! nic_devsw_installed ) { - dev = makedev(CDEV_MAJOR ,0); - cdevsw_add(&dev,&nic_cdevsw, NULL); - nic_devsw_installed = 1; - } -} - -SYSINIT(nicdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,nic_drvinit,NULL) - -#endif /* NNIC > 0 */ diff --git a/sys/gnu/i386/isa/nic3008.h b/sys/gnu/i386/isa/nic3008.h deleted file mode 100644 index 5a87409..0000000 --- a/sys/gnu/i386/isa/nic3008.h +++ /dev/null @@ -1,123 +0,0 @@ -/* @(#)$Id: nic3008.h,v 1.1 1995/02/14 15:00:12 jkh Exp $ - ******************************************************************************* - * II - Version 0.1 $Revision: 1.1 $ $State: Exp $ - * - * Copyright 1994 Dietmar Friede - ******************************************************************************* - * Bug reports, patches, comments, suggestions should be sent to: - * - * jkr@saarlink.de or jkrause@guug.de - * - ******************************************************************************* - * $Log: nic3008.h,v $ - * Revision 1.1 1995/02/14 15:00:12 jkh - * An ISDN driver that supports the EDSS1 and the 1TR6 ISDN interfaces. - * EDSS1 is the "Euro-ISDN", 1TR6 is the soon obsolete german ISDN Interface. - * Obtained from: Dietmar Friede <dfriede@drnhh.neuhaus.de> and - * Juergen Krause <jkr@saarlink.de> - * - * This is only one part - the rest to follow in a couple of hours. - * This part is a benign import, since it doesn't affect anything else. - * - * - ******************************************************************************/ - -/* - * This file defines the NICCY 3008 Interface. - * Copyright Dr. Neuhaus GmbH, Hamburg and Dietmar Friede - * -*/ - -#pragma pack (1) - -typedef struct { - u_short type; /* Message Subtype/Type */ - u_char source; - u_char dest; - u_short number; /* laufende Nachrichten-Nummer */ - u_short timeoutval; /* Wert fr Timeout */ - u_char priority; /* Nachrichten-Priorit„t */ - u_char more_data; /* Nachricht vollst„ndig? */ - u_short data_len; /* Datenmenge */ - u_char buf_valid; /* im aux. buf.? */ - u_char reserved[1]; - u_short add_info; /* Maske */ - u_char data[0x30];/* Datenfeld */ -} mbx_type; - -/* ------------------------------------------------------------------------ */ - -typedef struct { -/* Offset 0x0000 ---------------------------------------------------------- */ - u_char msg_flg[8]; /* Messages in MBX i */ - u_char card_number; /* Kartennummer of Applikation */ - u_char card_state; /* Kartenstatus */ - u_short mainloop_cnt; /* NICCY's M'loop,68000-Notation*/ - u_char watchdog_cnt; /* Applikation "lebt"? */ - u_char hw_config; /* Steckmodule? */ - u_char jmp_config; /* Karten-Jumper? */ - u_char ram_config; /* Karten-Speicher? */ -/* Offset 0x0010 -----------------------------------------------------------*/ - char niccy_ver[0x0E]; /* "NICCY V x.yyy\c" */ - u_char int_flg_pc; /* Will PC Interrupts? */ - u_char int_flg_nic; /* Will NICCY Interrupts? */ -/* Offset 0x0020 -----------------------------------------------------------*/ - u_short buf_ptr[8]; /* Pointer to aux. buf. ... */ -/* Offset 0x0030 -----------------------------------------------------------*/ - u_short buf_len[8]; /* Size of aux. buf. ... */ -/* Offset 0x0040 -----------------------------------------------------------*/ - /* 0x40 Bytes fr die */ - /* frei verfgbar */ - u_char old_flg[8]; /* Messages in MBX i */ - u_char irq_level; /* welcher IRQ (als Bitmaske */ - u_char res[7]; /* FREI */ -/* Offset 0x0050 -----------------------------------------------------------*/ - u_char api_area_int_nr; /*SW-Int des API wenn API_ACTIVE*/ - u_char api_area_PLCI[2]; /* PLCI w„hrend ApiManufacturer */ - u_char capi_version[6]; /* Versionsnummer der CAPI */ - u_char api_area[0x27]; /* FREI */ -/* Offset 0x0080 -----------------------------------------------------------*/ - u_char api_active; /* Flag ob CAPI aktiv ist */ - u_char ext_hw_config; /* Bit 0: UART 16550 */ - /* Bit 1..7: reserved */ - u_char dpr_hw_id[0x0E]; /* Hardware ID */ -/* Offset 0x0090 -----------------------------------------------------------*/ - u_char dpr_listen_req;/* Anzahl Listen Request's */ - u_char dpr_state_b1; /* state B1 channel */ - /* 0x00 : channel ist frei */ - /* 0x01 : Verbindungsaufb. Req */ - /* 0x02 : Verbindungsaufb. Act */ - /* 0x03 : Verbindung besteht */ - /* 0x04 : eintreffender Ruf */ - /* 0x05 : Verbindung angenommen */ - /* 0x06 : Verbindungsabb. Req */ - /* 0x07 : Verbindungsabb. laeuft*/ - /* 0x08 : Verbindung getrennt */ - u_char dpr_state_b2; /* state B2 channel (siehe oben)*/ - u_char dpr_state_ic1; /* state of Intercomm-Channel */ - u_char dpr_state_ic2; /* ----------- " -------------- */ - u_char state_res[0x04]; - u_char dpr_si_b1; /* Service Indicator auf B1 */ - u_char dpr_si_b2; /* Service Indicator auf B2 */ - u_char dpr_state_res_0[0x05]; -/* Offset 0x00A0 -----------------------------------------------------------*/ - u_char dpr_state_hscx; /* state of HSCX */ - u_char dpr_state_itac; /* state of ITAC */ - u_char dpr_state_arcofi;/* state of ARCOFI */ - u_char dpr_state_modem; /* state of Aufsteckmodem */ - u_char dpr_state_com; /* state of COM */ - u_char dpr_state_res[0x0B]; -/* Offset 0x00B0 -----------------------------------------------------------*/ - u_char dpr_state_ia_tel;/* state of internal Appl. */ - u_char dpr_state_ia_com;/* state of internal Appl. */ - u_char dpr_state_ia_mod;/* state of internal Appl. */ - u_char dpr_state_res_1[0x0D]; -/* Offset 0x00C0 -----------------------------------------------------------*/ - u_char dpr_state_dcp[0x10];/* state of D-channel Prot */ -/* Offset 0x00D0 -----------------------------------------------------------*/ - u_char reserved[0x130]; -/* Offset 0x0200 -----------------------------------------------------------*/ - mbx_type dpr_mbx[8]; /* the mailboxes ... */ -} dpr_type; - -#pragma pack () diff --git a/sys/gnu/i386/isa/nic3009.c b/sys/gnu/i386/isa/nic3009.c deleted file mode 100644 index 2e5a322..0000000 --- a/sys/gnu/i386/isa/nic3009.c +++ /dev/null @@ -1,1358 +0,0 @@ -/* @(#)$Id: nic3009.c,v 1.15 1996/03/28 14:27:28 scrappy Exp $ - ******************************************************************************* - * II - Version 0.1 $Revision: 1.15 $ $State: Exp $ - * - * Copyright 1994 Dietmar Friede - ******************************************************************************* - * Bug reports, patches, comments, suggestions should be sent to: - * - * jkr@saarlink.de or jkrause@guug.de - * - ******************************************************************************* - * $Log: nic3009.c,v $ - * Revision 1.15 1996/03/28 14:27:28 scrappy - * Switched from using devfs_add_sw() to using devfs_add_swf() - * - * Reviewed by: julian@freebsd.org - * - * Revision 1.14 1995/12/17 21:14:36 phk - * Staticize. - * - * Revision 1.13 1995/12/08 23:19:30 phk - * Julian forgot to make the *devsw structures static. - * - * Revision 1.12 1995/12/08 11:12:47 julian - * Pass 3 of the great devsw changes - * most devsw referenced functions are now static, as they are - * in the same file as their devsw structure. I've also added DEVFS - * support for nearly every device in the system, however - * many of the devices have 'incorrect' names under DEVFS - * because I couldn't quickly work out the correct naming conventions. - * (but devfs won't be coming on line for a month or so anyhow so that doesn't - * matter) - * - * If you "OWN" a device which would normally have an entry in /dev - * then search for the devfs_add_devsw() entries and munge to make them right.. - * check out similar devices to see what I might have done in them in you - * can't see what's going on.. - * for a laugh compare conf.c conf.h defore and after... :) - * I have not doen DEVFS entries for any DISKSLICE devices yet as that will be - * a much more complicated job.. (pass 5 :) - * - * pass 4 will be to make the devsw tables of type (cdevsw * ) - * rather than (cdevsw) - * seems to work here.. - * complaints to the usual places.. :) - * - * Revision 1.11 1995/11/29 14:39:08 julian - * If you're going to mechanically replicate something in 50 files - * it's best to not have a (compiles cleanly) typo in it! (sigh) - * - * Revision 1.10 1995/11/29 10:47:05 julian - * OK, that's it.. - * That's EVERY SINGLE driver that has an entry in conf.c.. - * my next trick will be to define cdevsw[] and bdevsw[] - * as empty arrays and remove all those DAMNED defines as well.. - * - * Revision 1.9 1995/11/21 14:56:02 bde - * Completed function declarations, added prototypes and removed redundant - * declarations. - * - * Revision 1.8 1995/09/19 18:54:42 bde - * Fix benign type mismatches in isa interrupt handlers. Many returned int - * instead of void. - * - * Revision 1.7 1995/09/08 11:06:47 bde - * Fix benign type mismatches in devsw functions. 82 out of 299 devsw - * functions were wrong. - * - * Revision 1.6 1995/05/11 19:25:56 rgrimes - * Fix -Wformat warnings from LINT kernel. - * - * Revision 1.5 1995/03/28 07:54:33 bde - * Add and move declarations to fix all of the warnings from `gcc -Wimplicit' - * (except in netccitt, netiso and netns) that I didn't notice when I fixed - * "all" such warnings before. - * - * Revision 1.4 1995/02/16 08:06:21 jkh - * Fix a few bogons introduced when config lost the 3 char limitation. - * - * Revision 1.3 1995/02/15 11:59:41 jkh - * Fix a few more nits. Should compile better now! :_) - * - * Revision 1.2 1995/02/15 06:28:20 jkh - * Fix up include paths, nuke some warnings. - * - * Revision 1.1 1995/02/14 15:00:14 jkh - * An ISDN driver that supports the EDSS1 and the 1TR6 ISDN interfaces. - * EDSS1 is the "Euro-ISDN", 1TR6 is the soon obsolete german ISDN Interface. - * Obtained from: Dietmar Friede <dfriede@drnhh.neuhaus.de> and - * Juergen Krause <jkr@saarlink.de> - * - * This is only one part - the rest to follow in a couple of hours. - * This part is a benign import, since it doesn't affect anything else. - * - * - ******************************************************************************/ - -/* - * Copyright (c) 1994 Dietmar Friede (dietmar@friede.de) All rights reserved. - * FSF/FSAG GNU Copyright applies - * - * A low level driver for the NICCY-3009 ISDN Card. - * - */ - -#include "nnic.h" -#if NNNIC > 0 - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/conf.h> -#include <sys/proc.h> -#ifdef DEVFS -#include <sys/devfsext.h> -#endif /*DEVFS*/ - -#include <i386/isa/isa_device.h> -#include <gnu/i386/isa/nic3009.h> -#include <gnu/i386/isa/niccyreg.h> -#include <gnu/isdn/isdn_ioctl.h> - - -#define OPEN 1 -#define LOAD_HEAD 3 -#define LOAD_DATA 5 -#define LOAD_ENTITY 8 -#define IS_DIAL(p) (((p)&0x20)==0) -#define IS_LISTEN(p) ((p)&0x20) -#define CHAN(pl) (((pl)&7)-1) -#define C_CHAN(x) ((x)&1) -#define APPL(pl) ((((pl)>>6)&0x7f)-1) -#define CARD(pl) (((pl)>>13)&7) -#define MK_APPL(pl) (((pl)+1)<<6) - -#define min(a,b) ((a)<(b)?(a):(b)) - -extern isdn_appl_t isdn_appl[]; -extern u_short isdn_state; -extern isdn_ctrl_t isdn_ctrl[]; -extern int ispy_applnr; -extern int Isdn_Appl, Isdn_Ctrl, Isdn_Typ; - -static old_spy= 0; - -static int nnicattach __P((struct isa_device *is)); -static int nnicprobe __P((struct isa_device *is)); -static int nnic_accept __P((int cn, int an, int rea)); -static int nnic_connect __P((int cn, int ap, int b_channel, int inf_mask, - int out_serv, int out_serv_add, - int src_subadr, unsigned ad_len, - char *dest_addr, int spv)); -static int nnic_disconnect __P((int cn, int rea)); -static int nnic_listen __P((int cn, int ap, int inf_mask, - int subadr_mask, int si_mask, int spv)); -static int nnic_output __P((int cn)); -static int nnic_state __P((int cn)); - -static d_open_t nnicopen; -static d_close_t nnicclose; -static d_ioctl_t nnicioctl; - -#define CDEV_MAJOR 60 -static struct cdevsw nnic_cdevsw = - { nnicopen, nnicclose, noread, nowrite, /*60*/ - nnicioctl, nostop, nullreset, nodevtotty,/* nnic */ - seltrue, nommap, NULL, "nnic", NULL, -1 }; - - -static short bsintr; - -struct isa_driver nnicdriver = {nnicprobe, nnicattach, "nnic"}; - -typedef enum -{ - DISCON, ISDISCON, DIAL, CALLED, CONNECT, IDLE, ACTIVE -} io_state; - -typedef struct -{ - char ctrl; - u_char msg_nr; - u_char morenr; - short plci; - short ncci; - short state; - short i_len; - char i_buf[2048]; - char o_buf[2048]; - u_short more; - char *more_b; -} chan_t; - -static struct nnic_softc -{ - dpr_type *sc_dpr; /* card RAM virtual memory base */ - u_short sc_vector; /* interrupt vector */ - short sc_port; - u_char sc_flags; - u_char sc_unit; - u_char sc_ctrl; - u_char sc_type; - short sc_stat; - chan_t sc_chan[2]; -#ifdef DEVFS - void *devfs_token; -#endif -} nnic_sc[NNNIC]; - -static void badstate __P((mbx_type *mbx, int n, int mb, dpr_type *dpr)); -static int con_b3_resp __P((int unit, int mb, u_short ncci, u_short pl, - u_char reject)); -static int discon_req __P((int w, int unit, int pl, int rea, int err)); -static int con_resp __P((int unit, int pl, int rea)); -static void dn_intr __P((unsigned unit, struct nnic_softc *sc)); -static int en_q __P((int unit, int t, int st, int pl, int l, u_char *b)); -static void make_intr __P((void *gen)); -static void nnnicintr __P((void *gen)); -static void nnic_reset __P((struct nnic_softc *sc, int reset)); -static int reset_plci __P((int w, chan_t *chan, int p)); -static int sel_b2_prot_req __P((int unit, int c, int pl, dlpd_t *dlpd)); -static int sel_b3_prot_req __P((int unit, int mb, u_short pl, - ncpd_t *ncpd)); -static void up_intr __P((unsigned unit, struct nnic_softc *sc)); - -static int -nnicprobe(struct isa_device * is) -{ - register struct nnic_softc *sc = &nnic_sc[is->id_unit & 127]; - dpr_type *dpr; - u_char *w; - int i; - - sc->sc_vector = is->id_irq; - sc->sc_port = is->id_iobase; - sc->sc_unit = is->id_unit; - w= (u_char *) dpr = sc->sc_dpr = (dpr_type *) is->id_maddr; - - i= ffs(sc->sc_vector)-1; - if(i == 9) i= 1; - outb(sc->sc_port, 0); - outb(sc->sc_port+1, i); - outb(sc->sc_port, ((unsigned) dpr >> 12) & 0xff); - -/* There should be memory, so lets test that */ - for (i=0;i<DPR_LEN;i++) - w[i] = (i+0xaf) & 0xff; - for (i=0;i<DPR_LEN;i++) - if (w[i] != ((i+0xaf) & 0xff)) - { - printf("Niccy card not found or bad memory %p\n", - is->id_maddr); - outb(sc->sc_port, 0); - return(0); - } - bzero(w,DPR_LEN-4); - - is->id_msize = DPR_LEN; - return (2); -} - -static void -nnic_reset(struct nnic_softc *sc, int reset) -{ - u_char o; - o= ffs(sc->sc_vector)-1; - if(reset == 0) - o|= 0x80; - outb(sc->sc_port+1,o); -} - -/* - * nnicattach() Install device - */ -static int -nnicattach(struct isa_device * is) -{ - struct nnic_softc *sc; - int cn; - isdn_ctrl_t *ctrl0, *ctrl1; - - sc = &nnic_sc[is->id_unit]; - sc->sc_ctrl = -1; - if ((cn = isdn_ctrl_attach(2)) == -1) - { - return (0); - } - sc->sc_ctrl = cn; - sc->sc_chan[0].plci = sc->sc_chan[1].plci = -1; - - ctrl0 = &isdn_ctrl[cn]; - ctrl1 = &isdn_ctrl[cn + 1]; - sc->sc_chan[0].ctrl = ctrl0->ctrl = cn; - sc->sc_chan[1].ctrl = ctrl1->ctrl = cn + 1; - ctrl0->o_buf = sc->sc_chan[0].o_buf; - ctrl1->o_buf = sc->sc_chan[1].o_buf; - ctrl0->listen = ctrl1->listen = nnic_listen; - ctrl0->disconnect = ctrl1->disconnect = nnic_disconnect; - ctrl0->accept = ctrl1->accept = nnic_accept; - ctrl0->connect = ctrl1->connect = nnic_connect; - ctrl0->output = ctrl1->output = nnic_output; - ctrl0->state = ctrl1->state = nnic_state; - ctrl0->unit = ctrl1->unit = is->id_unit; - ctrl0->appl = ctrl1->appl = -1; - ctrl0->o_len = ctrl1->o_len = -1; - sc->sc_flags= LOAD_ENTITY; -#ifdef DEVFS - sc->devfs_token = - devfs_add_devswf(&nnic_cdevsw, is->id_unit, DV_CHR, 0, 0, - 0600, "/isdn/nnic%d", is->id_unit); -#endif - - return (1); -} - -#define con_b3_req(unit,mb,pl) en_q(unit,mb|BD_CONN_B3_REQ,0,pl,0,NULL) -#define con_act_resp(unit,pl) en_q(unit,DD_CONN_ACT_RSP,0, pl,0,NULL) -#define discon_resp(sc,pl) en_q(unit,DD_DISC_RSP,0, pl,0,NULL) -#define inf_resp(unit,pl) en_q(unit,DD_INFO_RSP,0, pl,0,NULL) -#define listen_b3_req(unit,mb,pl) en_q(unit,mb|BD_LIST_B3_REQ,0,pl,0,NULL) - -/* If the Niccy card wants it: Interupt it. */ -static void -make_intr(void *gen) -{ - struct nnic_softc * sc = (struct nnic_softc *)gen; - dpr_type *dpr = sc->sc_dpr; - - dpr->watchdog_cnt = 0xFF; - - if (dpr->int_flg_nic) - dpr->signal_pc_to_niccy++; -} - -static int -en_q(int unit, int t, int st, int pl, int l, u_char *b) -{ - struct nnic_softc * sc= &nnic_sc[unit]; - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx = &dpr->dn_mbx; - -/* - if (dpr->card_state & ~4) - return (ENODEV); -*/ - if (mbx->msg_flag) - return (EBUSY); - - bzero(&mbx->type, 18); - mbx->type = t; - mbx->subtype = st; - mbx->plci = pl; - if (l) - { - mbx->data_len = l; - bcopy(b, mbx->data, l); - } - mbx->msg_flag = 1; - make_intr(sc); - return (0); -} - -static void -badstate(mbx_type * mbx, int n, int mb, dpr_type *dpr) -{ - printf("Niccy: not implemented %x len %d at %d.", mbx->type,mbx->data_len,n); - if(mbx->data_len) - { - int i; - - for(i=0; i<mbx->data_len; i++) printf(" %x",mbx->data[i]); - } - printf("\n"); -} - -static int -nnic_state(int cn) -{ - isdn_ctrl_t *ctrl = &isdn_ctrl[cn]; - struct nnic_softc *sc = &nnic_sc[ctrl->unit]; - chan_t *chan0 = &sc->sc_chan[0]; - chan_t *chan1 = &sc->sc_chan[1]; - dpr_type *dpr = sc->sc_dpr; - - if(sc->sc_flags == LOAD_ENTITY) - return(ENODEV); - if (dpr->card_state & ~4 ) - return (ENODEV); - if (dpr->card_state & 4 ) - return (EAGAIN); - if(chan0->state && chan1->state) - return(EBUSY); - return(0); -} - -static int -nnic_output(int cn) -{ - isdn_ctrl_t *ctrl = &isdn_ctrl[cn]; - struct nnic_softc *sc = &nnic_sc[ctrl->unit]; - chan_t *chan = &sc->sc_chan[C_CHAN(cn)]; - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx = &dpr->dn_mbx; - int l; - int len= ctrl->o_len; - - if (dpr->card_state /* & ~4 */) - return (ENODEV); - - if (bsintr || (chan->ncci == -1) || mbx->msg_flag || (chan->state != IDLE)) - return (EBUSY); - - chan->state = ACTIVE; - - bzero(&mbx->type, 20); - mbx->type = BD_DATA_B3_REQ; - if (C_CHAN(cn)) - mbx->type |= 0x40; - *(u_short *) mbx->data = chan->ncci; - mbx->data[4] = chan->msg_nr; - l = min(DATAFIELD_LEN-5, len); - mbx->data_len = l+5; - bcopy(ctrl->o_buf, &mbx->data[5], l); - - if (l < len) - { - chan->more = len - l; - chan->more_b = ctrl->o_buf + l; - mbx->more_data = 1; - bsintr = C_CHAN(cn)+1; - } else - { - chan->more = 0; - ctrl->o_len = -1; - bsintr= 0; - ++chan->msg_nr; - } - - mbx->msg_flag = 1; - make_intr(sc); - ctrl->lastact = time.tv_sec; - return (0); -} - -static int -con_resp(int unit, int pl, int rea) -{ - return(en_q(unit, DD_CONN_RSP, 0, pl, 1, (u_char *) & rea)); -} - -static int -reset_plci(int w, chan_t * chan, int p) -{ - isdn_ctrl_t *ctrl; - - if (p == -1) - return (-1); - - if(chan == NULL) - return(p); - - ctrl = &isdn_ctrl[chan->ctrl]; - if (chan->plci == p) - { - if (ISBUSY(ctrl->appl)) - { - isdn_disconn_ind(ctrl->appl); - isdn_appl[ctrl->appl].ctrl = -1; - isdn_appl[ctrl->appl].state = 0; - } - ctrl->appl = -1; - ctrl->o_len = -1; - chan->plci = -1; - chan->ncci = -1; - chan->state = DISCON; - chan->i_len = 0; - chan->more = 0; - } - return (p); -} - -static int -sel_b2_prot_req(int unit, int c, int pl, dlpd_t * dlpd) -{ - return(en_q(unit, (c ? 0x40 : 0)| BD_SEL_PROT_REQ, 2, pl, sizeof(dlpd_t), (u_char *) dlpd)); -} - -static int -sel_b3_prot_req(int unit, int mb, u_short pl, ncpd_t * ncpd) -{ - return(en_q(unit, mb | BD_SEL_PROT_REQ, 3, pl, sizeof(ncpd_t), (u_char *) ncpd)); -} - -static int -discon_req(int w, int unit , int pl, int rea, int err) -{ - if((pl == 0) || (pl == -1)) - return(0); - return(en_q(unit, DD_DISC_REQ,0, pl, 1, (u_char *) &rea)); -} - -static int -con_b3_resp(int unit, int mb, u_short ncci, u_short pl, u_char reject) -{ - u_char buf[32]; - int l = 4; - - bzero(buf, 32); - *(u_short *) buf = ncci; - buf[2] = reject; - buf[3] = 0; /* ncpi ??? */ - l += 15; - return(en_q(unit, mb | BD_CONN_B3_RSP,0, pl, l, buf)); -} - -static int -nnic_connect(int cn, int ap, int b_channel, int inf_mask, int out_serv - ,int out_serv_add, int src_subadr, unsigned ad_len - ,char *dest_addr, int spv) -{ - char buf[128]; - - if (ad_len > 118) - return (-1); - - buf[0] = spv ? 0x53 : 0; - buf[1] = b_channel; - if (spv) - inf_mask |= 0x40000000; - *(u_long *) & buf[2] = inf_mask; - buf[6] = out_serv; - buf[7] = out_serv_add; - buf[8] = src_subadr; - buf[9] = ad_len; - bcopy(dest_addr, &buf[10], ad_len); - return (en_q(isdn_ctrl[cn].unit, DD_CONN_REQ, 0, MK_APPL(ap), ad_len + 10, buf)); -} - -static int -nnic_listen(int cn, int ap, int inf_mask, int subadr_mask, int si_mask, int spv) -{ - u_short sbuf[4]; - - if (spv) - inf_mask |= 0x40000000; - *(u_long *) sbuf = inf_mask; - sbuf[2] = subadr_mask; - sbuf[3] = si_mask; - return (en_q(isdn_ctrl[cn].unit, DD_LISTEN_REQ, 0, MK_APPL(ap), 8, (u_char *) sbuf)); -} - -static int -nnic_disconnect(int cn, int rea) -{ - isdn_ctrl_t *ctrl = &isdn_ctrl[cn]; - chan_t *chan = &nnic_sc[ctrl->unit].sc_chan[C_CHAN(cn)]; - int p, err; - u_char buf[16]; - - if(chan->ncci != -1) - { - bzero(buf,16); - *(u_short *) buf = chan->ncci; - err= en_q(ctrl->unit, (C_CHAN(cn)?0x40:0)|BD_DISC_B3_REQ, 0 - , chan->plci, 3+sizeof(ncpi_t), buf); - if((err==0) && (ctrl->o_len == 0)) - ctrl->o_len= -1; - return(err); - } - p = chan->plci; - if ((p == 0) || (p == -1)) - return (ENODEV); - - err= en_q(ctrl->unit, DD_DISC_REQ, 0, p, 1, (u_char *) &rea); - if((err==0) && (ctrl->o_len == 0)) - ctrl->o_len= -1; - return(err); -} - -static int -nnic_accept(int cn, int an, int rea) -{ - isdn_ctrl_t *ctrl = &isdn_ctrl[cn]; - struct nnic_softc *sc = &nnic_sc[ctrl->unit]; - chan_t *chan = &sc->sc_chan[C_CHAN(cn)]; - isdn_appl_t *appl = &isdn_appl[an]; - - if(ISFREE(ctrl->appl)) - return(ENODEV); - - if (rea) - { - ctrl->appl= -1; - return(discon_req(1, ctrl->unit, chan->plci, rea, 0)); - } - ctrl->appl= an; - ctrl->lastact = time.tv_sec; - appl->ctrl= cn; - appl->state= 4; - - return(sel_b2_prot_req(ctrl->unit, C_CHAN(cn), chan->plci, &appl->dlpd)); -} - -static int -nnicopen(dev_t dev, int flags, int fmt, struct proc *p) -{ - struct nnic_softc *sc; - u_char unit; - int x; - - unit = minor(dev); - /* minor number out of limits ? */ - if (unit >= NNNIC) - return (ENXIO); - sc = &nnic_sc[unit]; - - x= splhigh(); - /* Card busy ? */ -/* - if (sc->sc_flags & 7) - { - splx(x); - return (EBUSY); - } -*/ - sc->sc_flags |= OPEN; - - splx(x); - return (0); -} - -static int -nnicclose(dev_t dev, int flags, int fmt, struct proc *p) -{ - struct nnic_softc *sc = &nnic_sc[minor(dev)]; - - sc->sc_flags &= ~7; - return (0); -} - -static int -nnicioctl(dev_t dev, int cmd, caddr_t data, int flags, struct proc *pr) -{ - int error; - int i, x; - struct nnic_softc *sc = &nnic_sc[minor(dev)]; - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx= &dpr->dn_mbx; - u_char *p= (u_char *)dpr; - struct head *head = (struct head *) data; - - error = 0; - switch (cmd) - { - case NICCY_DEBUG: - data[0]= 0x39; - bcopy(p, &data[1], 2044); - break; - case NICCY_LOAD: - switch(head->status) - { - case 0: /* Loading initial boot code */ - x = splhigh(); - nnic_reset(sc,1); - if(error = copyin(head->data+0x16,p, head->d_len-0x16)) - { - splx(x); - return (error); - } - nnic_reset(sc,0); - i= hz; - while (p[7] && i--) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "l9_0", 1); - if (error != EWOULDBLOCK) - { - splx(x); - return (error); - } - } - nnic_reset(sc,1); - splx(x); - if(p[7]) return(ENODEV); - return(0); - - case 1: /* Loading boot code */ - x = splhigh(); - - if(error = copyin(head->data+0x64,p, head->d_len-0x64)) - { - splx(x); - return (error); - } - nnic_reset(sc,0); - i= 5*hz; - while ((dpr->mainloop_cnt != 0x1147) && i--) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "l9_1", 1); - if (error != EWOULDBLOCK) - { - splx(x); - return (error); - } - } - - if(dpr->mainloop_cnt != 0x1147) - { - splx(x); - return(ENODEV); - } - - i= 1*hz; - while ((dpr->up_mbx.type != 1) && i--) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "l9_2", 1); - if (error != EWOULDBLOCK) - { - splx(x); - return (error); - } - } - if(dpr->up_mbx.type != 1) - { - splx(x); - return(ENODEV); - } - bzero(&mbx->type, 16); - dpr->up_mbx.msg_flag= 0; - mbx->type= 0x21; - mbx->msg_flag= 1; - - i= 1*hz; - while (mbx->msg_flag && i--) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "l9_3", 1); - if (error != EWOULDBLOCK) - { - splx(x); - return (error); - } - } - if(mbx->msg_flag) - { - splx(x); - return(ENODEV); - } - - head->status= 0; - splx(x); - return(0); - - default: - x = splhigh(); - while (mbx->msg_flag) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "l9_1h", 1); - if (error != EWOULDBLOCK) - { - splx(x); - return (error); - } - } - - bzero(&mbx->type, 16); - mbx->type = MD_DNL_MOD_REQ; - mbx->subtype = head->typ; - sc->sc_type = head->typ; - mbx->data_len = 12; - bcopy(head->nam, mbx->data, 8); - *(u_long *) (mbx->data + 8) = head->len; - - mbx->msg_flag = 1; - make_intr(sc); - i= 1*hz; - while ((dpr->up_mbx.msg_flag == 0) && i--) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "l9_2", 1); - if (error != EWOULDBLOCK) - { - splx(x); - return (error); - } - } - - if((dpr->up_mbx.type != MU_DNL_MOD_CNF) || dpr->up_mbx.data[0]) - { - dpr->up_mbx.msg_flag= 0; - make_intr(sc); - splx(x); - return(ENODEV); - } - dpr->up_mbx.msg_flag= 0; - make_intr(sc); - { - int len, l, off; - len= head->d_len; - off= 0; - l= 0x64; - - while(len > 0) - { - while (mbx->msg_flag) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "l9_4load", 1); - if (error != EWOULDBLOCK) - { - splx(x); - return (error); - } - } - mbx->type = MD_DNL_MOD_DATA; - len-= l; - mbx->more_data = len > 0; - mbx->data_len = l; - if(error= copyin(head->data+off, mbx->data, l)) - { - splx(x); - return (error); - } - off+= l; - l= min(len,512); - mbx->msg_flag = 1; - make_intr(sc); - } - } - - i= 3*hz; - while ((dpr->up_mbx.msg_flag == 0) && i--) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "l9_2", 1); - if (error != EWOULDBLOCK) - { - splx(x); - return (error); - } - } - if(dpr->up_mbx.type == 0) - { - dpr->up_mbx.msg_flag= 0; - make_intr(sc); - i= 3*hz; - while ((dpr->up_mbx.msg_flag == 0) && i--) - { - error = tsleep((caddr_t) sc, PZERO | PCATCH, "l9_3", 1); - if (error != EWOULDBLOCK) - { - splx(x); - return (error); - } - } - } - - if(dpr->up_mbx.type != MU_DNL_MOD_IND) - { - dpr->up_mbx.msg_flag= 0; - make_intr(sc); - splx(x); - return(ENODEV); - } - head->status = dpr->up_mbx.data[0]; - mbx->data[0] = dpr->up_mbx.data[1]; - mbx->type= 0x20|MU_DNL_MOD_IND; - mbx->subtype = head->typ; - mbx->data_len = 1; - dpr->card_number = sc->sc_unit; - dpr->up_mbx.msg_flag= 0; - mbx->msg_flag= 1; - make_intr(sc); - splx(x); - return (0); - } - splx(x); - return(0); - case NICCY_SET_CLOCK: - x = splhigh(); - dpr->int_flg_pc = 0xff; - dpr->card_number = sc->sc_unit; - if (mbx->msg_flag) - { - splx(x); - return (EBUSY); - } - bzero(&mbx->type, 16); - mbx->type = MD_SET_CLOCK_REQ; - mbx->data_len = 14; - bcopy(data, mbx->data, 14); - - mbx->msg_flag = 1; - make_intr(sc); - splx(x); - return (0); - case NICCY_SPY: - x = splhigh(); - if (mbx->msg_flag) - { - splx(x); - return (EBUSY); - } - bzero(&mbx->type, 16); - mbx->type = MD_MANUFACT_REQ; - mbx->subtype = 18; - mbx->data_len = 1; - mbx->plci = MK_APPL(ispy_applnr); -/* There are ilegal states. So I use them to toggle */ - if((data[0] == 0) && (old_spy == 0)) data[0]= 255; - else if(data[0] && old_spy ) data[0]= 0; - old_spy= mbx->data[0]= data[0]; - - mbx->msg_flag = 1; - make_intr(sc); - splx(x); - return (0); - - case NICCY_RESET: - x = splhigh(); - nnic_reset(sc,1); - bzero((u_char*)dpr,DPR_LEN); - sc->sc_flags= LOAD_ENTITY; - splx(x); - return (0); - - default: - error = ENODEV; - } - return (error); -} - -static void -dn_intr(unsigned unit, struct nnic_softc * sc) -{ - dpr_type *dpr = sc->sc_dpr; - mbx_type *mbx= &dpr->dn_mbx; - chan_t *chan; - isdn_ctrl_t *ctrl; - int c,l, len; - - c= bsintr-1; - chan = &sc->sc_chan[c]; - ctrl = &isdn_ctrl[chan->ctrl]; - - if ((chan->state == ACTIVE) && (chan->more)) - { - len= chan->more; - - bzero(&mbx->type, 20); - mbx->type = BD_DATA_B3_REQ; - if (c) - mbx->type |= 0x40; - *(u_short *) mbx->data = chan->ncci; - mbx->data[4] = chan->msg_nr; - l = min(DATAFIELD_LEN-5, len); - mbx->data_len = l+5; - bcopy(chan->more_b, &mbx->data[5], l); - - if (l < len) - { - chan->more = len - l; - chan->more_b += l; - mbx->more_data = 1; - } else - { - chan->more = 0; - ctrl->o_len = -1; - bsintr= 0; - ++chan->msg_nr; - } - - mbx->msg_flag = 1; - make_intr(sc); - ctrl->lastact = time.tv_sec; - return; - } - bsintr= 0; -} - -static void -up_intr(unsigned unit, struct nnic_softc * sc) -{ - dpr_type *dpr = sc->sc_dpr; - mbx_type *msg= &dpr->up_mbx; - chan_t *chan; - u_short n, mb, c, pl, err = 0; - isdn_ctrl_t *ctrl; - isdn_appl_t *appl; - int error= 0; - - chan= NULL; - ctrl= NULL; - appl= NULL; - mb= 0; - pl = msg->plci; - - if(pl && (msg->type >= 0x40) && (msg->type < 0xfd) && (msg->type != 0x47)) - { - if ((c = CHAN(pl)) < 2) - { - chan = &sc->sc_chan[c]; - ctrl = &isdn_ctrl[chan->ctrl]; - } else - { - c = 0xffff; - chan= NULL; - ctrl= NULL; - } - - if(ctrl && (ctrl->appl & 0xC0) == 0) - appl= &isdn_appl[ctrl->appl]; - else if( APPL(pl) < 0x30) - appl = &isdn_appl[APPL(pl)]; - else if( APPL(pl) < 0x40) - appl= NULL; - else goto fin; - - if(msg->type >= 0x80) - { - mb= msg->type & 0x40; - msg->type &= 0xbf; - } - } - - switch (msg->type) - { - case 0x01: /* INIT IND */ - if(dpr->dn_mbx.msg_flag) return; - error= en_q(unit,msg->type|0x20,0,0,0,NULL); - break; - case 0x04: /* DNL MOD */ - sc->sc_stat = msg->data[0]; - if (sc->sc_flags ) - sc->sc_flags = OPEN; - break; - case 0x06: /* DNL MOD IND */ - if(dpr->dn_mbx.msg_flag) return; - sc->sc_stat = msg->data[0]; - if (sc->sc_flags) - sc->sc_flags = OPEN; - if(sc->sc_stat) - break; - error= en_q(unit,msg->type|0x20,sc->sc_type,0,1, &msg->data[1]); - break; - case 0x0e: /* SET CLOCK CONF */ - dpr->card_number = unit; -/* - dpr->api_active = 1; - dpr->watchdog_cnt = 0xFF; - dpr->api_area[0] = 0; - dpr->api_area[2] = 0; -*/ - dpr->int_flg_pc = 0xFF; - break; - case 0x15: /* POLL IND */ - if(dpr->dn_mbx.msg_flag) return; - dpr->api_active = 1; - dpr->watchdog_cnt = 0xFF; - dpr->int_flg_pc = 0xFF; - error= en_q(unit,msg->type|0x20,0,0,0,NULL); - break; - case 0x16: /* STATE IND */ - if(dpr->dn_mbx.msg_flag) return; - if(sc->sc_flags & LOAD_ENTITY) - { - if(sc->sc_flags & 7) - sc->sc_flags = OPEN; - else sc->sc_flags= 0; - } - error= en_q(unit,msg->type|0x20,0,0,0,NULL); - break; - case 0x17: /* STATE RESP */ - break; - case 0x1e: /* MANUFACT CONF */ - if(msg->subtype == 18) - break; - badstate(msg,1,0,dpr); - break; - case 0x1f: /* MANUFACT IND */ - if(msg->subtype == 19) - { - if(dpr->dn_mbx.msg_flag) return; - isdn_input(ispy_applnr, msg->data_len, msg->data,0); - error= en_q(unit,msg->type|0x20,msg->subtype,0,0,NULL); - break; - } - badstate(msg,2,0,dpr); - break; - case 0x40: /* CONNECT CONF */ - err = *(u_short *) msg->data; - if (err || (appl == NULL) || (chan == NULL) || (ctrl == NULL)) - { - if(chan) reset_plci(3, chan, pl); - if(appl) appl->state= 0; - break; - } - if (ISBUSY(ctrl->appl)) - { - if(dpr->dn_mbx.msg_flag) return; - error= discon_req(2, unit, pl, 0, 0); - break; - } - chan->plci = pl; - chan->msg_nr = 0; - chan->ncci = -1; - ctrl->lastact = time.tv_sec; - ctrl->appl = APPL(pl); - appl->ctrl = chan->ctrl; - ctrl->islisten= 0; - chan->state = DIAL; - appl->state= 3; - break; - - case 0x41: /* CONNECT IND */ - if (ISBUSY(ctrl->appl)) - { - if(dpr->dn_mbx.msg_flag) return; - error= discon_req(3, unit, pl, 0, 0); - break; - } - chan->plci = pl; - chan->msg_nr = 0; - chan->ncci = -1; - ctrl->lastact = time.tv_sec; - ctrl->appl = 0x7f; - ctrl->islisten= 1; - chan->state = CALLED; - msg->data[msg->data[3] + 4] = 0; - isdn_accept_con_ind(APPL(pl), chan->ctrl, msg->data[0], msg->data[1] - ,msg->data[2], msg->data[3], (char *) &msg->data[4]); - break; - - case 0x42: /* CONNECT ACTIVE IND */ - if(dpr->dn_mbx.msg_flag) return; - error= con_act_resp(unit, pl); - if (IS_LISTEN(pl)) - { - isdn_conn_ind(ctrl->appl,chan->ctrl,0); - break; - } - isdn_conn_ind(APPL(pl),chan->ctrl,1); - chan->state = CONNECT; - ctrl->appl = APPL(pl); - appl->ctrl = chan->ctrl; - break; - - case 0x43: /* DISCONNECT CONF */ - reset_plci(4, chan, pl); - break; - - case 0x44: /* DISCONNECT IND */ - if(dpr->dn_mbx.msg_flag) return; - error= discon_resp(unit, reset_plci(5, chan, pl)); - break; - - case 0x47: /* LISTEN CONF */ - isdn_state = *(u_short *) msg->data; - break; - - case 0x4a: /* INFO IND */ - if(dpr->dn_mbx.msg_flag) return; - isdn_info(APPL(pl),*(u_short *)msg->data, msg->data[2], msg->data+3); - error= inf_resp(unit, pl); - break; - case 0x80: /* SELECT PROT CONF */ - if(dpr->dn_mbx.msg_flag) return; - err = *(u_short *) msg->data; - if (err) - { - error= discon_req(4, unit, pl, 0, err); - break; - } - - switch (msg->subtype) - { - case 2:/* SELECT B2 PROTOCOL */ - if(ISFREE(ctrl->appl)) - break; - error= sel_b3_prot_req(unit, mb, pl, &isdn_appl[ctrl->appl].ncpd); - break; - - case 3:/* SELECT B3 PROTOCOL */ - if (IS_DIAL(pl)) - error= con_b3_req(unit, mb, pl); - else - error= listen_b3_req(unit, mb, pl); - break; - } - break; - - case 0x81: /* LISTEN B3 CONF */ - if(dpr->dn_mbx.msg_flag) return; - err = *(u_short *) msg->data; - if (err) - { - error= discon_req(5, unit, pl, 0, err); - break; - } - error= con_resp(unit, pl, 0); - break; - - case 0x82: /* CONNECT B3 CONF */ - err = *(u_short *) (msg->data + 2); - n = *(u_short *) msg->data; - - if (err) - { - if(dpr->dn_mbx.msg_flag) return; - error= discon_req(6, unit, pl, 0, err); - break; - } - if(ISFREE(ctrl->appl)) - break; - chan->ncci = n; - chan->state = CONNECT; - break; - - case 0x83: /* CONNECT B3 IND */ - if(ISFREE(ctrl->appl)) - break; - if(dpr->dn_mbx.msg_flag) return; - n = *(u_short *) msg->data; - chan->ncci = n; - chan->state = CONNECT; - error= con_b3_resp(unit, mb, n, pl, 0); - break; - - case 0x84: /* CONNECT B3 ACTIVE IND */ - if(ISFREE(ctrl->appl)) - break; - if (chan->state < IDLE) - { - chan->state = IDLE; - ctrl->o_len = 0; - /* - * XXX the chan->ctrl arg is very bogus. - * Don't just use a cast to "fix" it. - */ - timeout(isdn_start_out, chan->ctrl, hz / 5); - } - break; - - case 0x85: /* DISCONNECT B3 CONF */ - if(ISBUSY(ctrl->appl)) - chan->state = ISDISCON; - err = *(u_short *) (msg->data + 2); - if (err) - { - if(dpr->dn_mbx.msg_flag) return; - error= discon_req(7, unit, pl, 0, err); - break; - } - break; - case 0x86: /* DISCONNECT B3 IND */ - if(dpr->dn_mbx.msg_flag) return; - if(ISBUSY(ctrl->appl)) - chan->state = ISDISCON; - err = *(u_short *) (msg->data + 2); - error= discon_req(8, unit, pl, 0, err); - break; - - case 0x88: /* DATA B3 CONF */ - if(ISFREE(ctrl->appl)) - break; - err = *(u_short *) (msg->data + 2); - if (err) - { - ctrl->send_err++; - isdn_appl[ctrl->appl].send_err++; - } - chan->state = IDLE; - ctrl->o_len = 0; - isdn_start_out(chan->ctrl); - break; - - case 0x89: /* DATA B3 IND */ - if(ISFREE(ctrl->appl)) - break; - if (msg->more_data) - { - if(chan->i_len) - { - if((chan->morenr != msg->data[4]) || ((chan->i_len + msg->data_len - 5) > 2048)) - break; - } - else - chan->morenr= msg->data[4]; - bcopy(msg->data+5, &chan->i_buf[chan->i_len], msg->data_len-5); - chan->i_len += msg->data_len -5; - break; - } /* msg->more_data == 0 */ - if (chan->i_len) - { - int l; - - if(chan->morenr != msg->data[4]) - break; - - if ((l = chan->i_len + msg->data_len - 5) <= 2048) - { - bcopy(msg->data+5, &chan->i_buf[chan->i_len], msg->data_len); - if(isdn_input(ctrl->appl, l, chan->i_buf, ctrl->islisten)) - ctrl->lastact = time.tv_sec; - } - chan->i_len = 0; - break; - } /* chan->i_len == 0 && msg->more_data == 0 */ - if(isdn_input(ctrl->appl, msg->data_len-5, msg->data+5,ctrl->islisten)) - ctrl->lastact = time.tv_sec; - break; - - default: - badstate(msg,3,mb,dpr); - break; - } - -fin: - if(error) - { -printf("E?%x",error); - return; - } - msg->msg_flag= 0; - timeout(make_intr, (void *)sc,1); -} - -static void -nnnicintr(void *gen) -{ - unsigned int unit = (int)gen; - register struct nnic_softc *sc = &nnic_sc[unit]; - dpr_type *dpr = sc->sc_dpr; - - if(dpr->up_mbx.msg_flag) - up_intr(unit,sc); - if (bsintr && (dpr->dn_mbx.msg_flag == 0)) - dn_intr(unit,sc); -} -void -nnicintr(int unit) -{ - timeout(nnnicintr, (void *)unit,1); -} - - -static nnic_devsw_installed = 0; - -static void nnic_drvinit(void *unused) -{ - dev_t dev; - - if( ! nnic_devsw_installed ) { - dev = makedev(CDEV_MAJOR, 0); - cdevsw_add(&dev,&nnic_cdevsw, NULL); - nnic_devsw_installed = 1; - } -} - -SYSINIT(nnicdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,nnic_drvinit,NULL) - -#endif /* NNNIC > 0 */ diff --git a/sys/gnu/i386/isa/nic3009.h b/sys/gnu/i386/isa/nic3009.h deleted file mode 100644 index 8e794cc..0000000 --- a/sys/gnu/i386/isa/nic3009.h +++ /dev/null @@ -1,88 +0,0 @@ -/* @(#)$Id: nic3009.h,v 1.1 1995/02/14 15:00:16 jkh Exp $ - ******************************************************************************* - * II - Version 0.1 $Revision: 1.1 $ $State: Exp $ - * - * Copyright 1994 Dietmar Friede - ******************************************************************************* - * Bug reports, patches, comments, suggestions should be sent to: - * - * jkr@saarlink.de or jkrause@guug.de - * - ******************************************************************************* - * $Log: nic3009.h,v $ - * Revision 1.1 1995/02/14 15:00:16 jkh - * An ISDN driver that supports the EDSS1 and the 1TR6 ISDN interfaces. - * EDSS1 is the "Euro-ISDN", 1TR6 is the soon obsolete german ISDN Interface. - * Obtained from: Dietmar Friede <dfriede@drnhh.neuhaus.de> and - * Juergen Krause <jkr@saarlink.de> - * - * This is only one part - the rest to follow in a couple of hours. - * This part is a benign import, since it doesn't affect anything else. - * - * - ******************************************************************************/ - -/* - * This file defines the NICCY 3009 Interface. Copyright Dr. Neuhaus GmbH, - * Hamburg and Dietmar Friede - * - */ - -#define NO_MORE_DATA 0x00 /* der Message folgen keine Daten */ -#define MORE_DATA 0x01 /* der Message folgen weitere Daten */ - -#define DPR_LEN 0x800 /* 2 kBytes gross */ -#define DPR_VAR_AREA_LEN 0x100 /* davon fuer allg. Variablen */ - -#define DPR_MBX_LEN (DPR_LEN-DPR_VAR_AREA_LEN)/2 /* 0x380 lang */ -#define DPR_MBX_FLAG_LEN 2 /* zwei Bytes MBX-Zustand... */ -#define DPR_MSG_HDR_LEN 10 /* Msg-Laenge ohne Datafield */ -#define DATAFIELD_LEN (DPR_MBX_LEN-DPR_MBX_FLAG_LEN-DPR_MSG_HDR_LEN) -#define MAX_B3_LEN (2048+2) /* Daten und Network-Header */ - -#pragma pack (1) -typedef struct -{ - u_char msg_flag; /* Signalisierung NICCY / PC */ - u_char progress; /* NICCY-interne Verwendung ! */ - u_char type; - u_char subtype; - u_short number; - u_char more_data; - u_char reserved; - u_short data_len; - u_short plci; - u_char data[DATAFIELD_LEN]; -} mbx_type; - -typedef struct -{ - mbx_type up_mbx; /* Offset 0x000-0x37F */ - mbx_type dn_mbx; /* Offset 0x380-0x6FF */ - u_char card_number; /* Offset 0x700 */ - u_char card_state; /* Offset 0x701 */ - u_short mainloop_cnt; /* Offset 0x702-0x703 */ - u_char watchdog_cnt; /* Offset 0x704 */ - u_char hw_config; /* Offset 0x705 */ - u_char int_flg_pc; /* Offset 0x706 */ - u_char int_flg_nic; /* Offset 0x707 */ - u_char api_area[64]; /* Offset 0x708-0x747 */ - u_char api_active; /* Offset 0x748 */ - u_char tei; /* Offset 0x749 */ - u_char state_b1; /* Offset 0x74A */ - u_char state_b2; /* Offset 0x74B */ - u_char si_b1; /* Offset 0x74C */ - u_char si_b2; /* Offset 0x74D */ - u_short calls_in; /* Offset 0x74E-0x74F */ - u_short calls_out; /* Offset 0x750-0x751 */ - u_char ram_config; /* Offset 0x752 */ - u_char spv_request_flag; /* Offset 0x753 */ - u_char dcp_state_b1; /* Offset 0x754 */ - u_char dcp_state_b2; /* Offset 0x755 */ - u_char dc_protocol; /* Offset 0x756 */ - u_char poll_flag; /* Offset 0x757 */ - u_char debug[DPR_LEN - 0x758 - 4]; /* Offset 0x758-0x7FB */ - u_short signal_niccy_to_pc; /* Offset 0x7FC-0x7FD */ - u_short signal_pc_to_niccy; /* Offset 0x7FE-0x7FF */ -} dpr_type; -#pragma pack () diff --git a/sys/gnu/i386/isa/niccyreg.h b/sys/gnu/i386/isa/niccyreg.h deleted file mode 100644 index a696148..0000000 --- a/sys/gnu/i386/isa/niccyreg.h +++ /dev/null @@ -1,167 +0,0 @@ -/* @(#)$Id: niccyreg.h,v 1.1 1995/02/14 15:00:19 jkh Exp $ - ******************************************************************************* - * II - Version 0.1 $Revision: 1.1 $ $State: Exp $ - * - * Copyright 1994 Dietmar Friede - ******************************************************************************* - * Bug reports, patches, comments, suggestions should be sent to: - * - * jkr@saarlink.de or jkrause@guug.de - * - ******************************************************************************* - * $Log: niccyreg.h,v $ - * Revision 1.1 1995/02/14 15:00:19 jkh - * An ISDN driver that supports the EDSS1 and the 1TR6 ISDN interfaces. - * EDSS1 is the "Euro-ISDN", 1TR6 is the soon obsolete german ISDN Interface. - * Obtained from: Dietmar Friede <dfriede@drnhh.neuhaus.de> and - * Juergen Krause <jkr@saarlink.de> - * - * This is only one part - the rest to follow in a couple of hours. - * This part is a benign import, since it doesn't affect anything else. - * - * - ******************************************************************************/ - -/* - * This file defines the NICCY 3008 Interface. - * Copyright Dr. Neuhaus GmbH, Hamburg and Dietmar Friede - * -*/ - -#define MBX_MU 0 -#define MBX_MD 1 -#define MBX_DU 2 -#define MBX_DD 3 -#define MBX_B1U 4 -#define MBX_B1D 5 -#define MBX_B2U 6 -#define MBX_B2D 7 - -#define MBX_xU 0x55 -#define MBX_xD 0xAA - -/* -------------------------------------------------------------------- */ - -#define MU_INIT_CNF 0x00 -#define MU_INIT_IND 0x01 -#define MU_RESET_CNF 0x02 -#define MU_HANDSET_IND 0x03 -#define MU_DNL_MOD_CNF 0x04 -/* reserved: 0x05 */ -#define MU_DNL_MOD_IND 0x06 -#define MU_DISC_MOD_CNF 0x07 -#define MU_LIST_MOD_CNF 0x08 -#define MU_LIST_MOD_DATA 0x09 -/* reserved: 0x0A to 0x0B */ -#define MU_HW_CONFIG_CNF 0x0C -#define MU_HW_ID_CNF 0x0D -#define MU_SET_CLOCK_CNF 0x0E -#define MU_GET_CLOCK_CNF 0x0F -#define MU_ACT_IA_CNF 0x10 -#define MU_ACT_IA_IND 0x11 -#define MU_DEACT_IA_CNF 0x12 -#define MU_DEACT_IA_IND 0x13 -#define MU_POLL_CNF 0x14 -#define MU_POLL_IND 0x15 -/* reserved: 0x16 to 0x1D */ -#define MU_MANUFACT_CNF 0x1E -#define MU_MANUFACT_IND 0x1F - -/*---------------------------------------------------------------------------*/ - -#define MD_INIT_REQ 0x20 -#define MD_INIT_RSP 0x21 -#define MD_RESET_REQ 0x22 -#define MD_HANDSET_RSP 0x23 -#define MD_DNL_MOD_REQ 0x24 -#define MD_DNL_MOD_DATA 0x25 -#define MD_DNL_MOD_RSP 0x26 -#define MD_DISC_MOD_REQ 0x27 -#define MD_LIST_MOD_REQ 0x28 -/* reserved: 0x29 to 0x2B */ -#define MD_HW_CONFIG_REQ 0x2C -#define MD_HW_ID_REQ 0x2D -#define MD_SET_CLOCK_REQ 0x2E -#define MD_GET_CLOCK_REQ 0x2F -#define MD_ACT_IA_REQ 0x30 -#define MD_ACT_IA_RSP 0x31 -#define MD_DEACT_IA_REQ 0x32 -#define MD_DEACT_IA_RSP 0x33 -#define MD_POLL_REQ 0x34 -#define MD_POLL_RSP 0x35 -#define MD_STATE_IND 0x37 -#define MD_MANUFACT_REQ 0x3E -#define MD_MANUFACT_RSP 0x3F - -/*---------------------------------------------------------------------------*/ - -#define DU_CONN_CNF 0x40 -#define DU_CONN_IND 0x41 -#define DU_CONN_ACT_IND 0x42 -#define DU_DISC_CNF 0x43 -#define DU_DISC_IND 0x44 -#define DU_DATA_CNF 0x45 -#define DU_DATA_IND 0x46 -#define DU_LISTEN_CNF 0x47 -#define DU_GET_PAR_CNF 0x48 -#define DU_INFO_CNF 0x49 -#define DU_INFO_IND 0x4A -#define DU_CONN_INFO_CNF 0x4B -#define DU_REL_PLCI_CNF 0x4C -/* reserved: 0x4C to 0x5E */ -#define DU_STR_NOT_COMP 0x5F - -/*---------------------------------------------------------------------------*/ - -#define DD_CONN_REQ 0x60 -#define DD_CONN_RSP 0x61 -#define DD_CONN_ACT_RSP 0x62 -#define DD_DISC_REQ 0x63 -#define DD_DISC_RSP 0x64 -#define DD_DATA_REQ 0x65 -#define DD_DATA_RSP 0x66 -#define DD_LISTEN_REQ 0x67 -#define DD_GET_PAR_REQ 0x68 -#define DD_INFO_REQ 0x69 -#define DD_INFO_RSP 0x6A -#define DD_CONN_INFO_REQ 0x6B -#define DD_REL_PLCI_REQ 0x6C - -/*---------------------------------------------------------------------------*/ - -#define BD_SEL_PROT_REQ 0xA0 -#define BD_LIST_B3_REQ 0xA1 -#define BD_CONN_B3_REQ 0xA2 -#define BD_CONN_B3_RSP 0xA3 -#define BD_C_B3_ACT_RSP 0xA4 -#define BD_DISC_B3_REQ 0xA5 -#define BD_DISC_B3_RSP 0xA6 -#define BD_GET_P_B3_REQ 0xA7 -#define BD_DATA_B3_REQ 0xA8 -#define BD_DATA_B3_RSP 0xA9 -#define BD_RESET_B3_REQ 0xAA -#define BD_RESET_B3_RSP 0xAB - -/*---------------------------------------------------------------------------*/ - - -#define NICCY_DEBUG _IOWR('N',1,dbg_type) -#define NICCY_RESET _IOWR('N',2,int) -#define NICCY_LOAD _IOWR('N',3,struct head) -#define NICCY_SET_CLOCK _IOWR('N',4,time_str_t) -#define NICCY_SPY _IOWR('N',5,int) - -struct head -{ - u_long len; - u_long sig; - char nam[8]; - char ver[5]; - u_char typ; - u_short status; - u_long d_len; - u_char *data; -}; - -typedef char time_str_t[14]; -typedef u_char dbg_type[10000]; |