2 * $Id: c4.c,v 1.4 2000/02/02 18:36:03 calle Exp $
4 * Module for AVM C4 card.
6 * (c) Copyright 1999 by Carsten Paeth (calle@calle.in-berlin.de)
9 * Revision 1.4 2000/02/02 18:36:03 calle
10 * - Modules are now locked while init_module is running
11 * - fixed problem with memory mapping if address is not aligned
13 * Revision 1.3 2000/01/25 14:37:39 calle
14 * new message after successfull detection including card revision and
17 * Revision 1.2 2000/01/21 20:52:58 keil
18 * pci_find_subsys as local function for 2.2.X kernel
20 * Revision 1.1 2000/01/20 10:51:37 calle
21 * Added driver for C4.
26 #include <linux/config.h>
27 #include <linux/module.h>
28 #include <linux/kernel.h>
29 #include <linux/skbuff.h>
30 #include <linux/delay.h>
32 #include <linux/interrupt.h>
33 #include <linux/ioport.h>
34 #include <linux/pci.h>
35 #include <linux/capi.h>
37 #include <asm/uaccess.h>
43 static char *revision
= "$Revision: 1.4 $";
45 #undef CONFIG_C4_DEBUG
46 #undef CONFIG_C4_POLLDEBUG
48 /* ------------------------------------------------------------- */
50 #ifndef PCI_VENDOR_ID_DEC
51 #define PCI_VENDOR_ID_DEC 0x1011
54 #ifndef PCI_DEVICE_ID_DEC_21285
55 #define PCI_DEVICE_ID_DEC_21285 0x1065
58 #ifndef PCI_VENDOR_ID_AVM
59 #define PCI_VENDOR_ID_AVM 0x1244
62 #ifndef PCI_DEVICE_ID_AVM_C4
63 #define PCI_DEVICE_ID_AVM_C4 0x0800
66 /* ------------------------------------------------------------- */
68 static int suppress_pollack
= 0;
70 MODULE_AUTHOR("Carsten Paeth <calle@calle.in-berlin.de>");
72 MODULE_PARM(suppress_pollack
, "0-1i");
74 /* ------------------------------------------------------------- */
76 static struct capi_driver_interface
*di
;
78 /* ------------------------------------------------------------- */
80 static void c4_dispatch_tx(avmcard
*card
);
82 /* ------------------------------------------------------------- */
84 #define DC21285_DRAM_A0MR 0x40000000
85 #define DC21285_DRAM_A1MR 0x40004000
86 #define DC21285_DRAM_A2MR 0x40008000
87 #define DC21285_DRAM_A3MR 0x4000C000
89 #define CAS_OFFSET 0x88
91 #define DC21285_ARMCSR_BASE 0x42000000
93 #define PCI_OUT_INT_STATUS 0x30
94 #define PCI_OUT_INT_MASK 0x34
95 #define MAILBOX_0 0x50
96 #define MAILBOX_1 0x54
97 #define MAILBOX_2 0x58
98 #define MAILBOX_3 0x5C
100 #define DOORBELL_SETUP 0x64
102 #define CHAN_1_CONTROL 0x90
103 #define CHAN_2_CONTROL 0xB0
104 #define DRAM_TIMING 0x10C
105 #define DRAM_ADDR_SIZE_0 0x110
106 #define DRAM_ADDR_SIZE_1 0x114
107 #define DRAM_ADDR_SIZE_2 0x118
108 #define DRAM_ADDR_SIZE_3 0x11C
109 #define SA_CONTROL 0x13C
110 #define XBUS_CYCLE 0x148
111 #define XBUS_STROBE 0x14C
112 #define DBELL_PCI_MASK 0x150
113 #define DBELL_SA_MASK 0x154
115 #define SDRAM_SIZE 0x1000000
117 /* ------------------------------------------------------------- */
119 #define MBOX_PEEK_POKE MAILBOX_0
121 #define DBELL_ADDR 0x01
122 #define DBELL_DATA 0x02
123 #define DBELL_RNWR 0x40
124 #define DBELL_INIT 0x80
126 /* ------------------------------------------------------------- */
128 #define MBOX_UP_ADDR MAILBOX_0
129 #define MBOX_UP_LEN MAILBOX_1
130 #define MBOX_DOWN_ADDR MAILBOX_2
131 #define MBOX_DOWN_LEN MAILBOX_3
133 #define DBELL_UP_HOST 0x00000100
134 #define DBELL_UP_ARM 0x00000200
135 #define DBELL_DOWN_HOST 0x00000400
136 #define DBELL_DOWN_ARM 0x00000800
137 #define DBELL_RESET_HOST 0x40000000
138 #define DBELL_RESET_ARM 0x80000000
140 /* ------------------------------------------------------------- */
142 #define DRAM_TIMING_DEF 0x001A01A5
143 #define DRAM_AD_SZ_DEF0 0x00000045
144 #define DRAM_AD_SZ_NULL 0x00000000
146 #define SA_CTL_ALLRIGHT 0x64AA0271
148 #define INIT_XBUS_CYCLE 0x100016DB
149 #define INIT_XBUS_STROBE 0xF1F1F1F1
151 /* ------------------------------------------------------------- */
153 #define RESET_TIMEOUT (15*HZ) /* 15 sec */
154 #define PEEK_POKE_TIMEOUT (HZ/10) /* 0.1 sec */
156 /* ------------------------------------------------------------- */
158 #define c4outmeml(addr, value) writel(value, addr)
159 #define c4inmeml(addr) readl(addr)
160 #define c4outmemw(addr, value) writew(value, addr)
161 #define c4inmemw(addr) readw(addr)
162 #define c4outmemb(addr, value) writeb(value, addr)
163 #define c4inmemb(addr) readb(addr)
165 /* ------------------------------------------------------------- */
167 static inline int wait_for_doorbell(avmcard
*card
, unsigned long t
)
172 while (c4inmeml(card
->mbase
+DOORBELL
) != 0xffffffff) {
173 if (!time_before(jiffies
, stop
))
179 static int c4_poke(avmcard
*card
, unsigned long off
, unsigned long value
)
182 if (wait_for_doorbell(card
, HZ
/10) < 0)
185 c4outmeml(card
->mbase
+MBOX_PEEK_POKE
, off
);
186 c4outmeml(card
->mbase
+DOORBELL
, DBELL_ADDR
);
188 if (wait_for_doorbell(card
, HZ
/10) < 0)
191 c4outmeml(card
->mbase
+MBOX_PEEK_POKE
, value
);
192 c4outmeml(card
->mbase
+DOORBELL
, DBELL_DATA
| DBELL_ADDR
);
197 static int c4_peek(avmcard
*card
, unsigned long off
, unsigned long *valuep
)
199 if (wait_for_doorbell(card
, HZ
/10) < 0)
202 c4outmeml(card
->mbase
+MBOX_PEEK_POKE
, off
);
203 c4outmeml(card
->mbase
+DOORBELL
, DBELL_RNWR
| DBELL_ADDR
);
205 if (wait_for_doorbell(card
, HZ
/10) < 0)
208 *valuep
= c4inmeml(card
->mbase
+MBOX_PEEK_POKE
);
213 /* ------------------------------------------------------------- */
215 static int c4_load_t4file(avmcard
*card
, capiloaddatapart
* t4file
)
224 while (left
>= sizeof(__u32
)) {
226 retval
= copy_from_user(&val
, dp
, sizeof(val
));
230 memcpy(&val
, dp
, sizeof(val
));
232 if (c4_poke(card
, loadoff
, val
)) {
233 printk(KERN_ERR
"%s: corrupted firmware file ?\n",
237 left
-= sizeof(__u32
);
239 loadoff
+= sizeof(__u32
);
244 retval
= copy_from_user(&val
, dp
, left
);
248 memcpy(&val
, dp
, left
);
250 if (c4_poke(card
, loadoff
, val
)) {
251 printk(KERN_ERR
"%s: corrupted firmware file ?\n",
259 /* ------------------------------------------------------------- */
261 static inline void _put_byte(void **pp
, __u8 val
)
268 static inline void _put_word(void **pp
, __u32 val
)
272 *s
++ = (val
>> 8) & 0xff;
273 *s
++ = (val
>> 16) & 0xff;
274 *s
++ = (val
>> 24) & 0xff;
278 static inline void _put_slice(void **pp
, unsigned char *dp
, unsigned int len
)
283 _put_byte(pp
, *dp
++);
286 static inline __u8
_get_byte(void **pp
)
295 static inline __u32
_get_word(void **pp
)
307 static inline __u32
_get_slice(void **pp
, unsigned char *dp
)
311 len
= i
= _get_word(pp
);
312 while (i
-- > 0) *dp
++ = _get_byte(pp
);
316 /* ------------------------------------------------------------- */
318 static void c4_reset(avmcard
*card
)
322 c4outmeml(card
->mbase
+DOORBELL
, DBELL_RESET_ARM
);
324 stop
= jiffies
+ HZ
*10;
325 while (c4inmeml(card
->mbase
+DOORBELL
) != 0xffffffff) {
326 if (!time_before(jiffies
, stop
))
328 c4outmeml(card
->mbase
+DOORBELL
, DBELL_ADDR
);
331 c4_poke(card
, DC21285_ARMCSR_BASE
+ CHAN_1_CONTROL
, 0);
332 c4_poke(card
, DC21285_ARMCSR_BASE
+ CHAN_2_CONTROL
, 0);
335 /* ------------------------------------------------------------- */
337 static int c4_detect(avmcard
*card
)
339 unsigned long stop
, dummy
;
341 c4outmeml(card
->mbase
+PCI_OUT_INT_MASK
, 0x0c);
342 if (c4inmeml(card
->mbase
+PCI_OUT_INT_MASK
) != 0x0c)
345 c4outmeml(card
->mbase
+DOORBELL
, DBELL_RESET_ARM
);
347 stop
= jiffies
+ HZ
*10;
348 while (c4inmeml(card
->mbase
+DOORBELL
) != 0xffffffff) {
349 if (!time_before(jiffies
, stop
))
351 c4outmeml(card
->mbase
+DOORBELL
, DBELL_ADDR
);
354 c4_poke(card
, DC21285_ARMCSR_BASE
+ CHAN_1_CONTROL
, 0);
355 c4_poke(card
, DC21285_ARMCSR_BASE
+ CHAN_2_CONTROL
, 0);
357 c4outmeml(card
->mbase
+MAILBOX_0
, 0x55aa55aa);
358 if (c4inmeml(card
->mbase
+MAILBOX_0
) != 0x55aa55aa) return 3;
360 c4outmeml(card
->mbase
+MAILBOX_0
, 0xaa55aa55);
361 if (c4inmeml(card
->mbase
+MAILBOX_0
) != 0xaa55aa55) return 4;
363 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DBELL_SA_MASK
, 0)) return 5;
364 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DBELL_PCI_MASK
, 0)) return 6;
365 if (c4_poke(card
, DC21285_ARMCSR_BASE
+SA_CONTROL
, SA_CTL_ALLRIGHT
))
367 if (c4_poke(card
, DC21285_ARMCSR_BASE
+XBUS_CYCLE
, INIT_XBUS_CYCLE
))
369 if (c4_poke(card
, DC21285_ARMCSR_BASE
+XBUS_STROBE
, INIT_XBUS_STROBE
))
371 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_TIMING
, 0)) return 9;
375 if (c4_peek(card
, DC21285_DRAM_A0MR
, &dummy
)) return 10;
376 if (c4_peek(card
, DC21285_DRAM_A1MR
, &dummy
)) return 11;
377 if (c4_peek(card
, DC21285_DRAM_A2MR
, &dummy
)) return 12;
378 if (c4_peek(card
, DC21285_DRAM_A3MR
, &dummy
)) return 13;
380 if (c4_poke(card
, DC21285_DRAM_A0MR
+CAS_OFFSET
, 0)) return 14;
381 if (c4_poke(card
, DC21285_DRAM_A1MR
+CAS_OFFSET
, 0)) return 15;
382 if (c4_poke(card
, DC21285_DRAM_A2MR
+CAS_OFFSET
, 0)) return 16;
383 if (c4_poke(card
, DC21285_DRAM_A3MR
+CAS_OFFSET
, 0)) return 17;
387 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_TIMING
, DRAM_TIMING_DEF
))
390 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_ADDR_SIZE_0
,DRAM_AD_SZ_DEF0
))
392 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_ADDR_SIZE_1
,DRAM_AD_SZ_NULL
))
394 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_ADDR_SIZE_2
,DRAM_AD_SZ_NULL
))
396 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_ADDR_SIZE_3
,DRAM_AD_SZ_NULL
))
399 /* Transputer test */
401 if ( c4_poke(card
, 0x000000, 0x11111111)
402 || c4_poke(card
, 0x400000, 0x22222222)
403 || c4_poke(card
, 0x800000, 0x33333333)
404 || c4_poke(card
, 0xC00000, 0x44444444))
407 if ( c4_peek(card
, 0x000000, &dummy
) || dummy
!= 0x11111111
408 || c4_peek(card
, 0x400000, &dummy
) || dummy
!= 0x22222222
409 || c4_peek(card
, 0x800000, &dummy
) || dummy
!= 0x33333333
410 || c4_peek(card
, 0xC00000, &dummy
) || dummy
!= 0x44444444)
413 if ( c4_poke(card
, 0x000000, 0x55555555)
414 || c4_poke(card
, 0x400000, 0x66666666)
415 || c4_poke(card
, 0x800000, 0x77777777)
416 || c4_poke(card
, 0xC00000, 0x88888888))
419 if ( c4_peek(card
, 0x000000, &dummy
) || dummy
!= 0x55555555
420 || c4_peek(card
, 0x400000, &dummy
) || dummy
!= 0x66666666
421 || c4_peek(card
, 0x800000, &dummy
) || dummy
!= 0x77777777
422 || c4_peek(card
, 0xC00000, &dummy
) || dummy
!= 0x88888888)
428 /* ------------------------------------------------------------- */
430 static void c4_dispatch_tx(avmcard
*card
)
432 avmcard_dmainfo
*dma
= card
->dma
;
443 if (card
->csr
& DBELL_DOWN_ARM
) { /* tx busy */
444 restore_flags(flags
);
448 skb
= skb_dequeue(&dma
->send_queue
);
450 #ifdef CONFIG_C4_DEBUG
451 printk(KERN_DEBUG
"%s: tx underrun\n", card
->name
);
453 restore_flags(flags
);
457 len
= CAPIMSG_LEN(skb
->data
);
460 cmd
= CAPIMSG_COMMAND(skb
->data
);
461 subcmd
= CAPIMSG_SUBCOMMAND(skb
->data
);
465 if (CAPICMD(cmd
, subcmd
) == CAPI_DATA_B3_REQ
) {
466 __u16 dlen
= CAPIMSG_DATALEN(skb
->data
);
467 _put_byte(&p
, SEND_DATA_B3_REQ
);
468 _put_slice(&p
, skb
->data
, len
);
469 _put_slice(&p
, skb
->data
+ len
, dlen
);
471 _put_byte(&p
, SEND_MESSAGE
);
472 _put_slice(&p
, skb
->data
, len
);
474 txlen
= (__u8
*)p
- (__u8
*)dma
->sendbuf
;
475 #ifdef CONFIG_C4_DEBUG
476 printk(KERN_DEBUG
"%s: tx put msg len=%d\n", card
->name
, txlen
);
480 #ifdef CONFIG_C4_POLLDEBUG
481 if (skb
->data
[2] == SEND_POLLACK
)
482 printk(KERN_INFO
"%s: ack to c4\n", card
->name
);
484 #ifdef CONFIG_C4_DEBUG
485 printk(KERN_DEBUG
"%s: tx put 0x%x len=%d\n",
486 card
->name
, skb
->data
[2], txlen
);
488 memcpy(dma
->sendbuf
, skb
->data
+2, skb
->len
-2);
490 txlen
= (txlen
+ 3) & ~3;
492 c4outmeml(card
->mbase
+MBOX_DOWN_ADDR
, virt_to_phys(dma
->sendbuf
));
493 c4outmeml(card
->mbase
+MBOX_DOWN_LEN
, txlen
);
495 card
->csr
|= DBELL_DOWN_ARM
;
497 c4outmeml(card
->mbase
+DOORBELL
, DBELL_DOWN_ARM
);
499 restore_flags(flags
);
503 /* ------------------------------------------------------------- */
505 static void queue_pollack(avmcard
*card
)
510 skb
= alloc_skb(3, GFP_ATOMIC
);
512 printk(KERN_CRIT
"%s: no memory, lost poll ack\n",
519 _put_byte(&p
, SEND_POLLACK
);
520 skb_put(skb
, (__u8
*)p
- (__u8
*)skb
->data
);
522 skb_queue_tail(&card
->dma
->send_queue
, skb
);
523 c4_dispatch_tx(card
);
526 /* ------------------------------------------------------------- */
528 static void c4_handle_rx(avmcard
*card
)
530 avmcard_dmainfo
*dma
= card
->dma
;
531 struct capi_ctr
*ctrl
;
534 void *p
= dma
->recvbuf
;
535 __u32 ApplId
, MsgLen
, DataB3Len
, NCCI
, WindowSize
;
536 __u8 b1cmd
= _get_byte(&p
);
540 #ifdef CONFIG_C4_DEBUG
541 printk(KERN_DEBUG
"%s: rx 0x%x len=%lu\n", card
->name
,
542 b1cmd
, (unsigned long)dma
->recvlen
);
546 case RECEIVE_DATA_B3_IND
:
548 ApplId
= (unsigned) _get_word(&p
);
549 MsgLen
= _get_slice(&p
, card
->msgbuf
);
550 DataB3Len
= _get_slice(&p
, card
->databuf
);
551 cidx
= CAPIMSG_CONTROLLER(card
->msgbuf
)-card
->cardnr
;
552 if (cidx
> 3) cidx
= 0;
553 ctrl
= card
->ctrlinfo
[cidx
].capi_ctrl
;
555 if (MsgLen
< 30) { /* not CAPI 64Bit */
556 memset(card
->msgbuf
+MsgLen
, 0, 30-MsgLen
);
558 CAPIMSG_SETLEN(card
->msgbuf
, 30);
560 if (!(skb
= alloc_skb(DataB3Len
+MsgLen
, GFP_ATOMIC
))) {
561 printk(KERN_ERR
"%s: incoming packet dropped\n",
564 memcpy(skb_put(skb
, MsgLen
), card
->msgbuf
, MsgLen
);
565 memcpy(skb_put(skb
, DataB3Len
), card
->databuf
, DataB3Len
);
566 ctrl
->handle_capimsg(ctrl
, ApplId
, skb
);
570 case RECEIVE_MESSAGE
:
572 ApplId
= (unsigned) _get_word(&p
);
573 MsgLen
= _get_slice(&p
, card
->msgbuf
);
574 cidx
= CAPIMSG_CONTROLLER(card
->msgbuf
)-card
->cardnr
;
575 if (cidx
> 3) cidx
= 0;
576 ctrl
= card
->ctrlinfo
[cidx
].capi_ctrl
;
578 if (!(skb
= alloc_skb(MsgLen
, GFP_ATOMIC
))) {
579 printk(KERN_ERR
"%s: incoming packet dropped\n",
582 memcpy(skb_put(skb
, MsgLen
), card
->msgbuf
, MsgLen
);
583 ctrl
->handle_capimsg(ctrl
, ApplId
, skb
);
587 case RECEIVE_NEW_NCCI
:
589 ApplId
= _get_word(&p
);
590 NCCI
= _get_word(&p
);
591 WindowSize
= _get_word(&p
);
592 cidx
= (NCCI
&0x7f) - card
->cardnr
;
593 if (cidx
> 3) cidx
= 0;
594 ctrl
= card
->ctrlinfo
[cidx
].capi_ctrl
;
596 ctrl
->new_ncci(ctrl
, ApplId
, NCCI
, WindowSize
);
600 case RECEIVE_FREE_NCCI
:
602 ApplId
= _get_word(&p
);
603 NCCI
= _get_word(&p
);
605 if (NCCI
!= 0xffffffff) {
606 cidx
= (NCCI
&0x7f) - card
->cardnr
;
607 if (cidx
> 3) cidx
= 0;
608 ctrl
= card
->ctrlinfo
[cidx
].capi_ctrl
;
609 ctrl
->free_ncci(ctrl
, ApplId
, NCCI
);
611 for (cidx
=0; cidx
< 4; cidx
++) {
612 ctrl
= card
->ctrlinfo
[cidx
].capi_ctrl
;
613 ctrl
->appl_released(ctrl
, ApplId
);
619 #ifdef CONFIG_C4_POLLDEBUG
620 printk(KERN_INFO
"%s: poll from c4\n", card
->name
);
622 if (!suppress_pollack
)
624 for (cidx
=0; cidx
< 4; cidx
++) {
625 ctrl
= card
->ctrlinfo
[cidx
].capi_ctrl
;
626 ctrl
->resume_output(ctrl
);
631 for (cidx
=0; cidx
< 4; cidx
++) {
632 ctrl
= card
->ctrlinfo
[cidx
].capi_ctrl
;
633 ctrl
->suspend_output(ctrl
);
639 cidx
= card
->nlogcontr
++;
640 cinfo
= &card
->ctrlinfo
[cidx
];
641 ctrl
= cinfo
->capi_ctrl
;
642 cinfo
->versionlen
= _get_slice(&p
, cinfo
->versionbuf
);
643 b1_parse_version(cinfo
);
644 printk(KERN_INFO
"%s: %s-card (%s) now active\n",
646 cinfo
->version
[VER_CARDTYPE
],
647 cinfo
->version
[VER_DRIVER
]);
648 ctrl
->ready(cinfo
->capi_ctrl
);
651 case RECEIVE_TASK_READY
:
652 ApplId
= (unsigned) _get_word(&p
);
653 MsgLen
= _get_slice(&p
, card
->msgbuf
);
654 card
->msgbuf
[MsgLen
--] = 0;
656 && ( card
->msgbuf
[MsgLen
] == '\n'
657 || card
->msgbuf
[MsgLen
] == '\r'))
658 card
->msgbuf
[MsgLen
--] = 0;
659 printk(KERN_INFO
"%s: task %d \"%s\" ready.\n",
660 card
->name
, ApplId
, card
->msgbuf
);
663 case RECEIVE_DEBUGMSG
:
664 MsgLen
= _get_slice(&p
, card
->msgbuf
);
665 card
->msgbuf
[MsgLen
--] = 0;
667 && ( card
->msgbuf
[MsgLen
] == '\n'
668 || card
->msgbuf
[MsgLen
] == '\r'))
669 card
->msgbuf
[MsgLen
--] = 0;
670 printk(KERN_INFO
"%s: DEBUG: %s\n", card
->name
, card
->msgbuf
);
674 printk(KERN_ERR
"%s: c4_interrupt: 0x%x ???\n",
680 /* ------------------------------------------------------------- */
682 static void c4_handle_interrupt(avmcard
*card
)
684 __u32 status
= c4inmeml(card
->mbase
+DOORBELL
);
686 if (status
& DBELL_RESET_HOST
) {
688 c4outmeml(card
->mbase
+PCI_OUT_INT_MASK
, 0x0c);
689 printk(KERN_ERR
"%s: unexpected reset\n", card
->name
);
690 for (i
=0; i
< 4; i
++) {
691 avmctrl_info
*cinfo
= &card
->ctrlinfo
[i
];
692 memset(cinfo
->version
, 0, sizeof(cinfo
->version
));
693 if (cinfo
->capi_ctrl
)
694 cinfo
->capi_ctrl
->reseted(cinfo
->capi_ctrl
);
699 status
&= (DBELL_UP_HOST
| DBELL_DOWN_HOST
);
702 c4outmeml(card
->mbase
+DOORBELL
, status
);
704 if ((status
& DBELL_UP_HOST
) != 0) {
705 card
->dma
->recvlen
= c4inmeml(card
->mbase
+MBOX_UP_LEN
);
706 c4outmeml(card
->mbase
+MBOX_UP_LEN
, 0);
708 card
->dma
->recvlen
= 0;
709 c4outmeml(card
->mbase
+MBOX_UP_LEN
, sizeof(card
->dma
->recvbuf
));
710 c4outmeml(card
->mbase
+DOORBELL
, DBELL_UP_ARM
);
713 if ((status
& DBELL_DOWN_HOST
) != 0) {
714 card
->csr
&= ~DBELL_DOWN_ARM
;
715 c4_dispatch_tx(card
);
716 } else if (card
->csr
& DBELL_DOWN_HOST
) {
717 if (c4inmeml(card
->mbase
+MBOX_DOWN_LEN
) == 0) {
718 card
->csr
&= ~DBELL_DOWN_ARM
;
719 c4_dispatch_tx(card
);
724 static void c4_interrupt(int interrupt
, void *devptr
, struct pt_regs
*regs
)
728 card
= (avmcard
*) devptr
;
731 printk(KERN_WARNING
"%s: interrupt: wrong device\n", card
->name
);
734 if (card
->interrupt
) {
735 printk(KERN_ERR
"%s: reentering interrupt hander\n",
742 c4_handle_interrupt(card
);
747 /* ------------------------------------------------------------- */
749 static void c4_send_init(avmcard
*card
)
754 skb
= alloc_skb(15, GFP_ATOMIC
);
756 printk(KERN_CRIT
"%s: no memory, lost register appl.\n",
763 _put_byte(&p
, SEND_INIT
);
764 _put_word(&p
, AVM_NAPPS
);
765 _put_word(&p
, AVM_NCCI_PER_CHANNEL
*30);
766 _put_word(&p
, card
->cardnr
- 1);
767 skb_put(skb
, (__u8
*)p
- (__u8
*)skb
->data
);
769 skb_queue_tail(&card
->dma
->send_queue
, skb
);
770 c4_dispatch_tx(card
);
773 static int c4_send_config(avmcard
*card
, capiloaddatapart
* config
)
776 __u8 val
[sizeof(__u32
)];
781 skb
= alloc_skb(12 + ((config
->len
+3)/4)*5, GFP_ATOMIC
);
783 printk(KERN_CRIT
"%s: no memory, can't send config.\n",
790 _put_byte(&p
, SEND_CONFIG
);
792 _put_byte(&p
, SEND_CONFIG
);
793 _put_word(&p
, config
->len
); /* 12 */
797 while (left
>= sizeof(__u32
)) {
799 retval
= copy_from_user(val
, dp
, sizeof(val
));
805 memcpy(val
, dp
, sizeof(val
));
807 _put_byte(&p
, SEND_CONFIG
);
808 _put_byte(&p
, val
[0]);
809 _put_byte(&p
, val
[1]);
810 _put_byte(&p
, val
[2]);
811 _put_byte(&p
, val
[3]);
816 memset(val
, 0, sizeof(val
));
818 retval
= copy_from_user(&val
, dp
, left
);
824 memcpy(&val
, dp
, left
);
826 _put_byte(&p
, SEND_CONFIG
);
827 _put_byte(&p
, val
[0]);
828 _put_byte(&p
, val
[1]);
829 _put_byte(&p
, val
[2]);
830 _put_byte(&p
, val
[3]);
833 skb_put(skb
, (__u8
*)p
- (__u8
*)skb
->data
);
835 skb_queue_tail(&card
->dma
->send_queue
, skb
);
836 c4_dispatch_tx(card
);
841 static int c4_load_firmware(struct capi_ctr
*ctrl
, capiloaddata
*data
)
843 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
844 avmcard
*card
= cinfo
->card
;
848 if ((retval
= c4_load_t4file(card
, &data
->firmware
))) {
849 printk(KERN_ERR
"%s: failed to load t4file!!\n",
859 c4outmeml(card
->mbase
+MBOX_UP_LEN
, 0);
860 c4outmeml(card
->mbase
+MBOX_DOWN_LEN
, 0);
861 c4outmeml(card
->mbase
+DOORBELL
, DBELL_INIT
);
863 c4outmeml(card
->mbase
+DOORBELL
,
864 DBELL_UP_HOST
| DBELL_DOWN_HOST
| DBELL_RESET_HOST
);
866 c4outmeml(card
->mbase
+PCI_OUT_INT_MASK
, 0x08);
868 card
->dma
->recvlen
= 0;
869 c4outmeml(card
->mbase
+MBOX_UP_ADDR
, virt_to_phys(card
->dma
->recvbuf
));
870 c4outmeml(card
->mbase
+MBOX_UP_LEN
, sizeof(card
->dma
->recvbuf
));
871 c4outmeml(card
->mbase
+DOORBELL
, DBELL_UP_ARM
);
872 restore_flags(flags
);
874 if (data
->configuration
.len
> 0 && data
->configuration
.data
)
875 c4_send_config(card
, &data
->configuration
);
883 void c4_reset_ctr(struct capi_ctr
*ctrl
)
885 avmcard
*card
= ((avmctrl_info
*)(ctrl
->driverdata
))->card
;
891 for (i
=0; i
< 4; i
++) {
892 cinfo
= &card
->ctrlinfo
[i
];
893 memset(cinfo
->version
, 0, sizeof(cinfo
->version
));
894 if (cinfo
->capi_ctrl
)
895 cinfo
->capi_ctrl
->reseted(cinfo
->capi_ctrl
);
899 static void c4_remove_ctr(struct capi_ctr
*ctrl
)
901 avmcard
*card
= ((avmctrl_info
*)(ctrl
->driverdata
))->card
;
907 for (i
=0; i
<= 4; i
++) {
908 cinfo
= &card
->ctrlinfo
[i
];
909 if (cinfo
->capi_ctrl
)
910 di
->detach_ctr(cinfo
->capi_ctrl
);
913 free_irq(card
->irq
, card
);
914 iounmap((void *) (((unsigned long) card
->mbase
) & PAGE_MASK
));
915 release_region(card
->port
, AVMB1_PORTLEN
);
916 ctrl
->driverdata
= 0;
917 kfree(card
->ctrlinfo
);
924 /* ------------------------------------------------------------- */
927 void c4_register_appl(struct capi_ctr
*ctrl
,
929 capi_register_params
*rp
)
931 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
932 avmcard
*card
= cinfo
->card
;
934 int want
= rp
->level3cnt
;
938 if (ctrl
->cnr
== card
->cardnr
) {
940 if (want
> 0) nconn
= want
;
941 else nconn
= ctrl
->profile
.nbchannel
* 4 * -want
;
942 if (nconn
== 0) nconn
= ctrl
->profile
.nbchannel
* 4;
944 skb
= alloc_skb(23, GFP_ATOMIC
);
946 printk(KERN_CRIT
"%s: no memory, lost register appl.\n",
953 _put_byte(&p
, SEND_REGISTER
);
955 _put_word(&p
, 1024 * (nconn
+1));
956 _put_word(&p
, nconn
);
957 _put_word(&p
, rp
->datablkcnt
);
958 _put_word(&p
, rp
->datablklen
);
959 skb_put(skb
, (__u8
*)p
- (__u8
*)skb
->data
);
961 skb_queue_tail(&card
->dma
->send_queue
, skb
);
962 c4_dispatch_tx(card
);
965 ctrl
->appl_registered(ctrl
, appl
);
968 /* ------------------------------------------------------------- */
970 void c4_release_appl(struct capi_ctr
*ctrl
, __u16 appl
)
972 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
973 avmcard
*card
= cinfo
->card
;
977 if (ctrl
->cnr
== card
->cardnr
) {
978 skb
= alloc_skb(7, GFP_ATOMIC
);
980 printk(KERN_CRIT
"%s: no memory, lost release appl.\n",
987 _put_byte(&p
, SEND_RELEASE
);
990 skb_put(skb
, (__u8
*)p
- (__u8
*)skb
->data
);
991 skb_queue_tail(&card
->dma
->send_queue
, skb
);
992 c4_dispatch_tx(card
);
996 /* ------------------------------------------------------------- */
999 static void c4_send_message(struct capi_ctr
*ctrl
, struct sk_buff
*skb
)
1001 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
1002 avmcard
*card
= cinfo
->card
;
1003 skb_queue_tail(&card
->dma
->send_queue
, skb
);
1004 c4_dispatch_tx(card
);
1007 /* ------------------------------------------------------------- */
1009 static char *c4_procinfo(struct capi_ctr
*ctrl
)
1011 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
1015 sprintf(cinfo
->infobuf
, "%s %s 0x%x %d 0x%lx",
1016 cinfo
->cardname
[0] ? cinfo
->cardname
: "-",
1017 cinfo
->version
[VER_DRIVER
] ? cinfo
->version
[VER_DRIVER
] : "-",
1018 cinfo
->card
? cinfo
->card
->port
: 0x0,
1019 cinfo
->card
? cinfo
->card
->irq
: 0,
1020 cinfo
->card
? cinfo
->card
->membase
: 0
1022 return cinfo
->infobuf
;
1025 static int c4_read_proc(char *page
, char **start
, off_t off
,
1026 int count
, int *eof
, struct capi_ctr
*ctrl
)
1028 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
1029 avmcard
*card
= cinfo
->card
;
1034 len
+= sprintf(page
+len
, "%-16s %s\n", "name", card
->name
);
1035 len
+= sprintf(page
+len
, "%-16s 0x%x\n", "io", card
->port
);
1036 len
+= sprintf(page
+len
, "%-16s %d\n", "irq", card
->irq
);
1037 len
+= sprintf(page
+len
, "%-16s 0x%lx\n", "membase", card
->membase
);
1038 switch (card
->cardtype
) {
1039 case avm_b1isa
: s
= "B1 ISA"; break;
1040 case avm_b1pci
: s
= "B1 PCI"; break;
1041 case avm_b1pcmcia
: s
= "B1 PCMCIA"; break;
1042 case avm_m1
: s
= "M1"; break;
1043 case avm_m2
: s
= "M2"; break;
1044 case avm_t1isa
: s
= "T1 ISA (HEMA)"; break;
1045 case avm_t1pci
: s
= "T1 PCI"; break;
1046 case avm_c4
: s
= "C4"; break;
1047 default: s
= "???"; break;
1049 len
+= sprintf(page
+len
, "%-16s %s\n", "type", s
);
1050 if ((s
= cinfo
->version
[VER_DRIVER
]) != 0)
1051 len
+= sprintf(page
+len
, "%-16s %s\n", "ver_driver", s
);
1052 if ((s
= cinfo
->version
[VER_CARDTYPE
]) != 0)
1053 len
+= sprintf(page
+len
, "%-16s %s\n", "ver_cardtype", s
);
1054 if ((s
= cinfo
->version
[VER_SERIAL
]) != 0)
1055 len
+= sprintf(page
+len
, "%-16s %s\n", "ver_serial", s
);
1057 if (card
->cardtype
!= avm_m1
) {
1058 flag
= ((__u8
*)(ctrl
->profile
.manu
))[3];
1060 len
+= sprintf(page
+len
, "%-16s%s%s%s%s%s%s%s\n",
1062 (flag
& 0x01) ? " DSS1" : "",
1063 (flag
& 0x02) ? " CT1" : "",
1064 (flag
& 0x04) ? " VN3" : "",
1065 (flag
& 0x08) ? " NI1" : "",
1066 (flag
& 0x10) ? " AUSTEL" : "",
1067 (flag
& 0x20) ? " ESS" : "",
1068 (flag
& 0x40) ? " 1TR6" : ""
1071 if (card
->cardtype
!= avm_m1
) {
1072 flag
= ((__u8
*)(ctrl
->profile
.manu
))[5];
1074 len
+= sprintf(page
+len
, "%-16s%s%s%s%s\n",
1076 (flag
& 0x01) ? " point to point" : "",
1077 (flag
& 0x02) ? " point to multipoint" : "",
1078 (flag
& 0x08) ? " leased line without D-channel" : "",
1079 (flag
& 0x04) ? " leased line with D-channel" : ""
1082 len
+= sprintf(page
+len
, "%-16s %s\n", "cardname", cinfo
->cardname
);
1084 if (off
+count
>= len
)
1088 *start
= page
+ off
;
1089 return ((count
< len
-off
) ? count
: len
-off
);
1092 /* ------------------------------------------------------------- */
1094 static int c4_add_card(struct capi_driver
*driver
, struct capicardparams
*p
)
1096 unsigned long base
, page_offset
;
1097 avmctrl_info
*cinfo
;
1104 card
= (avmcard
*) kmalloc(sizeof(avmcard
), GFP_ATOMIC
);
1107 printk(KERN_WARNING
"%s: no memory.\n", driver
->name
);
1111 memset(card
, 0, sizeof(avmcard
));
1112 card
->dma
= (avmcard_dmainfo
*) kmalloc(sizeof(avmcard_dmainfo
), GFP_ATOMIC
);
1114 printk(KERN_WARNING
"%s: no memory.\n", driver
->name
);
1119 memset(card
->dma
, 0, sizeof(avmcard_dmainfo
));
1120 cinfo
= (avmctrl_info
*) kmalloc(sizeof(avmctrl_info
)*4, GFP_ATOMIC
);
1122 printk(KERN_WARNING
"%s: no memory.\n", driver
->name
);
1123 kfree(card
->ctrlinfo
);
1129 memset(cinfo
, 0, sizeof(avmctrl_info
)*4);
1130 card
->ctrlinfo
= cinfo
;
1131 for (i
=0; i
< 4; i
++) {
1132 cinfo
= &card
->ctrlinfo
[i
];
1135 sprintf(card
->name
, "c4-%x", p
->port
);
1136 card
->port
= p
->port
;
1138 card
->membase
= p
->membase
;
1139 card
->cardtype
= avm_c4
;
1141 if (check_region(card
->port
, AVMB1_PORTLEN
)) {
1143 "%s: ports 0x%03x-0x%03x in use.\n",
1144 driver
->name
, card
->port
, card
->port
+ AVMB1_PORTLEN
);
1145 kfree(card
->ctrlinfo
);
1152 base
= card
->membase
& PAGE_MASK
;
1153 page_offset
= card
->membase
- base
;
1154 card
->mbase
= ioremap_nocache(base
, page_offset
+ 128);
1156 card
->mbase
+= page_offset
;
1158 printk(KERN_NOTICE
"%s: can't remap memory at 0x%lx\n",
1159 driver
->name
, card
->membase
);
1160 kfree(card
->ctrlinfo
);
1167 if ((retval
= c4_detect(card
)) != 0) {
1168 printk(KERN_NOTICE
"%s: NO card at 0x%x (%d)\n",
1169 driver
->name
, card
->port
, retval
);
1170 iounmap((void *) (((unsigned long) card
->mbase
) & PAGE_MASK
));
1171 kfree(card
->ctrlinfo
);
1179 request_region(p
->port
, AVMB1_PORTLEN
, card
->name
);
1181 retval
= request_irq(card
->irq
, c4_interrupt
, SA_SHIRQ
, card
->name
, card
);
1183 printk(KERN_ERR
"%s: unable to get IRQ %d.\n",
1184 driver
->name
, card
->irq
);
1185 iounmap((void *) (((unsigned long) card
->mbase
) & PAGE_MASK
));
1186 release_region(card
->port
, AVMB1_PORTLEN
);
1187 kfree(card
->ctrlinfo
);
1194 for (i
=0; i
< 4; i
++) {
1195 cinfo
= &card
->ctrlinfo
[i
];
1197 cinfo
->capi_ctrl
= di
->attach_ctr(driver
, card
->name
, cinfo
);
1198 if (!cinfo
->capi_ctrl
) {
1199 printk(KERN_ERR
"%s: attach controller failed (%d).\n",
1201 for (i
--; i
>= 0; i
--) {
1202 cinfo
= &card
->ctrlinfo
[i
];
1203 di
->detach_ctr(cinfo
->capi_ctrl
);
1205 iounmap((void *) (((unsigned long) card
->mbase
) & PAGE_MASK
));
1206 free_irq(card
->irq
, card
);
1207 release_region(card
->port
, AVMB1_PORTLEN
);
1209 kfree(card
->ctrlinfo
);
1215 card
->cardnr
= cinfo
->capi_ctrl
->cnr
;
1218 skb_queue_head_init(&card
->dma
->send_queue
);
1221 "%s: AVM C4 at i/o %#x, irq %d, mem %#lx\n",
1222 driver
->name
, card
->port
, card
->irq
, card
->membase
);
1227 /* ------------------------------------------------------------- */
1229 static struct capi_driver c4_driver
= {
1241 0, /* use standard driver_read_proc */
1243 0, /* no add_card function */
1247 #define c4_init init_module
1248 void cleanup_module(void);
1252 static int ncards
= 0;
1256 struct capi_driver
*driver
= &c4_driver
;
1257 struct pci_dev
*dev
= NULL
;
1261 if ((p
= strchr(revision
, ':'))) {
1262 strncpy(driver
->revision
, p
+ 1, sizeof(driver
->revision
));
1263 p
= strchr(driver
->revision
, '$');
1267 printk(KERN_INFO
"%s: revision %s\n", driver
->name
, driver
->revision
);
1269 di
= attach_capi_driver(driver
);
1272 printk(KERN_ERR
"%s: failed to attach capi_driver\n",
1278 if (!pci_present()) {
1279 printk(KERN_ERR
"%s: no PCI bus present\n", driver
->name
);
1280 detach_capi_driver(driver
);
1284 while ((dev
= pci_find_subsys(
1285 PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_21285
,
1286 PCI_VENDOR_ID_AVM
, PCI_DEVICE_ID_AVM_C4
, dev
))) {
1287 struct capicardparams param
;
1289 param
.port
= dev
->resource
[ 1].start
& PCI_BASE_ADDRESS_IO_MASK
;
1290 param
.irq
= dev
->irq
;
1291 param
.membase
= dev
->resource
[ 0].start
& PCI_BASE_ADDRESS_MEM_MASK
;
1294 "%s: PCI BIOS reports AVM-C4 at i/o %#x, irq %d, mem %#x\n",
1295 driver
->name
, param
.port
, param
.irq
, param
.membase
);
1296 retval
= c4_add_card(driver
, ¶m
);
1299 "%s: no AVM-C4 at i/o %#x, irq %d detected, mem %#x\n",
1300 driver
->name
, param
.port
, param
.irq
, param
.membase
);
1309 printk(KERN_INFO
"%s: %d C4 card(s) detected\n",
1310 driver
->name
, ncards
);
1313 printk(KERN_ERR
"%s: NO C4 card detected\n", driver
->name
);
1316 printk(KERN_ERR
"%s: kernel not compiled with PCI.\n", driver
->name
);
1322 void cleanup_module(void)
1324 detach_capi_driver(&c4_driver
);