Rev 11 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 11 | Rev 362 | ||
|---|---|---|---|
| Line 65... | Line 65... | ||
| 65 | #include <asm/types.h> |
65 | #include <asm/types.h> |
| 66 | #include <asm/uaccess.h> |
66 | #include <asm/uaccess.h> |
| 67 | 67 | ||
| 68 | #include <linux/sched.h> |
68 | #include <linux/sched.h> |
| 69 | #include <linux/fs.h> |
69 | #include <linux/fs.h> |
| 70 | #if HAVE_UNLOCKED_IOCTL |
- | |
| 71 |
|
70 | #include <linux/mutex.h> |
| 72 | #else |
- | |
| 73 | #include <linux/smp_lock.h> |
- | |
| 74 | #endif |
- | |
| 75 | 71 | ||
| 76 | 72 | ||
| 77 | #include "fops.h" |
73 | #include "fops.h" |
| 78 | #include "plx9050.h" |
74 | #include "plx9050.h" |
| 79 | #include "pcivme.h" /* the common ioctl commands and structures between driver and application */ |
75 | #include "pcivme.h" /* the common ioctl commands and structures between driver and application */ |
| Line 255... | Line 251... | ||
| 255 | { |
251 | { |
| 256 | u16 tmp; |
252 | u16 tmp; |
| 257 | 253 | ||
| 258 | __get_user(tmp, increment16(pvBuffer)); |
254 | __get_user(tmp, increment16(pvBuffer)); |
| 259 | writew(tmp, (volatile void *) ( pd->pVME + dwLocalAddressInPage )); |
255 | writew(tmp, (volatile void *) ( pd->pVME + dwLocalAddressInPage )); |
| 260 | } |
256 | } |
| 261 | 257 | ||
| 262 | static void readLong(DEVICE_OBJ *pd, void **pvBuffer, u32 dwLocalAddressInPage) |
258 | static void readLong(DEVICE_OBJ *pd, void **pvBuffer, u32 dwLocalAddressInPage) |
| 263 | { |
259 | { |
| 264 | u32 tmp; |
260 | u32 tmp; |
| 265 | 261 | ||
| 266 | tmp = readl((const volatile void *) (pd->pVME + dwLocalAddressInPage)); |
262 | tmp = readl((const volatile void *) (pd->pVME + dwLocalAddressInPage)); |
| Line 442... | Line 438... | ||
| 442 | fail: |
438 | fail: |
| 443 | return err; |
439 | return err; |
| 444 | } |
440 | } |
| 445 | 441 | ||
| 446 | static int access_command(PATH_OBJ *pp, DEVICE_OBJ *pd, PCIVME_ACCESS_COMMAND *cmd) |
442 | static int access_command(PATH_OBJ *pp, DEVICE_OBJ *pd, PCIVME_ACCESS_COMMAND *cmd) |
| 447 | { |
443 | { |
| 448 | PRINTK(KERN_DEBUG "%s : access_command()\n", DEVICE_NAME); |
444 | PRINTK(KERN_DEBUG "%s : access_command()\n", DEVICE_NAME); |
| 449 | 445 | ||
| 450 | pp->bModifier = cmd->bModifier; |
446 | pp->bModifier = cmd->bModifier; |
| 451 | pp->bAccessType = cmd->bAccessType; |
447 | pp->bAccessType = cmd->bAccessType; |
| 452 | pp->bIncrement = cmd->bIncrement; |
448 | pp->bIncrement = cmd->bIncrement; |
| Line 722... | Line 718... | ||
| 722 | PATH_OBJ *pp = (PATH_OBJ *)pFile->private_data; |
718 | PATH_OBJ *pp = (PATH_OBJ *)pFile->private_data; |
| 723 | DEVICE_OBJ *pd = pp->pDo; |
719 | DEVICE_OBJ *pd = pp->pDo; |
| 724 | int err = 1; |
720 | int err = 1; |
| 725 | 721 | ||
| 726 | PRINTK(KERN_DEBUG "%s : pcivme_ioctl(0x%08x), size = %d\n", DEVICE_NAME, cmd, _IOC_SIZE(cmd)); |
722 | PRINTK(KERN_DEBUG "%s : pcivme_ioctl(0x%08x), size = %d\n", DEVICE_NAME, cmd, _IOC_SIZE(cmd)); |
| 727 | 723 | ||
| 728 | if (_IOC_TYPE(cmd) != PCIVME_MAGIC) |
724 | if (_IOC_TYPE(cmd) != PCIVME_MAGIC) |
| 729 | return -EINVAL; |
725 | return -EINVAL; |
| 730 | 726 | ||
| 731 | // check for accessible user buffer |
727 | // check for accessible user buffer |
| 732 | if (_IOC_DIR(cmd) & _IOC_READ) |
728 | if (_IOC_DIR(cmd) & _IOC_READ) |
| 733 | err = !access_ok( |
729 | err = !access_ok( (void *)arg, _IOC_SIZE(cmd)); |
| 734 | if (_IOC_DIR(cmd) & _IOC_WRITE) |
730 | if (_IOC_DIR(cmd) & _IOC_WRITE) |
| 735 | err = !access_ok( |
731 | err = !access_ok( (void *)arg, _IOC_SIZE(cmd)); |
| 736 | if (err) |
732 | if (err) |
| 737 | return -EFAULT; |
733 | return -EFAULT; |
| 738 | 734 | ||
| 739 | switch (_IOC_NR(cmd)) |
735 | switch (_IOC_NR(cmd)) |
| 740 | { |
736 | { |
| Line 748... | Line 744... | ||
| 748 | return -EINVAL; |
744 | return -EINVAL; |
| 749 | return read_vector_polling(pp, pd, (PCIVME_VECTOR_LEVEL *)arg); |
745 | return read_vector_polling(pp, pd, (PCIVME_VECTOR_LEVEL *)arg); |
| 750 | 746 | ||
| 751 | case _IOC_NR(PCIVME_CONTROL_INTERRUPTS): |
747 | case _IOC_NR(PCIVME_CONTROL_INTERRUPTS): |
| 752 | if (_IOC_SIZE(cmd) < sizeof(PCIVME_IRQ_CONTROL)) |
748 | if (_IOC_SIZE(cmd) < sizeof(PCIVME_IRQ_CONTROL)) |
| 753 | return -EINVAL; |
749 | return -EINVAL; |
| 754 | return control_interrupts(pp, pd, (PCIVME_IRQ_CONTROL *)arg); |
750 | return control_interrupts(pp, pd, (PCIVME_IRQ_CONTROL *)arg); |
| 755 | 751 | ||
| 756 | case _IOC_NR(PCIVME_TAS): |
752 | case _IOC_NR(PCIVME_TAS): |
| 757 | if (_IOC_SIZE(cmd) < sizeof(PCIVME_TAS_STRUCT)) |
753 | if (_IOC_SIZE(cmd) < sizeof(PCIVME_TAS_STRUCT)) |
| 758 | return -EINVAL; |
754 | return -EINVAL; |
| Line 810... | Line 806... | ||
| 810 | 806 | ||
| 811 | static long pcivme_unlocked_ioctl(struct file *pFile, unsigned int cmd, unsigned long arg){ |
807 | static long pcivme_unlocked_ioctl(struct file *pFile, unsigned int cmd, unsigned long arg){ |
| 812 | long retval=0; |
808 | long retval=0; |
| 813 | 809 | ||
| 814 | 810 | ||
| 815 | #if HAVE_UNLOCKED_IOCTL |
- | |
| 816 | struct mutex fs_mutex; |
811 | struct mutex fs_mutex; |
| 817 | mutex_init(&fs_mutex); |
812 | mutex_init(&fs_mutex); |
| 818 | mutex_lock(&fs_mutex); |
813 | mutex_lock(&fs_mutex); |
| 819 | #else |
- | |
| 820 | lock_kernel(); |
- | |
| 821 | #endif |
- | |
| 822 | 814 | ||
| 823 | PRINTK(KERN_DEBUG "%s : pcivme_unlocked_ioctl(0x%08x), size = %d\n", DEVICE_NAME, cmd, _IOC_SIZE(cmd)); |
815 | PRINTK(KERN_DEBUG "%s : pcivme_unlocked_ioctl(0x%08x), size = %d\n", DEVICE_NAME, cmd, _IOC_SIZE(cmd)); |
| 824 | retval = pcivme_ioctl(NULL, pFile, cmd,arg); |
816 | retval = pcivme_ioctl(NULL, pFile, cmd,arg); |
| 825 | 817 | ||
| 826 | #if HAVE_UNLOCKED_IOCTL |
- | |
| 827 | mutex_unlock(&fs_mutex); |
818 | mutex_unlock(&fs_mutex); |
| 828 | #else |
- | |
| 829 | unlock_kernel(); |
- | |
| 830 | #endif |
- | |
| 831 | 819 | ||
| 832 | return retval; |
820 | return retval; |
| 833 | } |
821 | } |
| 834 | 822 | ||
| 835 | int pcivme_open(struct inode *pInode, struct file *pFile) |
823 | int pcivme_open(struct inode *pInode, struct file *pFile) |
| Line 955... | Line 943... | ||
| 955 | // inhibit misaligned accesses |
943 | // inhibit misaligned accesses |
| 956 | if (pp->AlignmentCheck(*offp)) |
944 | if (pp->AlignmentCheck(*offp)) |
| 957 | return -EFAULT; |
945 | return -EFAULT; |
| 958 | 946 | ||
| 959 | // check for free access to user buffer |
947 | // check for free access to user buffer |
| 960 | if (!access_ok( |
948 | if (!access_ok( pcBuffer, count)) |
| 961 | return -EFAULT; |
949 | return -EFAULT; |
| 962 | 950 | ||
| 963 | // do I still have the same modifier? |
951 | // do I still have the same modifier? |
| 964 | if (pp->bModifier != pd->bCurrentModifier) |
952 | if (pp->bModifier != pd->bCurrentModifier) |
| 965 | setModifier(pd, pp->bModifier); |
953 | setModifier(pd, pp->bModifier); |
| Line 997... | Line 985... | ||
| 997 | // inhibit misaligned accesses |
985 | // inhibit misaligned accesses |
| 998 | if (pp->AlignmentCheck(*offp)) |
986 | if (pp->AlignmentCheck(*offp)) |
| 999 | return -EFAULT; |
987 | return -EFAULT; |
| 1000 | 988 | ||
| 1001 | // check for free access to user buffer |
989 | // check for free access to user buffer |
| 1002 | if (!access_ok( |
990 | if (!access_ok( pcBuffer, count)) |
| 1003 | return -EFAULT; |
991 | return -EFAULT; |
| 1004 | 992 | ||
| 1005 | // do I still have the same modifier? |
993 | // do I still have the same modifier? |
| 1006 | if (pp->bModifier != pd->bCurrentModifier) |
994 | if (pp->bModifier != pd->bCurrentModifier) |
| 1007 | setModifier(pd, pp->bModifier); |
995 | setModifier(pd, pp->bModifier); |