2 * $Id: t1pci.c,v 1.13.6.1 2000/11/28 12:02:45 kai Exp $
4 * Module for AVM T1 PCI-card.
6 * (c) Copyright 1999 by Carsten Paeth (calle@calle.in-berlin.de)
9 * Revision 1.13.6.1 2000/11/28 12:02:45 kai
10 * MODULE_DEVICE_TABLE for 2.4
12 * Revision 1.13.2.2 2000/11/26 17:47:53 kai
13 * added PCI_DEV_TABLE for 2.4
15 * Revision 1.13.2.1 2000/11/26 17:14:19 kai
17 * also needs patches to include/linux/pci_ids.h
19 * Revision 1.13 2000/11/23 20:45:14 kai
20 * fixed module_init/exit stuff
21 * Note: compiled-in kernel doesn't work pre 2.2.18 anymore.
23 * Revision 1.12 2000/11/01 14:05:02 calle
24 * - use module_init/module_exit from linux/init.h.
25 * - all static struct variables are initialized with "membername:" now.
26 * - avm_cs.c, let it work with newer pcmcia-cs.
28 * Revision 1.11 2000/08/08 09:24:19 calle
29 * calls to pci_enable_device surounded by #ifndef COMPAT_HAS_2_2_PCI
31 * Revision 1.10 2000/07/20 10:21:21 calle
32 * Bugfix: driver will not be unregistered, if not cards were detected.
33 * this result in an oops in kcapi.c
35 * Revision 1.9 2000/05/19 15:43:22 calle
36 * added calls to pci_device_start().
38 * Revision 1.8 2000/05/06 00:52:36 kai
39 * merged changes from kernel tree
40 * fixed timer and net_device->name breakage
42 * Revision 1.7 2000/04/07 15:26:55 calle
43 * better error message if cabel not connected or T1 has no power.
45 * Revision 1.6 2000/04/03 13:29:25 calle
46 * make Tim Waugh happy (module unload races in 2.3.99-pre3).
47 * no real problem there, but now it is much cleaner ...
49 * Revision 1.5 2000/02/02 18:36:04 calle
50 * - Modules are now locked while init_module is running
51 * - fixed problem with memory mapping if address is not aligned
53 * Revision 1.4 2000/01/25 14:33:38 calle
54 * - Added Support AVM B1 PCI V4.0 (tested with prototype)
55 * - splitted up t1pci.c into b1dma.c for common function with b1pciv4
56 * - support for revision register
58 * Revision 1.3 1999/11/13 21:27:16 keil
59 * remove KERNELVERSION
61 * Revision 1.2 1999/11/05 16:38:02 calle
62 * Cleanups before kernel 2.4:
63 * - Changed all messages to use card->name or driver->name instead of
65 * - Moved some data from struct avmcard into new struct avmctrl_info.
66 * Changed all lowlevel capi driver to match the new structur.
68 * Revision 1.1 1999/10/26 15:31:42 calle
69 * Added driver for T1-PCI card.
74 #include <linux/config.h>
75 #include <linux/module.h>
76 #include <linux/kernel.h>
77 #include <linux/skbuff.h>
78 #include <linux/delay.h>
80 #include <linux/interrupt.h>
81 #include <linux/ioport.h>
82 #include <linux/pci.h>
83 #include <linux/capi.h>
84 #include <linux/init.h>
91 static char *revision
= "$Revision: 1.13.6.1 $";
93 #undef CONFIG_T1PCI_DEBUG
94 #undef CONFIG_T1PCI_POLLDEBUG
96 /* ------------------------------------------------------------- */
98 static struct pci_device_id t1pci_pci_tbl
[] __initdata
= {
99 { PCI_VENDOR_ID_AVM
, PCI_DEVICE_ID_AVM_T1
, PCI_ANY_ID
, PCI_ANY_ID
},
100 { } /* Terminating entry */
103 MODULE_DEVICE_TABLE(pci
, t1pci_pci_tbl
);
104 MODULE_AUTHOR("Carsten Paeth <calle@calle.in-berlin.de>");
106 /* ------------------------------------------------------------- */
108 static struct capi_driver_interface
*di
;
110 /* ------------------------------------------------------------- */
112 static void t1pci_remove_ctr(struct capi_ctr
*ctrl
)
114 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
115 avmcard
*card
= cinfo
->card
;
119 di
->detach_ctr(ctrl
);
120 free_irq(card
->irq
, card
);
121 iounmap((void *) (((unsigned long) card
->mbase
) & PAGE_MASK
));
122 release_region(card
->port
, AVMB1_PORTLEN
);
123 ctrl
->driverdata
= 0;
124 kfree(card
->ctrlinfo
);
131 /* ------------------------------------------------------------- */
133 static int t1pci_add_card(struct capi_driver
*driver
, struct capicardparams
*p
)
135 unsigned long base
, page_offset
;
142 card
= (avmcard
*) kmalloc(sizeof(avmcard
), GFP_ATOMIC
);
145 printk(KERN_WARNING
"%s: no memory.\n", driver
->name
);
149 memset(card
, 0, sizeof(avmcard
));
150 card
->dma
= (avmcard_dmainfo
*) kmalloc(sizeof(avmcard_dmainfo
), GFP_ATOMIC
);
152 printk(KERN_WARNING
"%s: no memory.\n", driver
->name
);
157 memset(card
->dma
, 0, sizeof(avmcard_dmainfo
));
158 cinfo
= (avmctrl_info
*) kmalloc(sizeof(avmctrl_info
), GFP_ATOMIC
);
160 printk(KERN_WARNING
"%s: no memory.\n", driver
->name
);
166 memset(cinfo
, 0, sizeof(avmctrl_info
));
167 card
->ctrlinfo
= cinfo
;
169 sprintf(card
->name
, "t1pci-%x", p
->port
);
170 card
->port
= p
->port
;
172 card
->membase
= p
->membase
;
173 card
->cardtype
= avm_t1pci
;
175 if (check_region(card
->port
, AVMB1_PORTLEN
)) {
177 "%s: ports 0x%03x-0x%03x in use.\n",
178 driver
->name
, card
->port
, card
->port
+ AVMB1_PORTLEN
);
179 kfree(card
->ctrlinfo
);
186 base
= card
->membase
& PAGE_MASK
;
187 page_offset
= card
->membase
- base
;
188 card
->mbase
= ioremap_nocache(base
, page_offset
+ 64);
190 card
->mbase
+= page_offset
;
192 printk(KERN_NOTICE
"%s: can't remap memory at 0x%lx\n",
193 driver
->name
, card
->membase
);
194 kfree(card
->ctrlinfo
);
203 if ((retval
= t1pci_detect(card
)) != 0) {
205 printk(KERN_NOTICE
"%s: NO card at 0x%x (%d)\n",
206 driver
->name
, card
->port
, retval
);
208 printk(KERN_NOTICE
"%s: card at 0x%x, but cabel not connected or T1 has no power (%d)\n",
209 driver
->name
, card
->port
, retval
);
210 iounmap((void *) (((unsigned long) card
->mbase
) & PAGE_MASK
));
211 kfree(card
->ctrlinfo
);
219 request_region(p
->port
, AVMB1_PORTLEN
, card
->name
);
221 retval
= request_irq(card
->irq
, b1dma_interrupt
, SA_SHIRQ
, card
->name
, card
);
223 printk(KERN_ERR
"%s: unable to get IRQ %d.\n",
224 driver
->name
, card
->irq
);
225 iounmap((void *) (((unsigned long) card
->mbase
) & PAGE_MASK
));
226 release_region(card
->port
, AVMB1_PORTLEN
);
227 kfree(card
->ctrlinfo
);
234 cinfo
->capi_ctrl
= di
->attach_ctr(driver
, card
->name
, cinfo
);
235 if (!cinfo
->capi_ctrl
) {
236 printk(KERN_ERR
"%s: attach controller failed.\n", driver
->name
);
237 iounmap((void *) (((unsigned long) card
->mbase
) & PAGE_MASK
));
238 free_irq(card
->irq
, card
);
239 release_region(card
->port
, AVMB1_PORTLEN
);
240 kfree(card
->ctrlinfo
);
246 card
->cardnr
= cinfo
->capi_ctrl
->cnr
;
248 skb_queue_head_init(&card
->dma
->send_queue
);
251 "%s: AVM T1 PCI at i/o %#x, irq %d, mem %#lx\n",
252 driver
->name
, card
->port
, card
->irq
, card
->membase
);
257 /* ------------------------------------------------------------- */
259 static char *t1pci_procinfo(struct capi_ctr
*ctrl
)
261 avmctrl_info
*cinfo
= (avmctrl_info
*)(ctrl
->driverdata
);
265 sprintf(cinfo
->infobuf
, "%s %s 0x%x %d 0x%lx",
266 cinfo
->cardname
[0] ? cinfo
->cardname
: "-",
267 cinfo
->version
[VER_DRIVER
] ? cinfo
->version
[VER_DRIVER
] : "-",
268 cinfo
->card
? cinfo
->card
->port
: 0x0,
269 cinfo
->card
? cinfo
->card
->irq
: 0,
270 cinfo
->card
? cinfo
->card
->membase
: 0
272 return cinfo
->infobuf
;
275 /* ------------------------------------------------------------- */
277 static struct capi_driver t1pci_driver
= {
280 load_firmware
: b1dma_load_firmware
,
281 reset_ctr
: b1dma_reset_ctr
,
282 remove_ctr
: t1pci_remove_ctr
,
283 register_appl
: b1dma_register_appl
,
284 release_appl
: b1dma_release_appl
,
285 send_message
: b1dma_send_message
,
287 procinfo
: t1pci_procinfo
,
288 ctr_read_proc
: b1dmactl_read_proc
,
289 driver_read_proc
: 0, /* use standard driver_read_proc */
291 add_card
: 0, /* no add_card function */
294 static int ncards
= 0;
296 static int __init
t1pci_init(void)
298 struct capi_driver
*driver
= &t1pci_driver
;
299 struct pci_dev
*dev
= NULL
;
305 if ((p
= strchr(revision
, ':'))) {
306 strncpy(driver
->revision
, p
+ 1, sizeof(driver
->revision
));
307 p
= strchr(driver
->revision
, '$');
311 printk(KERN_INFO
"%s: revision %s\n", driver
->name
, driver
->revision
);
313 di
= attach_capi_driver(driver
);
316 printk(KERN_ERR
"%s: failed to attach capi_driver\n",
323 if (!pci_present()) {
324 printk(KERN_ERR
"%s: no PCI bus present\n", driver
->name
);
325 detach_capi_driver(driver
);
330 while ((dev
= pci_find_device(PCI_VENDOR_ID_AVM
, PCI_DEVICE_ID_AVM_T1
, dev
))) {
331 struct capicardparams param
;
333 param
.port
= pci_resource_start(dev
, 1);
334 param
.irq
= dev
->irq
;
335 param
.membase
= pci_resource_start(dev
, 0);
337 retval
= pci_enable_device (dev
);
340 "%s: failed to enable AVM-T1-PCI at i/o %#x, irq %d, mem %#x err=%d\n",
341 driver
->name
, param
.port
, param
.irq
, param
.membase
, retval
);
342 detach_capi_driver(&t1pci_driver
);
348 "%s: PCI BIOS reports AVM-T1-PCI at i/o %#x, irq %d, mem %#x\n",
349 driver
->name
, param
.port
, param
.irq
, param
.membase
);
350 retval
= t1pci_add_card(driver
, ¶m
);
353 "%s: no AVM-T1-PCI at i/o %#x, irq %d detected, mem %#x\n",
354 driver
->name
, param
.port
, param
.irq
, param
.membase
);
355 detach_capi_driver(&t1pci_driver
);
362 printk(KERN_INFO
"%s: %d T1-PCI card(s) detected\n",
363 driver
->name
, ncards
);
367 printk(KERN_ERR
"%s: NO T1-PCI card detected\n", driver
->name
);
368 detach_capi_driver(&t1pci_driver
);
372 printk(KERN_ERR
"%s: kernel not compiled with PCI.\n", driver
->name
);
378 static void __exit
t1pci_exit(void)
380 detach_capi_driver(&t1pci_driver
);
383 module_init(t1pci_init
);
384 module_exit(t1pci_exit
);