1 /* $Id: c4.c,v 1.1.2.2 2004/01/16 21:09:27 keil Exp $
3 * Module for AVM C4 & C2 card.
5 * Copyright 1999 by Carsten Paeth <calle@calle.de>
7 * This software may be used and distributed according to the terms
8 * of the GNU General Public License, incorporated herein by reference.
12 #include <linux/module.h>
13 #include <linux/kernel.h>
14 #include <linux/skbuff.h>
15 #include <linux/delay.h>
17 #include <linux/interrupt.h>
18 #include <linux/ioport.h>
19 #include <linux/pci.h>
20 #include <linux/capi.h>
21 #include <linux/kernelcapi.h>
22 #include <linux/init.h>
24 #include <asm/uaccess.h>
25 #include <linux/netdevice.h>
26 #include <linux/isdn/capicmd.h>
27 #include <linux/isdn/capiutil.h>
28 #include <linux/isdn/capilli.h>
32 #undef AVM_C4_POLLDEBUG
34 /* ------------------------------------------------------------- */
36 static char *revision
= "$Revision: 1.1.2.2 $";
38 /* ------------------------------------------------------------- */
40 static int suppress_pollack
;
42 static struct pci_device_id c4_pci_tbl
[] = {
43 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_21285
, PCI_VENDOR_ID_AVM
, PCI_DEVICE_ID_AVM_C4
, 0, 0, (unsigned long)4 },
44 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_21285
, PCI_VENDOR_ID_AVM
, PCI_DEVICE_ID_AVM_C2
, 0, 0, (unsigned long)2 },
45 { } /* Terminating entry */
48 MODULE_DEVICE_TABLE(pci
, c4_pci_tbl
);
49 MODULE_DESCRIPTION("CAPI4Linux: Driver for AVM C2/C4 cards");
50 MODULE_AUTHOR("Carsten Paeth");
51 MODULE_LICENSE("GPL");
52 module_param(suppress_pollack
, bool, 0);
54 /* ------------------------------------------------------------- */
56 static void c4_dispatch_tx(avmcard
*card
);
58 /* ------------------------------------------------------------- */
60 #define DC21285_DRAM_A0MR 0x40000000
61 #define DC21285_DRAM_A1MR 0x40004000
62 #define DC21285_DRAM_A2MR 0x40008000
63 #define DC21285_DRAM_A3MR 0x4000C000
65 #define CAS_OFFSET 0x88
67 #define DC21285_ARMCSR_BASE 0x42000000
69 #define PCI_OUT_INT_STATUS 0x30
70 #define PCI_OUT_INT_MASK 0x34
71 #define MAILBOX_0 0x50
72 #define MAILBOX_1 0x54
73 #define MAILBOX_2 0x58
74 #define MAILBOX_3 0x5C
76 #define DOORBELL_SETUP 0x64
78 #define CHAN_1_CONTROL 0x90
79 #define CHAN_2_CONTROL 0xB0
80 #define DRAM_TIMING 0x10C
81 #define DRAM_ADDR_SIZE_0 0x110
82 #define DRAM_ADDR_SIZE_1 0x114
83 #define DRAM_ADDR_SIZE_2 0x118
84 #define DRAM_ADDR_SIZE_3 0x11C
85 #define SA_CONTROL 0x13C
86 #define XBUS_CYCLE 0x148
87 #define XBUS_STROBE 0x14C
88 #define DBELL_PCI_MASK 0x150
89 #define DBELL_SA_MASK 0x154
91 #define SDRAM_SIZE 0x1000000
93 /* ------------------------------------------------------------- */
95 #define MBOX_PEEK_POKE MAILBOX_0
97 #define DBELL_ADDR 0x01
98 #define DBELL_DATA 0x02
99 #define DBELL_RNWR 0x40
100 #define DBELL_INIT 0x80
102 /* ------------------------------------------------------------- */
104 #define MBOX_UP_ADDR MAILBOX_0
105 #define MBOX_UP_LEN MAILBOX_1
106 #define MBOX_DOWN_ADDR MAILBOX_2
107 #define MBOX_DOWN_LEN MAILBOX_3
109 #define DBELL_UP_HOST 0x00000100
110 #define DBELL_UP_ARM 0x00000200
111 #define DBELL_DOWN_HOST 0x00000400
112 #define DBELL_DOWN_ARM 0x00000800
113 #define DBELL_RESET_HOST 0x40000000
114 #define DBELL_RESET_ARM 0x80000000
116 /* ------------------------------------------------------------- */
118 #define DRAM_TIMING_DEF 0x001A01A5
119 #define DRAM_AD_SZ_DEF0 0x00000045
120 #define DRAM_AD_SZ_NULL 0x00000000
122 #define SA_CTL_ALLRIGHT 0x64AA0271
124 #define INIT_XBUS_CYCLE 0x100016DB
125 #define INIT_XBUS_STROBE 0xF1F1F1F1
127 /* ------------------------------------------------------------- */
129 #define RESET_TIMEOUT (15*HZ) /* 15 sec */
130 #define PEEK_POKE_TIMEOUT (HZ/10) /* 0.1 sec */
132 /* ------------------------------------------------------------- */
134 #define c4outmeml(addr, value) writel(value, addr)
135 #define c4inmeml(addr) readl(addr)
136 #define c4outmemw(addr, value) writew(value, addr)
137 #define c4inmemw(addr) readw(addr)
138 #define c4outmemb(addr, value) writeb(value, addr)
139 #define c4inmemb(addr) readb(addr)
141 /* ------------------------------------------------------------- */
143 static inline int wait_for_doorbell(avmcard
*card
, unsigned long t
)
148 while (c4inmeml(card
->mbase
+DOORBELL
) != 0xffffffff) {
149 if (!time_before(jiffies
, stop
))
156 static int c4_poke(avmcard
*card
, unsigned long off
, unsigned long value
)
159 if (wait_for_doorbell(card
, HZ
/10) < 0)
162 c4outmeml(card
->mbase
+MBOX_PEEK_POKE
, off
);
163 c4outmeml(card
->mbase
+DOORBELL
, DBELL_ADDR
);
165 if (wait_for_doorbell(card
, HZ
/10) < 0)
168 c4outmeml(card
->mbase
+MBOX_PEEK_POKE
, value
);
169 c4outmeml(card
->mbase
+DOORBELL
, DBELL_DATA
| DBELL_ADDR
);
174 static int c4_peek(avmcard
*card
, unsigned long off
, unsigned long *valuep
)
176 if (wait_for_doorbell(card
, HZ
/10) < 0)
179 c4outmeml(card
->mbase
+MBOX_PEEK_POKE
, off
);
180 c4outmeml(card
->mbase
+DOORBELL
, DBELL_RNWR
| DBELL_ADDR
);
182 if (wait_for_doorbell(card
, HZ
/10) < 0)
185 *valuep
= c4inmeml(card
->mbase
+MBOX_PEEK_POKE
);
190 /* ------------------------------------------------------------- */
192 static int c4_load_t4file(avmcard
*card
, capiloaddatapart
* t4file
)
201 while (left
>= sizeof(u32
)) {
203 if (copy_from_user(&val
, dp
, sizeof(val
)))
206 memcpy(&val
, dp
, sizeof(val
));
208 if (c4_poke(card
, loadoff
, val
)) {
209 printk(KERN_ERR
"%s: corrupted firmware file ?\n",
215 loadoff
+= sizeof(u32
);
220 if (copy_from_user(&val
, dp
, left
))
223 memcpy(&val
, dp
, left
);
225 if (c4_poke(card
, loadoff
, val
)) {
226 printk(KERN_ERR
"%s: corrupted firmware file ?\n",
234 /* ------------------------------------------------------------- */
236 static inline void _put_byte(void **pp
, u8 val
)
243 static inline void _put_word(void **pp
, u32 val
)
247 *s
++ = (val
>> 8) & 0xff;
248 *s
++ = (val
>> 16) & 0xff;
249 *s
++ = (val
>> 24) & 0xff;
253 static inline void _put_slice(void **pp
, unsigned char *dp
, unsigned int len
)
258 _put_byte(pp
, *dp
++);
261 static inline u8
_get_byte(void **pp
)
270 static inline u32
_get_word(void **pp
)
282 static inline u32
_get_slice(void **pp
, unsigned char *dp
)
286 len
= i
= _get_word(pp
);
287 while (i
-- > 0) *dp
++ = _get_byte(pp
);
291 /* ------------------------------------------------------------- */
293 static void c4_reset(avmcard
*card
)
297 c4outmeml(card
->mbase
+DOORBELL
, DBELL_RESET_ARM
);
299 stop
= jiffies
+ HZ
*10;
300 while (c4inmeml(card
->mbase
+DOORBELL
) != 0xffffffff) {
301 if (!time_before(jiffies
, stop
))
303 c4outmeml(card
->mbase
+DOORBELL
, DBELL_ADDR
);
307 c4_poke(card
, DC21285_ARMCSR_BASE
+ CHAN_1_CONTROL
, 0);
308 c4_poke(card
, DC21285_ARMCSR_BASE
+ CHAN_2_CONTROL
, 0);
311 /* ------------------------------------------------------------- */
313 static int c4_detect(avmcard
*card
)
315 unsigned long stop
, dummy
;
317 c4outmeml(card
->mbase
+PCI_OUT_INT_MASK
, 0x0c);
318 if (c4inmeml(card
->mbase
+PCI_OUT_INT_MASK
) != 0x0c)
321 c4outmeml(card
->mbase
+DOORBELL
, DBELL_RESET_ARM
);
323 stop
= jiffies
+ HZ
*10;
324 while (c4inmeml(card
->mbase
+DOORBELL
) != 0xffffffff) {
325 if (!time_before(jiffies
, stop
))
327 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);
334 c4outmeml(card
->mbase
+MAILBOX_0
, 0x55aa55aa);
335 if (c4inmeml(card
->mbase
+MAILBOX_0
) != 0x55aa55aa) return 3;
337 c4outmeml(card
->mbase
+MAILBOX_0
, 0xaa55aa55);
338 if (c4inmeml(card
->mbase
+MAILBOX_0
) != 0xaa55aa55) return 4;
340 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DBELL_SA_MASK
, 0)) return 5;
341 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DBELL_PCI_MASK
, 0)) return 6;
342 if (c4_poke(card
, DC21285_ARMCSR_BASE
+SA_CONTROL
, SA_CTL_ALLRIGHT
))
344 if (c4_poke(card
, DC21285_ARMCSR_BASE
+XBUS_CYCLE
, INIT_XBUS_CYCLE
))
346 if (c4_poke(card
, DC21285_ARMCSR_BASE
+XBUS_STROBE
, INIT_XBUS_STROBE
))
348 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_TIMING
, 0)) return 9;
352 if (c4_peek(card
, DC21285_DRAM_A0MR
, &dummy
)) return 10;
353 if (c4_peek(card
, DC21285_DRAM_A1MR
, &dummy
)) return 11;
354 if (c4_peek(card
, DC21285_DRAM_A2MR
, &dummy
)) return 12;
355 if (c4_peek(card
, DC21285_DRAM_A3MR
, &dummy
)) return 13;
357 if (c4_poke(card
, DC21285_DRAM_A0MR
+CAS_OFFSET
, 0)) return 14;
358 if (c4_poke(card
, DC21285_DRAM_A1MR
+CAS_OFFSET
, 0)) return 15;
359 if (c4_poke(card
, DC21285_DRAM_A2MR
+CAS_OFFSET
, 0)) return 16;
360 if (c4_poke(card
, DC21285_DRAM_A3MR
+CAS_OFFSET
, 0)) return 17;
364 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_TIMING
, DRAM_TIMING_DEF
))
367 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_ADDR_SIZE_0
,DRAM_AD_SZ_DEF0
))
369 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_ADDR_SIZE_1
,DRAM_AD_SZ_NULL
))
371 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_ADDR_SIZE_2
,DRAM_AD_SZ_NULL
))
373 if (c4_poke(card
, DC21285_ARMCSR_BASE
+DRAM_ADDR_SIZE_3
,DRAM_AD_SZ_NULL
))
376 /* Transputer test */
378 if ( c4_poke(card
, 0x000000, 0x11111111)
379 || c4_poke(card
, 0x400000, 0x22222222)
380 || c4_poke(card
, 0x800000, 0x33333333)
381 || c4_poke(card
, 0xC00000, 0x44444444))
384 if ( c4_peek(card
, 0x000000, &dummy
) || dummy
!= 0x11111111
385 || c4_peek(card
, 0x400000, &dummy
) || dummy
!= 0x22222222
386 || c4_peek(card
, 0x800000, &dummy
) || dummy
!= 0x33333333
387 || c4_peek(card
, 0xC00000, &dummy
) || dummy
!= 0x44444444)
390 if ( c4_poke(card
, 0x000000, 0x55555555)
391 || c4_poke(card
, 0x400000, 0x66666666)
392 || c4_poke(card
, 0x800000, 0x77777777)
393 || c4_poke(card
, 0xC00000, 0x88888888))
396 if ( c4_peek(card
, 0x000000, &dummy
) || dummy
!= 0x55555555
397 || c4_peek(card
, 0x400000, &dummy
) || dummy
!= 0x66666666
398 || c4_peek(card
, 0x800000, &dummy
) || dummy
!= 0x77777777
399 || c4_peek(card
, 0xC00000, &dummy
) || dummy
!= 0x88888888)
405 /* ------------------------------------------------------------- */
407 static void c4_dispatch_tx(avmcard
*card
)
409 avmcard_dmainfo
*dma
= card
->dma
;
417 if (card
->csr
& DBELL_DOWN_ARM
) { /* tx busy */
421 skb
= skb_dequeue(&dma
->send_queue
);
424 printk(KERN_DEBUG
"%s: tx underrun\n", card
->name
);
429 len
= CAPIMSG_LEN(skb
->data
);
432 cmd
= CAPIMSG_COMMAND(skb
->data
);
433 subcmd
= CAPIMSG_SUBCOMMAND(skb
->data
);
435 p
= dma
->sendbuf
.dmabuf
;
437 if (CAPICMD(cmd
, subcmd
) == CAPI_DATA_B3_REQ
) {
438 u16 dlen
= CAPIMSG_DATALEN(skb
->data
);
439 _put_byte(&p
, SEND_DATA_B3_REQ
);
440 _put_slice(&p
, skb
->data
, len
);
441 _put_slice(&p
, skb
->data
+ len
, dlen
);
443 _put_byte(&p
, SEND_MESSAGE
);
444 _put_slice(&p
, skb
->data
, len
);
446 txlen
= (u8
*)p
- (u8
*)dma
->sendbuf
.dmabuf
;
448 printk(KERN_DEBUG
"%s: tx put msg len=%d\n", card
->name
, txlen
);
452 #ifdef AVM_C4_POLLDEBUG
453 if (skb
->data
[2] == SEND_POLLACK
)
454 printk(KERN_INFO
"%s: ack to c4\n", card
->name
);
457 printk(KERN_DEBUG
"%s: tx put 0x%x len=%d\n",
458 card
->name
, skb
->data
[2], txlen
);
460 skb_copy_from_linear_data_offset(skb
, 2, dma
->sendbuf
.dmabuf
,
463 txlen
= (txlen
+ 3) & ~3;
465 c4outmeml(card
->mbase
+MBOX_DOWN_ADDR
, dma
->sendbuf
.dmaaddr
);
466 c4outmeml(card
->mbase
+MBOX_DOWN_LEN
, txlen
);
468 card
->csr
|= DBELL_DOWN_ARM
;
470 c4outmeml(card
->mbase
+DOORBELL
, DBELL_DOWN_ARM
);
472 dev_kfree_skb_any(skb
);
475 /* ------------------------------------------------------------- */
477 static void queue_pollack(avmcard
*card
)
482 skb
= alloc_skb(3, GFP_ATOMIC
);
484 printk(KERN_CRIT
"%s: no memory, lost poll ack\n",
491 _put_byte(&p
, SEND_POLLACK
);
492 skb_put(skb
, (u8
*)p
- (u8
*)skb
->data
);
494 skb_queue_tail(&card
->dma
->send_queue
, skb
);
495 c4_dispatch_tx(card
);
498 /* ------------------------------------------------------------- */
500 static void c4_handle_rx(avmcard
*card
)
502 avmcard_dmainfo
*dma
= card
->dma
;
503 struct capi_ctr
*ctrl
;
506 void *p
= dma
->recvbuf
.dmabuf
;
507 u32 ApplId
, MsgLen
, DataB3Len
, NCCI
, WindowSize
;
508 u8 b1cmd
= _get_byte(&p
);
513 printk(KERN_DEBUG
"%s: rx 0x%x len=%lu\n", card
->name
,
514 b1cmd
, (unsigned long)dma
->recvlen
);
518 case RECEIVE_DATA_B3_IND
:
520 ApplId
= (unsigned) _get_word(&p
);
521 MsgLen
= _get_slice(&p
, card
->msgbuf
);
522 DataB3Len
= _get_slice(&p
, card
->databuf
);
523 cidx
= CAPIMSG_CONTROLLER(card
->msgbuf
)-card
->cardnr
;
524 if (cidx
>= card
->nlogcontr
) cidx
= 0;
525 ctrl
= &card
->ctrlinfo
[cidx
].capi_ctrl
;
527 if (MsgLen
< 30) { /* not CAPI 64Bit */
528 memset(card
->msgbuf
+MsgLen
, 0, 30-MsgLen
);
530 CAPIMSG_SETLEN(card
->msgbuf
, 30);
532 if (!(skb
= alloc_skb(DataB3Len
+MsgLen
, GFP_ATOMIC
))) {
533 printk(KERN_ERR
"%s: incoming packet dropped\n",
536 memcpy(skb_put(skb
, MsgLen
), card
->msgbuf
, MsgLen
);
537 memcpy(skb_put(skb
, DataB3Len
), card
->databuf
, DataB3Len
);
538 capi_ctr_handle_message(ctrl
, ApplId
, skb
);
542 case RECEIVE_MESSAGE
:
544 ApplId
= (unsigned) _get_word(&p
);
545 MsgLen
= _get_slice(&p
, card
->msgbuf
);
546 cidx
= CAPIMSG_CONTROLLER(card
->msgbuf
)-card
->cardnr
;
547 if (cidx
>= card
->nlogcontr
) cidx
= 0;
548 cinfo
= &card
->ctrlinfo
[cidx
];
549 ctrl
= &card
->ctrlinfo
[cidx
].capi_ctrl
;
551 if (!(skb
= alloc_skb(MsgLen
, GFP_ATOMIC
))) {
552 printk(KERN_ERR
"%s: incoming packet dropped\n",
555 memcpy(skb_put(skb
, MsgLen
), card
->msgbuf
, MsgLen
);
556 if (CAPIMSG_CMD(skb
->data
) == CAPI_DATA_B3_CONF
)
557 capilib_data_b3_conf(&cinfo
->ncci_head
, ApplId
,
558 CAPIMSG_NCCI(skb
->data
),
559 CAPIMSG_MSGID(skb
->data
));
561 capi_ctr_handle_message(ctrl
, ApplId
, skb
);
565 case RECEIVE_NEW_NCCI
:
567 ApplId
= _get_word(&p
);
568 NCCI
= _get_word(&p
);
569 WindowSize
= _get_word(&p
);
570 cidx
= (NCCI
&0x7f) - card
->cardnr
;
571 if (cidx
>= card
->nlogcontr
) cidx
= 0;
573 capilib_new_ncci(&card
->ctrlinfo
[cidx
].ncci_head
, ApplId
, NCCI
, WindowSize
);
577 case RECEIVE_FREE_NCCI
:
579 ApplId
= _get_word(&p
);
580 NCCI
= _get_word(&p
);
582 if (NCCI
!= 0xffffffff) {
583 cidx
= (NCCI
&0x7f) - card
->cardnr
;
584 if (cidx
>= card
->nlogcontr
) cidx
= 0;
585 capilib_free_ncci(&card
->ctrlinfo
[cidx
].ncci_head
, ApplId
, NCCI
);
590 #ifdef AVM_C4_POLLDEBUG
591 printk(KERN_INFO
"%s: poll from c4\n", card
->name
);
593 if (!suppress_pollack
)
595 for (cidx
=0; cidx
< card
->nr_controllers
; cidx
++) {
596 ctrl
= &card
->ctrlinfo
[cidx
].capi_ctrl
;
597 capi_ctr_resume_output(ctrl
);
602 for (cidx
=0; cidx
< card
->nr_controllers
; cidx
++) {
603 ctrl
= &card
->ctrlinfo
[cidx
].capi_ctrl
;
604 capi_ctr_suspend_output(ctrl
);
610 cidx
= card
->nlogcontr
;
611 if (cidx
>= card
->nr_controllers
) {
612 printk(KERN_ERR
"%s: card with %d controllers ??\n",
617 cinfo
= &card
->ctrlinfo
[cidx
];
618 ctrl
= &cinfo
->capi_ctrl
;
619 cinfo
->versionlen
= _get_slice(&p
, cinfo
->versionbuf
);
620 b1_parse_version(cinfo
);
621 printk(KERN_INFO
"%s: %s-card (%s) now active\n",
623 cinfo
->version
[VER_CARDTYPE
],
624 cinfo
->version
[VER_DRIVER
]);
625 capi_ctr_ready(&cinfo
->capi_ctrl
);
628 case RECEIVE_TASK_READY
:
629 ApplId
= (unsigned) _get_word(&p
);
630 MsgLen
= _get_slice(&p
, card
->msgbuf
);
631 card
->msgbuf
[MsgLen
] = 0;
633 && ( card
->msgbuf
[MsgLen
-1] == '\n'
634 || card
->msgbuf
[MsgLen
-1] == '\r')) {
635 card
->msgbuf
[MsgLen
-1] = 0;
638 printk(KERN_INFO
"%s: task %d \"%s\" ready.\n",
639 card
->name
, ApplId
, card
->msgbuf
);
642 case RECEIVE_DEBUGMSG
:
643 MsgLen
= _get_slice(&p
, card
->msgbuf
);
644 card
->msgbuf
[MsgLen
] = 0;
646 && ( card
->msgbuf
[MsgLen
-1] == '\n'
647 || card
->msgbuf
[MsgLen
-1] == '\r')) {
648 card
->msgbuf
[MsgLen
-1] = 0;
651 printk(KERN_INFO
"%s: DEBUG: %s\n", card
->name
, card
->msgbuf
);
655 printk(KERN_ERR
"%s: c4_interrupt: 0x%x ???\n",
661 /* ------------------------------------------------------------- */
663 static irqreturn_t
c4_handle_interrupt(avmcard
*card
)
668 spin_lock_irqsave(&card
->lock
, flags
);
669 status
= c4inmeml(card
->mbase
+DOORBELL
);
671 if (status
& DBELL_RESET_HOST
) {
673 c4outmeml(card
->mbase
+PCI_OUT_INT_MASK
, 0x0c);
674 spin_unlock_irqrestore(&card
->lock
, flags
);
675 if (card
->nlogcontr
== 0)
677 printk(KERN_ERR
"%s: unexpected reset\n", card
->name
);
678 for (i
=0; i
< card
->nr_controllers
; i
++) {
679 avmctrl_info
*cinfo
= &card
->ctrlinfo
[i
];
680 memset(cinfo
->version
, 0, sizeof(cinfo
->version
));
681 capilib_release(&cinfo
->ncci_head
);
682 capi_ctr_reseted(&cinfo
->capi_ctrl
);
688 status
&= (DBELL_UP_HOST
| DBELL_DOWN_HOST
);
690 spin_unlock_irqrestore(&card
->lock
, flags
);
693 c4outmeml(card
->mbase
+DOORBELL
, status
);
695 if ((status
& DBELL_UP_HOST
) != 0) {
696 card
->dma
->recvlen
= c4inmeml(card
->mbase
+MBOX_UP_LEN
);
697 c4outmeml(card
->mbase
+MBOX_UP_LEN
, 0);
699 card
->dma
->recvlen
= 0;
700 c4outmeml(card
->mbase
+MBOX_UP_LEN
, card
->dma
->recvbuf
.size
);
701 c4outmeml(card
->mbase
+DOORBELL
, DBELL_UP_ARM
);
704 if ((status
& DBELL_DOWN_HOST
) != 0) {
705 card
->csr
&= ~DBELL_DOWN_ARM
;
706 c4_dispatch_tx(card
);
707 } else if (card
->csr
& DBELL_DOWN_HOST
) {
708 if (c4inmeml(card
->mbase
+MBOX_DOWN_LEN
) == 0) {
709 card
->csr
&= ~DBELL_DOWN_ARM
;
710 c4_dispatch_tx(card
);
713 spin_unlock_irqrestore(&card
->lock
, flags
);
717 static irqreturn_t
c4_interrupt(int interrupt
, void *devptr
)
719 avmcard
*card
= devptr
;
721 return c4_handle_interrupt(card
);
724 /* ------------------------------------------------------------- */
726 static void c4_send_init(avmcard
*card
)
731 skb
= alloc_skb(15, GFP_ATOMIC
);
733 printk(KERN_CRIT
"%s: no memory, lost register appl.\n",
740 _put_byte(&p
, SEND_INIT
);
741 _put_word(&p
, CAPI_MAXAPPL
);
742 _put_word(&p
, AVM_NCCI_PER_CHANNEL
*30);
743 _put_word(&p
, card
->cardnr
- 1);
744 skb_put(skb
, (u8
*)p
- (u8
*)skb
->data
);
746 skb_queue_tail(&card
->dma
->send_queue
, skb
);
747 c4_dispatch_tx(card
);
750 static int queue_sendconfigword(avmcard
*card
, u32 val
)
755 skb
= alloc_skb(3+4, GFP_ATOMIC
);
757 printk(KERN_CRIT
"%s: no memory, send config\n",
764 _put_byte(&p
, SEND_CONFIG
);
766 skb_put(skb
, (u8
*)p
- (u8
*)skb
->data
);
768 skb_queue_tail(&card
->dma
->send_queue
, skb
);
769 c4_dispatch_tx(card
);
773 static int queue_sendconfig(avmcard
*card
, char cval
[4])
779 skb
= alloc_skb(3+4, GFP_ATOMIC
);
781 printk(KERN_CRIT
"%s: no memory, send config\n",
788 _put_byte(&p
, SEND_CONFIG
);
789 _put_byte(&p
, cval
[0]);
790 _put_byte(&p
, cval
[1]);
791 _put_byte(&p
, cval
[2]);
792 _put_byte(&p
, cval
[3]);
793 skb_put(skb
, (u8
*)p
- (u8
*)skb
->data
);
795 skb_queue_tail(&card
->dma
->send_queue
, skb
);
797 spin_lock_irqsave(&card
->lock
, flags
);
798 c4_dispatch_tx(card
);
799 spin_unlock_irqrestore(&card
->lock
, flags
);
803 static int c4_send_config(avmcard
*card
, capiloaddatapart
* config
)
810 if ((retval
= queue_sendconfigword(card
, 1)) != 0)
812 if ((retval
= queue_sendconfigword(card
, config
->len
)) != 0)
817 while (left
>= sizeof(u32
)) {
819 if (copy_from_user(val
, dp
, sizeof(val
)))
822 memcpy(val
, dp
, sizeof(val
));
824 if ((retval
= queue_sendconfig(card
, val
)) != 0)
830 memset(val
, 0, sizeof(val
));
832 if (copy_from_user(&val
, dp
, left
))
835 memcpy(&val
, dp
, left
);
837 if ((retval
= queue_sendconfig(card
, val
)) != 0)
844 static int c4_load_firmware(struct capi_ctr
*ctrl
, capiloaddata
*data
)
846 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
847 avmcard
*card
= cinfo
->card
;
850 if ((retval
= c4_load_t4file(card
, &data
->firmware
))) {
851 printk(KERN_ERR
"%s: failed to load t4file!!\n",
858 c4outmeml(card
->mbase
+MBOX_UP_LEN
, 0);
859 c4outmeml(card
->mbase
+MBOX_DOWN_LEN
, 0);
860 c4outmeml(card
->mbase
+DOORBELL
, DBELL_INIT
);
862 c4outmeml(card
->mbase
+DOORBELL
,
863 DBELL_UP_HOST
| DBELL_DOWN_HOST
| DBELL_RESET_HOST
);
865 c4outmeml(card
->mbase
+PCI_OUT_INT_MASK
, 0x08);
867 card
->dma
->recvlen
= 0;
868 c4outmeml(card
->mbase
+MBOX_UP_ADDR
, card
->dma
->recvbuf
.dmaaddr
);
869 c4outmeml(card
->mbase
+MBOX_UP_LEN
, card
->dma
->recvbuf
.size
);
870 c4outmeml(card
->mbase
+DOORBELL
, DBELL_UP_ARM
);
872 if (data
->configuration
.len
> 0 && data
->configuration
.data
) {
873 retval
= c4_send_config(card
, &data
->configuration
);
875 printk(KERN_ERR
"%s: failed to set config!!\n",
888 static void c4_reset_ctr(struct capi_ctr
*ctrl
)
890 avmcard
*card
= ((avmctrl_info
*)(ctrl
->driverdata
))->card
;
895 spin_lock_irqsave(&card
->lock
, flags
);
899 spin_unlock_irqrestore(&card
->lock
, flags
);
901 for (i
=0; i
< card
->nr_controllers
; i
++) {
902 cinfo
= &card
->ctrlinfo
[i
];
903 memset(cinfo
->version
, 0, sizeof(cinfo
->version
));
904 capi_ctr_reseted(&cinfo
->capi_ctrl
);
909 static void c4_remove(struct pci_dev
*pdev
)
911 avmcard
*card
= pci_get_drvdata(pdev
);
920 for (i
=0; i
< card
->nr_controllers
; i
++) {
921 cinfo
= &card
->ctrlinfo
[i
];
922 detach_capi_ctr(&cinfo
->capi_ctrl
);
925 free_irq(card
->irq
, card
);
926 iounmap(card
->mbase
);
927 release_region(card
->port
, AVMB1_PORTLEN
);
928 avmcard_dma_free(card
->dma
);
929 pci_set_drvdata(pdev
, NULL
);
933 /* ------------------------------------------------------------- */
936 static void c4_register_appl(struct capi_ctr
*ctrl
,
938 capi_register_params
*rp
)
940 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
941 avmcard
*card
= cinfo
->card
;
943 int want
= rp
->level3cnt
;
948 if (ctrl
->cnr
== card
->cardnr
) {
950 if (want
> 0) nconn
= want
;
951 else nconn
= ctrl
->profile
.nbchannel
* 4 * -want
;
952 if (nconn
== 0) nconn
= ctrl
->profile
.nbchannel
* 4;
954 skb
= alloc_skb(23, GFP_ATOMIC
);
956 printk(KERN_CRIT
"%s: no memory, lost register appl.\n",
963 _put_byte(&p
, SEND_REGISTER
);
965 _put_word(&p
, 1024 * (nconn
+1));
966 _put_word(&p
, nconn
);
967 _put_word(&p
, rp
->datablkcnt
);
968 _put_word(&p
, rp
->datablklen
);
969 skb_put(skb
, (u8
*)p
- (u8
*)skb
->data
);
971 skb_queue_tail(&card
->dma
->send_queue
, skb
);
973 spin_lock_irqsave(&card
->lock
, flags
);
974 c4_dispatch_tx(card
);
975 spin_unlock_irqrestore(&card
->lock
, flags
);
979 /* ------------------------------------------------------------- */
981 static void c4_release_appl(struct capi_ctr
*ctrl
, u16 appl
)
983 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
984 avmcard
*card
= cinfo
->card
;
989 capilib_release_appl(&cinfo
->ncci_head
, appl
);
991 if (ctrl
->cnr
== card
->cardnr
) {
992 skb
= alloc_skb(7, GFP_ATOMIC
);
994 printk(KERN_CRIT
"%s: no memory, lost release appl.\n",
1001 _put_byte(&p
, SEND_RELEASE
);
1002 _put_word(&p
, appl
);
1004 skb_put(skb
, (u8
*)p
- (u8
*)skb
->data
);
1005 skb_queue_tail(&card
->dma
->send_queue
, skb
);
1006 spin_lock_irqsave(&card
->lock
, flags
);
1007 c4_dispatch_tx(card
);
1008 spin_unlock_irqrestore(&card
->lock
, flags
);
1012 /* ------------------------------------------------------------- */
1015 static u16
c4_send_message(struct capi_ctr
*ctrl
, struct sk_buff
*skb
)
1017 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
1018 avmcard
*card
= cinfo
->card
;
1019 u16 retval
= CAPI_NOERROR
;
1020 unsigned long flags
;
1022 if (CAPIMSG_CMD(skb
->data
) == CAPI_DATA_B3_REQ
) {
1023 retval
= capilib_data_b3_req(&cinfo
->ncci_head
,
1024 CAPIMSG_APPID(skb
->data
),
1025 CAPIMSG_NCCI(skb
->data
),
1026 CAPIMSG_MSGID(skb
->data
));
1028 if (retval
== CAPI_NOERROR
) {
1029 skb_queue_tail(&card
->dma
->send_queue
, skb
);
1030 spin_lock_irqsave(&card
->lock
, flags
);
1031 c4_dispatch_tx(card
);
1032 spin_unlock_irqrestore(&card
->lock
, flags
);
1037 /* ------------------------------------------------------------- */
1039 static char *c4_procinfo(struct capi_ctr
*ctrl
)
1041 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
1045 sprintf(cinfo
->infobuf
, "%s %s 0x%x %d 0x%lx",
1046 cinfo
->cardname
[0] ? cinfo
->cardname
: "-",
1047 cinfo
->version
[VER_DRIVER
] ? cinfo
->version
[VER_DRIVER
] : "-",
1048 cinfo
->card
? cinfo
->card
->port
: 0x0,
1049 cinfo
->card
? cinfo
->card
->irq
: 0,
1050 cinfo
->card
? cinfo
->card
->membase
: 0
1052 return cinfo
->infobuf
;
1055 static int c4_read_proc(char *page
, char **start
, off_t off
,
1056 int count
, int *eof
, struct capi_ctr
*ctrl
)
1058 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
1059 avmcard
*card
= cinfo
->card
;
1064 len
+= sprintf(page
+len
, "%-16s %s\n", "name", card
->name
);
1065 len
+= sprintf(page
+len
, "%-16s 0x%x\n", "io", card
->port
);
1066 len
+= sprintf(page
+len
, "%-16s %d\n", "irq", card
->irq
);
1067 len
+= sprintf(page
+len
, "%-16s 0x%lx\n", "membase", card
->membase
);
1068 switch (card
->cardtype
) {
1069 case avm_b1isa
: s
= "B1 ISA"; break;
1070 case avm_b1pci
: s
= "B1 PCI"; break;
1071 case avm_b1pcmcia
: s
= "B1 PCMCIA"; break;
1072 case avm_m1
: s
= "M1"; break;
1073 case avm_m2
: s
= "M2"; break;
1074 case avm_t1isa
: s
= "T1 ISA (HEMA)"; break;
1075 case avm_t1pci
: s
= "T1 PCI"; break;
1076 case avm_c4
: s
= "C4"; break;
1077 case avm_c2
: s
= "C2"; break;
1078 default: s
= "???"; break;
1080 len
+= sprintf(page
+len
, "%-16s %s\n", "type", s
);
1081 if ((s
= cinfo
->version
[VER_DRIVER
]) != 0)
1082 len
+= sprintf(page
+len
, "%-16s %s\n", "ver_driver", s
);
1083 if ((s
= cinfo
->version
[VER_CARDTYPE
]) != 0)
1084 len
+= sprintf(page
+len
, "%-16s %s\n", "ver_cardtype", s
);
1085 if ((s
= cinfo
->version
[VER_SERIAL
]) != 0)
1086 len
+= sprintf(page
+len
, "%-16s %s\n", "ver_serial", s
);
1088 if (card
->cardtype
!= avm_m1
) {
1089 flag
= ((u8
*)(ctrl
->profile
.manu
))[3];
1091 len
+= sprintf(page
+len
, "%-16s%s%s%s%s%s%s%s\n",
1093 (flag
& 0x01) ? " DSS1" : "",
1094 (flag
& 0x02) ? " CT1" : "",
1095 (flag
& 0x04) ? " VN3" : "",
1096 (flag
& 0x08) ? " NI1" : "",
1097 (flag
& 0x10) ? " AUSTEL" : "",
1098 (flag
& 0x20) ? " ESS" : "",
1099 (flag
& 0x40) ? " 1TR6" : ""
1102 if (card
->cardtype
!= avm_m1
) {
1103 flag
= ((u8
*)(ctrl
->profile
.manu
))[5];
1105 len
+= sprintf(page
+len
, "%-16s%s%s%s%s\n",
1107 (flag
& 0x01) ? " point to point" : "",
1108 (flag
& 0x02) ? " point to multipoint" : "",
1109 (flag
& 0x08) ? " leased line without D-channel" : "",
1110 (flag
& 0x04) ? " leased line with D-channel" : ""
1113 len
+= sprintf(page
+len
, "%-16s %s\n", "cardname", cinfo
->cardname
);
1115 if (off
+count
>= len
)
1119 *start
= page
+ off
;
1120 return ((count
< len
-off
) ? count
: len
-off
);
1123 /* ------------------------------------------------------------- */
1125 static int c4_add_card(struct capicardparams
*p
, struct pci_dev
*dev
,
1129 avmctrl_info
*cinfo
;
1133 card
= b1_alloc_card(nr_controllers
);
1135 printk(KERN_WARNING
"c4: no memory.\n");
1139 card
->dma
= avmcard_dma_alloc("c4", dev
, 2048+128, 2048+128);
1141 printk(KERN_WARNING
"c4: no memory.\n");
1146 sprintf(card
->name
, "c%d-%x", nr_controllers
, p
->port
);
1147 card
->port
= p
->port
;
1149 card
->membase
= p
->membase
;
1150 card
->cardtype
= (nr_controllers
== 4) ? avm_c4
: avm_c2
;
1152 if (!request_region(card
->port
, AVMB1_PORTLEN
, card
->name
)) {
1153 printk(KERN_WARNING
"c4: ports 0x%03x-0x%03x in use.\n",
1154 card
->port
, card
->port
+ AVMB1_PORTLEN
);
1159 card
->mbase
= ioremap(card
->membase
, 128);
1160 if (card
->mbase
== 0) {
1161 printk(KERN_NOTICE
"c4: can't remap memory at 0x%lx\n",
1164 goto err_release_region
;
1167 retval
= c4_detect(card
);
1169 printk(KERN_NOTICE
"c4: NO card at 0x%x error(%d)\n",
1170 card
->port
, retval
);
1176 retval
= request_irq(card
->irq
, c4_interrupt
, IRQF_SHARED
, card
->name
, card
);
1178 printk(KERN_ERR
"c4: unable to get IRQ %d.\n",card
->irq
);
1183 for (i
=0; i
< nr_controllers
; i
++) {
1184 cinfo
= &card
->ctrlinfo
[i
];
1185 cinfo
->capi_ctrl
.owner
= THIS_MODULE
;
1186 cinfo
->capi_ctrl
.driver_name
= "c4";
1187 cinfo
->capi_ctrl
.driverdata
= cinfo
;
1188 cinfo
->capi_ctrl
.register_appl
= c4_register_appl
;
1189 cinfo
->capi_ctrl
.release_appl
= c4_release_appl
;
1190 cinfo
->capi_ctrl
.send_message
= c4_send_message
;
1191 cinfo
->capi_ctrl
.load_firmware
= c4_load_firmware
;
1192 cinfo
->capi_ctrl
.reset_ctr
= c4_reset_ctr
;
1193 cinfo
->capi_ctrl
.procinfo
= c4_procinfo
;
1194 cinfo
->capi_ctrl
.ctr_read_proc
= c4_read_proc
;
1195 strcpy(cinfo
->capi_ctrl
.name
, card
->name
);
1197 retval
= attach_capi_ctr(&cinfo
->capi_ctrl
);
1199 printk(KERN_ERR
"c4: attach controller failed (%d).\n", i
);
1200 for (i
--; i
>= 0; i
--) {
1201 cinfo
= &card
->ctrlinfo
[i
];
1202 detach_capi_ctr(&cinfo
->capi_ctrl
);
1207 card
->cardnr
= cinfo
->capi_ctrl
.cnr
;
1210 printk(KERN_INFO
"c4: AVM C%d at i/o %#x, irq %d, mem %#lx\n",
1211 nr_controllers
, card
->port
, card
->irq
,
1213 pci_set_drvdata(dev
, card
);
1217 free_irq(card
->irq
, card
);
1219 iounmap(card
->mbase
);
1221 release_region(card
->port
, AVMB1_PORTLEN
);
1223 avmcard_dma_free(card
->dma
);
1230 /* ------------------------------------------------------------- */
1232 static int __devinit
c4_probe(struct pci_dev
*dev
,
1233 const struct pci_device_id
*ent
)
1235 int nr
= ent
->driver_data
;
1237 struct capicardparams param
;
1239 if (pci_enable_device(dev
) < 0) {
1240 printk(KERN_ERR
"c4: failed to enable AVM-C%d\n", nr
);
1243 pci_set_master(dev
);
1245 param
.port
= pci_resource_start(dev
, 1);
1246 param
.irq
= dev
->irq
;
1247 param
.membase
= pci_resource_start(dev
, 0);
1249 printk(KERN_INFO
"c4: PCI BIOS reports AVM-C%d at i/o %#x, irq %d, mem %#x\n",
1250 nr
, param
.port
, param
.irq
, param
.membase
);
1252 retval
= c4_add_card(¶m
, dev
, nr
);
1254 printk(KERN_ERR
"c4: no AVM-C%d at i/o %#x, irq %d detected, mem %#x\n",
1255 nr
, param
.port
, param
.irq
, param
.membase
);
1261 static struct pci_driver c4_pci_driver
= {
1263 .id_table
= c4_pci_tbl
,
1265 .remove
= c4_remove
,
1268 static struct capi_driver capi_driver_c2
= {
1273 static struct capi_driver capi_driver_c4
= {
1278 static int __init
c4_init(void)
1284 if ((p
= strchr(revision
, ':')) != 0 && p
[1]) {
1285 strlcpy(rev
, p
+ 2, 32);
1286 if ((p
= strchr(rev
, '$')) != 0 && p
> rev
)
1291 err
= pci_register_driver(&c4_pci_driver
);
1293 strlcpy(capi_driver_c2
.revision
, rev
, 32);
1294 register_capi_driver(&capi_driver_c2
);
1295 strlcpy(capi_driver_c4
.revision
, rev
, 32);
1296 register_capi_driver(&capi_driver_c4
);
1297 printk(KERN_INFO
"c4: revision %s\n", rev
);
1302 static void __exit
c4_exit(void)
1304 unregister_capi_driver(&capi_driver_c2
);
1305 unregister_capi_driver(&capi_driver_c4
);
1306 pci_unregister_driver(&c4_pci_driver
);
1309 module_init(c4_init
);
1310 module_exit(c4_exit
);