Mercurial > pt1
diff driver/pt1_pci.c @ 119:7662d0ecd74b
revised new ioctl functions
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Fri, 19 Nov 2010 11:19:25 +0900 |
parents | 53266592882d |
children | 3914cc1b2375 |
line wrap: on
line diff
--- a/driver/pt1_pci.c Thu Nov 18 23:01:40 2010 +0900 +++ b/driver/pt1_pci.c Fri Nov 19 11:19:25 2010 +0900 @@ -33,6 +33,7 @@ #include <linux/cdev.h> #include <linux/ioctl.h> +#include <linux/smp_lock.h> #include "pt1_com.h" #include "pt1_pci.h" @@ -511,11 +512,7 @@ return count; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36) -static long pt1_ioctl(struct file *file, unsigned int cmd, unsigned long arg0) -#else -static int pt1_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg0) -#endif +static long pt1_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg0) { PT1_CHANNEL *channel = file->private_data; int signal; @@ -572,6 +569,35 @@ return -EINVAL; } +static long pt1_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg0) +{ + long ret; + + lock_kernel(); + ret = pt1_do_ioctl(file, cmd, arg0); + unlock_kernel(); + + return ret; +} + +static long pt1_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg0) +{ + long ret; + /* should do 32bit <-> 64bit conversion here? --yaz */ + ret = pt1_unlocked_ioctl(file, cmd, arg0); + + return ret; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) +static int pt1_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg0) +{ + int ret; + ret = (int)pt1_do_ioctl(file, cmd, arg0); + return ret; +} +#endif + /* */ static const struct file_operations pt1_fops = { @@ -579,11 +605,11 @@ .open = pt1_open, .release = pt1_release, .read = pt1_read, -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36) - .unlocked_ioctl = pt1_ioctl, -#else +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) .ioctl = pt1_ioctl, #endif + .unlocked_ioctl = pt1_unlocked_ioctl, + .compat_ioctl = pt1_compat_ioctl, .llseek = no_llseek, };