Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/isdn/hardware/avm/c4.c (Version 2.6.25.8) and /linux/drivers/isdn/hardware/avm/c4.c (Version 2.6.11.8)


  1 /* $Id: c4.c,v 1.1.2.2 2004/01/16 21:09:27 kei      1 
  2  *                                                
  3  * Module for AVM C4 & C2 card.                   
  4  *                                                
  5  * Copyright 1999 by Carsten Paeth <calle@call    
  6  *                                                
  7  * This software may be used and distributed a    
  8  * of the GNU General Public License, incorpor    
  9  *                                                
 10  */                                               
 11                                                   
 12 #include <linux/module.h>                         
 13 #include <linux/kernel.h>                         
 14 #include <linux/skbuff.h>                         
 15 #include <linux/delay.h>                          
 16 #include <linux/mm.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>                           
 23 #include <asm/io.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>                   
 29 #include "avmcard.h"                              
 30                                                   
 31 #undef AVM_C4_DEBUG                               
 32 #undef AVM_C4_POLLDEBUG                           
 33                                                   
 34 /* -------------------------------------------    
 35                                                   
 36 static char *revision = "$Revision: 1.1.2.2 $"    
 37                                                   
 38 /* -------------------------------------------    
 39                                                   
 40 static int suppress_pollack;                      
 41                                                   
 42 static struct pci_device_id c4_pci_tbl[] = {      
 43         { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC    
 44         { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC    
 45         { }                     /* Terminating    
 46 };                                                
 47                                                   
 48 MODULE_DEVICE_TABLE(pci, c4_pci_tbl);             
 49 MODULE_DESCRIPTION("CAPI4Linux: Driver for AVM    
 50 MODULE_AUTHOR("Carsten Paeth");                   
 51 MODULE_LICENSE("GPL");                            
 52 module_param(suppress_pollack, bool, 0);          
 53                                                   
 54 /* -------------------------------------------    
 55                                                   
 56 static void c4_dispatch_tx(avmcard *card);        
 57                                                   
 58 /* -------------------------------------------    
 59                                                   
 60 #define DC21285_DRAM_A0MR       0x40000000        
 61 #define DC21285_DRAM_A1MR       0x40004000        
 62 #define DC21285_DRAM_A2MR       0x40008000        
 63 #define DC21285_DRAM_A3MR       0x4000C000        
 64                                                   
 65 #define CAS_OFFSET      0x88                      
 66                                                   
 67 #define DC21285_ARMCSR_BASE     0x42000000        
 68                                                   
 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              
 75 #define DOORBELL                0x60              
 76 #define DOORBELL_SETUP          0x64              
 77                                                   
 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             
 90                                                   
 91 #define SDRAM_SIZE              0x1000000         
 92                                                   
 93 /* -------------------------------------------    
 94                                                   
 95 #define MBOX_PEEK_POKE          MAILBOX_0         
 96                                                   
 97 #define DBELL_ADDR              0x01              
 98 #define DBELL_DATA              0x02              
 99 #define DBELL_RNWR              0x40              
100 #define DBELL_INIT              0x80              
101                                                   
102 /* -------------------------------------------    
103                                                   
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         
108                                                   
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        
115                                                   
116 /* -------------------------------------------    
117                                                   
118 #define DRAM_TIMING_DEF         0x001A01A5        
119 #define DRAM_AD_SZ_DEF0         0x00000045        
120 #define DRAM_AD_SZ_NULL         0x00000000        
121                                                   
122 #define SA_CTL_ALLRIGHT         0x64AA0271        
123                                                   
124 #define INIT_XBUS_CYCLE         0x100016DB        
125 #define INIT_XBUS_STROBE        0xF1F1F1F1        
126                                                   
127 /* -------------------------------------------    
128                                                   
129 #define RESET_TIMEOUT           (15*HZ) /* 15     
130 #define PEEK_POKE_TIMEOUT       (HZ/10) /* 0.1    
131                                                   
132 /* -------------------------------------------    
133                                                   
134 #define c4outmeml(addr, value)  writel(value,     
135 #define c4inmeml(addr)  readl(addr)               
136 #define c4outmemw(addr, value)  writew(value,     
137 #define c4inmemw(addr)  readw(addr)               
138 #define c4outmemb(addr, value)  writeb(value,     
139 #define c4inmemb(addr)  readb(addr)               
140                                                   
141 /* -------------------------------------------    
142                                                   
143 static inline int wait_for_doorbell(avmcard *c    
144 {                                                 
145         unsigned long stop;                       
146                                                   
147         stop = jiffies + t;                       
148         while (c4inmeml(card->mbase+DOORBELL)     
149                 if (!time_before(jiffies, stop    
150                         return -1;                
151                 mb();                             
152         }                                         
153         return 0;                                 
154 }                                                 
155                                                   
156 static int c4_poke(avmcard *card,  unsigned lo    
157 {                                                 
158                                                   
159         if (wait_for_doorbell(card, HZ/10) < 0    
160                 return -1;                        
161                                                   
162         c4outmeml(card->mbase+MBOX_PEEK_POKE,     
163         c4outmeml(card->mbase+DOORBELL, DBELL_    
164                                                   
165         if (wait_for_doorbell(card, HZ/10) < 0    
166                 return -1;                        
167                                                   
168         c4outmeml(card->mbase+MBOX_PEEK_POKE,     
169         c4outmeml(card->mbase+DOORBELL, DBELL_    
170                                                   
171         return 0;                                 
172 }                                                 
173                                                   
174 static int c4_peek(avmcard *card,  unsigned lo    
175 {                                                 
176         if (wait_for_doorbell(card, HZ/10) < 0    
177                 return -1;                        
178                                                   
179         c4outmeml(card->mbase+MBOX_PEEK_POKE,     
180         c4outmeml(card->mbase+DOORBELL, DBELL_    
181                                                   
182         if (wait_for_doorbell(card, HZ/10) < 0    
183                 return -1;                        
184                                                   
185         *valuep = c4inmeml(card->mbase+MBOX_PE    
186                                                   
187         return 0;                                 
188 }                                                 
189                                                   
190 /* -------------------------------------------    
191                                                   
192 static int c4_load_t4file(avmcard *card, capil    
193 {                                                 
194         u32 val;                                  
195         unsigned char *dp;                        
196         u_int left;                               
197         u32 loadoff = 0;                          
198                                                   
199         dp = t4file->data;                        
200         left = t4file->len;                       
201         while (left >= sizeof(u32)) {             
202                 if (t4file->user) {               
203                         if (copy_from_user(&va    
204                                 return -EFAULT    
205                 } else {                          
206                         memcpy(&val, dp, sizeo    
207                 }                                 
208                 if (c4_poke(card, loadoff, val    
209                         printk(KERN_ERR "%s: c    
210                                         card->    
211                         return -EIO;              
212                 }                                 
213                 left -= sizeof(u32);              
214                 dp += sizeof(u32);                
215                 loadoff += sizeof(u32);           
216         }                                         
217         if (left) {                               
218                 val = 0;                          
219                 if (t4file->user) {               
220                         if (copy_from_user(&va    
221                                 return -EFAULT    
222                 } else {                          
223                         memcpy(&val, dp, left)    
224                 }                                 
225                 if (c4_poke(card, loadoff, val    
226                         printk(KERN_ERR "%s: c    
227                                         card->    
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 va    
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, unsig    
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, unsign    
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_    
298                                                   
299         stop = jiffies + HZ*10;                   
300         while (c4inmeml(card->mbase+DOORBELL)     
301                 if (!time_before(jiffies, stop    
302                         return;                   
303                 c4outmeml(card->mbase+DOORBELL    
304                 mb();                             
305         }                                         
306                                                   
307         c4_poke(card, DC21285_ARMCSR_BASE + CH    
308         c4_poke(card, DC21285_ARMCSR_BASE + CH    
309 }                                                 
310                                                   
311 /* -------------------------------------------    
312                                                   
313 static int c4_detect(avmcard *card)               
314 {                                                 
315         unsigned long stop, dummy;                
316                                                   
317         c4outmeml(card->mbase+PCI_OUT_INT_MASK    
318         if (c4inmeml(card->mbase+PCI_OUT_INT_M    
319                 return  1;                        
320                                                   
321         c4outmeml(card->mbase+DOORBELL, DBELL_    
322                                                   
323         stop = jiffies + HZ*10;                   
324         while (c4inmeml(card->mbase+DOORBELL)     
325                 if (!time_before(jiffies, stop    
326                         return 2;                 
327                 c4outmeml(card->mbase+DOORBELL    
328                 mb();                             
329         }                                         
330                                                   
331         c4_poke(card, DC21285_ARMCSR_BASE + CH    
332         c4_poke(card, DC21285_ARMCSR_BASE + CH    
333                                                   
334         c4outmeml(card->mbase+MAILBOX_0, 0x55a    
335         if (c4inmeml(card->mbase+MAILBOX_0) !=    
336                                                   
337         c4outmeml(card->mbase+MAILBOX_0, 0xaa5    
338         if (c4inmeml(card->mbase+MAILBOX_0) !=    
339                                                   
340         if (c4_poke(card, DC21285_ARMCSR_BASE+    
341         if (c4_poke(card, DC21285_ARMCSR_BASE+    
342         if (c4_poke(card, DC21285_ARMCSR_BASE+    
343                 return 7;                         
344         if (c4_poke(card, DC21285_ARMCSR_BASE+    
345                 return 8;                         
346         if (c4_poke(card, DC21285_ARMCSR_BASE+    
347                 return 8;                         
348         if (c4_poke(card, DC21285_ARMCSR_BASE+    
349                                                   
350         mdelay(1);                                
351                                                   
352         if (c4_peek(card, DC21285_DRAM_A0MR, &    
353         if (c4_peek(card, DC21285_DRAM_A1MR, &    
354         if (c4_peek(card, DC21285_DRAM_A2MR, &    
355         if (c4_peek(card, DC21285_DRAM_A3MR, &    
356                                                   
357         if (c4_poke(card, DC21285_DRAM_A0MR+CA    
358         if (c4_poke(card, DC21285_DRAM_A1MR+CA    
359         if (c4_poke(card, DC21285_DRAM_A2MR+CA    
360         if (c4_poke(card, DC21285_DRAM_A3MR+CA    
361                                                   
362         mdelay(1);                                
363                                                   
364         if (c4_poke(card, DC21285_ARMCSR_BASE+    
365                 return 18;                        
366                                                   
367         if (c4_poke(card, DC21285_ARMCSR_BASE+    
368                 return 19;                        
369         if (c4_poke(card, DC21285_ARMCSR_BASE+    
370                 return 20;                        
371         if (c4_poke(card, DC21285_ARMCSR_BASE+    
372                 return 21;                        
373         if (c4_poke(card, DC21285_ARMCSR_BASE+    
374                 return 22;                        
375                                                   
376         /* Transputer test */                     
377                                                   
378         if (   c4_poke(card, 0x000000, 0x11111    
379             || c4_poke(card, 0x400000, 0x22222    
380             || c4_poke(card, 0x800000, 0x33333    
381             || c4_poke(card, 0xC00000, 0x44444    
382                 return 23;                        
383                                                   
384         if (   c4_peek(card, 0x000000, &dummy)    
385             || c4_peek(card, 0x400000, &dummy)    
386             || c4_peek(card, 0x800000, &dummy)    
387             || c4_peek(card, 0xC00000, &dummy)    
388                 return 24;                        
389                                                   
390         if (   c4_poke(card, 0x000000, 0x55555    
391             || c4_poke(card, 0x400000, 0x66666    
392             || c4_poke(card, 0x800000, 0x77777    
393             || c4_poke(card, 0xC00000, 0x88888    
394                 return 25;                        
395                                                   
396         if (   c4_peek(card, 0x000000, &dummy)    
397             || c4_peek(card, 0x400000, &dummy)    
398             || c4_peek(card, 0x800000, &dummy)    
399             || c4_peek(card, 0xC00000, &dummy)    
400                 return 26;                        
401                                                   
402         return 0;                                 
403 }                                                 
404                                                   
405 /* -------------------------------------------    
406                                                   
407 static void c4_dispatch_tx(avmcard *card)         
408 {                                                 
409         avmcard_dmainfo *dma = card->dma;         
410         struct sk_buff *skb;                      
411         u8 cmd, subcmd;                           
412         u16 len;                                  
413         u32 txlen;                                
414         void *p;                                  
415                                                   
416                                                   
417         if (card->csr & DBELL_DOWN_ARM) { /* t    
418                 return;                           
419         }                                         
420                                                   
421         skb = skb_dequeue(&dma->send_queue);      
422         if (!skb) {                               
423 #ifdef AVM_C4_DEBUG                               
424                 printk(KERN_DEBUG "%s: tx unde    
425 #endif                                            
426                 return;                           
427         }                                         
428                                                   
429         len = CAPIMSG_LEN(skb->data);             
430                                                   
431         if (len) {                                
432                 cmd = CAPIMSG_COMMAND(skb->dat    
433                 subcmd = CAPIMSG_SUBCOMMAND(sk    
434                                                   
435                 p = dma->sendbuf.dmabuf;          
436                                                   
437                 if (CAPICMD(cmd, subcmd) == CA    
438                         u16 dlen = CAPIMSG_DAT    
439                         _put_byte(&p, SEND_DAT    
440                         _put_slice(&p, skb->da    
441                         _put_slice(&p, skb->da    
442                 } else {                          
443                         _put_byte(&p, SEND_MES    
444                         _put_slice(&p, skb->da    
445                 }                                 
446                 txlen = (u8 *)p - (u8 *)dma->s    
447 #ifdef AVM_C4_DEBUG                               
448                 printk(KERN_DEBUG "%s: tx put     
449 #endif                                            
450         } else {                                  
451                 txlen = skb->len-2;               
452 #ifdef AVM_C4_POLLDEBUG                           
453                 if (skb->data[2] == SEND_POLLA    
454                         printk(KERN_INFO "%s:     
455 #endif                                            
456 #ifdef AVM_C4_DEBUG                               
457                 printk(KERN_DEBUG "%s: tx put     
458                                 card->name, sk    
459 #endif                                            
460                 skb_copy_from_linear_data_offs    
461                                                   
462         }                                         
463         txlen = (txlen + 3) & ~3;                 
464                                                   
465         c4outmeml(card->mbase+MBOX_DOWN_ADDR,     
466         c4outmeml(card->mbase+MBOX_DOWN_LEN, t    
467                                                   
468         card->csr |= DBELL_DOWN_ARM;              
469                                                   
470         c4outmeml(card->mbase+DOORBELL, DBELL_    
471                                                   
472         dev_kfree_skb_any(skb);                   
473 }                                                 
474                                                   
475 /* -------------------------------------------    
476                                                   
477 static void queue_pollack(avmcard *card)          
478 {                                                 
479         struct sk_buff *skb;                      
480         void *p;                                  
481                                                   
482         skb = alloc_skb(3, GFP_ATOMIC);           
483         if (!skb) {                               
484                 printk(KERN_CRIT "%s: no memor    
485                                         card->    
486                 return;                           
487         }                                         
488         p = skb->data;                            
489         _put_byte(&p, 0);                         
490         _put_byte(&p, 0);                         
491         _put_byte(&p, SEND_POLLACK);              
492         skb_put(skb, (u8 *)p - (u8 *)skb->data    
493                                                   
494         skb_queue_tail(&card->dma->send_queue,    
495         c4_dispatch_tx(card);                     
496 }                                                 
497                                                   
498 /* -------------------------------------------    
499                                                   
500 static void c4_handle_rx(avmcard *card)           
501 {                                                 
502         avmcard_dmainfo *dma = card->dma;         
503         struct capi_ctr *ctrl;                    
504         avmctrl_info *cinfo;                      
505         struct sk_buff *skb;                      
506         void *p = dma->recvbuf.dmabuf;            
507         u32 ApplId, MsgLen, DataB3Len, NCCI, W    
508         u8 b1cmd =  _get_byte(&p);                
509         u32 cidx;                                 
510                                                   
511                                                   
512 #ifdef AVM_C4_DEBUG                               
513         printk(KERN_DEBUG "%s: rx 0x%x len=%lu    
514                                 b1cmd, (unsign    
515 #endif                                            
516                                                   
517         switch (b1cmd) {                          
518         case RECEIVE_DATA_B3_IND:                 
519                                                   
520                 ApplId = (unsigned) _get_word(    
521                 MsgLen = _get_slice(&p, card->    
522                 DataB3Len = _get_slice(&p, car    
523                 cidx = CAPIMSG_CONTROLLER(card    
524                 if (cidx >= card->nlogcontr) c    
525                 ctrl = &card->ctrlinfo[cidx].c    
526                                                   
527                 if (MsgLen < 30) { /* not CAPI    
528                         memset(card->msgbuf+Ms    
529                         MsgLen = 30;              
530                         CAPIMSG_SETLEN(card->m    
531                 }                                 
532                 if (!(skb = alloc_skb(DataB3Le    
533                         printk(KERN_ERR "%s: i    
534                                         card->    
535                 } else {                          
536                         memcpy(skb_put(skb, Ms    
537                         memcpy(skb_put(skb, Da    
538                         capi_ctr_handle_messag    
539                 }                                 
540                 break;                            
541                                                   
542         case RECEIVE_MESSAGE:                     
543                                                   
544                 ApplId = (unsigned) _get_word(    
545                 MsgLen = _get_slice(&p, card->    
546                 cidx = CAPIMSG_CONTROLLER(card    
547                 if (cidx >= card->nlogcontr) c    
548                 cinfo = &card->ctrlinfo[cidx];    
549                 ctrl = &card->ctrlinfo[cidx].c    
550                                                   
551                 if (!(skb = alloc_skb(MsgLen,     
552                         printk(KERN_ERR "%s: i    
553                                         card->    
554                 } else {                          
555                         memcpy(skb_put(skb, Ms    
556                         if (CAPIMSG_CMD(skb->d    
557                                 capilib_data_b    
558                                                   
559                                                   
560                                                   
561                         capi_ctr_handle_messag    
562                 }                                 
563                 break;                            
564                                                   
565         case RECEIVE_NEW_NCCI:                    
566                                                   
567                 ApplId = _get_word(&p);           
568                 NCCI = _get_word(&p);             
569                 WindowSize = _get_word(&p);       
570                 cidx = (NCCI&0x7f) - card->car    
571                 if (cidx >= card->nlogcontr) c    
572                                                   
573                 capilib_new_ncci(&card->ctrlin    
574                                                   
575                 break;                            
576                                                   
577         case RECEIVE_FREE_NCCI:                   
578                                                   
579                 ApplId = _get_word(&p);           
580                 NCCI = _get_word(&p);             
581                                                   
582                 if (NCCI != 0xffffffff) {         
583                         cidx = (NCCI&0x7f) - c    
584                         if (cidx >= card->nlog    
585                         capilib_free_ncci(&car    
586                 }                                 
587                 break;                            
588                                                   
589         case RECEIVE_START:                       
590 #ifdef AVM_C4_POLLDEBUG                           
591                 printk(KERN_INFO "%s: poll fro    
592 #endif                                            
593                 if (!suppress_pollack)            
594                         queue_pollack(card);      
595                 for (cidx=0; cidx < card->nr_c    
596                         ctrl = &card->ctrlinfo    
597                         capi_ctr_resume_output    
598                 }                                 
599                 break;                            
600                                                   
601         case RECEIVE_STOP:                        
602                 for (cidx=0; cidx < card->nr_c    
603                         ctrl = &card->ctrlinfo    
604                         capi_ctr_suspend_outpu    
605                 }                                 
606                 break;                            
607                                                   
608         case RECEIVE_INIT:                        
609                                                   
610                 cidx = card->nlogcontr;           
611                 if (cidx >= card->nr_controlle    
612                         printk(KERN_ERR "%s: c    
613                                         card->    
614                         break;                    
615                 }                                 
616                 card->nlogcontr++;                
617                 cinfo = &card->ctrlinfo[cidx];    
618                 ctrl = &cinfo->capi_ctrl;         
619                 cinfo->versionlen = _get_slice    
620                 b1_parse_version(cinfo);          
621                 printk(KERN_INFO "%s: %s-card     
622                        card->name,                
623                        cinfo->version[VER_CARD    
624                        cinfo->version[VER_DRIV    
625                 capi_ctr_ready(&cinfo->capi_ct    
626                 break;                            
627                                                   
628         case RECEIVE_TASK_READY:                  
629                 ApplId = (unsigned) _get_word(    
630                 MsgLen = _get_slice(&p, card->    
631                 card->msgbuf[MsgLen] = 0;         
632                 while (    MsgLen > 0             
633                        && (   card->msgbuf[Msg    
634                            || card->msgbuf[Msg    
635                         card->msgbuf[MsgLen-1]    
636                         MsgLen--;                 
637                 }                                 
638                 printk(KERN_INFO "%s: task %d     
639                                 card->name, Ap    
640                 break;                            
641                                                   
642         case RECEIVE_DEBUGMSG:                    
643                 MsgLen = _get_slice(&p, card->    
644                 card->msgbuf[MsgLen] = 0;         
645                 while (    MsgLen > 0             
646                        && (   card->msgbuf[Msg    
647                            || card->msgbuf[Msg    
648                         card->msgbuf[MsgLen-1]    
649                         MsgLen--;                 
650                 }                                 
651                 printk(KERN_INFO "%s: DEBUG: %    
652                 break;                            
653                                                   
654         default:                                  
655                 printk(KERN_ERR "%s: c4_interr    
656                                 card->name, b1    
657                 return;                           
658         }                                         
659 }                                                 
660                                                   
661 /* -------------------------------------------    
662                                                   
663 static irqreturn_t c4_handle_interrupt(avmcard    
664 {                                                 
665         unsigned long flags;                      
666         u32 status;                               
667                                                   
668         spin_lock_irqsave(&card->lock, flags);    
669         status = c4inmeml(card->mbase+DOORBELL    
670                                                   
671         if (status & DBELL_RESET_HOST) {          
672                 u_int i;                          
673                 c4outmeml(card->mbase+PCI_OUT_    
674                 spin_unlock_irqrestore(&card->    
675                 if (card->nlogcontr == 0)         
676                         return IRQ_HANDLED;       
677                 printk(KERN_ERR "%s: unexpecte    
678                 for (i=0; i < card->nr_control    
679                         avmctrl_info *cinfo =     
680                         memset(cinfo->version,    
681                         spin_lock_irqsave(&car    
682                         capilib_release(&cinfo    
683                         spin_unlock_irqrestore    
684                         capi_ctr_reseted(&cinf    
685                 }                                 
686                 card->nlogcontr = 0;              
687                 return IRQ_HANDLED;               
688         }                                         
689                                                   
690         status &= (DBELL_UP_HOST | DBELL_DOWN_    
691         if (!status) {                            
692                 spin_unlock_irqrestore(&card->    
693                 return IRQ_HANDLED;               
694         }                                         
695         c4outmeml(card->mbase+DOORBELL, status    
696                                                   
697         if ((status & DBELL_UP_HOST) != 0) {      
698                 card->dma->recvlen = c4inmeml(    
699                 c4outmeml(card->mbase+MBOX_UP_    
700                 c4_handle_rx(card);               
701                 card->dma->recvlen = 0;           
702                 c4outmeml(card->mbase+MBOX_UP_    
703                 c4outmeml(card->mbase+DOORBELL    
704         }                                         
705                                                   
706         if ((status & DBELL_DOWN_HOST) != 0) {    
707                 card->csr &= ~DBELL_DOWN_ARM;     
708                 c4_dispatch_tx(card);             
709         } else if (card->csr & DBELL_DOWN_HOST    
710                 if (c4inmeml(card->mbase+MBOX_    
711                         card->csr &= ~DBELL_DO    
712                         c4_dispatch_tx(card);     
713                 }                                 
714         }                                         
715         spin_unlock_irqrestore(&card->lock, fl    
716         return IRQ_HANDLED;                       
717 }                                                 
718                                                   
719 static irqreturn_t c4_interrupt(int interrupt,    
720 {                                                 
721         avmcard *card = devptr;                   
722                                                   
723         return c4_handle_interrupt(card);         
724 }                                                 
725                                                   
726 /* -------------------------------------------    
727                                                   
728 static void c4_send_init(avmcard *card)           
729 {                                                 
730         struct sk_buff *skb;                      
731         void *p;                                  
732         unsigned long flags;                      
733                                                   
734         skb = alloc_skb(15, GFP_ATOMIC);          
735         if (!skb) {                               
736                 printk(KERN_CRIT "%s: no memor    
737                                         card->    
738                 return;                           
739         }                                         
740         p = skb->data;                            
741         _put_byte(&p, 0);                         
742         _put_byte(&p, 0);                         
743         _put_byte(&p, SEND_INIT);                 
744         _put_word(&p, CAPI_MAXAPPL);              
745         _put_word(&p, AVM_NCCI_PER_CHANNEL*30)    
746         _put_word(&p, card->cardnr - 1);          
747         skb_put(skb, (u8 *)p - (u8 *)skb->data    
748                                                   
749         skb_queue_tail(&card->dma->send_queue,    
750         spin_lock_irqsave(&card->lock, flags);    
751         c4_dispatch_tx(card);                     
752         spin_unlock_irqrestore(&card->lock, fl    
753 }                                                 
754                                                   
755 static int queue_sendconfigword(avmcard *card,    
756 {                                                 
757         struct sk_buff *skb;                      
758         unsigned long flags;                      
759         void *p;                                  
760                                                   
761         skb = alloc_skb(3+4, GFP_ATOMIC);         
762         if (!skb) {                               
763                 printk(KERN_CRIT "%s: no memor    
764                                         card->    
765                 return -ENOMEM;                   
766         }                                         
767         p = skb->data;                            
768         _put_byte(&p, 0);                         
769         _put_byte(&p, 0);                         
770         _put_byte(&p, SEND_CONFIG);               
771         _put_word(&p, val);                       
772         skb_put(skb, (u8 *)p - (u8 *)skb->data    
773                                                   
774         skb_queue_tail(&card->dma->send_queue,    
775         spin_lock_irqsave(&card->lock, flags);    
776         c4_dispatch_tx(card);                     
777         spin_unlock_irqrestore(&card->lock, fl    
778         return 0;                                 
779 }                                                 
780                                                   
781 static int queue_sendconfig(avmcard *card, cha    
782 {                                                 
783         struct sk_buff *skb;                      
784         unsigned long flags;                      
785         void *p;                                  
786                                                   
787         skb = alloc_skb(3+4, GFP_ATOMIC);         
788         if (!skb) {                               
789                 printk(KERN_CRIT "%s: no memor    
790                                         card->    
791                 return -ENOMEM;                   
792         }                                         
793         p = skb->data;                            
794         _put_byte(&p, 0);                         
795         _put_byte(&p, 0);                         
796         _put_byte(&p, SEND_CONFIG);               
797         _put_byte(&p, cval[0]);                   
798         _put_byte(&p, cval[1]);                   
799         _put_byte(&p, cval[2]);                   
800         _put_byte(&p, cval[3]);                   
801         skb_put(skb, (u8 *)p - (u8 *)skb->data    
802                                                   
803         skb_queue_tail(&card->dma->send_queue,    
804                                                   
805         spin_lock_irqsave(&card->lock, flags);    
806         c4_dispatch_tx(card);                     
807         spin_unlock_irqrestore(&card->lock, fl    
808         return 0;                                 
809 }                                                 
810                                                   
811 static int c4_send_config(avmcard *card, capil    
812 {                                                 
813         u8 val[4];                                
814         unsigned char *dp;                        
815         u_int left;                               
816         int retval;                               
817                                                   
818         if ((retval = queue_sendconfigword(car    
819                 return retval;                    
820         if ((retval = queue_sendconfigword(car    
821                 return retval;                    
822                                                   
823         dp = config->data;                        
824         left = config->len;                       
825         while (left >= sizeof(u32)) {             
826                 if (config->user) {               
827                         if (copy_from_user(val    
828                                 return -EFAULT    
829                 } else {                          
830                         memcpy(val, dp, sizeof    
831                 }                                 
832                 if ((retval = queue_sendconfig    
833                         return retval;            
834                 left -= sizeof(val);              
835                 dp += sizeof(val);                
836         }                                         
837         if (left) {                               
838                 memset(val, 0, sizeof(val));      
839                 if (config->user) {               
840                         if (copy_from_user(&va    
841                                 return -EFAULT    
842                 } else {                          
843                         memcpy(&val, dp, left)    
844                 }                                 
845                 if ((retval = queue_sendconfig    
846                         return retval;            
847         }                                         
848                                                   
849         return 0;                                 
850 }                                                 
851                                                   
852 static int c4_load_firmware(struct capi_ctr *c    
853 {                                                 
854         avmctrl_info *cinfo = (avmctrl_info *)    
855         avmcard *card = cinfo->card;              
856         int retval;                               
857                                                   
858         if ((retval = c4_load_t4file(card, &da    
859                 printk(KERN_ERR "%s: failed to    
860                                         card->    
861                 c4_reset(card);                   
862                 return retval;                    
863         }                                         
864                                                   
865         card->csr = 0;                            
866         c4outmeml(card->mbase+MBOX_UP_LEN, 0);    
867         c4outmeml(card->mbase+MBOX_DOWN_LEN, 0    
868         c4outmeml(card->mbase+DOORBELL, DBELL_    
869         mdelay(1);                                
870         c4outmeml(card->mbase+DOORBELL,           
871                         DBELL_UP_HOST | DBELL_    
872                                                   
873         c4outmeml(card->mbase+PCI_OUT_INT_MASK    
874                                                   
875         card->dma->recvlen = 0;                   
876         c4outmeml(card->mbase+MBOX_UP_ADDR, ca    
877         c4outmeml(card->mbase+MBOX_UP_LEN, car    
878         c4outmeml(card->mbase+DOORBELL, DBELL_    
879                                                   
880         if (data->configuration.len > 0 && dat    
881                 retval = c4_send_config(card,     
882                 if (retval) {                     
883                         printk(KERN_ERR "%s: f    
884                                         card->    
885                         c4_reset(card);           
886                         return retval;            
887                 }                                 
888         }                                         
889                                                   
890         c4_send_init(card);                       
891                                                   
892         return 0;                                 
893 }                                                 
894                                                   
895                                                   
896 static void c4_reset_ctr(struct capi_ctr *ctrl    
897 {                                                 
898         avmcard *card = ((avmctrl_info *)(ctrl    
899         avmctrl_info *cinfo;                      
900         u_int i;                                  
901         unsigned long flags;                      
902                                                   
903         spin_lock_irqsave(&card->lock, flags);    
904                                                   
905         c4_reset(card);                           
906                                                   
907         spin_unlock_irqrestore(&card->lock, fl    
908                                                   
909         for (i=0; i < card->nr_controllers; i+    
910                 cinfo = &card->ctrlinfo[i];       
911                 memset(cinfo->version, 0, size    
912                 capi_ctr_reseted(&cinfo->capi_    
913         }                                         
914         card->nlogcontr = 0;                      
915 }                                                 
916                                                   
917 static void c4_remove(struct pci_dev *pdev)       
918 {                                                 
919         avmcard *card = pci_get_drvdata(pdev);    
920         avmctrl_info *cinfo;                      
921         u_int i;                                  
922                                                   
923         if (!card)                                
924                 return;                           
925                                                   
926         c4_reset(card);                           
927                                                   
928         for (i=0; i < card->nr_controllers; i+    
929                 cinfo = &card->ctrlinfo[i];       
930                 detach_capi_ctr(&cinfo->capi_c    
931         }                                         
932                                                   
933         free_irq(card->irq, card);                
934         iounmap(card->mbase);                     
935         release_region(card->port, AVMB1_PORTL    
936         avmcard_dma_free(card->dma);              
937         pci_set_drvdata(pdev, NULL);              
938         b1_free_card(card);                       
939 }                                                 
940                                                   
941 /* -------------------------------------------    
942                                                   
943                                                   
944 static void c4_register_appl(struct capi_ctr *    
945                                 u16 appl,         
946                                 capi_register_    
947 {                                                 
948         avmctrl_info *cinfo = (avmctrl_info *)    
949         avmcard *card = cinfo->card;              
950         struct sk_buff *skb;                      
951         int want = rp->level3cnt;                 
952         unsigned long flags;                      
953         int nconn;                                
954         void *p;                                  
955                                                   
956         if (ctrl->cnr == card->cardnr) {          
957                                                   
958                 if (want > 0) nconn = want;       
959                 else nconn = ctrl->profile.nbc    
960                 if (nconn == 0) nconn = ctrl->    
961                                                   
962                 skb = alloc_skb(23, GFP_ATOMIC    
963                 if (!skb) {                       
964                         printk(KERN_CRIT "%s:     
965                                                   
966                         return;                   
967                 }                                 
968                 p = skb->data;                    
969                 _put_byte(&p, 0);                 
970                 _put_byte(&p, 0);                 
971                 _put_byte(&p, SEND_REGISTER);     
972                 _put_word(&p, appl);              
973                 _put_word(&p, 1024 * (nconn+1)    
974                 _put_word(&p, nconn);             
975                 _put_word(&p, rp->datablkcnt);    
976                 _put_word(&p, rp->datablklen);    
977                 skb_put(skb, (u8 *)p - (u8 *)s    
978                                                   
979                 skb_queue_tail(&card->dma->sen    
980                                                   
981                 spin_lock_irqsave(&card->lock,    
982                 c4_dispatch_tx(card);             
983                 spin_unlock_irqrestore(&card->    
984         }                                         
985 }                                                 
986                                                   
987 /* -------------------------------------------    
988                                                   
989 static void c4_release_appl(struct capi_ctr *c    
990 {                                                 
991         avmctrl_info *cinfo = (avmctrl_info *)    
992         avmcard *card = cinfo->card;              
993         unsigned long flags;                      
994         struct sk_buff *skb;                      
995         void *p;                                  
996                                                   
997         spin_lock_irqsave(&card->lock, flags);    
998         capilib_release_appl(&cinfo->ncci_head    
999         spin_unlock_irqrestore(&card->lock, fl    
1000                                                  
1001         if (ctrl->cnr == card->cardnr) {         
1002                 skb = alloc_skb(7, GFP_ATOMIC    
1003                 if (!skb) {                      
1004                         printk(KERN_CRIT "%s:    
1005                                                  
1006                         return;                  
1007                 }                                
1008                 p = skb->data;                   
1009                 _put_byte(&p, 0);                
1010                 _put_byte(&p, 0);                
1011                 _put_byte(&p, SEND_RELEASE);     
1012                 _put_word(&p, appl);             
1013                                                  
1014                 skb_put(skb, (u8 *)p - (u8 *)    
1015                 skb_queue_tail(&card->dma->se    
1016                 spin_lock_irqsave(&card->lock    
1017                 c4_dispatch_tx(card);            
1018                 spin_unlock_irqrestore(&card-    
1019         }                                        
1020 }                                                
1021                                                  
1022 /* ------------------------------------------    
1023                                                  
1024                                                  
1025 static u16 c4_send_message(struct capi_ctr *c    
1026 {                                                
1027         avmctrl_info *cinfo = (avmctrl_info *    
1028         avmcard *card = cinfo->card;             
1029         u16 retval = CAPI_NOERROR;               
1030         unsigned long flags;                     
1031                                                  
1032         spin_lock_irqsave(&card->lock, flags)    
1033         if (CAPIMSG_CMD(skb->data) == CAPI_DA    
1034                 retval = capilib_data_b3_req(    
1035                                                  
1036                                                  
1037                                                  
1038         }                                        
1039         if (retval == CAPI_NOERROR) {            
1040                 skb_queue_tail(&card->dma->se    
1041                 c4_dispatch_tx(card);            
1042         }                                        
1043         spin_unlock_irqrestore(&card->lock, f    
1044         return retval;                           
1045 }                                                
1046                                                  
1047 /* ------------------------------------------    
1048                                                  
1049 static char *c4_procinfo(struct capi_ctr *ctr    
1050 {                                                
1051         avmctrl_info *cinfo = (avmctrl_info *    
1052                                                  
1053         if (!cinfo)                              
1054                 return "";                       
1055         sprintf(cinfo->infobuf, "%s %s 0x%x %    
1056                 cinfo->cardname[0] ? cinfo->c    
1057                 cinfo->version[VER_DRIVER] ?     
1058                 cinfo->card ? cinfo->card->po    
1059                 cinfo->card ? cinfo->card->ir    
1060                 cinfo->card ? cinfo->card->me    
1061                 );                               
1062         return cinfo->infobuf;                   
1063 }                                                
1064                                                  
1065 static int c4_read_proc(char *page, char **st    
1066                         int count, int *eof,     
1067 {                                                
1068         avmctrl_info *cinfo = (avmctrl_info *    
1069         avmcard *card = cinfo->card;             
1070         u8 flag;                                 
1071         int len = 0;                             
1072         char *s;                                 
1073                                                  
1074         len += sprintf(page+len, "%-16s %s\n"    
1075         len += sprintf(page+len, "%-16s 0x%x\    
1076         len += sprintf(page+len, "%-16s %d\n"    
1077         len += sprintf(page+len, "%-16s 0x%lx    
1078         switch (card->cardtype) {                
1079         case avm_b1isa: s = "B1 ISA"; break;     
1080         case avm_b1pci: s = "B1 PCI"; break;     
1081         case avm_b1pcmcia: s = "B1 PCMCIA"; b    
1082         case avm_m1: s = "M1"; break;            
1083         case avm_m2: s = "M2"; break;            
1084         case avm_t1isa: s = "T1 ISA (HEMA)";     
1085         case avm_t1pci: s = "T1 PCI"; break;     
1086         case avm_c4: s = "C4"; break;            
1087         case avm_c2: s = "C2"; break;            
1088         default: s = "???"; break;               
1089         }                                        
1090         len += sprintf(page+len, "%-16s %s\n"    
1091         if ((s = cinfo->version[VER_DRIVER])     
1092            len += sprintf(page+len, "%-16s %s    
1093         if ((s = cinfo->version[VER_CARDTYPE]    
1094            len += sprintf(page+len, "%-16s %s    
1095         if ((s = cinfo->version[VER_SERIAL])     
1096            len += sprintf(page+len, "%-16s %s    
1097                                                  
1098         if (card->cardtype != avm_m1) {          
1099                 flag = ((u8 *)(ctrl->profile.    
1100                 if (flag)                        
1101                         len += sprintf(page+l    
1102                         "protocol",              
1103                         (flag & 0x01) ? " DSS    
1104                         (flag & 0x02) ? " CT1    
1105                         (flag & 0x04) ? " VN3    
1106                         (flag & 0x08) ? " NI1    
1107                         (flag & 0x10) ? " AUS    
1108                         (flag & 0x20) ? " ESS    
1109                         (flag & 0x40) ? " 1TR    
1110                         );                       
1111         }                                        
1112         if (card->cardtype != avm_m1) {          
1113                 flag = ((u8 *)(ctrl->profile.    
1114                 if (flag)                        
1115                         len += sprintf(page+l    
1116                         "linetype",              
1117                         (flag & 0x01) ? " poi    
1118                         (flag & 0x02) ? " poi    
1119                         (flag & 0x08) ? " lea    
1120                         (flag & 0x04) ? " lea    
1121                         );                       
1122         }                                        
1123         len += sprintf(page+len, "%-16s %s\n"    
1124                                                  
1125         if (off+count >= len)                    
1126            *eof = 1;                             
1127         if (len < off)                           
1128            return 0;                             
1129         *start = page + off;                     
1130         return ((count < len-off) ? count : l    
1131 }                                                
1132                                                  
1133 /* ------------------------------------------    
1134                                                  
1135 static int c4_add_card(struct capicardparams     
1136                        int nr_controllers)       
1137 {                                                
1138         avmcard *card;                           
1139         avmctrl_info *cinfo;                     
1140         int retval;                              
1141         int i;                                   
1142                                                  
1143         card = b1_alloc_card(nr_controllers);    
1144         if (!card) {                             
1145                 printk(KERN_WARNING "c4: no m    
1146                 retval = -ENOMEM;                
1147                 goto err;                        
1148         }                                        
1149         card->dma = avmcard_dma_alloc("c4", d    
1150         if (!card->dma) {                        
1151                 printk(KERN_WARNING "c4: no m    
1152                 retval = -ENOMEM;                
1153                 goto err_free;                   
1154         }                                        
1155                                                  
1156         sprintf(card->name, "c%d-%x", nr_cont    
1157         card->port = p->port;                    
1158         card->irq = p->irq;                      
1159         card->membase = p->membase;              
1160         card->cardtype = (nr_controllers == 4    
1161                                                  
1162         if (!request_region(card->port, AVMB1    
1163                 printk(KERN_WARNING "c4: port    
1164                        card->port, card->port    
1165                 retval = -EBUSY;                 
1166                 goto err_free_dma;               
1167         }                                        
1168                                                  
1169         card->mbase = ioremap(card->membase,     
1170         if (card->mbase == 0) {                  
1171                 printk(KERN_NOTICE "c4: can't    
1172                        card->membase);           
1173                 retval = -EIO;                   
1174                 goto err_release_region;         
1175         }                                        
1176                                                  
1177         retval = c4_detect(card);                
1178         if (retval != 0) {                       
1179                 printk(KERN_NOTICE "c4: NO ca    
1180                        card->port, retval);      
1181                 retval = -EIO;                   
1182                 goto err_unmap;                  
1183         }                                        
1184         c4_reset(card);                          
1185                                                  
1186         retval = request_irq(card->irq, c4_in    
1187         if (retval) {                            
1188                 printk(KERN_ERR "c4: unable t    
1189                 retval = -EBUSY;                 
1190                 goto err_unmap;                  
1191         }                                        
1192                                                  
1193         for (i=0; i < nr_controllers ; i++) {    
1194                 cinfo = &card->ctrlinfo[i];      
1195                 cinfo->capi_ctrl.owner = THIS    
1196                 cinfo->capi_ctrl.driver_name     
1197                 cinfo->capi_ctrl.driverdata      
1198                 cinfo->capi_ctrl.register_app    
1199                 cinfo->capi_ctrl.release_appl    
1200                 cinfo->capi_ctrl.send_message    
1201                 cinfo->capi_ctrl.load_firmwar    
1202                 cinfo->capi_ctrl.reset_ctr       
1203                 cinfo->capi_ctrl.procinfo        
1204                 cinfo->capi_ctrl.ctr_read_pro    
1205                 strcpy(cinfo->capi_ctrl.name,    
1206                                                  
1207                 retval = attach_capi_ctr(&cin    
1208                 if (retval) {                    
1209                         printk(KERN_ERR "c4:     
1210                         for (i--; i >= 0; i--    
1211                                 cinfo = &card    
1212                                 detach_capi_c    
1213                         }                        
1214                         goto err_free_irq;       
1215                 }                                
1216                 if (i == 0)                      
1217                         card->cardnr = cinfo-    
1218         }                                        
1219                                                  
1220         printk(KERN_INFO "c4: AVM C%d at i/o     
1221                nr_controllers, card->port, ca    
1222                card->membase);                   
1223         pci_set_drvdata(dev, card);              
1224         return 0;                                
1225                                                  
1226  err_free_irq:                                   
1227         free_irq(card->irq, card);               
1228  err_unmap:                                      
1229         iounmap(card->mbase);                    
1230  err_release_region:                             
1231         release_region(card->port, AVMB1_PORT    
1232  err_free_dma:                                   
1233         avmcard_dma_free(card->dma);             
1234  err_free:                                       
1235         b1_free_card(card);                      
1236  err:                                            
1237         return retval;                           
1238 }                                                
1239                                                  
1240 /* ------------------------------------------    
1241                                                  
1242 static int __devinit c4_probe(struct pci_dev     
1243                               const struct pc    
1244 {                                                
1245         int nr = ent->driver_data;               
1246         int retval = 0;                          
1247         struct capicardparams param;             
1248                                                  
1249         if (pci_enable_device(dev) < 0) {        
1250                 printk(KERN_ERR "c4: failed t    
1251                 return -ENODEV;                  
1252         }                                        
1253         pci_set_master(dev);                     
1254                                                  
1255         param.port = pci_resource_start(dev,     
1256         param.irq = dev->irq;                    
1257         param.membase = pci_resource_start(de    
1258                                                  
1259         printk(KERN_INFO "c4: PCI BIOS report    
1260                nr, param.port, param.irq, par    
1261                                                  
1262         retval = c4_add_card(&param, dev, nr)    
1263         if (retval != 0) {                       
1264                 printk(KERN_ERR "c4: no AVM-C    
1265                        nr, param.port, param.    
1266                 return -ENODEV;                  
1267         }                                        
1268         return 0;                                
1269 }                                                
1270                                                  
1271 static struct pci_driver c4_pci_driver = {       
1272        .name           = "c4",                   
1273        .id_table       = c4_pci_tbl,             
1274        .probe          = c4_probe,               
1275        .remove         = c4_remove,              
1276 };                                               
1277                                                  
1278 static struct capi_driver capi_driver_c2 = {     
1279         .name           = "c2",                  
1280         .revision       = "1.0",                 
1281 };                                               
1282                                                  
1283 static struct capi_driver capi_driver_c4 = {     
1284         .name           = "c4",                  
1285         .revision       = "1.0",                 
1286 };                                               
1287                                                  
1288 static int __init c4_init(void)                  
1289 {                                                
1290         char *p;                                 
1291         char rev[32];                            
1292         int err;                                 
1293                                                  
1294         if ((p = strchr(revision, ':')) != 0     
1295                 strlcpy(rev, p + 2, 32);         
1296                 if ((p = strchr(rev, '$')) !=    
1297                    *(p-1) = 0;                   
1298         } else                                   
1299                 strcpy(rev, "1.0");              
1300                                                  
1301         err = pci_register_driver(&c4_pci_dri    
1302         if (!err) {                              
1303                 strlcpy(capi_driver_c2.revisi    
1304                 register_capi_driver(&capi_dr    
1305                 strlcpy(capi_driver_c4.revisi    
1306                 register_capi_driver(&capi_dr    
1307                 printk(KERN_INFO "c4: revisio    
1308         }                                        
1309         return err;                              
1310 }                                                
1311                                                  
1312 static void __exit c4_exit(void)                 
1313 {                                                
1314         unregister_capi_driver(&capi_driver_c    
1315         unregister_capi_driver(&capi_driver_c    
1316         pci_unregister_driver(&c4_pci_driver)    
1317 }                                                
1318                                                  
1319 module_init(c4_init);                            
1320 module_exit(c4_exit);                            
1321                                                  
  This page was automatically generated by the LXR engine.