diff options
Diffstat (limited to 'drivers/isdn/eicon')
-rw-r--r-- | drivers/isdn/eicon/eicon.h | 32 | ||||
-rw-r--r-- | drivers/isdn/eicon/eicon_dsp.h | 12 | ||||
-rw-r--r-- | drivers/isdn/eicon/eicon_idi.c | 224 | ||||
-rw-r--r-- | drivers/isdn/eicon/eicon_idi.h | 21 | ||||
-rw-r--r-- | drivers/isdn/eicon/eicon_io.c | 23 | ||||
-rw-r--r-- | drivers/isdn/eicon/eicon_isa.c | 111 | ||||
-rw-r--r-- | drivers/isdn/eicon/eicon_isa.h | 18 | ||||
-rw-r--r-- | drivers/isdn/eicon/eicon_mod.c | 87 | ||||
-rw-r--r-- | drivers/isdn/eicon/eicon_pci.c | 16 | ||||
-rw-r--r-- | drivers/isdn/eicon/eicon_pci.h | 12 |
10 files changed, 378 insertions, 178 deletions
diff --git a/drivers/isdn/eicon/eicon.h b/drivers/isdn/eicon/eicon.h index 88af10416..5ad164518 100644 --- a/drivers/isdn/eicon/eicon.h +++ b/drivers/isdn/eicon/eicon.h @@ -1,10 +1,10 @@ -/* $Id: eicon.h,v 1.17 1999/10/26 21:15:33 armin Exp $ +/* $Id: eicon.h,v 1.19 2000/01/23 21:21:23 armin Exp $ * - * ISDN low-level module for Eicon.Diehl active ISDN-Cards. + * ISDN low-level module for Eicon active ISDN-Cards. * * Copyright 1998 by Fritz Elfert (fritz@isdn4linux.de) - * Copyright 1998,99 by Armin Schindler (mac@melware.de) - * Copyright 1999 Cytronics & Melware (info@melware.de) + * Copyright 1998-2000 by Armin Schindler (mac@melware.de) + * Copyright 1999,2000 Cytronics & Melware (info@melware.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,15 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: eicon.h,v $ + * Revision 1.19 2000/01/23 21:21:23 armin + * Added new trace capability and some updates. + * DIVA Server BRI now supports data for ISDNLOG. + * + * Revision 1.18 1999/11/25 11:43:27 armin + * Fixed statectrl and connect message. + * X.75 fix and HDLC/transparent with autoconnect. + * Minor cleanup. + * * Revision 1.17 1999/10/26 21:15:33 armin * using define for checking phone number len to avoid buffer overflow. * @@ -258,7 +267,7 @@ typedef struct { /* Macro for delay via schedule() */ #define SLEEP(j) { \ - set_current_state(TASK_INTERRUPTIBLE); \ + set_current_state(TASK_UNINTERRUPTIBLE); \ schedule_timeout(j); \ } @@ -277,6 +286,8 @@ typedef struct { #define XLOG_ERR_UNKNOWN (18) #define XLOG_OK (0) +#define TRACE_OK (1) + typedef struct { __u8 Id __attribute__ ((packed)); __u8 uX __attribute__ ((packed)); @@ -494,12 +505,13 @@ typedef struct { typedef struct { int No; /* Channel Number */ unsigned short fsm_state; /* Current D-Channel state */ + unsigned short statectrl; /* State controling bits */ unsigned short eazmask; /* EAZ-Mask for this Channel */ int queued; /* User-Data Bytes in TX queue */ int waitq; /* User-Data Bytes in wait queue */ int waitpq; /* User-Data Bytes in packet queue */ - unsigned short plci; - unsigned short ncci; + struct sk_buff *tskb1; /* temp skb 1 */ + struct sk_buff *tskb2; /* temp skb 2 */ unsigned char l2prot; /* Layer 2 protocol */ unsigned char l3prot; /* Layer 3 protocol */ #ifdef CONFIG_ISDN_TTY_FAX @@ -600,21 +612,16 @@ typedef struct eicon_card { struct eicon_card *next; /* Pointer to next device struct */ int myid; /* Driver-Nr. assigned by linklevel */ unsigned long flags; /* Statusflags */ - unsigned long ilock; /* Semaphores for IRQ-Routines */ struct sk_buff_head rcvq; /* Receive-Message queue */ struct sk_buff_head sndq; /* Send-Message queue */ struct sk_buff_head rackq; /* Req-Ack-Message queue */ struct sk_buff_head sackq; /* Data-Ack-Message queue */ struct sk_buff_head statq; /* Status-Message queue */ int statq_entries; - u_char *ack_msg; /* Ptr to User Data in User skb */ - __u16 need_b3ack; /* Flag: Need ACK for current skb */ - struct sk_buff *sbuf; /* skb which is currently sent */ struct tq_struct snd_tq; /* Task struct for xmit bh */ struct tq_struct rcv_tq; /* Task struct for rcv bh */ struct tq_struct ack_tq; /* Task struct for ack bh */ msn_entry *msn_list; - unsigned short msgnum; /* Message number for sending */ eicon_chan* IdTable[256]; /* Table to find entity */ __u16 ref_in; __u16 ref_out; @@ -696,6 +703,7 @@ extern int eicon_info(char *, int , void *); extern ulong DebugVar; extern void eicon_log(eicon_card * card, int level, const char *fmt, ...); +extern void eicon_putstatus(eicon_card * card, char * buf); #endif /* __KERNEL__ */ diff --git a/drivers/isdn/eicon/eicon_dsp.h b/drivers/isdn/eicon/eicon_dsp.h index 9ffbd9bdb..420d73f6e 100644 --- a/drivers/isdn/eicon/eicon_dsp.h +++ b/drivers/isdn/eicon/eicon_dsp.h @@ -1,10 +1,10 @@ -/* $Id: eicon_dsp.h,v 1.4 1999/07/25 15:12:02 armin Exp $ +/* $Id: eicon_dsp.h,v 1.5 2000/01/23 21:21:23 armin Exp $ * - * ISDN lowlevel-module for Eicon.Diehl active cards. + * ISDN lowlevel-module for Eicon active cards. * DSP definitions * - * Copyright 1999 by Armin Schindler (mac@melware.de) - * Copyright 1999 Cytronics & Melware (info@melware.de) + * Copyright 1999,2000 by Armin Schindler (mac@melware.de) + * Copyright 1999,2000 Cytronics & Melware (info@melware.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,10 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: eicon_dsp.h,v $ + * Revision 1.5 2000/01/23 21:21:23 armin + * Added new trace capability and some updates. + * DIVA Server BRI now supports data for ISDNLOG. + * * Revision 1.4 1999/07/25 15:12:02 armin * fix of some debug logs. * enabled ISA-cards option. diff --git a/drivers/isdn/eicon/eicon_idi.c b/drivers/isdn/eicon/eicon_idi.c index d8634bdbe..e53469070 100644 --- a/drivers/isdn/eicon/eicon_idi.c +++ b/drivers/isdn/eicon/eicon_idi.c @@ -1,10 +1,10 @@ -/* $Id: eicon_idi.c,v 1.24 1999/10/26 21:15:33 armin Exp $ +/* $Id: eicon_idi.c,v 1.29 2000/01/23 21:21:23 armin Exp $ * - * ISDN lowlevel-module for Eicon.Diehl active cards. + * ISDN lowlevel-module for Eicon active cards. * IDI interface * - * Copyright 1998,99 by Armin Schindler (mac@melware.de) - * Copyright 1999 Cytronics & Melware (info@melware.de) + * Copyright 1998-2000 by Armin Schindler (mac@melware.de) + * Copyright 1999,2000 Cytronics & Melware (info@melware.de) * * Thanks to Deutsche Mailbox Saar-Lor-Lux GmbH * for sponsoring and testing fax @@ -26,6 +26,25 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: eicon_idi.c,v $ + * Revision 1.29 2000/01/23 21:21:23 armin + * Added new trace capability and some updates. + * DIVA Server BRI now supports data for ISDNLOG. + * + * Revision 1.28 2000/01/20 19:55:34 keil + * Add FAX Class 1 support + * + * Revision 1.27 1999/11/29 13:12:03 armin + * Autoconnect on L2_TRANS doesn't work with link_level correctly, + * changed back to former mode. + * + * Revision 1.26 1999/11/25 11:43:27 armin + * Fixed statectrl and connect message. + * X.75 fix and HDLC/transparent with autoconnect. + * Minor cleanup. + * + * Revision 1.25 1999/11/18 20:30:55 armin + * removed old workaround for ISA cards. + * * Revision 1.24 1999/10/26 21:15:33 armin * using define for checking phone number len to avoid buffer overflow. * @@ -130,7 +149,7 @@ #undef EICON_FULL_SERVICE_OKTETT -char *eicon_idi_revision = "$Revision: 1.24 $"; +char *eicon_idi_revision = "$Revision: 1.29 $"; eicon_manifbuf *manbuf; @@ -187,16 +206,13 @@ idi_assign_req(eicon_REQ *reqbuf, int signet, eicon_chan *chan) reqbuf->XBuffer.P[l++] = LLC; reqbuf->XBuffer.P[l++] = 2; switch(chan->l2prot) { - case ISDN_PROTO_L2_HDLC: - reqbuf->XBuffer.P[l++] = 2; + case ISDN_PROTO_L2_TRANS: + reqbuf->XBuffer.P[l++] = 2; /* transparent */ break; case ISDN_PROTO_L2_X75I: case ISDN_PROTO_L2_X75UI: case ISDN_PROTO_L2_X75BUI: - reqbuf->XBuffer.P[l++] = 5; - break; - case ISDN_PROTO_L2_TRANS: - reqbuf->XBuffer.P[l++] = 2; + reqbuf->XBuffer.P[l++] = 5; /* X.75 */ break; case ISDN_PROTO_L2_MODEM: if (chan->fsm_state == EICON_STATE_IWAIT) @@ -204,17 +220,18 @@ idi_assign_req(eicon_REQ *reqbuf, int signet, eicon_chan *chan) else reqbuf->XBuffer.P[l++] = 10; /* V.42 */ break; + case ISDN_PROTO_L2_HDLC: case ISDN_PROTO_L2_FAX: if (chan->fsm_state == EICON_STATE_IWAIT) reqbuf->XBuffer.P[l++] = 3; /* autoconnect on incoming */ else - reqbuf->XBuffer.P[l++] = 2; + reqbuf->XBuffer.P[l++] = 2; /* transparent */ break; default: reqbuf->XBuffer.P[l++] = 1; } switch(chan->l3prot) { - case ISDN_PROTO_L3_FAX: + case ISDN_PROTO_L3_FCLASS2: #ifdef CONFIG_ISDN_TTY_FAX reqbuf->XBuffer.P[l++] = 6; reqbuf->XBuffer.P[l++] = NLC; @@ -404,8 +421,10 @@ eicon_idi_listen_req(eicon_card *card, eicon_chan *chan) idi_do_req(card, chan, ASSIGN, 0); } if (chan->fsm_state == EICON_STATE_NULL) { - idi_do_req(card, chan, INDICATE_REQ, 0); - chan->fsm_state = EICON_STATE_LISTEN; + if (!(chan->statectrl & HAVE_CONN_REQ)) { + idi_do_req(card, chan, INDICATE_REQ, 0); + chan->fsm_state = EICON_STATE_LISTEN; + } } return(0); } @@ -462,6 +481,7 @@ idi_hangup(eicon_card *card, eicon_chan *chan) } if (chan->e.B2Id) idi_do_req(card, chan, REMOVE, 1); if (chan->fsm_state != EICON_STATE_NULL) { + chan->statectrl |= WAITING_FOR_HANGUP; idi_do_req(card, chan, HANGUP, 0); chan->fsm_state = EICON_STATE_NULL; } @@ -479,7 +499,6 @@ idi_connect_res(eicon_card *card, eicon_chan *chan) return 1; chan->fsm_state = EICON_STATE_IWAIT; - idi_do_req(card, chan, CALL_RES, 0); /* check if old NetID has been removed */ if (chan->e.B2Id) { @@ -489,6 +508,7 @@ idi_connect_res(eicon_card *card, eicon_chan *chan) } idi_do_req(card, chan, ASSIGN, 1); + idi_do_req(card, chan, CALL_RES, 0); return(0); } @@ -656,9 +676,18 @@ idi_connect_req(eicon_card *card, eicon_chan *chan, char *phone, reqbuf->XBuffer.length = l; reqbuf->Reference = 0; /* Sig Entity */ - skb_queue_tail(&chan->e.X, skb); - skb_queue_tail(&card->sndq, skb2); - eicon_schedule_tx(card); + if (chan->statectrl & WAITING_FOR_HANGUP) { + /* If the line did not disconnect yet, + we have to delay this command */ + eicon_log(card, 32, "idi_req: Ch%d: delaying conn_req\n", chan->No); + chan->statectrl |= HAVE_CONN_REQ; + chan->tskb1 = skb; + chan->tskb2 = skb2; + } else { + skb_queue_tail(&chan->e.X, skb); + skb_queue_tail(&card->sndq, skb2); + eicon_schedule_tx(card); + } eicon_log(card, 8, "idi_req: Ch%d: Conn_Req %s -> %s\n",chan->No, eazmsn, phone); return(0); @@ -1433,6 +1462,7 @@ idi_edata_action(eicon_card *ccard, eicon_chan *chan, char *buffer, int len) cmd.driver = ccard->myid; cmd.command = ISDN_STAT_BCONN; cmd.arg = chan->No; + strcpy(cmd.parm.num, ""); ccard->interface.statcallb(&cmd); cmd.driver = ccard->myid; @@ -1489,6 +1519,8 @@ idi_edata_action(eicon_card *ccard, eicon_chan *chan, char *buffer, int len) break; case 2: /* session end */ default: + /* send_edata produces error on some */ + /* fax-machines here, so we don't */ /* idi_send_edata(ccard, chan); */ break; } @@ -1505,6 +1537,7 @@ idi_edata_action(eicon_card *ccard, eicon_chan *chan, char *buffer, int len) cmd.driver = ccard->myid; cmd.command = ISDN_STAT_BCONN; cmd.arg = chan->No; + strcpy(cmd.parm.num, ""); ccard->interface.statcallb(&cmd); cmd.driver = ccard->myid; @@ -2277,6 +2310,51 @@ idi_parse_udata(eicon_card *ccard, eicon_chan *chan, unsigned char *buffer, int } void +eicon_parse_trace(eicon_card *ccard, unsigned char *buffer, int len) +{ + int i,j,n; + int buflen = len * 3 + 30; + char *p; + struct trace_s { + unsigned long time; + unsigned short size; + unsigned short code; + unsigned char data[1]; + } *q; + + if (!(p = kmalloc(buflen, GFP_KERNEL))) { + eicon_log(ccard, 1, "idi_err: Ch??: could not allocate trace buffer\n"); + return; + } + memset(p, 0, buflen); + q = (struct trace_s *)buffer; + + if (DebugVar & 512) { + if ((q->code == 3) || (q->code == 4)) { + n = (short) *(q->data); + if (n) { + j = sprintf(p, "DTRC:"); + for (i = 0; i < n; i++) { + j += sprintf(p + j, "%02x ", q->data[i+2]); + } + j += sprintf(p + j, "\n"); + } + } + } else { + j = sprintf(p, "XLOG: %lx %04x %04x ", + q->time, q->size, q->code); + + for (i = 0; i < q->size; i++) { + j += sprintf(p + j, "%02x ", q->data[i]); + } + j += sprintf(p + j, "\n"); + } + if (strlen(p)) + eicon_putstatus(ccard, p); + kfree(p); +} + +void idi_handle_ind(eicon_card *ccard, struct sk_buff *skb) { int tmp; @@ -2307,7 +2385,7 @@ idi_handle_ind(eicon_card *ccard, struct sk_buff *skb) else dlev = 128; - eicon_log(ccard, dlev, "idi_hdl: Ch%d: Ind=%d Id=%x Ch=%d MInd=%d MLen=%d Len=%d\n", chan->No, + eicon_log(ccard, dlev, "idi_hdl: Ch%d: Ind=%x Id=%x Ch=%x MInd=%x MLen=%x Len=%x\n", chan->No, ind->Ind,ind->IndId,ind->IndCh,ind->MInd,ind->MLength,ind->RBuffer.length); free_buff = 1; @@ -2347,12 +2425,25 @@ idi_handle_ind(eicon_card *ccard, struct sk_buff *skb) } else { if (chan->e.B2Id) idi_do_req(ccard, chan, REMOVE, 1); - chan->fsm_state = EICON_STATE_NULL; - cmd.driver = ccard->myid; - cmd.arg = chan->No; - cmd.command = ISDN_STAT_DHUP; - ccard->interface.statcallb(&cmd); - eicon_idi_listen_req(ccard, chan); + chan->statectrl &= ~WAITING_FOR_HANGUP; + if (chan->statectrl & HAVE_CONN_REQ) { + eicon_log(ccard, 32, "idi_req: Ch%d: queueing delayed conn_req\n", chan->No); + chan->statectrl &= ~HAVE_CONN_REQ; + if ((chan->tskb1) && (chan->tskb2)) { + skb_queue_tail(&chan->e.X, chan->tskb1); + skb_queue_tail(&ccard->sndq, chan->tskb2); + eicon_schedule_tx(ccard); + } + chan->tskb1 = NULL; + chan->tskb2 = NULL; + } else { + chan->fsm_state = EICON_STATE_NULL; + cmd.driver = ccard->myid; + cmd.arg = chan->No; + cmd.command = ISDN_STAT_DHUP; + ccard->interface.statcallb(&cmd); + eicon_idi_listen_req(ccard, chan); + } } break; case INDICATE_IND: @@ -2450,8 +2541,12 @@ idi_handle_ind(eicon_card *ccard, struct sk_buff *skb) case ISDN_PROTO_L2_MODEM: /* do nothing, wait for connect */ break; - default: + case ISDN_PROTO_L2_TRANS: idi_do_req(ccard, chan, IDI_N_CONNECT, 1); + break; + default: + /* On most incoming calls we use automatic connect */ + /* idi_do_req(ccard, chan, IDI_N_CONNECT, 1); */ } } else idi_hangup(ccard, chan); @@ -2495,8 +2590,12 @@ idi_handle_ind(eicon_card *ccard, struct sk_buff *skb) if (chan->No == ccard->nchannels) { /* Management Indication */ - idi_IndParse(ccard, chan, &message, ind->RBuffer.P, ind->RBuffer.length); - chan->fsm_state = 1; + if (ind->Ind == 0x04) { /* Trace_Ind */ + eicon_parse_trace(ccard, ind->RBuffer.P, ind->RBuffer.length); + } else { + idi_IndParse(ccard, chan, &message, ind->RBuffer.P, ind->RBuffer.length); + chan->fsm_state = 1; + } } else switch(ind->Ind) { @@ -2530,6 +2629,7 @@ idi_handle_ind(eicon_card *ccard, struct sk_buff *skb) cmd.driver = ccard->myid; cmd.command = ISDN_STAT_BCONN; cmd.arg = chan->No; + strcpy(cmd.parm.num, "64000"); ccard->interface.statcallb(&cmd); break; case IDI_N_CONNECT: @@ -2546,6 +2646,7 @@ idi_handle_ind(eicon_card *ccard, struct sk_buff *skb) cmd.driver = ccard->myid; cmd.command = ISDN_STAT_BCONN; cmd.arg = chan->No; + strcpy(cmd.parm.num, "64000"); ccard->interface.statcallb(&cmd); break; case IDI_N_DISC: @@ -2576,6 +2677,7 @@ idi_handle_ind(eicon_card *ccard, struct sk_buff *skb) cmd.arg = chan->No; ccard->interface.statcallb(&cmd); chan->fsm_state = EICON_STATE_NULL; + chan->statectrl |= WAITING_FOR_HANGUP; } #ifdef CONFIG_ISDN_TTY_FAX chan->fax = 0; @@ -2631,7 +2733,8 @@ idi_handle_ack_ok(eicon_card *ccard, eicon_chan *chan, eicon_RC *ack) isdn_ctrl cmd; if (ack->RcId != ((chan->e.ReqCh) ? chan->e.B2Id : chan->e.D3Id)) { - /* I dont know why this happens, just ignoring this RC */ + /* I dont know why this happens, should not ! */ + /* just ignoring this RC */ eicon_log(ccard, 16, "idi_ack: Ch%d: RcId %d not equal to last %d\n", chan->No, ack->RcId, (chan->e.ReqCh) ? chan->e.B2Id : chan->e.D3Id); return 1; @@ -2640,16 +2743,16 @@ idi_handle_ack_ok(eicon_card *ccard, eicon_chan *chan, eicon_RC *ack) /* Management Interface */ if (chan->No == ccard->nchannels) { /* Managementinterface: changing state */ - if (chan->e.Req == 0x04) + if (chan->e.Req != 0x02) chan->fsm_state = 1; } /* Remove an Id */ if (chan->e.Req == REMOVE) { if (ack->Reference != chan->e.ref) { + /* This should not happen anymore */ eicon_log(ccard, 16, "idi_ack: Ch%d: Rc-Ref %d not equal to stored %d\n", chan->No, ack->Reference, chan->e.ref); - return 0; } save_flags(flags); cli(); @@ -2807,11 +2910,14 @@ idi_handle_ack(eicon_card *ccard, struct sk_buff *skb) dCh, ack->Rc, ack->RcId, ack->RcCh); break; default: - eicon_log(ccard, 1, "eicon_err: Ch%d: Ack Not OK !!: Rc=%d Id=%x Ch=%d Req=%d\n", - dCh, ack->Rc, ack->RcId, ack->RcCh, chan->e.Req); + if (dCh != ccard->nchannels) + eicon_log(ccard, 1, "eicon_err: Ch%d: Ack Not OK !!: Rc=%d Id=%x Ch=%d Req=%d\n", + dCh, ack->Rc, ack->RcId, ack->RcCh, chan->e.Req); } if (dCh == ccard->nchannels) { /* Management */ chan->fsm_state = 2; + eicon_log(ccard, 8, "eicon_err: Ch%d: Ack Not OK !!: Rc=%d Id=%x Ch=%d Req=%d\n", + dCh, ack->Rc, ack->RcId, ack->RcCh, chan->e.Req); } else if (dCh >= 0) { /* any other channel */ /* card reports error: we hangup */ @@ -3011,38 +3117,36 @@ eicon_idi_manage(eicon_card *card, eicon_manifbuf *mb) chan = &(card->bch[card->nchannels]); - if (chan->e.D3Id) - return -EBUSY; - chan->e.D3Id = 1; - while((skb2 = skb_dequeue(&chan->e.X))) - dev_kfree_skb(skb2); - chan->e.busy = 0; + if (!(chan->e.D3Id)) { + chan->e.D3Id = 1; + while((skb2 = skb_dequeue(&chan->e.X))) + dev_kfree_skb(skb2); + chan->e.busy = 0; - if ((ret = eicon_idi_manage_assign(card))) { - chan->e.D3Id = 0; - return(ret); - } + if ((ret = eicon_idi_manage_assign(card))) { + chan->e.D3Id = 0; + return(ret); + } - timeout = jiffies + 50; - while (timeout > jiffies) { - if (chan->e.B2Id) break; - SLEEP(10); - } - if (!chan->e.B2Id) { - chan->e.D3Id = 0; - return -EIO; + timeout = jiffies + 50; + while (timeout > jiffies) { + if (chan->e.B2Id) break; + SLEEP(10); + } + if (!chan->e.B2Id) { + chan->e.D3Id = 0; + return -EIO; + } } chan->fsm_state = 0; if (!(manbuf = kmalloc(sizeof(eicon_manifbuf), GFP_KERNEL))) { eicon_log(card, 1, "idi_err: alloc_manifbuf failed\n"); - chan->e.D3Id = 0; return -ENOMEM; } if (copy_from_user(manbuf, mb, sizeof(eicon_manifbuf))) { kfree(manbuf); - chan->e.D3Id = 0; return -EFAULT; } @@ -3056,7 +3160,6 @@ eicon_idi_manage(eicon_card *card, eicon_manifbuf *mb) if (skb2) dev_kfree_skb(skb2); kfree(manbuf); - chan->e.D3Id = 0; return -ENOMEM; } @@ -3093,25 +3196,14 @@ eicon_idi_manage(eicon_card *card, eicon_manifbuf *mb) SLEEP(10); } if ((!chan->fsm_state) || (chan->fsm_state == 2)) { - eicon_idi_manage_remove(card); kfree(manbuf); - chan->e.D3Id = 0; return -EIO; } - - if ((ret = eicon_idi_manage_remove(card))) { - kfree(manbuf); - chan->e.D3Id = 0; - return(ret); - } - if (copy_to_user(mb, manbuf, sizeof(eicon_manifbuf))) { kfree(manbuf); - chan->e.D3Id = 0; return -EFAULT; } kfree(manbuf); - chan->e.D3Id = 0; return(0); } diff --git a/drivers/isdn/eicon/eicon_idi.h b/drivers/isdn/eicon/eicon_idi.h index e09c1954d..2fe6167a4 100644 --- a/drivers/isdn/eicon/eicon_idi.h +++ b/drivers/isdn/eicon/eicon_idi.h @@ -1,10 +1,10 @@ -/* $Id: eicon_idi.h,v 1.7 1999/08/22 20:26:46 calle Exp $ +/* $Id: eicon_idi.h,v 1.9 2000/01/23 21:21:23 armin Exp $ * - * ISDN lowlevel-module for the Eicon.Diehl active cards. + * ISDN lowlevel-module for the Eicon active cards. * IDI-Interface * - * Copyright 1998,99 by Armin Schindler (mac@melware.de) - * Copyright 1999 Cytronics & Melware (info@melware.de) + * Copyright 1998-2000 by Armin Schindler (mac@melware.de) + * Copyright 1999,2000 Cytronics & Melware (info@melware.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,15 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: eicon_idi.h,v $ + * Revision 1.9 2000/01/23 21:21:23 armin + * Added new trace capability and some updates. + * DIVA Server BRI now supports data for ISDNLOG. + * + * Revision 1.8 1999/11/25 11:43:27 armin + * Fixed statectrl and connect message. + * X.75 fix and HDLC/transparent with autoconnect. + * Minor cleanup. + * * Revision 1.7 1999/08/22 20:26:46 calle * backported changes from kernel 2.3.14: * - several #include "config.h" gone, others come. @@ -170,6 +179,10 @@ /*------------------------------------------------------------------*/ +/* defines for statectrl */ +#define WAITING_FOR_HANGUP 0x01 +#define HAVE_CONN_REQ 0x02 + typedef struct { char cpn[32]; char oad[32]; diff --git a/drivers/isdn/eicon/eicon_io.c b/drivers/isdn/eicon/eicon_io.c index 779f241e0..4f4180ed6 100644 --- a/drivers/isdn/eicon/eicon_io.c +++ b/drivers/isdn/eicon/eicon_io.c @@ -1,12 +1,12 @@ -/* $Id: eicon_io.c,v 1.8 1999/10/08 22:09:34 armin Exp $ +/* $Id: eicon_io.c,v 1.10 2000/01/23 21:21:23 armin Exp $ * - * ISDN low-level module for Eicon.Diehl active ISDN-Cards. + * ISDN low-level module for Eicon active ISDN-Cards. * Code for communicating with hardware. * - * Copyright 1999 by Armin Schindler (mac@melware.de) - * Copyright 1999 Cytronics & Melware (info@melware.de) + * Copyright 1999,2000 by Armin Schindler (mac@melware.de) + * Copyright 1999,2000 Cytronics & Melware (info@melware.de) * - * Thanks to Eicon Technology Diehl GmbH & Co. oHG for + * Thanks to Eicon Technology GmbH & Co. oHG for * documents, informations and hardware. * * This program is free software; you can redistribute it and/or modify @@ -24,6 +24,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: eicon_io.c,v $ + * Revision 1.10 2000/01/23 21:21:23 armin + * Added new trace capability and some updates. + * DIVA Server BRI now supports data for ISDNLOG. + * + * Revision 1.9 1999/11/18 20:55:25 armin + * Ready_Int fix of ISA cards. + * * Revision 1.8 1999/10/08 22:09:34 armin * Some fixes of cards interface handling. * Bugfix of NULL pointer occurence. @@ -470,7 +477,7 @@ eicon_io_transmit(eicon_card *ccard) { save_flags(flags); cli(); if (scom) { - if (ram_inb(ccard, &com->Req)) { + if ((ram_inb(ccard, &com->Req)) || (ccard->ReadyInt)) { if (!ccard->ReadyInt) { tmp = ram_inb(ccard, &com->ReadyInt) + 1; ram_outb(ccard, &com->ReadyInt, tmp); @@ -566,7 +573,8 @@ eicon_io_transmit(eicon_card *ccard) { chan->e.busy = 1; eicon_log(ccard, dlev, "eicon: Req=%d Id=%x Ch=%d Len=%d Ref=%d\n", reqbuf->Req, - ram_inb(ccard, &ReqOut->ReqId), + (scom) ? ram_inb(ccard, &com->ReqId) : + ram_inb(ccard, &ReqOut->ReqId), reqbuf->ReqCh, reqbuf->XBuffer.length, chan->e.ref); } @@ -754,6 +762,7 @@ eicon_irq(int irq, void *dev_id, struct pt_regs *regs) { if (ccard->ReadyInt) { ccard->ReadyInt--; ram_outb(ccard, &com->Rc, 0); + eicon_schedule_tx(ccard); } } else { skb = alloc_skb(sizeof(eicon_RC), GFP_ATOMIC); diff --git a/drivers/isdn/eicon/eicon_isa.c b/drivers/isdn/eicon/eicon_isa.c index a89d18b12..86e6c0ef7 100644 --- a/drivers/isdn/eicon/eicon_isa.c +++ b/drivers/isdn/eicon/eicon_isa.c @@ -1,11 +1,11 @@ -/* $Id: eicon_isa.c,v 1.9 1999/09/08 20:17:31 armin Exp $ +/* $Id: eicon_isa.c,v 1.13 2000/01/23 21:21:23 armin Exp $ * - * ISDN low-level module for Eicon.Diehl active ISDN-Cards. + * ISDN low-level module for Eicon active ISDN-Cards. * Hardware-specific code for old ISA cards. * - * Copyright 1998 by Fritz Elfert (fritz@isdn4linux.de) - * Copyright 1998,99 by Armin Schindler (mac@melware.de) - * Copyright 1999 Cytronics & Melware (info@melware.de) + * Copyright 1998 by Fritz Elfert (fritz@isdn4linux.de) + * Copyright 1998-2000 by Armin Schindler (mac@melware.de) + * Copyright 1999,2000 Cytronics & Melware (info@melware.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,8 +22,21 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: eicon_isa.c,v $ + * Revision 1.13 2000/01/23 21:21:23 armin + * Added new trace capability and some updates. + * DIVA Server BRI now supports data for ISDNLOG. + * + * Revision 1.12 1999/11/27 12:56:19 armin + * Forgot some iomem changes for last ioremap compat. + * + * Revision 1.11 1999/11/25 11:33:09 armin + * Microchannel fix from Erik Weber (exrz73@ibm.net). + * + * Revision 1.10 1999/11/18 21:14:30 armin + * New ISA memory mapped IO + * * Revision 1.9 1999/09/08 20:17:31 armin - * Added microchannel patch from Erik Weber. + * Added microchannel patch from Erik Weber (exrz73@ibm.net). * * Revision 1.8 1999/09/06 07:29:35 fritz * Changed my mail-address. @@ -70,7 +83,7 @@ #define release_shmem release_region #define request_shmem request_region -char *eicon_isa_revision = "$Revision: 1.9 $"; +char *eicon_isa_revision = "$Revision: 1.13 $"; #undef EICON_MCA_DEBUG @@ -87,8 +100,10 @@ static int eicon_isa_valid_irq[] = { static void eicon_isa_release_shmem(eicon_isa_card *card) { - if (card->mvalid) - release_shmem((unsigned long)card->shmem, card->ramsize); + if (card->mvalid) { + iounmap(card->shmem); + release_mem_region(card->physmem, card->ramsize); + } card->mvalid = 0; } @@ -117,7 +132,7 @@ eicon_isa_printpar(eicon_isa_card *card) { case EICON_CTYPE_S2M: printk(KERN_INFO "Eicon %s at 0x%lx, irq %d.\n", eicon_ctype_name[card->type], - (unsigned long)card->shmem, + card->physmem, card->irq); } } @@ -126,6 +141,7 @@ int eicon_isa_find_card(int Mem, int Irq, char * Id) { int primary = 1; + unsigned long amem; if (!strlen(Id)) return -1; @@ -138,24 +154,27 @@ eicon_isa_find_card(int Mem, int Irq, char * Id) Mem, Id); return -1; } - if (check_shmem(Mem, RAMSIZE)) { + if (check_mem_region(Mem, RAMSIZE)) { printk(KERN_WARNING "eicon_isa_boot: memory at 0x%x already in use.\n", Mem); return -1; } - writew(0x55aa, Mem + 0x402); - if (readw(Mem + 0x402) != 0x55aa) primary = 0; - writew(0, Mem + 0x402); - if (readw(Mem + 0x402) != 0) primary = 0; + amem = (unsigned long) ioremap(Mem, RAMSIZE); + writew(0x55aa, amem + 0x402); + if (readw(amem + 0x402) != 0x55aa) primary = 0; + writew(0, amem + 0x402); + if (readw(amem + 0x402) != 0) primary = 0; printk(KERN_INFO "Eicon: Driver-ID: %s\n", Id); if (primary) { printk(KERN_INFO "Eicon: assuming pri card at 0x%x\n", Mem); - writeb(0, Mem + 0x3ffe); + writeb(0, amem + 0x3ffe); + iounmap((unsigned char *)amem); return EICON_CTYPE_ISAPRI; } else { printk(KERN_INFO "Eicon: assuming bri card at 0x%x\n", Mem); - writeb(0, Mem + 0x400); + writeb(0, amem + 0x400); + iounmap((unsigned char *)amem); return EICON_CTYPE_ISABRI; } return -1; @@ -187,57 +206,65 @@ eicon_isa_bootload(eicon_isa_card *card, eicon_isa_codebuf *cb) { return -EFAULT; } + if (card->type == EICON_CTYPE_ISAPRI) + card->ramsize = RAMSIZE_P; + else + card->ramsize = RAMSIZE; + + if (check_mem_region(card->physmem, card->ramsize)) { + printk(KERN_WARNING "eicon_isa_boot: memory at 0x%lx already in use.\n", + card->physmem); + kfree(code); + return -EBUSY; + } + request_mem_region(card->physmem, card->ramsize, "Eicon ISA ISDN"); + card->shmem = (eicon_isa_shmem *) ioremap(card->physmem, card->ramsize); +#ifdef EICON_MCA_DEBUG + printk(KERN_INFO "eicon_isa_boot: card->ramsize = %d.\n", card->ramsize); +#endif + card->mvalid = 1; + switch(card->type) { case EICON_CTYPE_S: case EICON_CTYPE_SX: case EICON_CTYPE_SCOM: case EICON_CTYPE_QUADRO: case EICON_CTYPE_ISABRI: - card->ramsize = RAMSIZE; card->intack = (__u8 *)card->shmem + INTACK; card->startcpu = (__u8 *)card->shmem + STARTCPU; card->stopcpu = (__u8 *)card->shmem + STOPCPU; break; case EICON_CTYPE_S2M: case EICON_CTYPE_ISAPRI: - card->ramsize = RAMSIZE_P; card->intack = (__u8 *)card->shmem + INTACK_P; card->startcpu = (__u8 *)card->shmem + STARTCPU_P; card->stopcpu = (__u8 *)card->shmem + STOPCPU_P; break; default: printk(KERN_WARNING "eicon_isa_boot: Invalid card type %d\n", card->type); + eicon_isa_release_shmem(card); + kfree(code); return -EINVAL; } - /* Register shmem */ - if (check_shmem((unsigned long)card->shmem, card->ramsize)) { - printk(KERN_WARNING "eicon_isa_boot: memory at 0x%lx already in use.\n", - (unsigned long)card->shmem); - kfree(code); - return -EBUSY; - } - request_shmem((unsigned long)card->shmem, card->ramsize, "Eicon ISA ISDN"); -#ifdef EICON_MCA_DEBUG - printk(KERN_INFO "eicon_isa_boot: card->ramsize = %d.\n", card->ramsize); -#endif - card->mvalid = 1; - /* clear any pending irq's */ readb(card->intack); #ifdef CONFIG_MCA - if (card->type == EICON_CTYPE_SCOM) { - outb_p(0,card->io+1); - } - else { - printk(KERN_WARNING "eicon_isa_boot: Card type yet not supported.\n"); - return -EINVAL; - }; + if (MCA_bus) { + if (card->type == EICON_CTYPE_SCOM) { + outb_p(0,card->io+1); + } + else { + printk(KERN_WARNING "eicon_isa_boot: Card type not supported yet.\n"); + eicon_isa_release_shmem(card); + return -EINVAL; + }; #ifdef EICON_MCA_DEBUG printk(KERN_INFO "eicon_isa_boot: card->io = %x.\n", card->io); printk(KERN_INFO "eicon_isa_boot: card->irq = %d.\n", (int)card->irq); #endif + } #else /* set reset-line active */ writeb(0, card->stopcpu); @@ -269,7 +296,9 @@ eicon_isa_bootload(eicon_isa_card *card, eicon_isa_codebuf *cb) { /* Start CPU */ writeb(cbuf.boot_opt, &boot->ctrl); #ifdef CONFIG_MCA - outb_p(0, card->io); + if (MCA_bus) { + outb_p(0, card->io); + } #else writeb(0, card->startcpu); #endif /* CONFIG_MCA */ @@ -320,7 +349,7 @@ eicon_isa_bootload(eicon_isa_card *card, eicon_isa_codebuf *cb) { } printk(KERN_INFO "%s: startup-code loaded\n", eicon_ctype_name[card->type]); if ((card->type == EICON_CTYPE_QUADRO) && (card->master)) { - tmp = eicon_addcard(card->type, (unsigned long)card->shmem, card->irq, + tmp = eicon_addcard(card->type, card->physmem, card->irq, ((eicon_card *)card->card)->regname); printk(KERN_INFO "Eicon: %d adapters added\n", tmp); } diff --git a/drivers/isdn/eicon/eicon_isa.h b/drivers/isdn/eicon/eicon_isa.h index b0d0b0eb9..b53adfcbf 100644 --- a/drivers/isdn/eicon/eicon_isa.h +++ b/drivers/isdn/eicon/eicon_isa.h @@ -1,10 +1,10 @@ -/* $Id: eicon_isa.h,v 1.6 1999/11/15 19:37:04 keil Exp $ +/* $Id: eicon_isa.h,v 1.8 2000/01/23 21:21:23 armin Exp $ * - * ISDN low-level module for Eicon.Diehl active ISDN-Cards. + * ISDN low-level module for Eicon active ISDN-Cards. * - * Copyright 1998 by Fritz Elfert (fritz@isdn4linux.de) - * Copyright 1998,99 by Armin Schindler (mac@melware.de) - * Copyright 1999 Cytronics & Melware (info@melware.de) + * Copyright 1998 by Fritz Elfert (fritz@isdn4linux.de) + * Copyright 1998-2000 by Armin Schindler (mac@melware.de) + * Copyright 1999,2000 Cytronics & Melware (info@melware.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: eicon_isa.h,v $ + * Revision 1.8 2000/01/23 21:21:23 armin + * Added new trace capability and some updates. + * DIVA Server BRI now supports data for ISDNLOG. + * + * Revision 1.7 1999/11/18 21:14:30 armin + * New ISA memory mapped IO + * * Revision 1.6 1999/11/15 19:37:04 keil * need config.h * @@ -116,6 +123,7 @@ typedef union { typedef struct { int ramsize; int irq; /* IRQ */ + unsigned long physmem; /* physical memory address */ #ifdef CONFIG_MCA int io; /* IO-port for MCA brand */ #endif /* CONFIG_MCA */ diff --git a/drivers/isdn/eicon/eicon_mod.c b/drivers/isdn/eicon/eicon_mod.c index 8797e6aed..688d74de3 100644 --- a/drivers/isdn/eicon/eicon_mod.c +++ b/drivers/isdn/eicon/eicon_mod.c @@ -1,12 +1,12 @@ -/* $Id: eicon_mod.c,v 1.19 1999/11/12 13:21:44 armin Exp $ +/* $Id: eicon_mod.c,v 1.24 2000/01/23 21:21:23 armin Exp $ * - * ISDN lowlevel-module for Eicon.Diehl active cards. + * ISDN lowlevel-module for Eicon active cards. * - * Copyright 1997 by Fritz Elfert (fritz@isdn4linux.de) - * Copyright 1998,99 by Armin Schindler (mac@melware.de) - * Copyright 1999 Cytronics & Melware (info@melware.de) + * Copyright 1997 by Fritz Elfert (fritz@isdn4linux.de) + * Copyright 1998-2000 by Armin Schindler (mac@melware.de) + * Copyright 1999,2000 Cytronics & Melware (info@melware.de) * - * Thanks to Eicon Technology Diehl GmbH & Co. oHG for + * Thanks to Eicon Technology GmbH & Co. oHG for * documents, informations and hardware. * * Deutsche Telekom AG for S2M support. @@ -31,6 +31,23 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: eicon_mod.c,v $ + * Revision 1.24 2000/01/23 21:21:23 armin + * Added new trace capability and some updates. + * DIVA Server BRI now supports data for ISDNLOG. + * + * Revision 1.23 2000/01/20 19:55:34 keil + * Add FAX Class 1 support + * + * Revision 1.22 1999/11/27 12:56:19 armin + * Forgot some iomem changes for last ioremap compat. + * + * Revision 1.21 1999/11/25 11:35:10 armin + * Microchannel fix from Erik Weber (exrz73@ibm.net). + * Minor cleanup. + * + * Revision 1.20 1999/11/18 21:14:30 armin + * New ISA memory mapped IO + * * Revision 1.19 1999/11/12 13:21:44 armin * Bugfix of undefined reference with CONFIG_MCA * @@ -46,7 +63,7 @@ * Improved debug and log via readstat() * * Revision 1.15 1999/09/08 20:17:31 armin - * Added microchannel patch from Erik Weber. + * Added microchannel patch from Erik Weber (exrz73@ibm.net). * * Revision 1.14 1999/09/06 07:29:35 fritz * Changed my mail-address. @@ -123,7 +140,7 @@ static eicon_card *cards = (eicon_card *) NULL; /* glob. var , contains start of card-list */ -static char *eicon_revision = "$Revision: 1.19 $"; +static char *eicon_revision = "$Revision: 1.24 $"; extern char *eicon_pci_revision; extern char *eicon_isa_revision; @@ -144,7 +161,7 @@ static int irq = -1; #endif static char *id = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -MODULE_DESCRIPTION( "Driver for Eicon.Diehl active ISDN cards"); +MODULE_DESCRIPTION( "Driver for Eicon active ISDN cards"); MODULE_AUTHOR( "Armin Schindler"); MODULE_SUPPORTED_DEVICE( "ISDN subsystem"); MODULE_PARM_DESC(id, "ID-String of first card"); @@ -659,7 +676,7 @@ eicon_command(eicon_card * card, isdn_ctrl * c) break; chan->l3prot = (c->arg >> 8); #ifdef CONFIG_ISDN_TTY_FAX - if (chan->l3prot == ISDN_PROTO_L3_FAX) + if (chan->l3prot == ISDN_PROTO_L3_FCLASS2) chan->fax = c->parm.fax; #endif return 0; @@ -839,8 +856,7 @@ if_sendbuf(int id, int channel, int ack, struct sk_buff *skb) } /* jiftime() copied from HiSax */ -inline int -jiftime(char *s, long mark) +static inline int jiftime(char *s, long mark) { s += 8; @@ -1000,19 +1016,28 @@ eicon_alloccard(int Type, int membase, int irq, char *id) case EICON_CTYPE_S: case EICON_CTYPE_SX: case EICON_CTYPE_SCOM: - if (membase == -1) - membase = EICON_ISA_MEMBASE; - if (irq == -1) - irq = EICON_ISA_IRQ; - card->bus = EICON_BUS_MCA; - card->hwif.isa.card = (void *)card; - card->hwif.isa.shmem = (eicon_isa_shmem *)membase; - card->hwif.isa.master = 1; - - card->hwif.isa.irq = irq; - card->hwif.isa.type = Type; - card->nchannels = 2; - card->interface.channels = 1; + if (MCA_bus) { + if (membase == -1) + membase = EICON_ISA_MEMBASE; + if (irq == -1) + irq = EICON_ISA_IRQ; + card->bus = EICON_BUS_MCA; + card->hwif.isa.card = (void *)card; + card->hwif.isa.shmem = (eicon_isa_shmem *)membase; + card->hwif.isa.physmem = (unsigned long)membase; + card->hwif.isa.master = 1; + + card->hwif.isa.irq = irq; + card->hwif.isa.type = Type; + card->nchannels = 2; + card->interface.channels = 1; + } else { + printk(KERN_WARNING + "eicon (%s): no MCA bus detected.\n", + card->interface.id); + kfree(card); + return; + } break; #endif /* CONFIG_MCA */ case EICON_CTYPE_QUADRO: @@ -1023,6 +1048,7 @@ eicon_alloccard(int Type, int membase, int irq, char *id) card->bus = EICON_BUS_ISA; card->hwif.isa.card = (void *)card; card->hwif.isa.shmem = (eicon_isa_shmem *)(membase + (i+1) * EICON_ISA_QOFFSET); + card->hwif.isa.physmem = (unsigned long)(membase + (i+1) * EICON_ISA_QOFFSET); card->hwif.isa.master = 0; strcpy(card->interface.id, id); if (id[strlen(id) - 1] == 'a') { @@ -1067,7 +1093,7 @@ eicon_alloccard(int Type, int membase, int irq, char *id) ISDN_FEATURE_L2_MODEM | ISDN_FEATURE_L2_FAX | ISDN_FEATURE_L3_TRANSDSP | - ISDN_FEATURE_L3_FAX; + ISDN_FEATURE_L3_FCLASS2; card->hwif.pci.card = (void *)card; card->hwif.pci.PCIreg = pcic->PCIreg; card->hwif.pci.PCIcfg = pcic->PCIcfg; @@ -1091,7 +1117,7 @@ eicon_alloccard(int Type, int membase, int irq, char *id) ISDN_FEATURE_L2_MODEM | ISDN_FEATURE_L2_FAX | ISDN_FEATURE_L3_TRANSDSP | - ISDN_FEATURE_L3_FAX; + ISDN_FEATURE_L3_FCLASS2; card->hwif.pci.card = (void *)card; card->hwif.pci.shmem = (eicon_pci_shmem *)pcic->shmem; card->hwif.pci.PCIreg = pcic->PCIreg; @@ -1116,6 +1142,7 @@ eicon_alloccard(int Type, int membase, int irq, char *id) card->bus = EICON_BUS_ISA; card->hwif.isa.card = (void *)card; card->hwif.isa.shmem = (eicon_isa_shmem *)membase; + card->hwif.isa.physmem = (unsigned long)membase; card->hwif.isa.master = 1; card->hwif.isa.irq = irq; card->hwif.isa.type = Type; @@ -1130,6 +1157,7 @@ eicon_alloccard(int Type, int membase, int irq, char *id) card->bus = EICON_BUS_ISA; card->hwif.isa.card = (void *)card; card->hwif.isa.shmem = (eicon_isa_shmem *)membase; + card->hwif.isa.physmem = (unsigned long)membase; card->hwif.isa.master = 1; card->hwif.isa.irq = irq; card->hwif.isa.type = Type; @@ -1151,14 +1179,15 @@ eicon_alloccard(int Type, int membase, int irq, char *id) } for (j=0; j< (card->nchannels + 1); j++) { memset((char *)&card->bch[j], 0, sizeof(eicon_chan)); - card->bch[j].plci = 0x8000; - card->bch[j].ncci = 0x8000; + card->bch[j].statectrl = 0; card->bch[j].l2prot = ISDN_PROTO_L2_X75I; card->bch[j].l3prot = ISDN_PROTO_L3_TRANS; card->bch[j].e.D3Id = 0; card->bch[j].e.B2Id = 0; card->bch[j].e.Req = 0; card->bch[j].No = j; + card->bch[j].tskb1 = NULL; + card->bch[j].tskb2 = NULL; skb_queue_head_init(&card->bch[j].e.X); skb_queue_head_init(&card->bch[j].e.R); } diff --git a/drivers/isdn/eicon/eicon_pci.c b/drivers/isdn/eicon/eicon_pci.c index 5c96302cb..47196f953 100644 --- a/drivers/isdn/eicon/eicon_pci.c +++ b/drivers/isdn/eicon/eicon_pci.c @@ -1,12 +1,12 @@ -/* $Id: eicon_pci.c,v 1.10 1999/08/22 20:26:49 calle Exp $ +/* $Id: eicon_pci.c,v 1.11 2000/01/23 21:21:23 armin Exp $ * - * ISDN low-level module for Eicon.Diehl active ISDN-Cards. + * ISDN low-level module for Eicon active ISDN-Cards. * Hardware-specific code for PCI cards. * - * Copyright 1998,99 by Armin Schindler (mac@melware.de) - * Copyright 1999 Cytronics & Melware (info@melware.de) + * Copyright 1998-2000 by Armin Schindler (mac@melware.de) + * Copyright 1999,2000 Cytronics & Melware (info@melware.de) * - * Thanks to Eicon Technology Diehl GmbH & Co. oHG for + * Thanks to Eicon Technology GmbH & Co. oHG for * documents, informations and hardware. * * Deutsche Telekom AG for S2M support. @@ -26,6 +26,10 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: eicon_pci.c,v $ + * Revision 1.11 2000/01/23 21:21:23 armin + * Added new trace capability and some updates. + * DIVA Server BRI now supports data for ISDNLOG. + * * Revision 1.10 1999/08/22 20:26:49 calle * backported changes from kernel 2.3.14: * - several #include "config.h" gone, others come. @@ -77,7 +81,7 @@ #include "eicon_pci.h" -char *eicon_pci_revision = "$Revision: 1.10 $"; +char *eicon_pci_revision = "$Revision: 1.11 $"; #if CONFIG_PCI /* intire stuff is only for PCI */ diff --git a/drivers/isdn/eicon/eicon_pci.h b/drivers/isdn/eicon/eicon_pci.h index a23faade2..384cc422c 100644 --- a/drivers/isdn/eicon/eicon_pci.h +++ b/drivers/isdn/eicon/eicon_pci.h @@ -1,9 +1,9 @@ -/* $Id: eicon_pci.h,v 1.3 1999/03/29 11:19:51 armin Exp $ +/* $Id: eicon_pci.h,v 1.4 2000/01/23 21:21:23 armin Exp $ * - * ISDN low-level module for Eicon.Diehl active ISDN-Cards (PCI part). + * ISDN low-level module for Eicon active ISDN-Cards (PCI part). * - * Copyright 1998,99 by Armin Schindler (mac@melware.de) - * Copyright 1999 Cytronics & Melware (info@melware.de) + * Copyright 1998-2000 by Armin Schindler (mac@melware.de) + * Copyright 1999,2000 Cytronics & Melware (info@melware.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +20,10 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: eicon_pci.h,v $ + * Revision 1.4 2000/01/23 21:21:23 armin + * Added new trace capability and some updates. + * DIVA Server BRI now supports data for ISDNLOG. + * * Revision 1.3 1999/03/29 11:19:51 armin * I/O stuff now in seperate file (eicon_io.c) * Old ISA type cards (S,SX,SCOM,Quadro,S2M) implemented. |