1 /* $Id: eicon_mod.c,v 1.11 1999/08/29 17:23:45 armin Exp $
3 * ISDN lowlevel-module for Eicon.Diehl active cards.
5 * Copyright 1997 by Fritz Elfert (fritz@wuemaus.franken.de)
6 * Copyright 1998,99 by Armin Schindler (mac@melware.de)
7 * Copyright 1999 Cytronics & Melware (info@melware.de)
9 * Thanks to Eicon Technology Diehl GmbH & Co. oHG for
10 * documents, informations and hardware.
12 * Deutsche Telekom AG for S2M support.
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2, or (at your option)
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 * $Log: eicon_mod.c,v $
29 * Revision 1.11 1999/08/29 17:23:45 armin
31 * Bugfix if compile as not module.
33 * Revision 1.10 1999/08/28 21:32:53 armin
34 * Prepared for fax related functions.
35 * Now compilable without errors/warnings.
37 * Revision 1.9 1999/08/18 20:17:02 armin
38 * Added XLOG function for all cards.
39 * Bugfix of alloc_skb NULL pointer.
41 * Revision 1.8 1999/07/25 15:12:08 armin
42 * fix of some debug logs.
43 * enabled ISA-cards option.
45 * Revision 1.7 1999/07/11 17:16:27 armin
46 * Bugfixes in queue handling.
47 * Added DSP-DTMF decoder functions.
48 * Reorganized ack_handler.
50 * Revision 1.6 1999/06/09 19:31:26 armin
51 * Wrong PLX size for request_region() corrected.
52 * Added first MCA code from Erik Weber.
54 * Revision 1.5 1999/04/01 12:48:35 armin
55 * Changed some log outputs.
57 * Revision 1.4 1999/03/29 11:19:47 armin
58 * I/O stuff now in seperate file (eicon_io.c)
59 * Old ISA type cards (S,SX,SCOM,Quadro,S2M) implemented.
61 * Revision 1.3 1999/03/02 12:37:47 armin
62 * Added some important checks.
63 * Analog Modem with DSP.
64 * Channels will be added to Link-Level after loading firmware.
66 * Revision 1.2 1999/01/24 20:14:21 armin
67 * Changed and added debug stuff.
68 * Better data sending. (still problems with tty's flip buffer)
70 * Revision 1.1 1999/01/01 18:09:44 armin
71 * First checkin of new eicon driver.
72 * DIVA-Server BRI/PCI and PRI/PCI are supported.
73 * Old diehl code is obsolete.
78 #define DRIVERPATCH ""
80 #include <linux/config.h>
81 #include <linux/module.h>
82 #include <linux/init.h>
84 #include <linux/mca.h>
89 #define INCLUDE_INLINE_FUNCS
91 static eicon_card
*cards
= (eicon_card
*) NULL
; /* glob. var , contains
94 static char *eicon_revision
= "$Revision: 1.11 $";
96 extern char *eicon_pci_revision
;
97 extern char *eicon_isa_revision
;
98 extern char *eicon_idi_revision
;
101 #define MOD_USE_COUNT (GET_USE_COUNT (&__this_module))
104 #define EICON_CTRL_VERSION 2
108 /* Parameters to be set by insmod */
109 #ifdef CONFIG_ISDN_DRV_EICON_ISA
110 static int membase
= -1;
113 static char *id
= "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
115 MODULE_DESCRIPTION( "Driver for Eicon.Diehl active ISDN cards");
116 MODULE_AUTHOR( "Armin Schindler");
117 MODULE_SUPPORTED_DEVICE( "ISDN subsystem");
118 MODULE_PARM_DESC(id
, "ID-String of first card");
119 MODULE_PARM(id
, "s");
120 #ifdef CONFIG_ISDN_DRV_EICON_ISA
121 MODULE_PARM_DESC(membase
, "Base address of first ISA card");
122 MODULE_PARM_DESC(irq
, "IRQ of first card");
123 MODULE_PARM(membase
, "i");
124 MODULE_PARM(irq
, "i");
127 char *eicon_ctype_name
[] = {
133 "DIVA Server BRI/PCI",
134 "DIVA Server 4BRI/PCI",
135 "DIVA Server 4BRI/PCI",
136 "DIVA Server PRI/PCI"
145 if ((tmp
= strchr(p
, '.')))
147 while (p
[0] >= '0' && p
[0] <= '9') {
148 v
= ((v
< 0) ? 0 : (v
* 10)) + (int) (p
[0] - '0');
157 eicon_getrev(const char *revision
)
161 if ((p
= strchr(revision
, ':'))) {
163 p
= strchr(rev
, '$');
171 find_channel(eicon_card
*card
, int channel
)
173 if ((channel
>= 0) && (channel
< card
->nchannels
))
174 return &(card
->bch
[channel
]);
176 printk(KERN_WARNING
"eicon: Invalid channel %d\n", channel
);
184 eicon_clear_msn(eicon_card
*card
)
186 struct msn_entry
*p
= card
->msn_list
;
192 card
->msn_list
= NULL
;
193 restore_flags(flags
);
202 * Find an MSN entry in the list.
203 * If ia5 != 0, return IA5-encoded EAZ, else
204 * return a bitmask with corresponding bit set.
207 eicon_find_msn(eicon_card
*card
, char *msn
, int ia5
)
209 struct msn_entry
*p
= card
->msn_list
;
213 if (!strcmp(p
->msn
, msn
)) {
220 return (1 << (eaz
- '0'));
226 * Find an EAZ entry in the list.
227 * return a string with corresponding msn.
230 eicon_find_eaz(eicon_card
*card
, char eaz
)
232 struct msn_entry
*p
= card
->msn_list
;
244 * Add or delete an MSN to the MSN list
246 * First character of msneaz is EAZ, rest is MSN.
247 * If length of eazmsn is 1, delete that entry.
250 eicon_set_msn(eicon_card
*card
, char *eazmsn
)
252 struct msn_entry
*p
= card
->msn_list
;
253 struct msn_entry
*q
= NULL
;
259 if (strlen(eazmsn
) > 16)
261 for (i
= 0; i
< strlen(eazmsn
); i
++)
262 if (!isdigit(eazmsn
[i
]))
264 if (strlen(eazmsn
) == 1) {
265 /* Delete a single MSN */
267 if (p
->eaz
== eazmsn
[0]) {
273 card
->msn_list
= p
->next
;
274 restore_flags(flags
);
278 "Mapping for EAZ %c deleted\n",
287 /* Add a single MSN */
289 /* Found in list, replace MSN */
290 if (p
->eaz
== eazmsn
[0]) {
293 strcpy(p
->msn
, &eazmsn
[1]);
294 restore_flags(flags
);
297 "Mapping for EAZ %c changed to %s\n",
304 /* Not found in list, add new entry */
305 p
= kmalloc(sizeof(msn_entry
), GFP_KERNEL
);
309 strcpy(p
->msn
, &eazmsn
[1]);
310 p
->next
= card
->msn_list
;
314 restore_flags(flags
);
317 "Mapping %c -> %s added\n",
325 eicon_rcv_dispatch(struct eicon_card
*card
)
331 eicon_io_rcv_dispatch(card
);
336 "eicon_ack_dispatch: Illegal bustype %d\n", card
->bus
);
341 eicon_ack_dispatch(struct eicon_card
*card
)
347 eicon_io_ack_dispatch(card
);
352 "eicon_ack_dispatch: Illegal bustype %d\n", card
->bus
);
357 eicon_transmit(struct eicon_card
*card
)
363 eicon_io_transmit(card
);
368 "eicon_transmit: Illegal bustype %d\n", card
->bus
);
372 static int eicon_xlog(eicon_card
*card
, xlogreq_t
*xlogreq
)
377 if (!(xlr
= kmalloc(sizeof(xlogreq_t
), GFP_KERNEL
))) {
379 printk(KERN_WARNING
"idi_err: alloc_xlogreq_t failed\n");
382 if (copy_from_user(xlr
, xlogreq
, sizeof(xlogreq_t
))) {
387 ret_val
= eicon_get_xlog(card
, xlr
);
389 if (copy_to_user(xlogreq
, xlr
, sizeof(xlogreq_t
))) {
399 eicon_command(eicon_card
* card
, isdn_ctrl
* c
)
410 printk(KERN_WARNING
"eicon_cmd 0x%x with arg 0x%lx (0x%lx)\n",
411 c
->command
, c
->arg
, (ulong
) *c
->parm
.num
);
413 switch (c
->command
) {
415 memcpy(&a
, c
->parm
.num
, sizeof(ulong
));
417 case EICON_IOCTL_GETVER
:
418 return(EICON_CTRL_VERSION
);
419 case EICON_IOCTL_GETTYPE
:
421 case EICON_IOCTL_GETMMIO
:
425 return (int)card
->hwif
.isa
.shmem
;
428 return card
->hwif
.pci
.PCIram
;
433 "eicon: Illegal BUS type %d\n",
437 #ifdef CONFIG_ISDN_DRV_EICON_ISA
438 case EICON_IOCTL_SETMMIO
:
439 if (card
->flags
& EICON_FLAGS_LOADED
)
444 if (eicon_isa_find_card(a
,
448 card
->hwif
.isa
.shmem
= (eicon_isa_shmem
*)a
;
453 "eicon: Illegal BUS type %d\n",
458 case EICON_IOCTL_GETIRQ
:
462 return card
->hwif
.isa
.irq
;
465 return card
->hwif
.pci
.irq
;
470 "eicon: Illegal BUS type %d\n",
474 case EICON_IOCTL_SETIRQ
:
475 if (card
->flags
& EICON_FLAGS_LOADED
)
477 if ((a
< 2) || (a
> 15))
482 card
->hwif
.isa
.irq
= a
;
487 "eicon: Illegal BUS type %d\n",
491 #ifdef CONFIG_ISDN_DRV_EICON_ISA
492 case EICON_IOCTL_LOADBOOT
:
493 if (card
->flags
& EICON_FLAGS_RUNNING
)
498 ret
= eicon_isa_bootload(
500 &(((eicon_codebuf
*)a
)->isa
));
505 "eicon: Illegal BUS type %d\n",
511 #ifdef CONFIG_ISDN_DRV_EICON_ISA
512 case EICON_IOCTL_LOADISA
:
513 if (card
->flags
& EICON_FLAGS_RUNNING
)
518 ret
= eicon_isa_load(
520 &(((eicon_codebuf
*)a
)->isa
));
522 card
->flags
|= EICON_FLAGS_LOADED
;
523 card
->flags
|= EICON_FLAGS_RUNNING
;
524 if (card
->hwif
.isa
.channels
> 1) {
525 cmd
.command
= ISDN_STAT_ADDCH
;
526 cmd
.driver
= card
->myid
;
527 cmd
.arg
= card
->hwif
.isa
.channels
- 1;
528 card
->interface
.statcallb(&cmd
);
530 cmd
.command
= ISDN_STAT_RUN
;
531 cmd
.driver
= card
->myid
;
533 card
->interface
.statcallb(&cmd
);
539 "eicon: Illegal BUS type %d\n",
545 case EICON_IOCTL_MANIF
:
546 if (!card
->flags
& EICON_FLAGS_RUNNING
)
548 if (!card
->Feature
& PROTCAP_MANIF
)
550 ret
= eicon_idi_manage(
552 (eicon_manifbuf
*)a
);
555 case EICON_IOCTL_GETXLOG
:
556 if (!card
->flags
& EICON_FLAGS_RUNNING
)
557 return XLOG_ERR_CARD_STATE
;
558 ret
= eicon_xlog(card
, (xlogreq_t
*)a
);
561 case EICON_IOCTL_LOADPCI
:
562 if (card
->flags
& EICON_FLAGS_RUNNING
)
564 if (card
->bus
== EICON_BUS_PCI
) {
566 case EICON_CTYPE_MAESTRA
:
567 ret
= eicon_pci_load_bri(
569 &(((eicon_codebuf
*)a
)->pci
));
572 case EICON_CTYPE_MAESTRAP
:
573 ret
= eicon_pci_load_pri(
575 &(((eicon_codebuf
*)a
)->pci
));
579 card
->flags
|= EICON_FLAGS_LOADED
;
580 card
->flags
|= EICON_FLAGS_RUNNING
;
581 if (card
->hwif
.pci
.channels
> 1) {
582 cmd
.command
= ISDN_STAT_ADDCH
;
583 cmd
.driver
= card
->myid
;
584 cmd
.arg
= card
->hwif
.pci
.channels
- 1;
585 card
->interface
.statcallb(&cmd
);
587 cmd
.command
= ISDN_STAT_RUN
;
588 cmd
.driver
= card
->myid
;
590 card
->interface
.statcallb(&cmd
);
593 } else return -ENODEV
;
596 case EICON_IOCTL_SETMSN
:
597 if ((ret
= copy_from_user(tmp
, (char *)a
, sizeof(tmp
))))
599 if ((ret
= eicon_set_msn(card
, tmp
)))
602 if (card
->flags
& EICON_FLAGS_RUNNING
)
603 return(eicon_capi_manufacturer_req_msn(card
));
607 case EICON_IOCTL_ADDCARD
:
608 if ((ret
= copy_from_user(&cdef
, (char *)a
, sizeof(cdef
))))
610 if (!(eicon_addcard(0, cdef
.membase
, cdef
.irq
, cdef
.id
)))
613 case EICON_IOCTL_DEBUGVAR
:
615 printk(KERN_DEBUG
"Eicon: Debug Value set to %ld\n", DebugVar
);
618 case EICON_IOCTL_FREEIT
:
619 while (MOD_USE_COUNT
> 0) MOD_DEC_USE_COUNT
;
628 if (!card
->flags
& EICON_FLAGS_RUNNING
)
630 if (!(chan
= find_channel(card
, c
->arg
& 0x1f)))
634 if ((chan
->fsm_state
!= EICON_STATE_NULL
) && (chan
->fsm_state
!= EICON_STATE_LISTEN
)) {
635 restore_flags(flags
);
637 printk(KERN_WARNING
"Dial on channel %d with state %d\n",
638 chan
->No
, chan
->fsm_state
);
641 if (card
->ptype
== ISDN_PTYPE_EURO
)
642 tmp
[0] = eicon_find_msn(card
, c
->parm
.setup
.eazmsn
, 1);
644 tmp
[0] = c
->parm
.setup
.eazmsn
[0];
645 chan
->fsm_state
= EICON_STATE_OCALL
;
646 chan
->callref
= 0xffff;
647 restore_flags(flags
);
649 ret
= idi_connect_req(card
, chan
, c
->parm
.setup
.phone
,
650 c
->parm
.setup
.eazmsn
,
654 cmd
.driver
= card
->myid
;
655 cmd
.command
= ISDN_STAT_DHUP
;
657 card
->interface
.statcallb(&cmd
);
660 case ISDN_CMD_ACCEPTD
:
661 if (!card
->flags
& EICON_FLAGS_RUNNING
)
663 if (!(chan
= find_channel(card
, c
->arg
& 0x1f)))
665 if (chan
->fsm_state
== EICON_STATE_ICALL
) {
666 idi_connect_res(card
, chan
);
669 case ISDN_CMD_ACCEPTB
:
670 if (!card
->flags
& EICON_FLAGS_RUNNING
)
673 case ISDN_CMD_HANGUP
:
674 if (!card
->flags
& EICON_FLAGS_RUNNING
)
676 if (!(chan
= find_channel(card
, c
->arg
& 0x1f)))
678 idi_hangup(card
, chan
);
680 case ISDN_CMD_SETEAZ
:
681 if (!card
->flags
& EICON_FLAGS_RUNNING
)
683 if (!(chan
= find_channel(card
, c
->arg
& 0x1f)))
685 if (strlen(c
->parm
.num
)) {
686 if (card
->ptype
== ISDN_PTYPE_EURO
) {
687 chan
->eazmask
= eicon_find_msn(card
, c
->parm
.num
, 0);
689 if (card
->ptype
== ISDN_PTYPE_1TR6
) {
692 for (i
= 0; i
< strlen(c
->parm
.num
); i
++)
693 if (isdigit(c
->parm
.num
[i
]))
694 chan
->eazmask
|= (1 << (c
->parm
.num
[i
] - '0'));
697 chan
->eazmask
= 0x3ff;
698 eicon_idi_listen_req(card
, chan
);
700 case ISDN_CMD_CLREAZ
:
701 if (!card
->flags
& EICON_FLAGS_RUNNING
)
703 if (!(chan
= find_channel(card
, c
->arg
& 0x1f)))
706 eicon_idi_listen_req(card
, chan
);
709 if (!card
->flags
& EICON_FLAGS_RUNNING
)
711 if (!(chan
= find_channel(card
, c
->arg
& 0x1f)))
713 chan
->l2prot
= (c
->arg
>> 8);
716 if (!card
->flags
& EICON_FLAGS_RUNNING
)
718 if (!(chan
= find_channel(card
, c
->arg
& 0x1f)))
722 if (!card
->flags
& EICON_FLAGS_RUNNING
)
724 if (!(chan
= find_channel(card
, c
->arg
& 0x1f)))
726 chan
->l3prot
= (c
->arg
>> 8);
727 #ifdef CONFIG_ISDN_TTY_FAX
728 if (chan
->l3prot
== ISDN_PROTO_L3_FAX
)
729 chan
->fax
= c
->parm
.fax
;
733 if (!card
->flags
& EICON_FLAGS_RUNNING
)
735 if (!(chan
= find_channel(card
, c
->arg
& 0x1f)))
738 case ISDN_CMD_GETEAZ
:
739 if (!card
->flags
& EICON_FLAGS_RUNNING
)
742 printk(KERN_DEBUG
"eicon CMD_GETEAZ not implemented\n");
744 case ISDN_CMD_SETSIL
:
745 if (!card
->flags
& EICON_FLAGS_RUNNING
)
748 printk(KERN_DEBUG
"eicon CMD_SETSIL not implemented\n");
750 case ISDN_CMD_GETSIL
:
751 if (!card
->flags
& EICON_FLAGS_RUNNING
)
754 printk(KERN_DEBUG
"eicon CMD_GETSIL not implemented\n");
759 case ISDN_CMD_UNLOCK
:
762 #ifdef CONFIG_ISDN_TTY_FAX
763 case ISDN_CMD_FAXCMD
:
764 if (!card
->flags
& EICON_FLAGS_RUNNING
)
766 if (!(chan
= find_channel(card
, c
->arg
& 0x1f)))
770 idi_fax_cmd(card
, chan
);
774 if (!card
->flags
& EICON_FLAGS_RUNNING
)
776 if (!(chan
= find_channel(card
, c
->arg
& 0x1f)))
778 idi_audio_cmd(card
, chan
, c
->arg
>> 8, c
->parm
.num
);
786 * Find card with given driverId
788 static inline eicon_card
*
789 eicon_findcard(int driverid
)
791 eicon_card
*p
= cards
;
794 if (p
->myid
== driverid
)
798 return (eicon_card
*) 0;
802 * Wrapper functions for interface to linklevel
805 if_command(isdn_ctrl
* c
)
807 eicon_card
*card
= eicon_findcard(c
->driver
);
810 return (eicon_command(card
, c
));
812 "eicon: if_command %d called with invalid driverId %d!\n",
813 c
->command
, c
->driver
);
818 if_writecmd(const u_char
* buf
, int len
, int user
, int id
, int channel
)
822 eicon_card
*card
= eicon_findcard(id
);
825 if (!card
->flags
& EICON_FLAGS_RUNNING
)
830 "eicon: if_writecmd called with invalid driverId!\n");
836 if_readstatus(u_char
* buf
, int len
, int user
, int id
, int channel
)
840 eicon_card
*card
= eicon_findcard(id
);
843 if (!card
->flags
& EICON_FLAGS_RUNNING
)
845 return (eicon_readstatus(buf
, len
, user
, card
));
848 "eicon: if_readstatus called with invalid driverId!\n");
854 if_sendbuf(int id
, int channel
, int ack
, struct sk_buff
*skb
)
856 eicon_card
*card
= eicon_findcard(id
);
864 if (!card
->flags
& EICON_FLAGS_RUNNING
) {
868 if (!(chan
= find_channel(card
, channel
))) {
872 if (chan
->fsm_state
== EICON_STATE_ACTIVE
) {
873 #ifdef CONFIG_ISDN_TTY_FAX
874 if (chan
->l2prot
== ISDN_PROTO_L2_FAX
) {
875 if ((ret
= idi_faxdata_send(card
, chan
, skb
)) > 0)
880 ret
= idi_send_data(card
, chan
, ack
, skb
, 1);
888 "eicon: if_sendbuf called with invalid driverId!\n");
895 * Allocate a new card-struct, initialize it
896 * link it into cards-list.
899 eicon_alloccard(int Type
, int membase
, int irq
, char *id
)
904 #ifdef CONFIG_ISDN_DRV_EICON_ISA
909 eicon_pci_card
*pcic
;
912 qloop
= (Type
== EICON_CTYPE_QUADRO
)?2:0;
913 for (i
= 0; i
<= qloop
; i
++) {
914 if (!(card
= (eicon_card
*) kmalloc(sizeof(eicon_card
), GFP_KERNEL
))) {
916 "eicon: (%s) Could not allocate card-struct.\n", id
);
919 memset((char *) card
, 0, sizeof(eicon_card
));
920 skb_queue_head_init(&card
->sndq
);
921 skb_queue_head_init(&card
->rcvq
);
922 skb_queue_head_init(&card
->rackq
);
923 skb_queue_head_init(&card
->sackq
);
924 card
->snd_tq
.routine
= (void *) (void *) eicon_transmit
;
925 card
->snd_tq
.data
= card
;
926 card
->rcv_tq
.routine
= (void *) (void *) eicon_rcv_dispatch
;
927 card
->rcv_tq
.data
= card
;
928 card
->ack_tq
.routine
= (void *) (void *) eicon_ack_dispatch
;
929 card
->ack_tq
.data
= card
;
930 card
->interface
.maxbufsize
= 4000;
931 card
->interface
.command
= if_command
;
932 card
->interface
.writebuf_skb
= if_sendbuf
;
933 card
->interface
.writecmd
= if_writecmd
;
934 card
->interface
.readstat
= if_readstatus
;
935 card
->interface
.features
=
936 ISDN_FEATURE_L2_X75I
|
937 ISDN_FEATURE_L2_HDLC
|
938 ISDN_FEATURE_L2_TRANS
|
939 ISDN_FEATURE_L3_TRANS
|
940 ISDN_FEATURE_P_UNKNOWN
;
941 card
->interface
.hl_hdrlen
= 20;
942 card
->ptype
= ISDN_PTYPE_UNKNOWN
;
943 strncpy(card
->interface
.id
, id
, sizeof(card
->interface
.id
) - 1);
947 #ifdef CONFIG_ISDN_DRV_EICON_ISA
948 #if CONFIG_MCA /* only needed for MCA */
951 case EICON_CTYPE_SCOM
:
953 membase
= EICON_ISA_MEMBASE
;
956 card
->bus
= EICON_BUS_MCA
;
957 card
->hwif
.isa
.card
= (void *)card
;
958 card
->hwif
.isa
.shmem
= (eicon_isa_shmem
*)membase
;
959 card
->hwif
.isa
.master
= 1;
961 card
->hwif
.isa
.irq
= irq
;
962 card
->hwif
.isa
.type
= Type
;
964 card
->interface
.channels
= 1;
966 #endif /* CONFIG_MCA */
967 case EICON_CTYPE_QUADRO
:
969 membase
= EICON_ISA_MEMBASE
;
972 card
->bus
= EICON_BUS_ISA
;
973 card
->hwif
.isa
.card
= (void *)card
;
974 card
->hwif
.isa
.shmem
= (eicon_isa_shmem
*)(membase
+ (i
+1) * EICON_ISA_QOFFSET
);
975 card
->hwif
.isa
.master
= 0;
976 strcpy(card
->interface
.id
, id
);
977 if (id
[strlen(id
) - 1] == 'a') {
978 card
->interface
.id
[strlen(id
) - 1] = 'a' + i
+ 1;
980 sprintf(qid
, "_%c",'2' + i
);
981 strcat(card
->interface
.id
, qid
);
983 printk(KERN_INFO
"Eicon: Quadro: Driver-Id %s added.\n",
986 eicon_card
*p
= cards
;
988 if ((p
->hwif
.isa
.master
) && (p
->hwif
.isa
.irq
== irq
)) {
995 printk(KERN_WARNING
"eicon_alloccard: Quadro Master not found.\n");
1000 cards
->qnext
= card
;
1002 card
->hwif
.isa
.irq
= irq
;
1003 card
->hwif
.isa
.type
= Type
;
1004 card
->nchannels
= 2;
1005 card
->interface
.channels
= 1;
1009 case EICON_CTYPE_MAESTRA
:
1010 (eicon_pci_card
*)pcic
= (eicon_pci_card
*)membase
;
1011 card
->bus
= EICON_BUS_PCI
;
1012 card
->interface
.features
|=
1013 ISDN_FEATURE_L2_V11096
|
1014 ISDN_FEATURE_L2_V11019
|
1015 ISDN_FEATURE_L2_V11038
|
1016 ISDN_FEATURE_L2_MODEM
|
1017 /* ISDN_FEATURE_L2_FAX | */
1018 ISDN_FEATURE_L3_TRANSDSP
|
1019 ISDN_FEATURE_L3_FAX
;
1020 card
->hwif
.pci
.card
= (void *)card
;
1021 card
->hwif
.pci
.PCIreg
= pcic
->PCIreg
;
1022 card
->hwif
.pci
.PCIcfg
= pcic
->PCIcfg
;
1023 card
->hwif
.pci
.master
= 1;
1024 card
->hwif
.pci
.mvalid
= pcic
->mvalid
;
1025 card
->hwif
.pci
.ivalid
= 0;
1026 card
->hwif
.pci
.irq
= irq
;
1027 card
->hwif
.pci
.type
= Type
;
1029 card
->nchannels
= 2;
1030 card
->interface
.channels
= 1;
1033 case EICON_CTYPE_MAESTRAP
:
1034 (eicon_pci_card
*)pcic
= (eicon_pci_card
*)membase
;
1035 card
->bus
= EICON_BUS_PCI
;
1036 card
->interface
.features
|=
1037 ISDN_FEATURE_L2_V11096
|
1038 ISDN_FEATURE_L2_V11019
|
1039 ISDN_FEATURE_L2_V11038
|
1040 ISDN_FEATURE_L2_MODEM
|
1041 /* ISDN_FEATURE_L2_FAX | */
1042 ISDN_FEATURE_L3_TRANSDSP
|
1043 ISDN_FEATURE_L3_FAX
;
1044 card
->hwif
.pci
.card
= (void *)card
;
1045 card
->hwif
.pci
.shmem
= (eicon_pci_shmem
*)pcic
->shmem
;
1046 card
->hwif
.pci
.PCIreg
= pcic
->PCIreg
;
1047 card
->hwif
.pci
.PCIram
= pcic
->PCIram
;
1048 card
->hwif
.pci
.PCIcfg
= pcic
->PCIcfg
;
1049 card
->hwif
.pci
.master
= 1;
1050 card
->hwif
.pci
.mvalid
= pcic
->mvalid
;
1051 card
->hwif
.pci
.ivalid
= 0;
1052 card
->hwif
.pci
.irq
= irq
;
1053 card
->hwif
.pci
.type
= Type
;
1055 card
->nchannels
= 30;
1056 card
->interface
.channels
= 1;
1059 #ifdef CONFIG_ISDN_DRV_EICON_ISA
1060 case EICON_CTYPE_ISABRI
:
1062 membase
= EICON_ISA_MEMBASE
;
1064 irq
= EICON_ISA_IRQ
;
1065 card
->bus
= EICON_BUS_ISA
;
1066 card
->hwif
.isa
.card
= (void *)card
;
1067 card
->hwif
.isa
.shmem
= (eicon_isa_shmem
*)membase
;
1068 card
->hwif
.isa
.master
= 1;
1069 card
->hwif
.isa
.irq
= irq
;
1070 card
->hwif
.isa
.type
= Type
;
1071 card
->nchannels
= 2;
1072 card
->interface
.channels
= 1;
1074 case EICON_CTYPE_ISAPRI
:
1076 membase
= EICON_ISA_MEMBASE
;
1078 irq
= EICON_ISA_IRQ
;
1079 card
->bus
= EICON_BUS_ISA
;
1080 card
->hwif
.isa
.card
= (void *)card
;
1081 card
->hwif
.isa
.shmem
= (eicon_isa_shmem
*)membase
;
1082 card
->hwif
.isa
.master
= 1;
1083 card
->hwif
.isa
.irq
= irq
;
1084 card
->hwif
.isa
.type
= Type
;
1085 card
->nchannels
= 30;
1086 card
->interface
.channels
= 1;
1090 printk(KERN_WARNING
"eicon_alloccard: Invalid type %d\n", Type
);
1094 if (!(card
->bch
= (eicon_chan
*) kmalloc(sizeof(eicon_chan
) * (card
->nchannels
+ 1)
1097 "eicon: (%s) Could not allocate bch-struct.\n", id
);
1101 for (j
=0; j
< (card
->nchannels
+ 1); j
++) {
1102 memset((char *)&card
->bch
[j
], 0, sizeof(eicon_chan
));
1103 card
->bch
[j
].plci
= 0x8000;
1104 card
->bch
[j
].ncci
= 0x8000;
1105 card
->bch
[j
].l2prot
= ISDN_PROTO_L2_X75I
;
1106 card
->bch
[j
].l3prot
= ISDN_PROTO_L3_TRANS
;
1107 card
->bch
[j
].e
.D3Id
= 0;
1108 card
->bch
[j
].e
.B2Id
= 0;
1109 card
->bch
[j
].e
.Req
= 0;
1110 card
->bch
[j
].No
= j
;
1111 skb_queue_head_init(&card
->bch
[j
].e
.X
);
1112 skb_queue_head_init(&card
->bch
[j
].e
.R
);
1120 * register card at linklevel
1123 eicon_registercard(eicon_card
* card
)
1125 switch (card
->bus
) {
1126 #ifdef CONFIG_ISDN_DRV_EICON_ISA
1128 /* TODO something to print */
1132 eicon_isa_printpar(&card
->hwif
.isa
);
1138 eicon_pci_printpar(&card
->hwif
.pci
);
1144 "eicon_registercard: Illegal BUS type %d\n",
1148 if (!register_isdn(&card
->interface
)) {
1150 "eicon_registercard: Unable to register %s\n",
1151 card
->interface
.id
);
1154 card
->myid
= card
->interface
.channels
;
1155 sprintf(card
->regname
, "%s", card
->interface
.id
);
1161 unregister_card(eicon_card
* card
)
1165 cmd
.command
= ISDN_STAT_UNLOAD
;
1166 cmd
.driver
= card
->myid
;
1167 card
->interface
.statcallb(&cmd
);
1168 switch (card
->bus
) {
1169 #ifdef CONFIG_ISDN_DRV_EICON_ISA
1174 eicon_isa_release(&card
->hwif
.isa
);
1179 eicon_pci_release(&card
->hwif
.pci
);
1185 "eicon: Invalid BUS type %d\n",
1193 eicon_freecard(eicon_card
*card
) {
1194 eicon_clear_msn(card
);
1200 eicon_addcard(int Type
, int membase
, int irq
, char *id
)
1203 eicon_card
*q
= NULL
;
1208 #ifdef CONFIG_ISDN_DRV_EICON_ISA
1209 if (!Type
) /* ISA */
1210 if ((Type
= eicon_isa_find_card(membase
, irq
, id
)) < 0)
1213 eicon_alloccard(Type
, membase
, irq
, id
);
1217 if (!p
->interface
.statcallb
) {
1218 /* Not yet registered.
1219 * Try to register and activate it.
1223 #ifdef CONFIG_ISDN_DRV_EICON_ISA
1226 if (eicon_registercard(p
))
1233 if (eicon_registercard(p
))
1241 "eicon: addcard: Invalid BUS type %d\n",
1245 /* Card already registered */
1248 /* Init OK, next card ... */
1252 /* registering failed, remove card from list, free memory */
1254 "eicon: Initialization of %s failed\n",
1268 return (added
- failed
);
1271 #define DRIVERNAME "Eicon active ISDN driver"
1272 #define DRIVERRELEASE "1"
1275 #define eicon_init init_module
1287 printk(KERN_INFO
"%s Rev: ", DRIVERNAME
);
1288 strcpy(tmprev
, eicon_revision
);
1289 printk("%s/", eicon_getrev(tmprev
));
1290 release
+= getrel(tmprev
);
1291 strcpy(tmprev
, eicon_pci_revision
);
1293 printk("%s/", eicon_getrev(tmprev
));
1297 release
+= getrel(tmprev
);
1298 strcpy(tmprev
, eicon_isa_revision
);
1299 #ifdef CONFIG_ISDN_DRV_EICON_ISA
1300 printk("%s/", eicon_getrev(tmprev
));
1304 release
+= getrel(tmprev
);
1305 strcpy(tmprev
, eicon_idi_revision
);
1306 printk("%s\n", eicon_getrev(tmprev
));
1307 release
+= getrel(tmprev
);
1308 sprintf(tmprev
,"%d", release
);
1309 printk(KERN_INFO
"%s Release: %s.%s%s\n", DRIVERNAME
,
1310 DRIVERRELEASE
, tmprev
, DRIVERPATCH
);
1312 #ifdef CONFIG_ISDN_DRV_EICON_ISA
1314 /* Check if we have MCA-bus */
1318 "eicon: No MCA bus, ISDN-interfaces not probed.\n");
1322 "eicon_mca_find_card, irq=%d.\n",
1324 if (!eicon_mca_find_card(0, membase
, irq
, id
))
1328 card_count
= eicon_addcard(0, membase
, irq
, id
);
1329 #endif /* CONFIG_MCA */
1330 #endif /* CONFIG_ISDN_DRV_EICON_ISA */
1333 card_count
+= eicon_pci_find_card(id
);
1338 #ifndef CONFIG_ISDN_DRV_EICON_ISA
1339 printk(KERN_INFO
"Eicon: Driver is neither ISA nor PCI compiled !\n");
1341 printk(KERN_INFO
"Eicon: No cards defined, driver not loaded !\n");
1344 printk(KERN_INFO
"Eicon: No PCI-cards found, driver not loaded !\n");
1350 printk(KERN_INFO
"Eicon: %d card%s added\n", card_count
,
1351 (card_count
>1)?"s":"");
1352 /* No symbols to export, hide all symbols */
1359 cleanup_module(void)
1361 eicon_card
*card
= cards
;
1367 mca_mark_as_unused (card
->mca_slot
);
1368 mca_set_adapter_procfn(card
->mca_slot
, NULL
, NULL
);
1371 unregister_card(card
);
1378 eicon_freecard(last
);
1380 printk(KERN_INFO
"%s unloaded\n", DRIVERNAME
);
1383 #else /* no module */
1385 #ifdef COMPAT_HAS_NEW_SETUP
1387 eicon_setup(char *line
)
1393 str
= get_options(line
, 4, ints
);
1396 eicon_setup(char *str
, int *ints
))
1403 #ifdef CONFIG_ISDN_DRV_EICON_ISA
1419 strcpy(id
, "eicon");
1421 printk(KERN_INFO
"Eicon ISDN active driver setup (id=%s membase=0x%x irq=%d)\n",
1425 printk(KERN_INFO
"Eicon ISDN active driver setup\n");
1427 #ifdef COMPAT_HAS_NEW_SETUP
1430 __setup("eicon=", eicon_setup
);
1437 #ifdef CONFIG_ISDN_DRV_EICON_ISA
1440 struct eicon_mca_adapters_struct
{
1444 /* possible MCA-brands of eicon cards */
1445 struct eicon_mca_adapters_struct eicon_mca_adapters
[] = {
1446 { "ISDN-P/2 Adapter", 0x6abb },
1447 { "ISDN-[S|SX|SCOM]/2 Adapter", 0x6a93 },
1448 { "DIVA /MCA", 0x6336 },
1452 int eicon_mca_find_card(int type
, /* type-idx of eicon-card */
1455 char * id
) /* name of eicon-isdn-dev */
1457 int j
, curr_slot
= 0;
1461 "eicon_mca_find_card type: %d, membase: %#x, irq %d \n",
1462 type
, membase
, irq
);
1463 /* find a no-driver-assigned eicon card */
1464 for (j
=0; eicon_mca_adapters
[j
].adf_id
!= 0; j
++)
1466 for ( curr_slot
=0; curr_slot
<=MCA_MAX_SLOT_NR
; curr_slot
++)
1468 curr_slot
= mca_find_unused_adapter(
1469 eicon_mca_adapters
[j
].adf_id
, curr_slot
);
1470 if (curr_slot
!= MCA_NOTFOUND
)
1472 /* check if pre-set parameters match
1473 these of the card, check cards memory */
1474 if (!(int) eicon_mca_probe(curr_slot
,
1481 /* means: adapter parms did match */
1485 /* MCA_NOTFOUND-branch: no matching adapter of
1486 THIS flavor found, next flavor */
1490 /* all adapter flavors checked without match, finito with: */
1495 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1496 * stolen from 3c523.c/elmc_getinfo, ewe, 10.5.1999
1498 int eicon_info(char * buf
, int slot
, void *d
)
1501 struct eicon_card
*dev
;
1503 dev
= (struct eicon_card
*) d
;
1507 len
+= sprintf(buf
+len
, "eicon ISDN adapter, type %d.\n",dev
->type
);
1508 len
+= sprintf(buf
+len
, "IRQ: %d\n", dev
->hwif
.isa
.irq
);
1509 len
+= sprintf(buf
+len
, "MEMBASE: %#lx\n", (unsigned long)dev
->hwif
.isa
.shmem
);
1514 int eicon_mca_probe(int slot
, /* slot-nr where the card was detected */
1515 int a_idx
, /* idx-nr of probed card in eicon_mca_adapters */
1518 char * id
) /* name of eicon-isdn-dev */
1520 unsigned char adf_pos0
;
1521 int cards_irq
, cards_membase
, cards_io
;
1522 int type
= EICON_CTYPE_S
;
1523 int irq_array
[]={0,3,4,2};
1524 int irq_array1
[]={3,4,0,0,2,10,11,12};
1526 adf_pos0
= mca_read_stored_pos(slot
,2);
1529 "eicon_mca_probe irq=%d, membase=%d\n",
1533 case 0: /* P/2-Adapter (== PRI/S2M ? ) */
1534 cards_membase
= 0xC0000+((adf_pos0
>>4)*0x4000);
1535 if (membase
== -1) {
1536 membase
= cards_membase
;
1538 if (membase
!= cards_membase
)
1541 cards_irq
=irq_array
[((adf_pos0
& 0xC)>>2)];
1548 cards_io
= 0xC00 + ((adf_pos0
>>4)*0x10);
1549 type
= EICON_CTYPE_ISAPRI
;
1552 case 1: /* [S|SX|SCOM]/2 */
1553 cards_membase
= 0xC0000+((adf_pos0
>>4)*0x2000);
1554 if (membase
== -1) {
1555 membase
= cards_membase
;
1557 if (membase
!= cards_membase
)
1560 cards_irq
=irq_array
[((adf_pos0
& 0xC)>>2)];
1564 if (irq
!= cards_irq
)
1568 cards_io
= 0xC00 + ((adf_pos0
>>4)*0x10);
1569 type
= EICON_CTYPE_SCOM
;
1572 case 2: /* DIVA/MCA */
1573 cards_io
= 0x200+ ((adf_pos0
>>4)* 0x20);
1574 cards_irq
= irq_array1
[(adf_pos0
& 0x7)];
1586 /* Uebereinstimmung vorgegebener membase & irq */
1587 if ( 1 == eicon_addcard(type
, membase
, irq
, id
)) {
1588 mca_set_adapter_name(slot
, eicon_mca_adapters
[a_idx
].name
);
1589 mca_set_adapter_procfn(slot
, (MCA_ProcFn
) eicon_info
, cards
);
1591 mca_mark_as_used(slot
);
1592 cards
->mca_slot
= slot
;
1593 /* card->io noch setzen oder ?? */
1595 printk("eicon_addcard: erfolgreich fuer slot: %d.\n",
1597 return 0 ; /* eicon_addcard hat eine Karte zugefuegt */
1602 #endif /* CONFIG_MCA */
1603 #endif /* CONFIG_ISDN_DRV_EICON_ISA */