diff options
author | Tomas Winkler <tomas.winkler@intel.com> | 2013-09-16 23:44:44 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-09-26 08:42:02 -0700 |
commit | 136698e535cd1ce59e436cc084b41370fd8f1eff (patch) | |
tree | 4f0b6e33c8b2c0250b8b16e9515fea84a3b23984 /drivers | |
parent | 2ebf8c94d431078d93599ba56efa58bf850078a1 (diff) |
mei: push credentials inside the irq write handler
this eventually allows as use a single write queue
both for control and data messages and removing possible
race
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/misc/mei/amthif.c | 9 | ||||
-rw-r--r-- | drivers/misc/mei/client.c | 30 | ||||
-rw-r--r-- | drivers/misc/mei/interrupt.c | 5 |
3 files changed, 34 insertions, 10 deletions
diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c index 718f3a14c1ca..04fd38567729 100644 --- a/drivers/misc/mei/amthif.c +++ b/drivers/misc/mei/amthif.c @@ -460,6 +460,15 @@ int mei_amthif_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, u32 msg_slots = mei_data2slots(len); int rets; + rets = mei_cl_flow_ctrl_creds(cl); + if (rets < 0) + return rets; + + if (rets == 0) { + cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); + return 0; + } + mei_hdr.host_addr = cl->host_client_id; mei_hdr.me_addr = cl->me_client_id; mei_hdr.reserved = 0; diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c index 1a53d961302a..2ab9d1613ffc 100644 --- a/drivers/misc/mei/client.c +++ b/drivers/misc/mei/client.c @@ -702,12 +702,33 @@ err: int mei_cl_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, s32 *slots, struct mei_cl_cb *cmpl_list) { - struct mei_device *dev = cl->dev; + struct mei_device *dev; + struct mei_msg_data *buf; struct mei_msg_hdr mei_hdr; - size_t len = cb->request_buffer.size - cb->buf_idx; - u32 msg_slots = mei_data2slots(len); + size_t len; + u32 msg_slots; int rets; + + if (WARN_ON(!cl || !cl->dev)) + return -ENODEV; + + dev = cl->dev; + + buf = &cb->request_buffer; + + rets = mei_cl_flow_ctrl_creds(cl); + if (rets < 0) + return rets; + + if (rets == 0) { + cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); + return 0; + } + + len = buf->size - cb->buf_idx; + msg_slots = mei_data2slots(len); + mei_hdr.host_addr = cl->host_client_id; mei_hdr.me_addr = cl->me_client_id; mei_hdr.reserved = 0; @@ -730,8 +751,7 @@ int mei_cl_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, cb->request_buffer.size, cb->buf_idx); *slots -= msg_slots; - rets = mei_write_message(dev, &mei_hdr, - cb->request_buffer.data + cb->buf_idx); + rets = mei_write_message(dev, &mei_hdr, buf->data + cb->buf_idx); if (rets) { cl->status = rets; list_move_tail(&cb->list, &cmpl_list->list); diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c index e4bb9aee40a1..7a95c07e59a6 100644 --- a/drivers/misc/mei/interrupt.c +++ b/drivers/misc/mei/interrupt.c @@ -513,11 +513,6 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list) cl = cb->cl; if (cl == NULL) continue; - if (mei_cl_flow_ctrl_creds(cl) <= 0) { - cl_dbg(dev, cl, "No flow control credentials, not sending.\n"); - continue; - } - if (cl == &dev->iamthif_cl) ret = mei_amthif_irq_write_complete(cl, cb, &slots, cmpl_list); |