patch-2.3.27 linux/drivers/isdn/eicon/eicon_mod.c
Next file: linux/drivers/isdn/eicon/eicon_pci.c
Previous file: linux/drivers/isdn/eicon/eicon_isa.h
Back to the patch index
Back to the overall index
- Lines: 886
- Date:
Sun Nov 7 16:34:00 1999
- Orig file:
v2.3.26/linux/drivers/isdn/eicon/eicon_mod.c
- Orig date:
Tue Sep 7 12:14:06 1999
diff -u --recursive --new-file v2.3.26/linux/drivers/isdn/eicon/eicon_mod.c linux/drivers/isdn/eicon/eicon_mod.c
@@ -1,8 +1,8 @@
-/* $Id: eicon_mod.c,v 1.11 1999/08/29 17:23:45 armin Exp $
+/* $Id: eicon_mod.c,v 1.18 1999/10/11 18:13:25 armin Exp $
*
* ISDN lowlevel-module for Eicon.Diehl active cards.
*
- * Copyright 1997 by Fritz Elfert (fritz@wuemaus.franken.de)
+ * Copyright 1997 by Fritz Elfert (fritz@isdn4linux.de)
* Copyright 1998,99 by Armin Schindler (mac@melware.de)
* Copyright 1999 Cytronics & Melware (info@melware.de)
*
@@ -11,6 +11,11 @@
*
* Deutsche Telekom AG for S2M support.
*
+ * Deutsche Mailbox Saar-Lor-Lux GmbH
+ * for sponsoring and testing fax
+ * capabilities with Diva Server cards.
+ * (dor@deutschemailbox.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
* the Free Software Foundation; either version 2, or (at your option)
@@ -26,6 +31,30 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: eicon_mod.c,v $
+ * Revision 1.18 1999/10/11 18:13:25 armin
+ * Added fax capabilities for Eicon Diva Server cards.
+ *
+ * Revision 1.17 1999/10/08 22:09:34 armin
+ * Some fixes of cards interface handling.
+ * Bugfix of NULL pointer occurence.
+ * Changed a few log outputs.
+ *
+ * Revision 1.16 1999/09/26 14:17:53 armin
+ * Improved debug and log via readstat()
+ *
+ * Revision 1.15 1999/09/08 20:17:31 armin
+ * Added microchannel patch from Erik Weber.
+ *
+ * Revision 1.14 1999/09/06 07:29:35 fritz
+ * Changed my mail-address.
+ *
+ * Revision 1.13 1999/09/04 17:37:59 armin
+ * Removed not used define, did not work and caused error
+ * in 2.3.16
+ *
+ * Revision 1.12 1999/08/31 11:20:14 paul
+ * various spelling corrections (new checksums may be needed, Karsten!)
+ *
* Revision 1.11 1999/08/29 17:23:45 armin
* New setup compat.
* Bugfix if compile as not module.
@@ -82,7 +111,7 @@
#include <linux/init.h>
#ifdef CONFIG_MCA
#include <linux/mca.h>
-#endif
+#endif /* CONFIG_MCA */
#include "eicon.h"
@@ -91,7 +120,7 @@
static eicon_card *cards = (eicon_card *) NULL; /* glob. var , contains
start of card-list */
-static char *eicon_revision = "$Revision: 1.11 $";
+static char *eicon_revision = "$Revision: 1.18 $";
extern char *eicon_pci_revision;
extern char *eicon_isa_revision;
@@ -172,8 +201,7 @@
{
if ((channel >= 0) && (channel < card->nchannels))
return &(card->bch[channel]);
- if (DebugVar & 1)
- printk(KERN_WARNING "eicon: Invalid channel %d\n", channel);
+ eicon_log(card, 1, "eicon: Invalid channel %d\n", channel);
return NULL;
}
@@ -239,87 +267,6 @@
return("\0");
}
-#if 0
-/*
- * Add or delete an MSN to the MSN list
- *
- * First character of msneaz is EAZ, rest is MSN.
- * If length of eazmsn is 1, delete that entry.
- */
-static int
-eicon_set_msn(eicon_card *card, char *eazmsn)
-{
- struct msn_entry *p = card->msn_list;
- struct msn_entry *q = NULL;
- unsigned long flags;
- int i;
-
- if (!strlen(eazmsn))
- return 0;
- if (strlen(eazmsn) > 16)
- return -EINVAL;
- for (i = 0; i < strlen(eazmsn); i++)
- if (!isdigit(eazmsn[i]))
- return -EINVAL;
- if (strlen(eazmsn) == 1) {
- /* Delete a single MSN */
- while (p) {
- if (p->eaz == eazmsn[0]) {
- save_flags(flags);
- cli();
- if (q)
- q->next = p->next;
- else
- card->msn_list = p->next;
- restore_flags(flags);
- kfree(p);
- if (DebugVar & 8)
- printk(KERN_DEBUG
- "Mapping for EAZ %c deleted\n",
- eazmsn[0]);
- return 0;
- }
- q = p;
- p = p->next;
- }
- return 0;
- }
- /* Add a single MSN */
- while (p) {
- /* Found in list, replace MSN */
- if (p->eaz == eazmsn[0]) {
- save_flags(flags);
- cli();
- strcpy(p->msn, &eazmsn[1]);
- restore_flags(flags);
- if (DebugVar & 8)
- printk(KERN_DEBUG
- "Mapping for EAZ %c changed to %s\n",
- eazmsn[0],
- &eazmsn[1]);
- return 0;
- }
- p = p->next;
- }
- /* Not found in list, add new entry */
- p = kmalloc(sizeof(msn_entry), GFP_KERNEL);
- if (!p)
- return -ENOMEM;
- p->eaz = eazmsn[0];
- strcpy(p->msn, &eazmsn[1]);
- p->next = card->msn_list;
- save_flags(flags);
- cli();
- card->msn_list = p;
- restore_flags(flags);
- if (DebugVar & 8)
- printk(KERN_DEBUG
- "Mapping %c -> %s added\n",
- eazmsn[0],
- &eazmsn[1]);
- return 0;
-}
-#endif
static void
eicon_rcv_dispatch(struct eicon_card *card)
@@ -331,9 +278,8 @@
eicon_io_rcv_dispatch(card);
break;
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon_ack_dispatch: Illegal bustype %d\n", card->bus);
+ eicon_log(card, 1,
+ "eicon_ack_dispatch: Illegal bustype %d\n", card->bus);
}
}
@@ -347,9 +293,8 @@
eicon_io_ack_dispatch(card);
break;
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon_ack_dispatch: Illegal bustype %d\n", card->bus);
+ eicon_log(card, 1,
+ "eicon_ack_dispatch: Illegal bustype %d\n", card->bus);
}
}
@@ -363,9 +308,8 @@
eicon_io_transmit(card);
break;
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon_transmit: Illegal bustype %d\n", card->bus);
+ eicon_log(card, 1,
+ "eicon_transmit: Illegal bustype %d\n", card->bus);
}
}
@@ -375,8 +319,7 @@
int ret_val;
if (!(xlr = kmalloc(sizeof(xlogreq_t), GFP_KERNEL))) {
- if (DebugVar & 1)
- printk(KERN_WARNING "idi_err: alloc_xlogreq_t failed\n");
+ eicon_log(card, 1, "idi_err: alloc_xlogreq_t failed\n");
return -ENOMEM;
}
if (copy_from_user(xlr, xlogreq, sizeof(xlogreq_t))) {
@@ -406,9 +349,8 @@
int ret = 0;
unsigned long flags;
- if (DebugVar & 16)
- printk(KERN_WARNING "eicon_cmd 0x%x with arg 0x%lx (0x%lx)\n",
- c->command, c->arg, (ulong) *c->parm.num);
+ eicon_log(card, 16, "eicon_cmd 0x%x with arg 0x%lx (0x%lx)\n",
+ c->command, c->arg, (ulong) *c->parm.num);
switch (c->command) {
case ISDN_CMD_IOCTL:
@@ -428,9 +370,8 @@
return card->hwif.pci.PCIram;
#endif
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon: Illegal BUS type %d\n",
+ eicon_log(card, 1,
+ "eicon: Illegal BUS type %d\n",
card->bus);
ret = -ENODEV;
}
@@ -440,17 +381,25 @@
return -EBUSY;
switch (card->bus) {
case EICON_BUS_ISA:
- case EICON_BUS_MCA:
if (eicon_isa_find_card(a,
card->hwif.isa.irq,
card->regname) < 0)
return -EFAULT;
card->hwif.isa.shmem = (eicon_isa_shmem *)a;
return 0;
+ case EICON_BUS_MCA:
+#if CONFIG_MCA
+ if (eicon_mca_find_card(
+ 0, a,
+ card->hwif.isa.irq,
+ card->regname) < 0)
+ return -EFAULT;
+ card->hwif.isa.shmem = (eicon_isa_shmem *)a;
+ return 0;
+#endif /* CONFIG_MCA */
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon: Illegal BUS type %d\n",
+ eicon_log(card, 1,
+ "eicon: Illegal BUS type %d\n",
card->bus);
ret = -ENODEV;
}
@@ -465,9 +414,8 @@
return card->hwif.pci.irq;
#endif
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon: Illegal BUS type %d\n",
+ eicon_log(card, 1,
+ "eicon: Illegal BUS type %d\n",
card->bus);
ret = -ENODEV;
}
@@ -482,9 +430,8 @@
card->hwif.isa.irq = a;
return 0;
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon: Illegal BUS type %d\n",
+ eicon_log(card, 1,
+ "eicon: Illegal BUS type %d\n",
card->bus);
ret = -ENODEV;
}
@@ -500,9 +447,8 @@
&(((eicon_codebuf *)a)->isa));
break;
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon: Illegal BUS type %d\n",
+ eicon_log(card, 1,
+ "eicon: Illegal BUS type %d\n",
card->bus);
ret = -ENODEV;
}
@@ -534,9 +480,8 @@
}
break;
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon: Illegal BUS type %d\n",
+ eicon_log(card, 1,
+ "eicon: Illegal BUS type %d\n",
card->bus);
ret = -ENODEV;
}
@@ -592,18 +537,6 @@
return ret;
} else return -ENODEV;
#endif
-#if 0
- case EICON_IOCTL_SETMSN:
- if ((ret = copy_from_user(tmp, (char *)a, sizeof(tmp))))
- return -EFAULT;
- if ((ret = eicon_set_msn(card, tmp)))
- return ret;
-#if 0
- if (card->flags & EICON_FLAGS_RUNNING)
- return(eicon_capi_manufacturer_req_msn(card));
-#endif
- return 0;
-#endif
case EICON_IOCTL_ADDCARD:
if ((ret = copy_from_user(&cdef, (char *)a, sizeof(cdef))))
return -EFAULT;
@@ -612,7 +545,7 @@
return 0;
case EICON_IOCTL_DEBUGVAR:
DebugVar = a;
- printk(KERN_DEBUG"Eicon: Debug Value set to %ld\n", DebugVar);
+ eicon_log(card, 1, "Eicon: Debug Value set to %ld\n", DebugVar);
return 0;
#ifdef MODULE
case EICON_IOCTL_FREEIT:
@@ -633,8 +566,7 @@
cli();
if ((chan->fsm_state != EICON_STATE_NULL) && (chan->fsm_state != EICON_STATE_LISTEN)) {
restore_flags(flags);
- if (DebugVar & 1)
- printk(KERN_WARNING "Dial on channel %d with state %d\n",
+ eicon_log(card, 1, "Dial on channel %d with state %d\n",
chan->No, chan->fsm_state);
return -EBUSY;
}
@@ -643,7 +575,6 @@
else
tmp[0] = c->parm.setup.eazmsn[0];
chan->fsm_state = EICON_STATE_OCALL;
- chan->callref = 0xffff;
restore_flags(flags);
ret = idi_connect_req(card, chan, c->parm.setup.phone,
@@ -738,20 +669,17 @@
case ISDN_CMD_GETEAZ:
if (!card->flags & EICON_FLAGS_RUNNING)
return -ENODEV;
- if (DebugVar & 1)
- printk(KERN_DEBUG "eicon CMD_GETEAZ not implemented\n");
+ eicon_log(card, 1, "eicon CMD_GETEAZ not implemented\n");
return 0;
case ISDN_CMD_SETSIL:
if (!card->flags & EICON_FLAGS_RUNNING)
return -ENODEV;
- if (DebugVar & 1)
- printk(KERN_DEBUG "eicon CMD_SETSIL not implemented\n");
+ eicon_log(card, 1, "eicon CMD_SETSIL not implemented\n");
return 0;
case ISDN_CMD_GETSIL:
if (!card->flags & EICON_FLAGS_RUNNING)
return -ENODEV;
- if (DebugVar & 1)
- printk(KERN_DEBUG "eicon CMD_GETSIL not implemented\n");
+ eicon_log(card, 1, "eicon CMD_GETSIL not implemented\n");
return 0;
case ISDN_CMD_LOCK:
MOD_INC_USE_COUNT;
@@ -817,36 +745,58 @@
static int
if_writecmd(const u_char * buf, int len, int user, int id, int channel)
{
-#if 0
- /* Not yet used */
- eicon_card *card = eicon_findcard(id);
-
- if (card) {
- if (!card->flags & EICON_FLAGS_RUNNING)
- return (len);
- return (len);
- }
- printk(KERN_ERR
- "eicon: if_writecmd called with invalid driverId!\n");
-#endif
return (len);
}
static int
if_readstatus(u_char * buf, int len, int user, int id, int channel)
{
-#if 0
- /* Not yet used */
+ int count = 0;
+ int cnt = 0;
+ ulong flags = 0;
+ u_char *p = buf;
+ struct sk_buff *skb;
+
eicon_card *card = eicon_findcard(id);
if (card) {
if (!card->flags & EICON_FLAGS_RUNNING)
return -ENODEV;
- return (eicon_readstatus(buf, len, user, card));
+
+ save_flags(flags);
+ cli();
+ while((skb = skb_dequeue(&card->statq))) {
+
+ if ((skb->len + count) > len)
+ cnt = len - count;
+ else
+ cnt = skb->len;
+
+ if (user)
+ copy_to_user(p, skb->data, cnt);
+ else
+ memcpy(p, skb->data, cnt);
+
+ count += cnt;
+ p += cnt;
+
+ if (cnt == skb->len) {
+ dev_kfree_skb(skb);
+ if (card->statq_entries > 0)
+ card->statq_entries--;
+ } else {
+ skb_pull(skb, cnt);
+ skb_queue_head(&card->statq, skb);
+ restore_flags(flags);
+ return count;
+ }
+ }
+ card->statq_entries = 0;
+ restore_flags(flags);
+ return count;
}
printk(KERN_ERR
"eicon: if_readstatus called with invalid driverId!\n");
-#endif
return 0;
}
@@ -861,14 +811,11 @@
len = skb->len;
if (card) {
- if (!card->flags & EICON_FLAGS_RUNNING) {
- dev_kfree_skb(skb);
+ if (!card->flags & EICON_FLAGS_RUNNING)
return -ENODEV;
- }
- if (!(chan = find_channel(card, channel))) {
- dev_kfree_skb(skb);
+ if (!(chan = find_channel(card, channel)))
return -ENODEV;
- }
+
if (chan->fsm_state == EICON_STATE_ACTIVE) {
#ifdef CONFIG_ISDN_TTY_FAX
if (chan->l2prot == ISDN_PROTO_L2_FAX) {
@@ -880,16 +827,115 @@
ret = idi_send_data(card, chan, ack, skb, 1);
return (ret);
} else {
- dev_kfree_skb(skb);
return -ENODEV;
}
}
printk(KERN_ERR
"eicon: if_sendbuf called with invalid driverId!\n");
- dev_kfree_skb(skb);
return -ENODEV;
}
+/* jiftime() copied from HiSax */
+inline int
+jiftime(char *s, long mark)
+{
+ s += 8;
+
+ *s-- = '\0';
+ *s-- = mark % 10 + '0';
+ mark /= 10;
+ *s-- = mark % 10 + '0';
+ mark /= 10;
+ *s-- = '.';
+ *s-- = mark % 10 + '0';
+ mark /= 10;
+ *s-- = mark % 6 + '0';
+ mark /= 6;
+ *s-- = ':';
+ *s-- = mark % 10 + '0';
+ mark /= 10;
+ *s-- = mark % 10 + '0';
+ return(8);
+}
+
+void
+eicon_putstatus(eicon_card * card, char * buf)
+{
+ ulong flags;
+ int count;
+ isdn_ctrl cmd;
+ u_char *p;
+ struct sk_buff *skb;
+
+ if (!card)
+ return;
+
+ save_flags(flags);
+ cli();
+ count = strlen(buf);
+ skb = alloc_skb(count, GFP_ATOMIC);
+ if (!skb) {
+ restore_flags(flags);
+ printk(KERN_ERR "eicon: could not alloc skb in putstatus\n");
+ return;
+ }
+ p = skb_put(skb, count);
+ memcpy(p, buf, count);
+
+ skb_queue_tail(&card->statq, skb);
+
+ if (card->statq_entries >= MAX_STATUS_BUFFER) {
+ if ((skb = skb_dequeue(&card->statq))) {
+ count -= skb->len;
+ dev_kfree_skb(skb);
+ } else
+ count = 0;
+ } else
+ card->statq_entries++;
+
+ restore_flags(flags);
+ if (count) {
+ cmd.command = ISDN_STAT_STAVAIL;
+ cmd.driver = card->myid;
+ cmd.arg = count;
+ card->interface.statcallb(&cmd);
+ }
+}
+
+/*
+ * Debug and Log
+ */
+void
+eicon_log(eicon_card * card, int level, const char *fmt, ...)
+{
+ va_list args;
+ char Line[160];
+ u_char *p;
+
+
+ if ((DebugVar & level) || (DebugVar & 256)) {
+ va_start(args, fmt);
+
+ if (DebugVar & level) {
+ if (DebugVar & 256) {
+ /* log-buffer */
+ p = Line;
+ p += jiftime(p, jiffies);
+ *p++ = 32;
+ p += vsprintf(p, fmt, args);
+ *p = 0;
+ eicon_putstatus(card, Line);
+ } else {
+ /* printk, syslogd */
+ vsprintf(Line, fmt, args);
+ printk(KERN_DEBUG "%s", Line);
+ }
+ }
+
+ va_end(args);
+ }
+}
+
/*
* Allocate a new card-struct, initialize it
@@ -912,7 +958,7 @@
qloop = (Type == EICON_CTYPE_QUADRO)?2:0;
for (i = 0; i <= qloop; i++) {
if (!(card = (eicon_card *) kmalloc(sizeof(eicon_card), GFP_KERNEL))) {
- printk(KERN_WARNING
+ eicon_log(card, 1,
"eicon: (%s) Could not allocate card-struct.\n", id);
return;
}
@@ -921,6 +967,8 @@
skb_queue_head_init(&card->rcvq);
skb_queue_head_init(&card->rackq);
skb_queue_head_init(&card->sackq);
+ skb_queue_head_init(&card->statq);
+ card->statq_entries = 0;
card->snd_tq.routine = (void *) (void *) eicon_transmit;
card->snd_tq.data = card;
card->rcv_tq.routine = (void *) (void *) eicon_rcv_dispatch;
@@ -992,7 +1040,7 @@
p = p->next;
}
if (!p) {
- printk(KERN_WARNING "eicon_alloccard: Quadro Master not found.\n");
+ eicon_log(card, 1, "eicon_alloccard: Quadro Master not found.\n");
kfree(card);
return;
}
@@ -1014,7 +1062,7 @@
ISDN_FEATURE_L2_V11019 |
ISDN_FEATURE_L2_V11038 |
ISDN_FEATURE_L2_MODEM |
- /* ISDN_FEATURE_L2_FAX | */
+ ISDN_FEATURE_L2_FAX |
ISDN_FEATURE_L3_TRANSDSP |
ISDN_FEATURE_L3_FAX;
card->hwif.pci.card = (void *)card;
@@ -1038,7 +1086,7 @@
ISDN_FEATURE_L2_V11019 |
ISDN_FEATURE_L2_V11038 |
ISDN_FEATURE_L2_MODEM |
- /* ISDN_FEATURE_L2_FAX | */
+ ISDN_FEATURE_L2_FAX |
ISDN_FEATURE_L3_TRANSDSP |
ISDN_FEATURE_L3_FAX;
card->hwif.pci.card = (void *)card;
@@ -1087,13 +1135,13 @@
break;
#endif
default:
- printk(KERN_WARNING "eicon_alloccard: Invalid type %d\n", Type);
+ eicon_log(card, 1, "eicon_alloccard: Invalid type %d\n", Type);
kfree(card);
return;
}
if (!(card->bch = (eicon_chan *) kmalloc(sizeof(eicon_chan) * (card->nchannels + 1)
, GFP_KERNEL))) {
- printk(KERN_WARNING
+ eicon_log(card, 1,
"eicon: (%s) Could not allocate bch-struct.\n", id);
kfree(card);
return;
@@ -1131,7 +1179,7 @@
case EICON_BUS_MCA:
eicon_isa_printpar(&card->hwif.isa);
break;
-#endif
+#endif /* CONFIG_MCA */
#endif
case EICON_BUS_PCI:
#if CONFIG_PCI
@@ -1139,9 +1187,8 @@
break;
#endif
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon_registercard: Illegal BUS type %d\n",
+ eicon_log(card, 1,
+ "eicon_registercard: Illegal BUS type %d\n",
card->bus);
return -1;
}
@@ -1170,7 +1217,7 @@
case EICON_BUS_ISA:
#ifdef CONFIG_MCA
case EICON_BUS_MCA:
-#endif
+#endif /* CONFIG_MCA */
eicon_isa_release(&card->hwif.isa);
break;
#endif
@@ -1180,9 +1227,8 @@
break;
#endif
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon: Invalid BUS type %d\n",
+ eicon_log(card, 1,
+ "eicon: Invalid BUS type %d\n",
card->bus);
break;
}
@@ -1191,6 +1237,26 @@
static void
eicon_freecard(eicon_card *card) {
+ int i;
+ struct sk_buff *skb;
+
+ for(i = 0; i < (card->nchannels + 1); i++) {
+ while((skb = skb_dequeue(&card->bch[i].e.X)))
+ dev_kfree_skb(skb);
+ while((skb = skb_dequeue(&card->bch[i].e.R)))
+ dev_kfree_skb(skb);
+ }
+ while((skb = skb_dequeue(&card->sndq)))
+ dev_kfree_skb(skb);
+ while((skb = skb_dequeue(&card->rcvq)))
+ dev_kfree_skb(skb);
+ while((skb = skb_dequeue(&card->rackq)))
+ dev_kfree_skb(skb);
+ while((skb = skb_dequeue(&card->sackq)))
+ dev_kfree_skb(skb);
+ while((skb = skb_dequeue(&card->statq)))
+ dev_kfree_skb(skb);
+
eicon_clear_msn(card);
kfree(card->bch);
kfree(card);
@@ -1236,9 +1302,8 @@
break;
#endif
default:
- if (DebugVar & 1)
- printk(KERN_WARNING
- "eicon: addcard: Invalid BUS type %d\n",
+ printk(KERN_ERR
+ "eicon: addcard: Invalid BUS type %d\n",
p->bus);
}
} else
@@ -1250,7 +1315,7 @@
p = p->next;
} else {
/* registering failed, remove card from list, free memory */
- printk(KERN_WARNING
+ printk(KERN_ERR
"eicon: Initialization of %s failed\n",
p->interface.id);
if (q) {
@@ -1275,7 +1340,7 @@
#define eicon_init init_module
#endif
-int __init
+int
eicon_init(void)
{
int card_count = 0;
@@ -1317,10 +1382,9 @@
printk(KERN_INFO
"eicon: No MCA bus, ISDN-interfaces not probed.\n");
} else {
- if (DebugVar & 8)
- printk(KERN_DEBUG
- "eicon_mca_find_card, irq=%d.\n",
- irq);
+ eicon_log(card, 8,
+ "eicon_mca_find_card, irq=%d.\n",
+ irq);
if (!eicon_mca_find_card(0, membase, irq, id))
card_count++;
};
@@ -1361,12 +1425,14 @@
eicon_card *card = cards;
eicon_card *last;
while (card) {
+#ifdef CONFIG_ISDN_DRV_EICON_ISA
#ifdef CONFIG_MCA
if (MCA_bus)
{
mca_mark_as_unused (card->mca_slot);
mca_set_adapter_procfn(card->mca_slot, NULL, NULL);
};
+#endif /* CONFIG_MCA */
#endif
unregister_card(card);
card = card->next;
@@ -1382,7 +1448,6 @@
#else /* no module */
-#ifdef COMPAT_HAS_NEW_SETUP
static int __init
eicon_setup(char *line)
{
@@ -1391,12 +1456,6 @@
char *str;
str = get_options(line, 4, ints);
-#else
-void __init
-eicon_setup(char *str, int *ints)
-{
- int i, argc;
-#endif
argc = ints[0];
i = 1;
@@ -1424,13 +1483,9 @@
#else
printk(KERN_INFO "Eicon ISDN active driver setup\n");
#endif
-#ifdef COMPAT_HAS_NEW_SETUP
return(1);
}
__setup("eicon=", eicon_setup);
-#else
-}
-#endif
#endif /* MODULE */
@@ -1456,10 +1511,9 @@
{
int j, curr_slot = 0;
- if (DebugVar & 8)
- printk(KERN_DEBUG
- "eicon_mca_find_card type: %d, membase: %#x, irq %d \n",
- type, membase, irq);
+ eicon_log(card, 8,
+ "eicon_mca_find_card type: %d, membase: %#x, irq %d \n",
+ type, membase, irq);
/* find a no-driver-assigned eicon card */
for (j=0; eicon_mca_adapters[j].adf_id != 0; j++)
{
@@ -1524,11 +1578,10 @@
int irq_array1[]={3,4,0,0,2,10,11,12};
adf_pos0 = mca_read_stored_pos(slot,2);
- if (DebugVar & 8)
- printk(KERN_DEBUG
- "eicon_mca_probe irq=%d, membase=%d\n",
- irq,
- membase);
+ eicon_log(card, 8,
+ "eicon_mca_probe irq=%d, membase=%d\n",
+ irq,
+ membase);
switch (a_idx) {
case 0: /* P/2-Adapter (== PRI/S2M ? ) */
cards_membase= 0xC0000+((adf_pos0>>4)*0x4000);
@@ -1542,7 +1595,7 @@
if (irq == -1) {
irq = cards_irq;
} else {
- if (irq != irq)
+ if (irq != cards_irq)
return ENODEV;
};
cards_io= 0xC00 + ((adf_pos0>>4)*0x10);
@@ -1575,7 +1628,7 @@
if (irq == -1) {
irq = cards_irq;
} else {
- if (irq != irq)
+ if (irq != cards_irq)
return ENODEV;
};
type = 0;
@@ -1591,8 +1644,12 @@
mca_mark_as_used(slot);
cards->mca_slot = slot;
/* card->io noch setzen oder ?? */
- if (DebugVar & 8)
- printk("eicon_addcard: erfolgreich fuer slot: %d.\n",
+ cards->mca_io = cards_io;
+ cards->hwif.isa.io = cards_io;
+ /* reset card */
+ outb_p(0,cards_io+1);
+
+ eicon_log(card, 8, "eicon_addcard: successful for slot # %d.\n",
cards->mca_slot+1);
return 0 ; /* eicon_addcard hat eine Karte zugefuegt */
} else {
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)