mei: support polling for event notification
authorTomas Winkler <tomas.winkler@intel.com>
Sun, 26 Jul 2015 06:54:21 +0000 (09:54 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 4 Aug 2015 00:30:00 +0000 (17:30 -0700)
Polling on priority events is translated on waiting for event
notification. One need to enable notification prior for
calling select or poll system call otherwise process
will not wait.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/main.c

index ffa70035af296420ef195aff759bcb72ff3a4607..17b356f26686108dc87b882f640511a69f4019ec 100644 (file)
@@ -608,6 +608,7 @@ static unsigned int mei_poll(struct file *file, poll_table *wait)
        struct mei_cl *cl = file->private_data;
        struct mei_device *dev;
        unsigned int mask = 0;
+       bool notify_en;
 
        if (WARN_ON(!cl || !cl->dev))
                return POLLERR;
@@ -616,6 +617,7 @@ static unsigned int mei_poll(struct file *file, poll_table *wait)
 
        mutex_lock(&dev->device_lock);
 
+       notify_en = cl->notify_en && (req_events & POLLPRI);
 
        if (dev->dev_state != MEI_DEV_ENABLED ||
            !mei_cl_is_connected(cl)) {
@@ -628,6 +630,12 @@ static unsigned int mei_poll(struct file *file, poll_table *wait)
                goto out;
        }
 
+       if (notify_en) {
+               poll_wait(file, &cl->ev_wait, wait);
+               if (cl->notify_ev)
+                       mask |= POLLPRI;
+       }
+
        if (req_events & (POLLIN | POLLRDNORM)) {
                poll_wait(file, &cl->rx_wait, wait);