Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
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;
}