static int c4_add_card(struct capicardparams *p, struct pci_dev *dev, int nr_controllers) { avmcard *card; avmctrl_info *cinfo; int retval; int i; card = b1_alloc_card(nr_controllers); if (!card) { printk(KERN_WARNING "c4: no memory.\n"); retval = -ENOMEM; goto err; } card->dma = avmcard_dma_alloc("c4", dev, 2048+128, 2048+128); if (!card->dma) { printk(KERN_WARNING "c4: no memory.\n"); retval = -ENOMEM; goto err_free; } sprintf(card->name, "c%d-%x", nr_controllers, p->port); card->port = p->port; card->irq = p->irq; card->membase = p->membase; card->cardtype = (nr_controllers == 4) ? avm_c4 : avm_c2; if (!request_region(card->port, AVMB1_PORTLEN, card->name)) { printk(KERN_WARNING "c4: ports 0x%03x-0x%03x in use.\n", card->port, card->port + AVMB1_PORTLEN); retval = -EBUSY; goto err_free_dma; } card->mbase = ioremap(card->membase, 128); if (card->mbase == NULL) { printk(KERN_NOTICE "c4: can't remap memory at 0x%lx\n", card->membase); retval = -EIO; goto err_release_region; } retval = c4_detect(card); if (retval != 0) { printk(KERN_NOTICE "c4: NO card at 0x%x error(%d)\n", card->port, retval); retval = -EIO; goto err_unmap; } c4_reset(card); retval = request_irq(card->irq, c4_interrupt, IRQF_SHARED, card->name, card); if (retval) { printk(KERN_ERR "c4: unable to get IRQ %d.\n",card->irq); retval = -EBUSY; goto err_unmap; } for (i=0; i < nr_controllers ; i++) { cinfo = &card->ctrlinfo[i]; cinfo->capi_ctrl.owner = THIS_MODULE; cinfo->capi_ctrl.driver_name = "c4"; cinfo->capi_ctrl.driverdata = cinfo; cinfo->capi_ctrl.register_appl = c4_register_appl; cinfo->capi_ctrl.release_appl = c4_release_appl; cinfo->capi_ctrl.send_message = c4_send_message; cinfo->capi_ctrl.load_firmware = c4_load_firmware; cinfo->capi_ctrl.reset_ctr = c4_reset_ctr; cinfo->capi_ctrl.procinfo = c4_procinfo; cinfo->capi_ctrl.proc_fops = &c4_proc_fops; strcpy(cinfo->capi_ctrl.name, card->name); retval = attach_capi_ctr(&cinfo->capi_ctrl); if (retval) { printk(KERN_ERR "c4: attach controller failed (%d).\n", i); for (i--; i >= 0; i--) { cinfo = &card->ctrlinfo[i]; detach_capi_ctr(&cinfo->capi_ctrl); } goto err_free_irq; } if (i == 0) card->cardnr = cinfo->capi_ctrl.cnr; } printk(KERN_INFO "c4: AVM C%d at i/o %#x, irq %d, mem %#lx\n", nr_controllers, card->port, card->irq, card->membase); pci_set_drvdata(dev, card); return 0; err_free_irq: free_irq(card->irq, card); err_unmap: iounmap(card->mbase); err_release_region: release_region(card->port, AVMB1_PORTLEN); err_free_dma: avmcard_dma_free(card->dma); err_free: b1_free_card(card); err: return retval; }
static int c4_add_card(struct capi_driver *driver, struct capicardparams *p, struct pci_dev *dev, int nr) { avmctrl_info *cinfo; avmcard *card; int retval; int i; MOD_INC_USE_COUNT; card = (avmcard *) kmalloc(sizeof(avmcard), GFP_ATOMIC); if (!card) { printk(KERN_WARNING "%s: no memory.\n", driver->name); MOD_DEC_USE_COUNT; return -ENOMEM; } memset(card, 0, sizeof(avmcard)); card->dma = avmcard_dma_alloc(driver->name, dev, 2048+128, 2048+128); if (!card->dma) { printk(KERN_WARNING "%s: no memory.\n", driver->name); kfree(card); MOD_DEC_USE_COUNT; return -ENOMEM; } cinfo = (avmctrl_info *) kmalloc(sizeof(avmctrl_info)*4, GFP_ATOMIC); if (!cinfo) { printk(KERN_WARNING "%s: no memory.\n", driver->name); avmcard_dma_free(card->dma); kfree(card); MOD_DEC_USE_COUNT; return -ENOMEM; } memset(cinfo, 0, sizeof(avmctrl_info)*4); card->ctrlinfo = cinfo; for (i=0; i < 4; i++) { cinfo = &card->ctrlinfo[i]; cinfo->card = card; } sprintf(card->name, "%s-%x", driver->name, p->port); card->port = p->port; card->irq = p->irq; card->membase = p->membase; card->cardtype = nr == 4 ? avm_c4 : avm_c2; if (check_region(card->port, AVMB1_PORTLEN)) { printk(KERN_WARNING "%s: ports 0x%03x-0x%03x in use.\n", driver->name, card->port, card->port + AVMB1_PORTLEN); kfree(card->ctrlinfo); avmcard_dma_free(card->dma); kfree(card); MOD_DEC_USE_COUNT; return -EBUSY; } card->mbase = ioremap_nocache(card->membase, 128); if (card->mbase == 0) { printk(KERN_NOTICE "%s: can't remap memory at 0x%lx\n", driver->name, card->membase); kfree(card->ctrlinfo); avmcard_dma_free(card->dma); kfree(card); MOD_DEC_USE_COUNT; return -EIO; } if ((retval = c4_detect(card)) != 0) { printk(KERN_NOTICE "%s: NO card at 0x%x (%d)\n", driver->name, card->port, retval); iounmap(card->mbase); kfree(card->ctrlinfo); avmcard_dma_free(card->dma); kfree(card); MOD_DEC_USE_COUNT; return -EIO; } c4_reset(card); request_region(p->port, AVMB1_PORTLEN, card->name); retval = request_irq(card->irq, c4_interrupt, SA_SHIRQ, card->name, card); if (retval) { printk(KERN_ERR "%s: unable to get IRQ %d.\n", driver->name, card->irq); iounmap(card->mbase); release_region(card->port, AVMB1_PORTLEN); kfree(card->ctrlinfo); avmcard_dma_free(card->dma); kfree(card); MOD_DEC_USE_COUNT; return -EBUSY; } for (i=0; i < nr ; i++) { cinfo = &card->ctrlinfo[i]; cinfo->card = card; cinfo->capi_ctrl = di->attach_ctr(driver, card->name, cinfo); if (!cinfo->capi_ctrl) { printk(KERN_ERR "%s: attach controller failed (%d).\n", driver->name, i); for (i--; i >= 0; i--) { cinfo = &card->ctrlinfo[i]; di->detach_ctr(cinfo->capi_ctrl); } iounmap(card->mbase); free_irq(card->irq, card); release_region(card->port, AVMB1_PORTLEN); avmcard_dma_free(card->dma); kfree(card->ctrlinfo); kfree(card); MOD_DEC_USE_COUNT; return -EBUSY; } if (i == 0) card->cardnr = cinfo->capi_ctrl->cnr; } printk(KERN_INFO "%s: AVM C%d at i/o %#x, irq %d, mem %#lx\n", driver->name, nr, card->port, card->irq, card->membase); return 0; }