aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Usyskin <alexander.usyskin@intel.com>2016-12-14 10:56:52 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-12 05:39:21 -0500
commitfc322290fc06e53aa515f7db575f9a6c3eb84029 (patch)
treec8e5c1cd0ef0b1e948f979d82605ae50815c03b8
parent5d46c4e9a05e4e6cebddf49f7483127390306f5c (diff)
mei: move write cb to completion on credentials failures
commit e09ee853c92011860a4bd2fbdf6126f60fc16bd3 upstream. The credentials handling was pushed to the write handlers but error handling wasn't done properly. Move write callbacks to completion queue to destroy them and to notify a blocked writer about the failure Fixes: 136698e535cd1 (mei: push credentials inside the irq write handler) Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com> Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/misc/mei/client.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c
index 6d948799d8c5..e2af61f7e3b6 100644
--- a/drivers/misc/mei/client.c
+++ b/drivers/misc/mei/client.c
@@ -1536,7 +1536,7 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
1536 1536
1537 rets = first_chunk ? mei_cl_tx_flow_ctrl_creds(cl) : 1; 1537 rets = first_chunk ? mei_cl_tx_flow_ctrl_creds(cl) : 1;
1538 if (rets < 0) 1538 if (rets < 0)
1539 return rets; 1539 goto err;
1540 1540
1541 if (rets == 0) { 1541 if (rets == 0) {
1542 cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); 1542 cl_dbg(dev, cl, "No flow control credentials: not sending.\n");
@@ -1570,11 +1570,8 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
1570 cb->buf.size, cb->buf_idx); 1570 cb->buf.size, cb->buf_idx);
1571 1571
1572 rets = mei_write_message(dev, &mei_hdr, buf->data + cb->buf_idx); 1572 rets = mei_write_message(dev, &mei_hdr, buf->data + cb->buf_idx);
1573 if (rets) { 1573 if (rets)
1574 cl->status = rets; 1574 goto err;
1575 list_move_tail(&cb->list, &cmpl_list->list);
1576 return rets;
1577 }
1578 1575
1579 cl->status = 0; 1576 cl->status = 0;
1580 cl->writing_state = MEI_WRITING; 1577 cl->writing_state = MEI_WRITING;
@@ -1582,14 +1579,21 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
1582 cb->completed = mei_hdr.msg_complete == 1; 1579 cb->completed = mei_hdr.msg_complete == 1;
1583 1580
1584 if (first_chunk) { 1581 if (first_chunk) {
1585 if (mei_cl_tx_flow_ctrl_creds_reduce(cl)) 1582 if (mei_cl_tx_flow_ctrl_creds_reduce(cl)) {
1586 return -EIO; 1583 rets = -EIO;
1584 goto err;
1585 }
1587 } 1586 }
1588 1587
1589 if (mei_hdr.msg_complete) 1588 if (mei_hdr.msg_complete)
1590 list_move_tail(&cb->list, &dev->write_waiting_list.list); 1589 list_move_tail(&cb->list, &dev->write_waiting_list.list);
1591 1590
1592 return 0; 1591 return 0;
1592
1593err:
1594 cl->status = rets;
1595 list_move_tail(&cb->list, &cmpl_list->list);
1596 return rets;
1593} 1597}
1594 1598
1595/** 1599/**