int flink_core_open(flink_dev* fdev,struct flink_bus_ops* bus_channel) { //fdev = flink_device_alloc(); flink_set_bus(bus_channel); flink_device_init(fdev, bus_channel); // TODO: Use other bus_ops for other channel flink_device_add(fdev); // creates device nodes return 0; }
int flink_core_open(flink_dev* fdev) { //fdev = flink_device_alloc(); flink_set_bus(&avalon_bus_ops); flink_device_init(fdev, &avalon_bus_ops); // TODO: Use other bus_ops for other channel flink_device_add(fdev); // creates device nodes return 0; }
// ############ Initialization and cleanup ############ static int __init flink_pci_init(void) { int error = 0; struct flink_device* flink_pci_dev; struct pci_dev* pci_device; void __iomem* mmio_base_ptr; unsigned long mmio_length; #if defined(DBG) printk(KERN_DEBUG "[%s] Initializing module with parameters 'vid=%x, pid=%x'", MODULE_NAME, vid, pid); #endif // Get PCI device struct pci_device = pci_get_device(vid, pid, NULL); if(pci_device == NULL) { printk(KERN_ALERT "[%s] ERROR: PCIe device not found!", MODULE_NAME); goto err_pci_device_not_found; } // Initialize and enable the PCI device error = pci_enable_device(pci_device); if(error) { printk(KERN_ALERT "[%s] ERROR: Unable to enable PCI device!", MODULE_NAME); goto err_pci_enable_device; } // Reserve PCI memory resources error = pci_request_regions(pci_device, KBUILD_MODNAME); if(error) { printk(KERN_ALERT "[%s] ERROR: Memory region request failed!", MODULE_NAME); goto err_pci_region_request; } // I/O Memory mapping mmio_length = pci_resource_len(pci_device, BAR_0); mmio_base_ptr = pci_iomap(pci_device, BAR_0, mmio_length); #if defined(DBG) printk(KERN_DEBUG "[%s] PCI resource I/O memory mapping:", MODULE_NAME); printk(KERN_DEBUG " -> Base address: 0x%p", mmio_base_ptr); printk(KERN_DEBUG " -> Memory length: 0x%lx (%lu bytes)", mmio_length, mmio_length); #endif if(mmio_base_ptr == NULL){ printk(KERN_ALERT "[%s] ERROR: I/O Memory mapping failed!", MODULE_NAME); goto err_pci_iomap; } flink_pci_dev = create_flink_pci_device(&pci_bus_ops, pci_device, mmio_base_ptr, mmio_length); flink_device_add(flink_pci_dev); // All done printk(KERN_INFO "[%s] Module sucessfully loaded", MODULE_NAME); return 0; // ---- ERROR HANDLING ---- err_pci_iomap: pci_release_regions(pci_device); err_pci_region_request: pci_disable_device(pci_device); err_pci_enable_device: pci_device = NULL; err_pci_device_not_found: // nothing to do return error; }