STATIC void __exit c4_mod_remove (void) { cleanup_hdlc (); /* delete any missed channels */ cleanup_devs (); c4_cleanup (); cleanup_ioremap (); pr_info("SBE - driver removed.\n"); }
status_t __init c4hw_attach_all (void) { hdw_info_t *hi; struct pci_dev *pdev = NULL; int found = 0, i, j; error_flag = 0; prep_hdw_info (); /*** scan PCI bus for all possible boards */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) while ((pdev = pci_get_device (PCI_VENDOR_ID_CONEXANT, PCI_DEVICE_ID_CN8474, pdev))) #else while ((pdev = pci_find_device (PCI_VENDOR_ID_CONEXANT, PCI_DEVICE_ID_CN8474, pdev))) #endif { if (c4_hdw_init (pdev, found)) found++; } if (!found) { pr_warning("No boards found\n"); return ENODEV; } /* sanity check for consistant hardware found */ for (i = 0, hi = hdw_info; i < MAX_BOARDS; i++, hi++) { if (hi->pci_slot != 0xff && (!hi->addr[0] || !hi->addr[1])) { pr_warning("%s: something very wrong with pci_get_device\n", hi->devname); return EIO; } } /* bring board's memory regions on/line */ for (i = 0, hi = hdw_info; i < MAX_BOARDS; i++, hi++) { if (hi->pci_slot == 0xff) break; for (j = 0; j < 2; j++) { if (request_mem_region (hi->addr[j], hi->len[j], hi->devname) == 0) { pr_warning("%s: memory in use, addr=0x%lx, len=0x%lx ?\n", hi->devname, hi->addr[j], hi->len[j]); cleanup_ioremap (); return ENOMEM; } hi->addr_mapped[j] = (unsigned long) ioremap (hi->addr[j], hi->len[j]); if (!hi->addr_mapped[j]) { pr_warning("%s: ioremap fails, addr=0x%lx, len=0x%lx ?\n", hi->devname, hi->addr[j], hi->len[j]); cleanup_ioremap (); return ENOMEM; } #ifdef SBE_MAP_DEBUG pr_warning("%s: io remapped from phys %x to virt %x\n", hi->devname, (u_int32_t) hi->addr[j], (u_int32_t) hi->addr_mapped[j]); #endif } } drvr_state = SBE_DRVR_AVAILABLE; /* Have now memory mapped all boards. Now allow board's access to system */ for (i = 0, hi = hdw_info; i < MAX_BOARDS; i++, hi++) { if (hi->pci_slot == 0xff) break; if (pci_enable_device (hi->pdev[0]) || pci_enable_device (hi->pdev[1])) { drvr_state = SBE_DRVR_DOWN; pr_warning("%s: failed to enable card %d slot %d\n", hi->devname, i, hi->pci_slot); cleanup_devs (); cleanup_ioremap (); return EIO; } pci_set_master (hi->pdev[0]); pci_set_master (hi->pdev[1]); if (!(hi->ndev = c4_add_dev (hi, i, (long) hi->addr_mapped[0], (long) hi->addr_mapped[1], hi->pdev[0]->irq, hi->pdev[1]->irq))) { drvr_state = SBE_DRVR_DOWN; cleanup_ioremap (); /* NOTE: c4_add_dev() does its own device cleanup */ #if 0 cleanup_devs (); #endif return error_flag; /* error_flag set w/in add_dev() */ } show_two (hi, i); /* displays found information */ } return 0; }