summaryrefslogtreecommitdiffstats
path: root/drivers/isdn/eicon/eicon_isa.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-02-24 00:12:35 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-02-24 00:12:35 +0000
commit482368b1a8e45430672c58c9a42e7d2004367126 (patch)
treece2a1a567d4d62dee7c2e71a46a99cf72cf1d606 /drivers/isdn/eicon/eicon_isa.c
parente4d0251c6f56ab2e191afb70f80f382793e23f74 (diff)
Merge with 2.3.47. Guys, this is buggy as shit. You've been warned.
Diffstat (limited to 'drivers/isdn/eicon/eicon_isa.c')
-rw-r--r--drivers/isdn/eicon/eicon_isa.c111
1 files changed, 70 insertions, 41 deletions
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);
}