Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}
Exemple #6
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;
}