int nr_sglist;
};
+struct pexor_locks {
+ struct semaphore sem_buf; /* lock semaphore for DMA buffer */
+ struct semaphore sem_ioctl; /* lock semaphore for ioctl operations */
+ spinlock_t spin_lock0; /* Spin Lock #0 */
+};
+
struct pexor_privdata
{
atomic_t state; /* run state of device */
unsigned long bases[6]; /* contains pci resource bases */
unsigned long reglen[6]; /* contains pci resource length */
void* iomem[6]; /* points to mapped io memory of the bars */
- struct semaphore sem_buf; /* lock semaphore for DMA buffer */
- struct semaphore sem_ioctl; /* lock semaphore for ioctl operations */
- spinlock_t spin_lock0; /* Spin Lock #0 */
-
+
struct pexor_dma dma; /* dma buffer */
u32* memwrite_buffer; /* buffer for register_write_mem */
int magic; /* magic number to identify irq */
+
+ struct pexor_locks locks; /* all Spin and Semaphore Locks */
};
/* ---------------------------------------------------------------------- */
int probe(struct pci_dev* dev,
const struct pci_device_id* id)
{
- int err = 0, ix = 0;
+ int err = 0;
+ int ix = 0;
+ struct pexor_privdata* priv = NULL;
- struct pexor_privdata* priv;
pexor_msg(KERN_NOTICE "PEXOR pci driver starts probe...\n");
+
if ((err = pci_enable_device(dev)) != 0) {
pexor_msg(KERN_ERR
"PEXOR pci driver probe: Error %d enabling PCI device! \n",
/* Initialize Semaphore Locks */
- sema_init(&(priv->sem_buf), 1);
- sema_init(&(priv->sem_ioctl), 1);
+ sema_init(&priv->locks.sem_buf, 1);
+ sema_init(&priv->locks.sem_ioctl, 1);
/* Initialize Spin Locks, not needed at the moment */
- spin_lock_init(&(priv->spin_lock0));
+ spin_lock_init(&(priv->locks.spin_lock0));
////////////////// here chardev registering
priv->devid = atomic_inc_return(&pexor_numdevs) - 1;
pexor_dbg(KERN_NOTICE "** starting pexor_read for f_pos=%d count=%d\n",
(int)*f_pos, (int)count);
- /* Request Semaphore */
- if (down_interruptible(&priv->sem_buf) != 0) {
- printk(KERN_ERR "pexor_read: could not get Semaphore sem_buf\n");
- return -ERESTARTSYS;
- }
-
priv = get_privdata(filp);
if (priv == NULL) {
retval= -EFAULT;
goto out_read;
}
+
+ /* Request Semaphore */
+ if (down_interruptible(&priv->locks.sem_buf) != 0) {
+ printk(KERN_ERR "pexor_read: could not get Semaphore sem_buf\n");
+ return -ERESTARTSYS;
+ }
if (count > priv->dma.size * PAGE_SIZE) {
pexor_msg(KERN_ERR "ERROR> pexor_read: requested count (%d) > Max: %d\n",
retval = count;
out_read:
- up(&priv->sem_buf);
+ up(&priv->locks.sem_buf);
return retval;
}
pexor_dbg(KERN_NOTICE "** starting pexor_write for f_pos=%d count=%d\n",
(int)*f_pos, (int)count);
-
- /* Request Semaphore */
- if (down_interruptible(&priv->sem_buf) != 0) {
- printk(KERN_ERR "pexor_write: could not get Semaphore sem_buf\n");
- return -ERESTARTSYS;
- }
/* u32 kbuf[lcount]; */
priv = get_privdata(filp);
retval = -EFAULT;
goto out_write;
}
+
+ /* Request Semaphore */
+ if (down_interruptible(&priv->locks.sem_buf) != 0) {
+ printk(KERN_ERR "pexor_write: could not get Semaphore sem_buf\n");
+ return -ERESTARTSYS;
+ }
if (count > 4 * PEXOR_MEMWRITE_SIZE) {
retval = -EFAULT;
retval = count;
out_write:
- up(&priv->sem_buf);
+ up(&priv->locks.sem_buf);
return retval;
}
struct pexor_reg_io descriptor;
/* Request Semaphore */
- if (down_interruptible(&priv->sem_ioctl) != 0) {
+ if (down_interruptible(&priv->locks.sem_ioctl) != 0) {
printk(KERN_ERR
"pexor_ioctl_read_register: could not get Semaphore sem_buf\n");
return -ERESTARTSYS;
retval = copy_to_user((void __user *)arg, &descriptor,
sizeof(struct pexor_reg_io));
OUT_READ_REG:
- up(&priv->sem_ioctl);
+ up(&priv->locks.sem_ioctl);
return retval;
}
struct pexor_reg_io descriptor;
/* Request Semaphore */
- if (down_interruptible(&priv->sem_ioctl) != 0) {
+ if (down_interruptible(&priv->locks.sem_ioctl) != 0) {
printk(KERN_ERR
"pexor_ioctl_write_register: could not get Semaphore sem_buf\n");
return -ERESTARTSYS;
udelay(UDELAY_TIME);
OUT_WRITE_REG:
- up(&priv->sem_ioctl);
+ up(&priv->locks.sem_ioctl);
return retval;
}
struct pexor_trbnet_io descriptor;
/* Request Semaphore */
- if (down_interruptible(&priv->sem_ioctl) != 0) {
+ if (down_interruptible(&priv->locks.sem_ioctl) != 0) {
printk(KERN_ERR
"pexor_ioctl_trbnet_request: could not get Semaphore sem_buf\n");
return -ERESTARTSYS;
}
OUT_IOCTL:
- up(&priv->sem_ioctl);
+ up(&priv->locks.sem_ioctl);
return status;
}