#define DECLARES
 #include "compat_ioctl.c"
 
-/* PA-specific ioctls */
-COMPATIBLE_IOCTL(PA_PERF_ON)
-COMPATIBLE_IOCTL(PA_PERF_OFF)
-COMPATIBLE_IOCTL(PA_PERF_VERSION)
-
 /* And these ioctls need translation */
 HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc)
 HANDLE_IOCTL(SIOCGPPPCSTATS, dev_ifsioc)
 
 static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos);
 static ssize_t perf_write(struct file *file, const char __user *buf, size_t count, 
        loff_t *ppos);
-static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-       unsigned long arg);
+static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
 static void perf_start_counters(void);
 static int perf_stop_counters(uint32_t *raddr);
 static struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num);
  * must be running on the processor that you wish to change.
  */
 
-static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-       unsigned long arg)
+static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        long error_start;
-       uint32_t raddr[4];      
+       uint32_t raddr[4];
+       int error = 0;
 
+       lock_kernel();
        switch (cmd) {
 
            case PA_PERF_ON:
                        /* Start the counters */
                        perf_start_counters();
-                       return 0;
+                       break;
 
            case PA_PERF_OFF:
                        error_start = perf_stop_counters(raddr);
                        if (error_start != 0) {
                                printk(KERN_ERR "perf_off: perf_stop_counters = %ld\n", error_start);
-                               return -EFAULT; 
+                               error = -EFAULT;
+                               break;
                        }
 
                        /* copy out the Counters */
                        if (copy_to_user((void __user *)arg, raddr, 
                                        sizeof (raddr)) != 0) {
-                               return -EFAULT;
+                               error =  -EFAULT;
+                               break;
                        }
-                       return 0;
+                       break;
 
            case PA_PERF_VERSION:
                        /* Return the version # */
-                       return put_user(PERF_VERSION, (int *)arg);
+                       error = put_user(PERF_VERSION, (int *)arg);
+                       break;
 
            default:
-                       break;
+                       error = -ENOTTY;
        }
-       return -ENOTTY;
+
+       unlock_kernel();
+
+       return error;
 }
 
 static struct file_operations perf_fops = {
        .llseek = no_llseek,
        .read = perf_read,
        .write = perf_write,
-       .ioctl = perf_ioctl,
+       .unlocked_ioctl = perf_ioctl,
+       .compat_ioctl = perf_ioctl,
        .open = perf_open,
        .release = perf_release
 };