static int xordevProbe(struct pci_dev *dev, const struct pci_device_id *id) { int retval = 0; printk(KERN_INFO "xordev: Probing PCI device %x:%x:%x.", dev->vendor, dev->device, dev->devfn); TRY(OR_RETURN(retval), retval, pci_enable_device(dev), "not enable PCI device"); TRY(OR_RETURN(retval), retval, setupDevice(dev), "not setup PCI device"); return retval; }
static inline __must_check int sysfs3Register(struct xordev *dev) { int result = 0; int i; for (i = 0; i < 3; ++i) { TRY(OR_RETURN(result), result, sysfsRegister(&dev[i]), "register sysfs special file"); } return result; }
static inline __must_check int add3CharDevices(struct xordev *dev) { int result = 0; int i; for (i = 0; i < 3; ++i) { TRY(OR_RETURN(result), result, addChrdev(&dev[i].cdev, dev[i].number), "add character device"); } return result; }
static inline __must_check int init3Queues(struct xordev *dev) { int result = 0; TRY(OR_RETURN(result), result, initQueues(dev), "initialize destination device queues"); TRY(OR_GOTO(fail), result, initQueues(dev + 1), "initialize source1 device queues"); TRY(OR_GOTO(fail), result, initQueues(dev + 2), "initialize source2 device queues"); return result; fail: exit3Queues(dev + 2); return result; }
static inline __must_check int setup3DeviceDataStructures(struct xordev *dev, int minorNumber) { int i; struct semaphore *mutex; TRY_PTR(OR_RETURN(-ENOMEM), mutex, kmalloc(sizeof(struct semaphore), GFP_KERNEL), "allocate memory for mutex for device with MINOR=%d", minorNumber); sema_init(mutex, 1); for (i = 0; i < 3; ++i) { printk(KERN_INFO "xordev: Setting up char device MAJOR=%d MINOR=%d", xordev_major, minorNumber + i); dev[i].number = MKDEV(xordev_major, minorNumber + i); dev[i].mutex = mutex; } return 0; }
int newXordev(int interruptNumber, struct pci_dev *pciDev) { int result = 0; int minorNumber = acquireMinorNumberByInterruptNumber(interruptNumber); struct xordev *dev = devices + minorNumber; printk(KERN_INFO "xordev: Creating xordev devices with MINOR starting at: %d", minorNumber); TRY(OR_RETURN(result), result, setup3DeviceDataStructures(dev, minorNumber), "initialize internal data structures"); dev[0].pciDev = pciDev; dev[1].pciDev = pciDev; dev[2].pciDev = pciDev; TRY(OR_GOTO(fail), result, request_irq(interruptNumber, handler, IRQF_SHARED, "xordev", dev), "interrupt request"); TRY(OR_GOTO(fail), result, init3Queues(dev), "initialize memory queues"); iowrite32(0L, dev->bar0); /* Interrupts disabled */ TRY(OR_GOTO(fail), result, add3CharDevices(dev), "add character devices"); TRY(OR_GOTO(fail), result, sysfs3Register(dev), "register sysfs special files"); return result; fail: delXordev(interruptNumber); return result; }