File: /usr/src/linux/drivers/isdn/avmb1/c4.c

1     /*
2      * $Id: c4.c,v 1.20.6.10 2001/06/09 15:14:15 kai Exp $
3      * 
4      * Module for AVM C4 & C2 card.
5      * 
6      * (c) Copyright 1999 by Carsten Paeth (calle@calle.in-berlin.de)
7      *
8      */
9     
10     #include <linux/config.h>
11     #include <linux/module.h>
12     #include <linux/kernel.h>
13     #include <linux/skbuff.h>
14     #include <linux/delay.h>
15     #include <linux/mm.h>
16     #include <linux/interrupt.h>
17     #include <linux/ioport.h>
18     #include <linux/pci.h>
19     #include <linux/capi.h>
20     #include <linux/kernelcapi.h>
21     #include <linux/init.h>
22     #include <asm/io.h>
23     #include <asm/uaccess.h>
24     #include <linux/netdevice.h>
25     #include "capicmd.h"
26     #include "capiutil.h"
27     #include "capilli.h"
28     #include "avmcard.h"
29     
30     static char *revision = "$Revision: 1.20.6.10 $";
31     
32     #undef CONFIG_C4_DEBUG
33     #undef CONFIG_C4_POLLDEBUG
34     
35     /* ------------------------------------------------------------- */
36     
37     static int suppress_pollack;
38     
39     static struct pci_device_id c4_pci_tbl[] __initdata = {
40     	{ PCI_VENDOR_ID_DEC,PCI_DEVICE_ID_DEC_21285, PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_C4 },
41     	{ PCI_VENDOR_ID_DEC,PCI_DEVICE_ID_DEC_21285, PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_C2 },
42     	{ }			/* Terminating entry */
43     };
44     
45     MODULE_DEVICE_TABLE(pci, c4_pci_tbl);
46     MODULE_AUTHOR("Carsten Paeth <calle@calle.in-berlin.de>");
47     MODULE_PARM(suppress_pollack, "0-1i");
48     
49     /* ------------------------------------------------------------- */
50     
51     static struct capi_driver_interface *di;
52     
53     /* ------------------------------------------------------------- */
54     
55     static void c4_dispatch_tx(avmcard *card);
56     
57     /* ------------------------------------------------------------- */
58     
59     #define DC21285_DRAM_A0MR	0x40000000
60     #define DC21285_DRAM_A1MR	0x40004000
61     #define DC21285_DRAM_A2MR	0x40008000
62     #define DC21285_DRAM_A3MR	0x4000C000
63     
64     #define	CAS_OFFSET	0x88
65     
66     #define DC21285_ARMCSR_BASE	0x42000000
67     
68     #define	PCI_OUT_INT_STATUS	0x30
69     #define	PCI_OUT_INT_MASK	0x34
70     #define	MAILBOX_0		0x50
71     #define	MAILBOX_1		0x54
72     #define	MAILBOX_2		0x58
73     #define	MAILBOX_3		0x5C
74     #define	DOORBELL		0x60
75     #define	DOORBELL_SETUP		0x64
76     
77     #define CHAN_1_CONTROL		0x90
78     #define CHAN_2_CONTROL		0xB0
79     #define DRAM_TIMING		0x10C
80     #define DRAM_ADDR_SIZE_0	0x110
81     #define DRAM_ADDR_SIZE_1	0x114
82     #define DRAM_ADDR_SIZE_2	0x118
83     #define DRAM_ADDR_SIZE_3	0x11C
84     #define	SA_CONTROL		0x13C
85     #define	XBUS_CYCLE		0x148
86     #define	XBUS_STROBE		0x14C
87     #define	DBELL_PCI_MASK		0x150
88     #define DBELL_SA_MASK		0x154
89     
90     #define SDRAM_SIZE		0x1000000
91     
92     /* ------------------------------------------------------------- */
93     
94     #define	MBOX_PEEK_POKE		MAILBOX_0
95     
96     #define DBELL_ADDR		0x01
97     #define DBELL_DATA		0x02
98     #define DBELL_RNWR		0x40
99     #define DBELL_INIT		0x80
100     
101     /* ------------------------------------------------------------- */
102     
103     #define	MBOX_UP_ADDR		MAILBOX_0
104     #define	MBOX_UP_LEN		MAILBOX_1
105     #define	MBOX_DOWN_ADDR		MAILBOX_2
106     #define	MBOX_DOWN_LEN		MAILBOX_3
107     
108     #define	DBELL_UP_HOST		0x00000100
109     #define	DBELL_UP_ARM		0x00000200
110     #define	DBELL_DOWN_HOST		0x00000400
111     #define	DBELL_DOWN_ARM		0x00000800
112     #define	DBELL_RESET_HOST	0x40000000
113     #define	DBELL_RESET_ARM		0x80000000
114     
115     /* ------------------------------------------------------------- */
116     
117     #define	DRAM_TIMING_DEF		0x001A01A5
118     #define DRAM_AD_SZ_DEF0		0x00000045
119     #define DRAM_AD_SZ_NULL		0x00000000
120     
121     #define SA_CTL_ALLRIGHT		0x64AA0271
122     
123     #define	INIT_XBUS_CYCLE		0x100016DB
124     #define	INIT_XBUS_STROBE	0xF1F1F1F1
125     
126     /* ------------------------------------------------------------- */
127     
128     #define	RESET_TIMEOUT		(15*HZ)	/* 15 sec */
129     #define	PEEK_POKE_TIMEOUT	(HZ/10)	/* 0.1 sec */
130     
131     /* ------------------------------------------------------------- */
132     
133     #define c4outmeml(addr, value)	writel(value, addr)
134     #define c4inmeml(addr)	readl(addr)
135     #define c4outmemw(addr, value)	writew(value, addr)
136     #define c4inmemw(addr)	readw(addr)
137     #define c4outmemb(addr, value)	writeb(value, addr)
138     #define c4inmemb(addr)	readb(addr)
139     
140     /* ------------------------------------------------------------- */
141     
142     static inline int wait_for_doorbell(avmcard *card, unsigned long t)
143     {
144     	unsigned long stop;
145     
146     	stop = jiffies + t;
147     	while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
148     		if (!time_before(jiffies, stop))
149     			return -1;
150     	}
151     	return 0;
152     }
153     
154     static int c4_poke(avmcard *card,  unsigned long off, unsigned long value)
155     {
156     
157     	if (wait_for_doorbell(card, HZ/10) < 0)
158     		return -1;
159     	
160     	c4outmeml(card->mbase+MBOX_PEEK_POKE, off);
161     	c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
162     
163     	if (wait_for_doorbell(card, HZ/10) < 0)
164     		return -1;
165     
166     	c4outmeml(card->mbase+MBOX_PEEK_POKE, value);
167     	c4outmeml(card->mbase+DOORBELL, DBELL_DATA | DBELL_ADDR);
168     
169     	return 0;
170     }
171     
172     static int c4_peek(avmcard *card,  unsigned long off, unsigned long *valuep)
173     {
174     	if (wait_for_doorbell(card, HZ/10) < 0)
175     		return -1;
176     
177     	c4outmeml(card->mbase+MBOX_PEEK_POKE, off);
178     	c4outmeml(card->mbase+DOORBELL, DBELL_RNWR | DBELL_ADDR);
179     
180     	if (wait_for_doorbell(card, HZ/10) < 0)
181     		return -1;
182     
183     	*valuep = c4inmeml(card->mbase+MBOX_PEEK_POKE);
184     
185     	return 0;
186     }
187     
188     /* ------------------------------------------------------------- */
189     
190     static int c4_load_t4file(avmcard *card, capiloaddatapart * t4file)
191     {
192     	__u32 val;
193     	unsigned char *dp;
194     	int left, retval;
195     	__u32 loadoff = 0;
196     
197     	dp = t4file->data;
198     	left = t4file->len;
199     	while (left >= sizeof(__u32)) {
200     	        if (t4file->user) {
201     			retval = copy_from_user(&val, dp, sizeof(val));
202     			if (retval)
203     				return -EFAULT;
204     		} else {
205     			memcpy(&val, dp, sizeof(val));
206     		}
207     		if (c4_poke(card, loadoff, val)) {
208     			printk(KERN_ERR "%s: corrupted firmware file ?\n",
209     					card->name);
210     			return -EIO;
211     		}
212     		left -= sizeof(__u32);
213     		dp += sizeof(__u32);
214     		loadoff += sizeof(__u32);
215     	}
216     	if (left) {
217     		val = 0;
218     		if (t4file->user) {
219     			retval = copy_from_user(&val, dp, left);
220     			if (retval)
221     				return -EFAULT;
222     		} else {
223     			memcpy(&val, dp, left);
224     		}
225     		if (c4_poke(card, loadoff, val)) {
226     			printk(KERN_ERR "%s: corrupted firmware file ?\n",
227     					card->name);
228     			return -EIO;
229     		}
230     	}
231     	return 0;
232     }
233     
234     /* ------------------------------------------------------------- */
235     
236     static inline void _put_byte(void **pp, __u8 val)
237     {
238     	__u8 *s = *pp;
239     	*s++ = val;
240     	*pp = s;
241     }
242     
243     static inline void _put_word(void **pp, __u32 val)
244     {
245     	__u8 *s = *pp;
246     	*s++ = val & 0xff;
247     	*s++ = (val >> 8) & 0xff;
248     	*s++ = (val >> 16) & 0xff;
249     	*s++ = (val >> 24) & 0xff;
250     	*pp = s;
251     }
252     
253     static inline void _put_slice(void **pp, unsigned char *dp, unsigned int len)
254     {
255     	unsigned i = len;
256     	_put_word(pp, i);
257     	while (i-- > 0)
258     		_put_byte(pp, *dp++);
259     }
260     
261     static inline __u8 _get_byte(void **pp)
262     {
263     	__u8 *s = *pp;
264     	__u8 val;
265     	val = *s++;
266     	*pp = s;
267     	return val;
268     }
269     
270     static inline __u32 _get_word(void **pp)
271     {
272     	__u8 *s = *pp;
273     	__u32 val;
274     	val = *s++;
275     	val |= (*s++ << 8);
276     	val |= (*s++ << 16);
277     	val |= (*s++ << 24);
278     	*pp = s;
279     	return val;
280     }
281     
282     static inline __u32 _get_slice(void **pp, unsigned char *dp)
283     {
284     	unsigned int len, i;
285     
286     	len = i = _get_word(pp);
287     	while (i-- > 0) *dp++ = _get_byte(pp);
288     	return len;
289     }
290     
291     /* ------------------------------------------------------------- */
292     
293     static void c4_reset(avmcard *card)
294     {
295     	unsigned long stop;
296     
297     	c4outmeml(card->mbase+DOORBELL, DBELL_RESET_ARM);
298     
299     	stop = jiffies + HZ*10;
300     	while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
301     		if (!time_before(jiffies, stop))
302     			return;
303     		c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
304     	}
305     
306     	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
307     	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_2_CONTROL, 0);
308     }
309     
310     /* ------------------------------------------------------------- */
311     
312     static int c4_detect(avmcard *card)
313     {
314     	unsigned long stop, dummy;
315     
316     	c4outmeml(card->mbase+PCI_OUT_INT_MASK, 0x0c);
317     	if (c4inmeml(card->mbase+PCI_OUT_INT_MASK) != 0x0c)
318     		return	1;
319     
320     	c4outmeml(card->mbase+DOORBELL, DBELL_RESET_ARM);
321     
322     	stop = jiffies + HZ*10;
323     	while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
324     		if (!time_before(jiffies, stop))
325     			return 2;
326     		c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
327     	}
328     
329     	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
330     	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_2_CONTROL, 0);
331     
332     	c4outmeml(card->mbase+MAILBOX_0, 0x55aa55aa);
333     	if (c4inmeml(card->mbase+MAILBOX_0) != 0x55aa55aa) return 3;
334     
335     	c4outmeml(card->mbase+MAILBOX_0, 0xaa55aa55);
336     	if (c4inmeml(card->mbase+MAILBOX_0) != 0xaa55aa55) return 4;
337     
338     	if (c4_poke(card, DC21285_ARMCSR_BASE+DBELL_SA_MASK, 0)) return 5;
339     	if (c4_poke(card, DC21285_ARMCSR_BASE+DBELL_PCI_MASK, 0)) return 6;
340     	if (c4_poke(card, DC21285_ARMCSR_BASE+SA_CONTROL, SA_CTL_ALLRIGHT))
341     		return 7;
342     	if (c4_poke(card, DC21285_ARMCSR_BASE+XBUS_CYCLE, INIT_XBUS_CYCLE))
343     		return 8;
344     	if (c4_poke(card, DC21285_ARMCSR_BASE+XBUS_STROBE, INIT_XBUS_STROBE))
345     		return 8;
346     	if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_TIMING, 0)) return 9;
347     
348             mdelay(1);
349     
350     	if (c4_peek(card, DC21285_DRAM_A0MR, &dummy)) return 10;
351     	if (c4_peek(card, DC21285_DRAM_A1MR, &dummy)) return 11;
352     	if (c4_peek(card, DC21285_DRAM_A2MR, &dummy)) return 12;
353     	if (c4_peek(card, DC21285_DRAM_A3MR, &dummy)) return 13;
354     
355     	if (c4_poke(card, DC21285_DRAM_A0MR+CAS_OFFSET, 0)) return 14;
356     	if (c4_poke(card, DC21285_DRAM_A1MR+CAS_OFFSET, 0)) return 15;
357     	if (c4_poke(card, DC21285_DRAM_A2MR+CAS_OFFSET, 0)) return 16;
358     	if (c4_poke(card, DC21285_DRAM_A3MR+CAS_OFFSET, 0)) return 17;
359     
360             mdelay(1);
361     
362     	if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_TIMING, DRAM_TIMING_DEF))
363     		return 18;
364     
365     	if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_0,DRAM_AD_SZ_DEF0))
366     		return 19;
367     	if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_1,DRAM_AD_SZ_NULL))
368     		return 20;
369     	if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_2,DRAM_AD_SZ_NULL))
370     		return 21;
371     	if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_3,DRAM_AD_SZ_NULL))
372     		return 22;
373     
374     	/* Transputer test */
375     	
376     	if (   c4_poke(card, 0x000000, 0x11111111)
377     	    || c4_poke(card, 0x400000, 0x22222222)
378     	    || c4_poke(card, 0x800000, 0x33333333)
379     	    || c4_poke(card, 0xC00000, 0x44444444))
380     		return 23;
381     
382     	if (   c4_peek(card, 0x000000, &dummy) || dummy != 0x11111111
383     	    || c4_peek(card, 0x400000, &dummy) || dummy != 0x22222222
384     	    || c4_peek(card, 0x800000, &dummy) || dummy != 0x33333333
385     	    || c4_peek(card, 0xC00000, &dummy) || dummy != 0x44444444)
386     		return 24;
387     
388     	if (   c4_poke(card, 0x000000, 0x55555555)
389     	    || c4_poke(card, 0x400000, 0x66666666)
390     	    || c4_poke(card, 0x800000, 0x77777777)
391     	    || c4_poke(card, 0xC00000, 0x88888888))
392     		return 25;
393     
394     	if (   c4_peek(card, 0x000000, &dummy) || dummy != 0x55555555
395     	    || c4_peek(card, 0x400000, &dummy) || dummy != 0x66666666
396     	    || c4_peek(card, 0x800000, &dummy) || dummy != 0x77777777
397     	    || c4_peek(card, 0xC00000, &dummy) || dummy != 0x88888888)
398     		return 26;
399     
400     	return 0;
401     }
402     
403     /* ------------------------------------------------------------- */
404     
405     static void c4_dispatch_tx(avmcard *card)
406     {
407     	avmcard_dmainfo *dma = card->dma;
408     	unsigned long flags;
409     	struct sk_buff *skb;
410     	__u8 cmd, subcmd;
411     	__u16 len;
412     	__u32 txlen;
413     	void *p;
414     	
415     	save_flags(flags);
416     	cli();
417     
418     	if (card->csr & DBELL_DOWN_ARM) { /* tx busy */
419     	        restore_flags(flags);
420     		return;
421     	}
422     
423     	skb = skb_dequeue(&dma->send_queue);
424     	if (!skb) {
425     #ifdef CONFIG_C4_DEBUG
426     		printk(KERN_DEBUG "%s: tx underrun\n", card->name);
427     #endif
428     	        restore_flags(flags);
429     		return;
430     	}
431     
432     	len = CAPIMSG_LEN(skb->data);
433     
434     	if (len) {
435     		cmd = CAPIMSG_COMMAND(skb->data);
436     		subcmd = CAPIMSG_SUBCOMMAND(skb->data);
437     
438     		p = dma->sendbuf;
439     
440     		if (CAPICMD(cmd, subcmd) == CAPI_DATA_B3_REQ) {
441     			__u16 dlen = CAPIMSG_DATALEN(skb->data);
442     			_put_byte(&p, SEND_DATA_B3_REQ);
443     			_put_slice(&p, skb->data, len);
444     			_put_slice(&p, skb->data + len, dlen);
445     		} else {
446     			_put_byte(&p, SEND_MESSAGE);
447     			_put_slice(&p, skb->data, len);
448     		}
449     		txlen = (__u8 *)p - (__u8 *)dma->sendbuf;
450     #ifdef CONFIG_C4_DEBUG
451     		printk(KERN_DEBUG "%s: tx put msg len=%d\n", card->name, txlen);
452     #endif
453     	} else {
454     		txlen = skb->len-2;
455     #ifdef CONFIG_C4_POLLDEBUG
456     		if (skb->data[2] == SEND_POLLACK)
457     			printk(KERN_INFO "%s: ack to c4\n", card->name);
458     #endif
459     #ifdef CONFIG_C4_DEBUG
460     		printk(KERN_DEBUG "%s: tx put 0x%x len=%d\n",
461     				card->name, skb->data[2], txlen);
462     #endif
463     		memcpy(dma->sendbuf, skb->data+2, skb->len-2);
464     	}
465     	txlen = (txlen + 3) & ~3;
466     
467     	c4outmeml(card->mbase+MBOX_DOWN_ADDR, virt_to_phys(dma->sendbuf));
468     	c4outmeml(card->mbase+MBOX_DOWN_LEN, txlen);
469     
470     	card->csr |= DBELL_DOWN_ARM;
471     
472     	c4outmeml(card->mbase+DOORBELL, DBELL_DOWN_ARM);
473     
474     	restore_flags(flags);
475     	dev_kfree_skb_any(skb);
476     }
477     
478     /* ------------------------------------------------------------- */
479     
480     static void queue_pollack(avmcard *card)
481     {
482     	struct sk_buff *skb;
483     	void *p;
484     
485     	skb = alloc_skb(3, GFP_ATOMIC);
486     	if (!skb) {
487     		printk(KERN_CRIT "%s: no memory, lost poll ack\n",
488     					card->name);
489     		return;
490     	}
491     	p = skb->data;
492     	_put_byte(&p, 0);
493     	_put_byte(&p, 0);
494     	_put_byte(&p, SEND_POLLACK);
495     	skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
496     
497     	skb_queue_tail(&card->dma->send_queue, skb);
498     	c4_dispatch_tx(card);
499     }
500     
501     /* ------------------------------------------------------------- */
502     
503     static void c4_handle_rx(avmcard *card)
504     {
505     	avmcard_dmainfo *dma = card->dma;
506     	struct capi_ctr *ctrl;
507     	avmctrl_info *cinfo;
508     	struct sk_buff *skb;
509     	void *p = dma->recvbuf;
510     	__u32 ApplId, MsgLen, DataB3Len, NCCI, WindowSize;
511     	__u8 b1cmd =  _get_byte(&p);
512     	__u32 cidx;
513     
514     
515     #ifdef CONFIG_C4_DEBUG
516     	printk(KERN_DEBUG "%s: rx 0x%x len=%lu\n", card->name,
517     				b1cmd, (unsigned long)dma->recvlen);
518     #endif
519     	
520     	switch (b1cmd) {
521     	case RECEIVE_DATA_B3_IND:
522     
523     		ApplId = (unsigned) _get_word(&p);
524     		MsgLen = _get_slice(&p, card->msgbuf);
525     		DataB3Len = _get_slice(&p, card->databuf);
526     		cidx = CAPIMSG_CONTROLLER(card->msgbuf)-card->cardnr;
527     		if (cidx >= card->nlogcontr) cidx = 0;
528     		ctrl = card->ctrlinfo[cidx].capi_ctrl;
529     
530     		if (MsgLen < 30) { /* not CAPI 64Bit */
531     			memset(card->msgbuf+MsgLen, 0, 30-MsgLen);
532     			MsgLen = 30;
533     			CAPIMSG_SETLEN(card->msgbuf, 30);
534     		}
535     		if (!(skb = alloc_skb(DataB3Len+MsgLen, GFP_ATOMIC))) {
536     			printk(KERN_ERR "%s: incoming packet dropped\n",
537     					card->name);
538     		} else {
539     			memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
540     			memcpy(skb_put(skb, DataB3Len), card->databuf, DataB3Len);
541     			ctrl->handle_capimsg(ctrl, ApplId, skb);
542     		}
543     		break;
544     
545     	case RECEIVE_MESSAGE:
546     
547     		ApplId = (unsigned) _get_word(&p);
548     		MsgLen = _get_slice(&p, card->msgbuf);
549     		cidx = CAPIMSG_CONTROLLER(card->msgbuf)-card->cardnr;
550     		if (cidx >= card->nlogcontr) cidx = 0;
551     		ctrl = card->ctrlinfo[cidx].capi_ctrl;
552     
553     		if (!(skb = alloc_skb(MsgLen, GFP_ATOMIC))) {
554     			printk(KERN_ERR "%s: incoming packet dropped\n",
555     					card->name);
556     		} else {
557     			memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
558     			ctrl->handle_capimsg(ctrl, ApplId, skb);
559     		}
560     		break;
561     
562     	case RECEIVE_NEW_NCCI:
563     
564     		ApplId = _get_word(&p);
565     		NCCI = _get_word(&p);
566     		WindowSize = _get_word(&p);
567     		cidx = (NCCI&0x7f) - card->cardnr;
568     		if (cidx >= card->nlogcontr) cidx = 0;
569     		ctrl = card->ctrlinfo[cidx].capi_ctrl;
570     
571     		ctrl->new_ncci(ctrl, ApplId, NCCI, WindowSize);
572     
573     		break;
574     
575     	case RECEIVE_FREE_NCCI:
576     
577     		ApplId = _get_word(&p);
578     		NCCI = _get_word(&p);
579     
580     		if (NCCI != 0xffffffff) {
581     			cidx = (NCCI&0x7f) - card->cardnr;
582     			if (cidx >= card->nlogcontr) cidx = 0;
583     			ctrl = card->ctrlinfo[cidx].capi_ctrl;
584     			if (ctrl)
585     				ctrl->free_ncci(ctrl, ApplId, NCCI);
586     		} else {
587     			for (cidx=0; cidx < 4; cidx++) {
588     				ctrl = card->ctrlinfo[cidx].capi_ctrl;
589     				if (ctrl)
590     					ctrl->appl_released(ctrl, ApplId);
591     			}
592     		}
593     		break;
594     
595     	case RECEIVE_START:
596     #ifdef CONFIG_C4_POLLDEBUG
597     		printk(KERN_INFO "%s: poll from c4\n", card->name);
598     #endif
599     		if (!suppress_pollack)
600     			queue_pollack(card);
601     		for (cidx=0; cidx < 4; cidx++) {
602     			ctrl = card->ctrlinfo[cidx].capi_ctrl;
603     			if (ctrl)
604     				ctrl->resume_output(ctrl);
605     		}
606     		break;
607     
608     	case RECEIVE_STOP:
609     		for (cidx=0; cidx < 4; cidx++) {
610     			ctrl = card->ctrlinfo[cidx].capi_ctrl;
611     			if (ctrl)
612     				ctrl->suspend_output(ctrl);
613     		}
614     		break;
615     
616     	case RECEIVE_INIT:
617     
618     	        cidx = card->nlogcontr;
619     		if (cidx >= 4 || !card->ctrlinfo[cidx].capi_ctrl) {
620     			printk(KERN_ERR "%s: card with %d controllers ??\n",
621     					card->name, cidx+1);
622     			break;
623     		}
624     	        card->nlogcontr++;
625     	        cinfo = &card->ctrlinfo[cidx];
626     		ctrl = cinfo->capi_ctrl;
627     		cinfo->versionlen = _get_slice(&p, cinfo->versionbuf);
628     		b1_parse_version(cinfo);
629     		printk(KERN_INFO "%s: %s-card (%s) now active\n",
630     		       card->name,
631     		       cinfo->version[VER_CARDTYPE],
632     		       cinfo->version[VER_DRIVER]);
633     		ctrl->ready(cinfo->capi_ctrl);
634     		break;
635     
636     	case RECEIVE_TASK_READY:
637     		ApplId = (unsigned) _get_word(&p);
638     		MsgLen = _get_slice(&p, card->msgbuf);
639     		card->msgbuf[MsgLen] = 0;
640     		while (    MsgLen > 0
641     		       && (   card->msgbuf[MsgLen-1] == '\n'
642     			   || card->msgbuf[MsgLen-1] == '\r')) {
643     			card->msgbuf[MsgLen-1] = 0;
644     			MsgLen--;
645     		}
646     		printk(KERN_INFO "%s: task %d \"%s\" ready.\n",
647     				card->name, ApplId, card->msgbuf);
648     		break;
649     
650     	case RECEIVE_DEBUGMSG:
651     		MsgLen = _get_slice(&p, card->msgbuf);
652     		card->msgbuf[MsgLen] = 0;
653     		while (    MsgLen > 0
654     		       && (   card->msgbuf[MsgLen-1] == '\n'
655     			   || card->msgbuf[MsgLen-1] == '\r')) {
656     			card->msgbuf[MsgLen-1] = 0;
657     			MsgLen--;
658     		}
659     		printk(KERN_INFO "%s: DEBUG: %s\n", card->name, card->msgbuf);
660     		break;
661     
662     	default:
663     		printk(KERN_ERR "%s: c4_interrupt: 0x%x ???\n",
664     				card->name, b1cmd);
665     		return;
666     	}
667     }
668     
669     /* ------------------------------------------------------------- */
670     
671     static void c4_handle_interrupt(avmcard *card)
672     {
673     	__u32 status = c4inmeml(card->mbase+DOORBELL);
674     
675     	if (status & DBELL_RESET_HOST) {
676     		int i;
677     		c4outmeml(card->mbase+PCI_OUT_INT_MASK, 0x0c);
678     		if (card->nlogcontr == 0)
679     			return;
680     		printk(KERN_ERR "%s: unexpected reset\n", card->name);
681                     for (i=0; i < 4; i++) {
682     			avmctrl_info *cinfo = &card->ctrlinfo[i];
683     			memset(cinfo->version, 0, sizeof(cinfo->version));
684     			if (cinfo->capi_ctrl)
685     				cinfo->capi_ctrl->reseted(cinfo->capi_ctrl);
686     		}
687     		card->nlogcontr = 0;
688     		return;
689     	}
690     
691     	status &= (DBELL_UP_HOST | DBELL_DOWN_HOST);
692     	if (!status)
693     		return;
694     	c4outmeml(card->mbase+DOORBELL, status);
695     
696     	if ((status & DBELL_UP_HOST) != 0) {
697     		card->dma->recvlen = c4inmeml(card->mbase+MBOX_UP_LEN);
698     		c4outmeml(card->mbase+MBOX_UP_LEN, 0);
699     		c4_handle_rx(card);
700     		card->dma->recvlen = 0;
701     		c4outmeml(card->mbase+MBOX_UP_LEN, sizeof(card->dma->recvbuf));
702     		c4outmeml(card->mbase+DOORBELL, DBELL_UP_ARM);
703     	}
704     
705     	if ((status & DBELL_DOWN_HOST) != 0) {
706     		card->csr &= ~DBELL_DOWN_ARM;
707     	        c4_dispatch_tx(card);
708     	} else if (card->csr & DBELL_DOWN_HOST) {
709     		if (c4inmeml(card->mbase+MBOX_DOWN_LEN) == 0) {
710     		        card->csr &= ~DBELL_DOWN_ARM;
711     			c4_dispatch_tx(card);
712     		}
713     	}
714     }
715     
716     static void c4_interrupt(int interrupt, void *devptr, struct pt_regs *regs)
717     {
718     	avmcard *card;
719     
720     	card = (avmcard *) devptr;
721     
722     	if (!card) {
723     		printk(KERN_WARNING "%s: interrupt: wrong device\n", card->name);
724     		return;
725     	}
726     	if (card->interrupt) {
727     		printk(KERN_ERR "%s: reentering interrupt hander\n",
728     				card->name);
729     		return;
730     	}
731     
732     	card->interrupt = 1;
733     
734     	c4_handle_interrupt(card);
735     
736     	card->interrupt = 0;
737     }
738     
739     /* ------------------------------------------------------------- */
740     
741     static void c4_send_init(avmcard *card)
742     {
743     	struct sk_buff *skb;
744     	void *p;
745     
746     	skb = alloc_skb(15, GFP_ATOMIC);
747     	if (!skb) {
748     		printk(KERN_CRIT "%s: no memory, lost register appl.\n",
749     					card->name);
750     		return;
751     	}
752     	p = skb->data;
753     	_put_byte(&p, 0);
754     	_put_byte(&p, 0);
755     	_put_byte(&p, SEND_INIT);
756     	_put_word(&p, CAPI_MAXAPPL);
757     	_put_word(&p, AVM_NCCI_PER_CHANNEL*30);
758     	_put_word(&p, card->cardnr - 1);
759     	skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
760     
761     	skb_queue_tail(&card->dma->send_queue, skb);
762     	c4_dispatch_tx(card);
763     }
764     
765     static int queue_sendconfigword(avmcard *card, __u32 val)
766     {
767     	struct sk_buff *skb;
768     	void *p;
769     
770     	skb = alloc_skb(3+4, GFP_ATOMIC);
771     	if (!skb) {
772     		printk(KERN_CRIT "%s: no memory, send config\n",
773     					card->name);
774     		return -ENOMEM;
775     	}
776     	p = skb->data;
777     	_put_byte(&p, 0);
778     	_put_byte(&p, 0);
779     	_put_byte(&p, SEND_CONFIG);
780     	_put_word(&p, val);
781     	skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
782     
783     	skb_queue_tail(&card->dma->send_queue, skb);
784     	c4_dispatch_tx(card);
785     	return 0;
786     }
787     
788     static int queue_sendconfig(avmcard *card, char cval[4])
789     {
790     	struct sk_buff *skb;
791     	void *p;
792     
793     	skb = alloc_skb(3+4, GFP_ATOMIC);
794     	if (!skb) {
795     		printk(KERN_CRIT "%s: no memory, send config\n",
796     					card->name);
797     		return -ENOMEM;
798     	}
799     	p = skb->data;
800     	_put_byte(&p, 0);
801     	_put_byte(&p, 0);
802     	_put_byte(&p, SEND_CONFIG);
803     	_put_byte(&p, cval[0]);
804     	_put_byte(&p, cval[1]);
805     	_put_byte(&p, cval[2]);
806     	_put_byte(&p, cval[3]);
807     	skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
808     
809     	skb_queue_tail(&card->dma->send_queue, skb);
810     	c4_dispatch_tx(card);
811     	return 0;
812     }
813     
814     static int c4_send_config(avmcard *card, capiloaddatapart * config)
815     {
816     	__u8 val[4];
817     	unsigned char *dp;
818     	int left, retval;
819     	
820     	if ((retval = queue_sendconfigword(card, 1)) != 0)
821     		return retval;
822     	if ((retval = queue_sendconfigword(card, config->len)) != 0)
823     		return retval;
824     
825     	dp = config->data;
826     	left = config->len;
827     	while (left >= sizeof(__u32)) {
828     	        if (config->user) {
829     			retval = copy_from_user(val, dp, sizeof(val));
830     			if (retval)
831     				return -EFAULT;
832     		} else {
833     			memcpy(val, dp, sizeof(val));
834     		}
835     		if ((retval = queue_sendconfig(card, val)) != 0)
836     			return retval;
837     		left -= sizeof(val);
838     		dp += sizeof(val);
839     	}
840     	if (left) {
841     		memset(val, 0, sizeof(val));
842     		if (config->user) {
843     			retval = copy_from_user(&val, dp, left);
844     			if (retval)
845     				return -EFAULT;
846     		} else {
847     			memcpy(&val, dp, left);
848     		}
849     		if ((retval = queue_sendconfig(card, val)) != 0)
850     			return retval;
851     	}
852     
853     	return 0;
854     }
855     
856     static int c4_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
857     {
858     	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
859     	avmcard *card = cinfo->card;
860     	unsigned long flags;
861     	int retval;
862     
863     	if ((retval = c4_load_t4file(card, &data->firmware))) {
864     		printk(KERN_ERR "%s: failed to load t4file!!\n",
865     					card->name);
866     		c4_reset(card);
867     		return retval;
868     	}
869     
870     	save_flags(flags);
871     	cli();
872     
873     	card->csr = 0;
874     	c4outmeml(card->mbase+MBOX_UP_LEN, 0);
875     	c4outmeml(card->mbase+MBOX_DOWN_LEN, 0);
876     	c4outmeml(card->mbase+DOORBELL, DBELL_INIT);
877     	mdelay(1);
878     	c4outmeml(card->mbase+DOORBELL,
879     			DBELL_UP_HOST | DBELL_DOWN_HOST | DBELL_RESET_HOST);
880     
881     	c4outmeml(card->mbase+PCI_OUT_INT_MASK, 0x08);
882     
883     	card->dma->recvlen = 0;
884     	c4outmeml(card->mbase+MBOX_UP_ADDR, virt_to_phys(card->dma->recvbuf));
885     	c4outmeml(card->mbase+MBOX_UP_LEN, sizeof(card->dma->recvbuf));
886     	c4outmeml(card->mbase+DOORBELL, DBELL_UP_ARM);
887     	restore_flags(flags);
888     
889     	if (data->configuration.len > 0 && data->configuration.data) {
890     		retval = c4_send_config(card, &data->configuration);
891     		if (retval) {
892     			printk(KERN_ERR "%s: failed to set config!!\n",
893     					card->name);
894     			c4_reset(card);
895     			return retval;
896     		}
897     	}
898     
899             c4_send_init(card);
900     
901     	return 0;
902     }
903     
904     
905     void c4_reset_ctr(struct capi_ctr *ctrl)
906     {
907     	avmcard *card = ((avmctrl_info *)(ctrl->driverdata))->card;
908     	avmctrl_info *cinfo;
909     	int i;
910     
911      	c4_reset(card);
912     
913             for (i=0; i < 4; i++) {
914     		cinfo = &card->ctrlinfo[i];
915     		memset(cinfo->version, 0, sizeof(cinfo->version));
916     		if (cinfo->capi_ctrl)
917     			cinfo->capi_ctrl->reseted(cinfo->capi_ctrl);
918     	}
919     	card->nlogcontr = 0;
920     }
921     
922     static void c4_remove_ctr(struct capi_ctr *ctrl)
923     {
924     	avmcard *card = ((avmctrl_info *)(ctrl->driverdata))->card;
925     	avmctrl_info *cinfo;
926     	int i;
927     
928      	c4_reset(card);
929     
930             for (i=0; i < 4; i++) {
931     		cinfo = &card->ctrlinfo[i];
932     		if (cinfo->capi_ctrl) {
933     			di->detach_ctr(cinfo->capi_ctrl);
934     			cinfo->capi_ctrl = NULL;
935     		}
936     	}
937     
938     	free_irq(card->irq, card);
939     	iounmap(card->mbase);
940     	release_region(card->port, AVMB1_PORTLEN);
941     	ctrl->driverdata = 0;
942     	kfree(card->ctrlinfo);
943     	kfree(card->dma);
944     	kfree(card);
945     
946     	MOD_DEC_USE_COUNT;
947     }
948     
949     /* ------------------------------------------------------------- */
950     
951     
952     void c4_register_appl(struct capi_ctr *ctrl,
953     				__u16 appl,
954     				capi_register_params *rp)
955     {
956     	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
957     	avmcard *card = cinfo->card;
958     	struct sk_buff *skb;
959     	int want = rp->level3cnt;
960     	int nconn;
961     	void *p;
962     
963     	if (ctrl->cnr == card->cardnr) {
964     
965     		if (want > 0) nconn = want;
966     		else nconn = ctrl->profile.nbchannel * 4 * -want;
967     		if (nconn == 0) nconn = ctrl->profile.nbchannel * 4;
968     
969     		skb = alloc_skb(23, GFP_ATOMIC);
970     		if (!skb) {
971     			printk(KERN_CRIT "%s: no memory, lost register appl.\n",
972     						card->name);
973     			return;
974     		}
975     		p = skb->data;
976     		_put_byte(&p, 0);
977     		_put_byte(&p, 0);
978     		_put_byte(&p, SEND_REGISTER);
979     		_put_word(&p, appl);
980     		_put_word(&p, 1024 * (nconn+1));
981     		_put_word(&p, nconn);
982     		_put_word(&p, rp->datablkcnt);
983     		_put_word(&p, rp->datablklen);
984     		skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
985     
986     		skb_queue_tail(&card->dma->send_queue, skb);
987     		c4_dispatch_tx(card);
988     	}
989     
990     	ctrl->appl_registered(ctrl, appl);
991     }
992     
993     /* ------------------------------------------------------------- */
994     
995     void c4_release_appl(struct capi_ctr *ctrl, __u16 appl)
996     {
997     	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
998     	avmcard *card = cinfo->card;
999     	struct sk_buff *skb;
1000     	void *p;
1001     
1002     	if (ctrl->cnr == card->cardnr) {
1003     		skb = alloc_skb(7, GFP_ATOMIC);
1004     		if (!skb) {
1005     			printk(KERN_CRIT "%s: no memory, lost release appl.\n",
1006     						card->name);
1007     			return;
1008     		}
1009     		p = skb->data;
1010     		_put_byte(&p, 0);
1011     		_put_byte(&p, 0);
1012     		_put_byte(&p, SEND_RELEASE);
1013     		_put_word(&p, appl);
1014     
1015     		skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
1016     		skb_queue_tail(&card->dma->send_queue, skb);
1017     		c4_dispatch_tx(card);
1018     	}
1019     }
1020     
1021     /* ------------------------------------------------------------- */
1022     
1023     
1024     static void c4_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
1025     {
1026     	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
1027     	avmcard *card = cinfo->card;
1028     	skb_queue_tail(&card->dma->send_queue, skb);
1029     	c4_dispatch_tx(card);
1030     }
1031     
1032     /* ------------------------------------------------------------- */
1033     
1034     static char *c4_procinfo(struct capi_ctr *ctrl)
1035     {
1036     	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
1037     
1038     	if (!cinfo)
1039     		return "";
1040     	sprintf(cinfo->infobuf, "%s %s 0x%x %d 0x%lx",
1041     		cinfo->cardname[0] ? cinfo->cardname : "-",
1042     		cinfo->version[VER_DRIVER] ? cinfo->version[VER_DRIVER] : "-",
1043     		cinfo->card ? cinfo->card->port : 0x0,
1044     		cinfo->card ? cinfo->card->irq : 0,
1045     		cinfo->card ? cinfo->card->membase : 0
1046     		);
1047     	return cinfo->infobuf;
1048     }
1049     
1050     static int c4_read_proc(char *page, char **start, off_t off,
1051             		int count, int *eof, struct capi_ctr *ctrl)
1052     {
1053     	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
1054     	avmcard *card = cinfo->card;
1055     	__u8 flag;
1056     	int len = 0;
1057     	char *s;
1058     
1059     	len += sprintf(page+len, "%-16s %s\n", "name", card->name);
1060     	len += sprintf(page+len, "%-16s 0x%x\n", "io", card->port);
1061     	len += sprintf(page+len, "%-16s %d\n", "irq", card->irq);
1062     	len += sprintf(page+len, "%-16s 0x%lx\n", "membase", card->membase);
1063     	switch (card->cardtype) {
1064     	case avm_b1isa: s = "B1 ISA"; break;
1065     	case avm_b1pci: s = "B1 PCI"; break;
1066     	case avm_b1pcmcia: s = "B1 PCMCIA"; break;
1067     	case avm_m1: s = "M1"; break;
1068     	case avm_m2: s = "M2"; break;
1069     	case avm_t1isa: s = "T1 ISA (HEMA)"; break;
1070     	case avm_t1pci: s = "T1 PCI"; break;
1071     	case avm_c4: s = "C4"; break;
1072     	case avm_c2: s = "C2"; break;
1073     	default: s = "???"; break;
1074     	}
1075     	len += sprintf(page+len, "%-16s %s\n", "type", s);
1076     	if ((s = cinfo->version[VER_DRIVER]) != 0)
1077     	   len += sprintf(page+len, "%-16s %s\n", "ver_driver", s);
1078     	if ((s = cinfo->version[VER_CARDTYPE]) != 0)
1079     	   len += sprintf(page+len, "%-16s %s\n", "ver_cardtype", s);
1080     	if ((s = cinfo->version[VER_SERIAL]) != 0)
1081     	   len += sprintf(page+len, "%-16s %s\n", "ver_serial", s);
1082     
1083     	if (card->cardtype != avm_m1) {
1084             	flag = ((__u8 *)(ctrl->profile.manu))[3];
1085             	if (flag)
1086     			len += sprintf(page+len, "%-16s%s%s%s%s%s%s%s\n",
1087     			"protocol",
1088     			(flag & 0x01) ? " DSS1" : "",
1089     			(flag & 0x02) ? " CT1" : "",
1090     			(flag & 0x04) ? " VN3" : "",
1091     			(flag & 0x08) ? " NI1" : "",
1092     			(flag & 0x10) ? " AUSTEL" : "",
1093     			(flag & 0x20) ? " ESS" : "",
1094     			(flag & 0x40) ? " 1TR6" : ""
1095     			);
1096     	}
1097     	if (card->cardtype != avm_m1) {
1098             	flag = ((__u8 *)(ctrl->profile.manu))[5];
1099     		if (flag)
1100     			len += sprintf(page+len, "%-16s%s%s%s%s\n",
1101     			"linetype",
1102     			(flag & 0x01) ? " point to point" : "",
1103     			(flag & 0x02) ? " point to multipoint" : "",
1104     			(flag & 0x08) ? " leased line without D-channel" : "",
1105     			(flag & 0x04) ? " leased line with D-channel" : ""
1106     			);
1107     	}
1108     	len += sprintf(page+len, "%-16s %s\n", "cardname", cinfo->cardname);
1109     
1110     	if (off+count >= len)
1111     	   *eof = 1;
1112     	if (len < off)
1113                return 0;
1114     	*start = page + off;
1115     	return ((count < len-off) ? count : len-off);
1116     }
1117     
1118     /* ------------------------------------------------------------- */
1119     
1120     static int c4_add_card(struct capi_driver *driver,
1121     		       struct capicardparams *p,
1122     		       int nr)
1123     {
1124     	avmctrl_info *cinfo;
1125     	avmcard *card;
1126     	int retval;
1127     	int i;
1128     
1129     	MOD_INC_USE_COUNT;
1130     
1131     	card = (avmcard *) kmalloc(sizeof(avmcard), GFP_ATOMIC);
1132     
1133     	if (!card) {
1134     		printk(KERN_WARNING "%s: no memory.\n", driver->name);
1135     	        MOD_DEC_USE_COUNT;
1136     		return -ENOMEM;
1137     	}
1138     	memset(card, 0, sizeof(avmcard));
1139     	card->dma = (avmcard_dmainfo *) kmalloc(sizeof(avmcard_dmainfo), GFP_ATOMIC);
1140     	if (!card->dma) {
1141     		printk(KERN_WARNING "%s: no memory.\n", driver->name);
1142     		kfree(card);
1143     	        MOD_DEC_USE_COUNT;
1144     		return -ENOMEM;
1145     	}
1146     	memset(card->dma, 0, sizeof(avmcard_dmainfo));
1147             cinfo = (avmctrl_info *) kmalloc(sizeof(avmctrl_info)*4, GFP_ATOMIC);
1148     	if (!cinfo) {
1149     		printk(KERN_WARNING "%s: no memory.\n", driver->name);
1150     		kfree(card->dma);
1151     		kfree(card);
1152     	        MOD_DEC_USE_COUNT;
1153     		return -ENOMEM;
1154     	}
1155     	memset(cinfo, 0, sizeof(avmctrl_info)*4);
1156     	card->ctrlinfo = cinfo;
1157     	for (i=0; i < 4; i++) {
1158     		cinfo = &card->ctrlinfo[i];
1159     		cinfo->card = card;
1160     	}
1161     	sprintf(card->name, "%s-%x", driver->name, p->port);
1162     	card->port = p->port;
1163     	card->irq = p->irq;
1164     	card->membase = p->membase;
1165     	card->cardtype = nr == 4 ? avm_c4 : avm_c2;
1166     
1167     	if (check_region(card->port, AVMB1_PORTLEN)) {
1168     		printk(KERN_WARNING
1169     		       "%s: ports 0x%03x-0x%03x in use.\n",
1170     		       driver->name, card->port, card->port + AVMB1_PORTLEN);
1171     	        kfree(card->ctrlinfo);
1172     		kfree(card->dma);
1173     		kfree(card);
1174     	        MOD_DEC_USE_COUNT;
1175     		return -EBUSY;
1176     	}
1177     
1178     	card->mbase = ioremap_nocache(card->membase, 128);
1179     	if (card->mbase == 0) {
1180     		printk(KERN_NOTICE "%s: can't remap memory at 0x%lx\n",
1181     					driver->name, card->membase);
1182     	        kfree(card->ctrlinfo);
1183     		kfree(card->dma);
1184     		kfree(card);
1185     	        MOD_DEC_USE_COUNT;
1186     		return -EIO;
1187     	}
1188     
1189     	if ((retval = c4_detect(card)) != 0) {
1190     		printk(KERN_NOTICE "%s: NO card at 0x%x (%d)\n",
1191     					driver->name, card->port, retval);
1192                     iounmap(card->mbase);
1193     	        kfree(card->ctrlinfo);
1194     		kfree(card->dma);
1195     		kfree(card);
1196     	        MOD_DEC_USE_COUNT;
1197     		return -EIO;
1198     	}
1199     	c4_reset(card);
1200     
1201     	request_region(p->port, AVMB1_PORTLEN, card->name);
1202     
1203     	retval = request_irq(card->irq, c4_interrupt, SA_SHIRQ, card->name, card);
1204     	if (retval) {
1205     		printk(KERN_ERR "%s: unable to get IRQ %d.\n",
1206     				driver->name, card->irq);
1207                     iounmap(card->mbase);
1208     		release_region(card->port, AVMB1_PORTLEN);
1209     	        kfree(card->ctrlinfo);
1210     		kfree(card->dma);
1211     		kfree(card);
1212     	        MOD_DEC_USE_COUNT;
1213     		return -EBUSY;
1214     	}
1215     
1216     	for (i=0; i < nr ; i++) {
1217     		cinfo = &card->ctrlinfo[i];
1218     		cinfo->card = card;
1219     		cinfo->capi_ctrl = di->attach_ctr(driver, card->name, cinfo);
1220     		if (!cinfo->capi_ctrl) {
1221     			printk(KERN_ERR "%s: attach controller failed (%d).\n",
1222     					driver->name, i);
1223     			for (i--; i >= 0; i--) {
1224     				cinfo = &card->ctrlinfo[i];
1225     				di->detach_ctr(cinfo->capi_ctrl);
1226     			}
1227                     	iounmap(card->mbase);
1228     			free_irq(card->irq, card);
1229     			release_region(card->port, AVMB1_PORTLEN);
1230     	        	kfree(card->dma);
1231     	        	kfree(card->ctrlinfo);
1232     			kfree(card);
1233     	        	MOD_DEC_USE_COUNT;
1234     			return -EBUSY;
1235     		}
1236     		if (i == 0)
1237     			card->cardnr = cinfo->capi_ctrl->cnr;
1238     	}
1239     
1240     	skb_queue_head_init(&card->dma->send_queue);
1241     
1242     	printk(KERN_INFO
1243     		"%s: AVM C%d at i/o %#x, irq %d, mem %#lx\n",
1244     		driver->name, nr, card->port, card->irq, card->membase);
1245     
1246     	return 0;
1247     }
1248     
1249     /* ------------------------------------------------------------- */
1250     
1251     static struct capi_driver c2_driver = {
1252         name: "c2",
1253         revision: "0.0",
1254         load_firmware: c4_load_firmware,
1255         reset_ctr: c4_reset_ctr,
1256         remove_ctr: c4_remove_ctr,
1257         register_appl: c4_register_appl,
1258         release_appl: c4_release_appl,
1259         send_message: c4_send_message,
1260     
1261         procinfo: c4_procinfo,
1262         ctr_read_proc: c4_read_proc,
1263         driver_read_proc: 0,	/* use standard driver_read_proc */
1264     
1265         add_card: 0, /* no add_card function */
1266     };
1267     
1268     static struct capi_driver c4_driver = {
1269         name: "c4",
1270         revision: "0.0",
1271         load_firmware: c4_load_firmware,
1272         reset_ctr: c4_reset_ctr,
1273         remove_ctr: c4_remove_ctr,
1274         register_appl: c4_register_appl,
1275         release_appl: c4_release_appl,
1276         send_message: c4_send_message,
1277     
1278         procinfo: c4_procinfo,
1279         ctr_read_proc: c4_read_proc,
1280         driver_read_proc: 0,	/* use standard driver_read_proc */
1281     
1282         add_card: 0, /* no add_card function */
1283     };
1284     
1285     static int ncards = 0;
1286     
1287     static int c4_attach_driver (struct capi_driver * driver)
1288     {
1289     	char *p;
1290     	if ((p = strchr(revision, ':')) != 0 && p[1]) {
1291     		strncpy(driver->revision, p + 2, sizeof(driver->revision));
1292     		driver->revision[sizeof(driver->revision)-1] = 0;
1293     		if ((p = strchr(driver->revision, '$')) != 0 && p > driver->revision)
1294     			*(p-1) = 0;
1295     	}
1296     
1297     	printk(KERN_INFO "%s: revision %s\n", driver->name, driver->revision);
1298     
1299             di = attach_capi_driver(driver);
1300     	if (!di) {
1301     		printk(KERN_ERR "%s: failed to attach capi_driver\n",
1302     				driver->name);
1303     		MOD_DEC_USE_COUNT;
1304     		return -ENODEV;
1305     	}
1306     	return 0;
1307     }
1308     
1309     static int __init search_cards(struct capi_driver * driver,
1310     				int pci_id, int nr)
1311     {
1312     	struct pci_dev *	dev	= NULL;
1313     	int			retval	= 0;
1314     
1315     	while ((dev = pci_find_subsys(
1316     			PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285,
1317     			PCI_VENDOR_ID_AVM, pci_id, dev))) {
1318     		struct capicardparams param;
1319     
1320     		if (pci_enable_device(dev) < 0) {
1321     		        printk(KERN_ERR "%s: failed to enable AVM-C%d\n",
1322     			       driver->name, nr);
1323     			continue;
1324     		}
1325     		pci_set_master(dev);
1326     
1327     		param.port = pci_resource_start(dev, 1);
1328     		param.irq = dev->irq;
1329     		param.membase = pci_resource_start(dev, 0);
1330       
1331     		printk(KERN_INFO
1332     			"%s: PCI BIOS reports AVM-C%d at i/o %#x, irq %d, mem %#x\n",
1333     			driver->name, nr, param.port, param.irq, param.membase);
1334     		retval = c4_add_card(driver, &param, nr);
1335     		if (retval != 0) {
1336     		        printk(KERN_ERR
1337     			"%s: no AVM-C%d at i/o %#x, irq %d detected, mem %#x\n",
1338     			driver->name, nr, param.port, param.irq, param.membase);
1339     			continue;
1340     		}
1341     		ncards++;
1342     	}
1343     	return retval;
1344     }
1345     
1346     static int __init c4_init(void)
1347     {
1348     	int retval;
1349     
1350     	MOD_INC_USE_COUNT;
1351     
1352     	retval = c4_attach_driver (&c4_driver);
1353     	if (retval) {
1354     		MOD_DEC_USE_COUNT;
1355     		return retval;
1356     	}
1357     
1358     	retval = c4_attach_driver (&c2_driver);
1359     	if (retval) {
1360     		MOD_DEC_USE_COUNT;
1361     		return retval;
1362     	}
1363     
1364     	retval = search_cards(&c4_driver, PCI_DEVICE_ID_AVM_C4, 4);
1365     	if (retval && ncards == 0) {
1366         		detach_capi_driver(&c2_driver);
1367         		detach_capi_driver(&c4_driver);
1368     		MOD_DEC_USE_COUNT;
1369     		return retval;
1370     	}
1371     	retval = search_cards(&c2_driver, PCI_DEVICE_ID_AVM_C2, 2);
1372     	if (retval && ncards == 0) {
1373         		detach_capi_driver(&c2_driver);
1374         		detach_capi_driver(&c4_driver);
1375     		MOD_DEC_USE_COUNT;
1376     		return retval;
1377     	}
1378     
1379     	if (ncards) {
1380     		printk(KERN_INFO "%s: %d C4/C2 card(s) detected\n",
1381     				c4_driver.name, ncards);
1382     		MOD_DEC_USE_COUNT;
1383     		return 0;
1384     	}
1385     	printk(KERN_ERR "%s: NO C4/C2 card detected\n", c4_driver.name);
1386     	detach_capi_driver(&c4_driver);
1387     	detach_capi_driver(&c2_driver);
1388     	MOD_DEC_USE_COUNT;
1389     	return -ENODEV;
1390     }
1391     
1392     static void __exit c4_exit(void)
1393     {
1394         detach_capi_driver(&c2_driver);
1395         detach_capi_driver(&c4_driver);
1396     }
1397     
1398     module_init(c4_init);
1399     module_exit(c4_exit);
1400