提交 4c6e22b8 编写于 作者: T Tomas Winkler 提交者: Greg Kroah-Hartman

mei: add mei_irq_compl_handler function

similar to read/write add also irq completion handler
that is called for the irq thread

rename missnamed mei_irq_complete_handler to
mei_cl_complete_handler as it operates on a single client
Signed-off-by: NTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 f57f27bc
...@@ -456,8 +456,6 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id) ...@@ -456,8 +456,6 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
{ {
struct mei_device *dev = (struct mei_device *) dev_id; struct mei_device *dev = (struct mei_device *) dev_id;
struct mei_cl_cb complete_list; struct mei_cl_cb complete_list;
struct mei_cl_cb *cb_pos = NULL, *cb_next = NULL;
struct mei_cl *cl;
s32 slots; s32 slots;
int rets; int rets;
bool bus_message_received; bool bus_message_received;
...@@ -527,23 +525,9 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id) ...@@ -527,23 +525,9 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
wake_up_interruptible(&dev->wait_recvd_msg); wake_up_interruptible(&dev->wait_recvd_msg);
bus_message_received = false; bus_message_received = false;
} }
if (list_empty(&complete_list.list))
return IRQ_HANDLED;
mei_irq_compl_handler(dev, &complete_list);
list_for_each_entry_safe(cb_pos, cb_next, &complete_list.list, list) {
cl = cb_pos->cl;
list_del(&cb_pos->list);
if (cl) {
if (cl != &dev->iamthif_cl) {
dev_dbg(&dev->pdev->dev, "completing call back.\n");
mei_irq_complete_handler(cl, cb_pos);
cb_pos = NULL;
} else if (cl == &dev->iamthif_cl) {
mei_amthif_complete(dev, cb_pos);
}
}
}
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static const struct mei_hw_ops mei_me_hw_ops = { static const struct mei_hw_ops mei_me_hw_ops = {
......
...@@ -30,21 +30,21 @@ ...@@ -30,21 +30,21 @@
/** /**
* mei_complete_handler - processes completed operation. * mei_cl_complete_handler - processes completed operation for a client
* *
* @cl: private data of the file object. * @cl: private data of the file object.
* @cb_pos: callback block. * @cb: callback block.
*/ */
void mei_irq_complete_handler(struct mei_cl *cl, struct mei_cl_cb *cb_pos) static void mei_cl_complete_handler(struct mei_cl *cl, struct mei_cl_cb *cb)
{ {
if (cb_pos->fop_type == MEI_FOP_WRITE) { if (cb->fop_type == MEI_FOP_WRITE) {
mei_io_cb_free(cb_pos); mei_io_cb_free(cb);
cb_pos = NULL; cb = NULL;
cl->writing_state = MEI_WRITE_COMPLETE; cl->writing_state = MEI_WRITE_COMPLETE;
if (waitqueue_active(&cl->tx_wait)) if (waitqueue_active(&cl->tx_wait))
wake_up_interruptible(&cl->tx_wait); wake_up_interruptible(&cl->tx_wait);
} else if (cb_pos->fop_type == MEI_FOP_READ && } else if (cb->fop_type == MEI_FOP_READ &&
MEI_READING == cl->reading_state) { MEI_READING == cl->reading_state) {
cl->reading_state = MEI_READ_COMPLETE; cl->reading_state = MEI_READ_COMPLETE;
if (waitqueue_active(&cl->rx_wait)) if (waitqueue_active(&cl->rx_wait))
...@@ -53,6 +53,31 @@ void mei_irq_complete_handler(struct mei_cl *cl, struct mei_cl_cb *cb_pos) ...@@ -53,6 +53,31 @@ void mei_irq_complete_handler(struct mei_cl *cl, struct mei_cl_cb *cb_pos)
} }
} }
/**
* mei_irq_compl_handler - dispatch complete handelers
* for the completed callbacks
*
* @dev - mei device
* @compl_list - list of completed cbs
*/
void mei_irq_compl_handler(struct mei_device *dev, struct mei_cl_cb *compl_list)
{
struct mei_cl_cb *cb, *next;
struct mei_cl *cl;
list_for_each_entry_safe(cb, next, &compl_list->list, list) {
cl = cb->cl;
list_del(&cb->list);
if (!cl)
continue;
dev_dbg(&dev->pdev->dev, "completing call back.\n");
if (cl == &dev->iamthif_cl)
mei_amthif_complete(dev, cb);
else
mei_cl_complete_handler(cl, cb);
}
}
/** /**
* _mei_irq_thread_state_ok - checks if mei header matches file private data * _mei_irq_thread_state_ok - checks if mei header matches file private data
* *
......
...@@ -405,8 +405,7 @@ int mei_irq_read_handler(struct mei_device *dev, ...@@ -405,8 +405,7 @@ int mei_irq_read_handler(struct mei_device *dev,
struct mei_cl_cb *cmpl_list, s32 *slots); struct mei_cl_cb *cmpl_list, s32 *slots);
int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list); int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list);
void mei_irq_compl_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list);
void mei_irq_complete_handler(struct mei_cl *cl, struct mei_cl_cb *cb_pos);
/* /*
* AMTHIF - AMT Host Interface Functions * AMTHIF - AMT Host Interface Functions
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册