How to call compat_ioctl or unlocked_ioctl?

gangadhars picture gangadhars · May 17, 2014 · Viewed 11.9k times · Source

I'm trying to implement a driver for RTC (Real Time Clock). I used ioctl function in kernel 2.6.32. It worked fine. But when I run same driver in kernel 3.13.0, it gave an error ‘struct file_operations’ has no member named ‘ioctl’

when I changed ioctl to unlocked_ioctl and compat_ioctl, compiled and moduled inserted.

But calling ioctl in user application not invoking ioctl function in module. What function I have to use in user application to invoke compat_ioctl or unlocked_ioctl?

Answer

Rocoder picture Rocoder · May 17, 2014

Check with arguments in driver

define structure file operation Definition like

static struct file_operations query_fops =
{
    .owner = THIS_MODULE,
    .open = my_open,
    .release = my_close,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
    .ioctl = my_ioctl
#else
    .unlocked_ioctl = my_ioctl
#endif
};

Define ioctl like

#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
static int my_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg)
#else
static long my_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
        #endif
    {
              switch(cmd){
                ....................................
                ...................................
              }
    }

and application level

No need to do any modification you can follow the basic rule for ioctl at application level.