Commit 237092bf authored by Tomas Winkler's avatar Tomas Winkler Committed by Greg Kroah-Hartman

mei: implement fasync for event notification

A process can be informed about client notification also via
SIGIO with POLL_PRI event.
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2c84c297
...@@ -1350,6 +1350,33 @@ int mei_cl_notify_request(struct mei_cl *cl, struct file *file, u8 request) ...@@ -1350,6 +1350,33 @@ int mei_cl_notify_request(struct mei_cl *cl, struct file *file, u8 request)
return rets; return rets;
} }
/**
* mei_cl_notify - raise notification
*
* @cl: host client
*
* Locking: called under "dev->device_lock" lock
*/
void mei_cl_notify(struct mei_cl *cl)
{
struct mei_device *dev;
if (!cl || !cl->dev)
return;
dev = cl->dev;
if (!cl->notify_en)
return;
cl_dbg(dev, cl, "notify event");
cl->notify_ev = true;
wake_up_interruptible_all(&cl->ev_wait);
if (cl->ev_async)
kill_fasync(&cl->ev_async, SIGIO, POLL_PRI);
}
/** /**
* mei_cl_notify_get - get or wait for notification event * mei_cl_notify_get - get or wait for notification event
* *
......
...@@ -225,6 +225,7 @@ int mei_cl_notify_request(struct mei_cl *cl, struct file *file, u8 request); ...@@ -225,6 +225,7 @@ int mei_cl_notify_request(struct mei_cl *cl, struct file *file, u8 request);
int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb, int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb,
struct mei_cl_cb *cmpl_list); struct mei_cl_cb *cmpl_list);
int mei_cl_notify_get(struct mei_cl *cl, bool block, bool *notify_ev); int mei_cl_notify_get(struct mei_cl *cl, bool block, bool *notify_ev);
void mei_cl_notify(struct mei_cl *cl);
void mei_cl_all_disconnect(struct mei_device *dev); void mei_cl_all_disconnect(struct mei_device *dev);
void mei_cl_all_wakeup(struct mei_device *dev); void mei_cl_all_wakeup(struct mei_device *dev);
......
...@@ -514,10 +514,8 @@ static void mei_hbm_cl_notify(struct mei_device *dev, ...@@ -514,10 +514,8 @@ static void mei_hbm_cl_notify(struct mei_device *dev,
struct mei_cl *cl; struct mei_cl *cl;
cl = mei_hbm_cl_find_by_cmd(dev, cmd); cl = mei_hbm_cl_find_by_cmd(dev, cmd);
if (cl && cl->notify_en) { if (cl)
cl->notify_ev = true; mei_cl_notify(cl);
wake_up_interruptible(&cl->ev_wait);
}
} }
/** /**
......
...@@ -650,6 +650,26 @@ static unsigned int mei_poll(struct file *file, poll_table *wait) ...@@ -650,6 +650,26 @@ static unsigned int mei_poll(struct file *file, poll_table *wait)
return mask; return mask;
} }
/**
* mei_fasync - asynchronous io support
*
* @fd: file descriptor
* @file: pointer to file structure
* @band: band bitmap
*
* Return: poll mask
*/
static int mei_fasync(int fd, struct file *file, int band)
{
struct mei_cl *cl = file->private_data;
if (!mei_cl_is_connected(cl))
return POLLERR;
return fasync_helper(fd, file, band, &cl->ev_async);
}
/** /**
* fw_status_show - mei device attribute show method * fw_status_show - mei device attribute show method
* *
...@@ -702,6 +722,7 @@ static const struct file_operations mei_fops = { ...@@ -702,6 +722,7 @@ static const struct file_operations mei_fops = {
.release = mei_release, .release = mei_release,
.write = mei_write, .write = mei_write,
.poll = mei_poll, .poll = mei_poll,
.fasync = mei_fasync,
.llseek = no_llseek .llseek = no_llseek
}; };
......
...@@ -236,6 +236,7 @@ struct mei_cl_cb { ...@@ -236,6 +236,7 @@ struct mei_cl_cb {
* @rx_wait: wait queue for rx completion * @rx_wait: wait queue for rx completion
* @wait: wait queue for management operation * @wait: wait queue for management operation
* @ev_wait: notification wait queue * @ev_wait: notification wait queue
* @ev_async: event async notification
* @status: connection status * @status: connection status
* @me_cl: fw client connected * @me_cl: fw client connected
* @host_client_id: host id * @host_client_id: host id
...@@ -258,6 +259,7 @@ struct mei_cl { ...@@ -258,6 +259,7 @@ struct mei_cl {
wait_queue_head_t rx_wait; wait_queue_head_t rx_wait;
wait_queue_head_t wait; wait_queue_head_t wait;
wait_queue_head_t ev_wait; wait_queue_head_t ev_wait;
struct fasync_struct *ev_async;
int status; int status;
struct mei_me_client *me_cl; struct mei_me_client *me_cl;
u8 host_client_id; u8 host_client_id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment