aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/misc/mei/amthif.c9
-rw-r--r--drivers/misc/mei/client.c30
-rw-r--r--drivers/misc/mei/interrupt.c5
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,
460 u32 msg_slots = mei_data2slots(len); 460 u32 msg_slots = mei_data2slots(len);
461 int rets; 461 int rets;
462 462
463 rets = mei_cl_flow_ctrl_creds(cl);
464 if (rets < 0)
465 return rets;
466
467 if (rets == 0) {
468 cl_dbg(dev, cl, "No flow control credentials: not sending.\n");
469 return 0;
470 }
471
463 mei_hdr.host_addr = cl->host_client_id; 472 mei_hdr.host_addr = cl->host_client_id;
464 mei_hdr.me_addr = cl->me_client_id; 473 mei_hdr.me_addr = cl->me_client_id;
465 mei_hdr.reserved = 0; 474 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:
702int mei_cl_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, 702int mei_cl_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb,
703 s32 *slots, struct mei_cl_cb *cmpl_list) 703 s32 *slots, struct mei_cl_cb *cmpl_list)
704{ 704{
705 struct mei_device *dev = cl->dev; 705 struct mei_device *dev;
706 struct mei_msg_data *buf;
706 struct mei_msg_hdr mei_hdr; 707 struct mei_msg_hdr mei_hdr;
707 size_t len = cb->request_buffer.size - cb->buf_idx; 708 size_t len;
708 u32 msg_slots = mei_data2slots(len); 709 u32 msg_slots;
709 int rets; 710 int rets;
710 711
712
713 if (WARN_ON(!cl || !cl->dev))
714 return -ENODEV;
715
716 dev = cl->dev;
717
718 buf = &cb->request_buffer;
719
720 rets = mei_cl_flow_ctrl_creds(cl);
721 if (rets < 0)
722 return rets;
723
724 if (rets == 0) {
725 cl_dbg(dev, cl, "No flow control credentials: not sending.\n");
726 return 0;
727 }
728
729 len = buf->size - cb->buf_idx;
730 msg_slots = mei_data2slots(len);
731
711 mei_hdr.host_addr = cl->host_client_id; 732 mei_hdr.host_addr = cl->host_client_id;
712 mei_hdr.me_addr = cl->me_client_id; 733 mei_hdr.me_addr = cl->me_client_id;
713 mei_hdr.reserved = 0; 734 mei_hdr.reserved = 0;
@@ -730,8 +751,7 @@ int mei_cl_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb,
730 cb->request_buffer.size, cb->buf_idx); 751 cb->request_buffer.size, cb->buf_idx);
731 752
732 *slots -= msg_slots; 753 *slots -= msg_slots;
733 rets = mei_write_message(dev, &mei_hdr, 754 rets = mei_write_message(dev, &mei_hdr, buf->data + cb->buf_idx);
734 cb->request_buffer.data + cb->buf_idx);
735 if (rets) { 755 if (rets) {
736 cl->status = rets; 756 cl->status = rets;
737 list_move_tail(&cb->list, &cmpl_list->list); 757 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)
513 cl = cb->cl; 513 cl = cb->cl;
514 if (cl == NULL) 514 if (cl == NULL)
515 continue; 515 continue;
516 if (mei_cl_flow_ctrl_creds(cl) <= 0) {
517 cl_dbg(dev, cl, "No flow control credentials, not sending.\n");
518 continue;
519 }
520
521 if (cl == &dev->iamthif_cl) 516 if (cl == &dev->iamthif_cl)
522 ret = mei_amthif_irq_write_complete(cl, cb, 517 ret = mei_amthif_irq_write_complete(cl, cb,
523 &slots, cmpl_list); 518 &slots, cmpl_list);