11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* $Id: t1pci.c,v 1.1.2.2 2004/01/16 21:09:27 keil Exp $ 2475be4d85a274d0961593db41cf85689db1d583cJoe Perches * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module for AVM T1 PCI-card. 4475be4d85a274d0961593db41cf85689db1d583cJoe Perches * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright 1999 by Carsten Paeth <calle@calle.de> 6475be4d85a274d0961593db41cf85689db1d583cJoe Perches * 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This software may be used and distributed according to the terms 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the GNU General Public License, incorporated herein by reference. 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h> 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/skbuff.h> 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h> 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h> 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h> 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h> 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h> 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/capi.h> 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h> 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/isdn/capicmd.h> 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/isdn/capiutil.h> 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/isdn/capilli.h> 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "avmcard.h" 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef CONFIG_T1PCI_DEBUG 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef CONFIG_T1PCI_POLLDEBUG 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------- */ 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char *revision = "$Revision: 1.1.2.2 $"; 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------- */ 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_device_id t1pci_pci_tbl[] = { 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_T1, PCI_ANY_ID, PCI_ANY_ID }, 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { } /* Terminating entry */ 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, t1pci_pci_tbl); 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("CAPI4Linux: Driver for AVM T1 PCI card"); 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Carsten Paeth"); 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------- */ 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char *t1pci_procinfo(struct capi_ctr *ctrl); 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int t1pci_add_card(struct capicardparams *p, struct pci_dev *pdev) 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds avmcard *card; 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds avmctrl_info *cinfo; 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int retval; 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card = b1_alloc_card(1); 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!card) { 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_WARNING "t1pci: no memory.\n"); 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = -ENOMEM; 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto err; 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 62475be4d85a274d0961593db41cf85689db1d583cJoe Perches card->dma = avmcard_dma_alloc("t1pci", pdev, 2048 + 128, 2048 + 128); 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!card->dma) { 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_WARNING "t1pci: no memory.\n"); 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = -ENOMEM; 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto err_free; 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo = card->ctrlinfo; 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sprintf(card->name, "t1pci-%x", p->port); 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->port = p->port; 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->irq = p->irq; 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->membase = p->membase; 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->cardtype = avm_t1pci; 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!request_region(card->port, AVMB1_PORTLEN, card->name)) { 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_WARNING "t1pci: ports 0x%03x-0x%03x in use.\n", 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->port, card->port + AVMB1_PORTLEN); 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = -EBUSY; 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto err_free_dma; 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->mbase = ioremap(card->membase, 64); 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!card->mbase) { 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_NOTICE "t1pci: can't remap memory at 0x%lx\n", 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->membase); 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = -EIO; 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto err_release_region; 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds b1dma_reset(card); 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = t1pci_detect(card); 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (retval != 0) { 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (retval < 6) 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_NOTICE "t1pci: NO card at 0x%x (%d)\n", 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->port, retval); 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_NOTICE "t1pci: card at 0x%x, but cable not connected or T1 has no power (%d)\n", 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->port, retval); 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = -EIO; 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto err_unmap; 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds b1dma_reset(card); 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1069ba02bec3888d391bad0fb0a8dd584f88eed6c8dThomas Gleixner retval = request_irq(card->irq, b1dma_interrupt, IRQF_SHARED, card->name, card); 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (retval) { 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_ERR "t1pci: unable to get IRQ %d.\n", card->irq); 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = -EBUSY; 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto err_unmap; 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->capi_ctrl.owner = THIS_MODULE; 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->capi_ctrl.driver_name = "t1pci"; 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->capi_ctrl.driverdata = cinfo; 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->capi_ctrl.register_appl = b1dma_register_appl; 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->capi_ctrl.release_appl = b1dma_release_appl; 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->capi_ctrl.send_message = b1dma_send_message; 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->capi_ctrl.load_firmware = b1dma_load_firmware; 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->capi_ctrl.procinfo = t1pci_procinfo; 1229a58a80a701bdb2d220cdab4914218df5b48d781Alexey Dobriyan cinfo->capi_ctrl.proc_fops = &b1dmactl_proc_fops; 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strcpy(cinfo->capi_ctrl.name, card->name); 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = attach_capi_ctr(&cinfo->capi_ctrl); 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (retval) { 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_ERR "t1pci: attach controller failed.\n"); 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = -EBUSY; 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto err_free_irq; 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->cardnr = cinfo->capi_ctrl.cnr; 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "t1pci: AVM T1 PCI at i/o %#x, irq %d, mem %#lx\n", 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds card->port, card->irq, card->membase); 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_set_drvdata(pdev, card); 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 139475be4d85a274d0961593db41cf85689db1d583cJoe Percheserr_free_irq: 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free_irq(card->irq, card); 141475be4d85a274d0961593db41cf85689db1d583cJoe Percheserr_unmap: 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds iounmap(card->mbase); 143475be4d85a274d0961593db41cf85689db1d583cJoe Percheserr_release_region: 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds release_region(card->port, AVMB1_PORTLEN); 145475be4d85a274d0961593db41cf85689db1d583cJoe Percheserr_free_dma: 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds avmcard_dma_free(card->dma); 147475be4d85a274d0961593db41cf85689db1d583cJoe Percheserr_free: 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds b1_free_card(card); 149475be4d85a274d0961593db41cf85689db1d583cJoe Percheserr: 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return retval; 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------- */ 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void t1pci_remove(struct pci_dev *pdev) 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds avmcard *card = pci_get_drvdata(pdev); 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds avmctrl_info *cinfo = card->ctrlinfo; 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 160475be4d85a274d0961593db41cf85689db1d583cJoe Perches b1dma_reset(card); 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds detach_capi_ctr(&cinfo->capi_ctrl); 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free_irq(card->irq, card); 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds iounmap(card->mbase); 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds release_region(card->port, AVMB1_PORTLEN); 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds avmcard_dma_free(card->dma); 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds b1_free_card(card); 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------- */ 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char *t1pci_procinfo(struct capi_ctr *ctrl) 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata); 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!cinfo) 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ""; 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sprintf(cinfo->infobuf, "%s %s 0x%x %d 0x%lx", 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->cardname[0] ? cinfo->cardname : "-", 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->version[VER_DRIVER] ? cinfo->version[VER_DRIVER] : "-", 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->card ? cinfo->card->port : 0x0, 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->card ? cinfo->card->irq : 0, 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cinfo->card ? cinfo->card->membase : 0 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ); 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return cinfo->infobuf; 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------- */ 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit t1pci_probe(struct pci_dev *dev, 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const struct pci_device_id *ent) 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct capicardparams param; 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int retval; 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (pci_enable_device(dev) < 0) { 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_ERR "t1pci: failed to enable AVM-T1-PCI\n"); 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENODEV; 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_set_master(dev); 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds param.port = pci_resource_start(dev, 1); 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds param.irq = dev->irq; 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds param.membase = pci_resource_start(dev, 0); 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "t1pci: PCI BIOS reports AVM-T1-PCI at i/o %#x, irq %d, mem %#x\n", 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds param.port, param.irq, param.membase); 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = t1pci_add_card(¶m, dev); 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (retval != 0) { 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_ERR "t1pci: no AVM-T1-PCI at i/o %#x, irq %d detected, mem %#x\n", 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds param.port, param.irq, param.membase); 213a5a4405b4d666454257be4048511840f3ab8adbbKulikov Vasiliy pci_disable_device(dev); 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENODEV; 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_driver t1pci_pci_driver = { 220475be4d85a274d0961593db41cf85689db1d583cJoe Perches .name = "t1pci", 221475be4d85a274d0961593db41cf85689db1d583cJoe Perches .id_table = t1pci_pci_tbl, 222475be4d85a274d0961593db41cf85689db1d583cJoe Perches .probe = t1pci_probe, 223475be4d85a274d0961593db41cf85689db1d583cJoe Perches .remove = t1pci_remove, 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct capi_driver capi_driver_t1pci = { 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "t1pci", 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .revision = "1.0", 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init t1pci_init(void) 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *p; 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char rev[32]; 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2378e44b29da5300f4698c41b5fd2d1ce52c28e2148Harvey Harrison if ((p = strchr(revision, ':')) != NULL && p[1]) { 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strlcpy(rev, p + 2, 32); 2398e44b29da5300f4698c41b5fd2d1ce52c28e2148Harvey Harrison if ((p = strchr(rev, '$')) != NULL && p > rev) 240475be4d85a274d0961593db41cf85689db1d583cJoe Perches *(p - 1) = 0; 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strcpy(rev, "1.0"); 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = pci_register_driver(&t1pci_pci_driver); 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!err) { 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strlcpy(capi_driver_t1pci.revision, rev, 32); 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds register_capi_driver(&capi_driver_t1pci); 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "t1pci: revision %s\n", rev); 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return err; 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit t1pci_exit(void) 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unregister_capi_driver(&capi_driver_t1pci); 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_unregister_driver(&t1pci_pci_driver); 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(t1pci_init); 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(t1pci_exit); 261