static void search_cards(void) { struct pci_dev *akt_pcidev = NULL; hysdn_card *card, *card_last; int i; card_root = NULL; card_last = NULL; while ((akt_pcidev = pci_find_device(PCI_VENDOR_ID_HYPERCOPE, PCI_DEVICE_ID_HYPERCOPE_PLX, akt_pcidev)) != NULL) { if (pci_enable_device(akt_pcidev)) continue; if (!(card = kmalloc(sizeof(hysdn_card), GFP_KERNEL))) { printk(KERN_ERR "HYSDN: unable to alloc device mem \n"); return; } memset(card, 0, sizeof(hysdn_card)); card->myid = cardmax; /* set own id */ card->bus = akt_pcidev->bus->number; card->devfn = akt_pcidev->devfn; /* slot + function */ card->subsysid = akt_pcidev->subsystem_device; card->irq = akt_pcidev->irq; card->iobase = pci_resource_start(akt_pcidev, PCI_REG_PLX_IO_BASE); card->plxbase = pci_resource_start(akt_pcidev, PCI_REG_PLX_MEM_BASE); card->membase = pci_resource_start(akt_pcidev, PCI_REG_MEMORY_BASE); card->brdtype = BD_NONE; /* unknown */ card->debug_flags = DEF_DEB_FLAGS; /* set default debug */ card->faxchans = 0; /* default no fax channels */ card->bchans = 2; /* and 2 b-channels */ for (i = 0; pci_subid_map[i].subid; i++) if (pci_subid_map[i].subid == card->subsysid) { card->brdtype = pci_subid_map[i].cardtyp; break; } if (card->brdtype != BD_NONE) { if (ergo_inithardware(card)) { printk(KERN_WARNING "HYSDN: card at io 0x%04x already in use\n", card->iobase); kfree(card); continue; } } else { printk(KERN_WARNING "HYSDN: unknown card id 0x%04x\n", card->subsysid); kfree(card); /* release mem */ continue; } cardmax++; card->next = NULL; /*end of chain */ if (card_last) card_last->next = card; /* pointer to next card */ else card_root = card; card_last = card; /* new chain end */ } /* device found */ } /* search_cards */
static int __devinit hysdn_pci_init_one(struct pci_dev *akt_pcidev, const struct pci_device_id *ent) { hysdn_card *card; int rc; rc = pci_enable_device(akt_pcidev); if (rc) return rc; if (!(card = kzalloc(sizeof(hysdn_card), GFP_KERNEL))) { ; rc = -ENOMEM; goto err_out; } card->myid = cardmax; /* set own id */ card->bus = akt_pcidev->bus->number; card->devfn = akt_pcidev->devfn; /* slot + function */ card->subsysid = akt_pcidev->subsystem_device; card->irq = akt_pcidev->irq; card->iobase = pci_resource_start(akt_pcidev, PCI_REG_PLX_IO_BASE); card->plxbase = pci_resource_start(akt_pcidev, PCI_REG_PLX_MEM_BASE); card->membase = pci_resource_start(akt_pcidev, PCI_REG_MEMORY_BASE); card->brdtype = BD_NONE; /* unknown */ card->debug_flags = DEF_DEB_FLAGS; /* set default debug */ card->faxchans = 0; /* default no fax channels */ card->bchans = 2; /* and 2 b-channels */ card->brdtype = ent->driver_data; if (ergo_inithardware(card)) { ; rc = -EBUSY; goto err_out_card; } cardmax++; card->next = NULL; /*end of chain */ if (card_last) card_last->next = card; /* pointer to next card */ else card_root = card; card_last = card; /* new chain end */ pci_set_drvdata(akt_pcidev, card); return 0; err_out_card: kfree(card); err_out: pci_disable_device(akt_pcidev); return rc; }