public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [char-misc-next 01/11] mei: consume flow control on the first chunk of writing
@ 2015-05-07 12:53 Tomas Winkler
  2015-05-07 12:53 ` [char-misc-next 02/11] mei: request autosuspend at the end of write Tomas Winkler
                   ` (9 more replies)
  0 siblings, 10 replies; 16+ messages in thread
From: Tomas Winkler @ 2015-05-07 12:53 UTC (permalink / raw)
  To: gregkh; +Cc: arnd, linux-kernel, Alexander Usyskin, Tomas Winkler

From: Alexander Usyskin <alexander.usyskin@intel.com>

Consume the write flow control on the first chunk of the write instead
of on the buffer completion.
We can safely assume that the consequent chunks have the flow control
granted.

This addresses two issues:

1. Blocks other callbacks from the same client riding on the client's
flow control and prevents interleaving of messages as FW cannot distinguish
between two messages from the same client.

2. Fixes single buffer flow control arbitration in a clean way, without
connection/disconnection book keeping

Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/client.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c
index 36706705dfdc..ce88c2199b2c 100644
--- a/drivers/misc/mei/client.c
+++ b/drivers/misc/mei/client.c
@@ -755,9 +755,6 @@ void mei_cl_set_disconnected(struct mei_cl *cl)
 	if (!WARN_ON(cl->me_cl->connect_count == 0))
 		cl->me_cl->connect_count--;
 
-	if (cl->me_cl->connect_count == 0)
-		cl->me_cl->mei_flow_ctrl_creds = 0;
-
 	mei_me_cl_put(cl->me_cl);
 	cl->me_cl = NULL;
 }
@@ -1272,6 +1269,7 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
 	u32 msg_slots;
 	int slots;
 	int rets;
+	bool first_chunk;
 
 	if (WARN_ON(!cl || !cl->dev))
 		return -ENODEV;
@@ -1280,7 +1278,9 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
 
 	buf = &cb->buf;
 
-	rets = mei_cl_flow_ctrl_creds(cl);
+	first_chunk = cb->buf_idx == 0;
+
+	rets = first_chunk ? mei_cl_flow_ctrl_creds(cl) : 1;
 	if (rets < 0)
 		return rets;
 
@@ -1327,12 +1327,14 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
 	cb->buf_idx += mei_hdr.length;
 	cb->completed = mei_hdr.msg_complete == 1;
 
-	if (mei_hdr.msg_complete) {
+	if (first_chunk) {
 		if (mei_cl_flow_ctrl_reduce(cl))
 			return -EIO;
-		list_move_tail(&cb->list, &dev->write_waiting_list.list);
 	}
 
+	if (mei_hdr.msg_complete)
+		list_move_tail(&cb->list, &dev->write_waiting_list.list);
+
 	return 0;
 }
 
@@ -1411,21 +1413,19 @@ int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking)
 	if (rets)
 		goto err;
 
+	rets = mei_cl_flow_ctrl_reduce(cl);
+	if (rets)
+		goto err;
+
 	cl->writing_state = MEI_WRITING;
 	cb->buf_idx = mei_hdr.length;
 	cb->completed = mei_hdr.msg_complete == 1;
 
 out:
-	if (mei_hdr.msg_complete) {
-		rets = mei_cl_flow_ctrl_reduce(cl);
-		if (rets < 0)
-			goto err;
-
+	if (mei_hdr.msg_complete)
 		list_add_tail(&cb->list, &dev->write_waiting_list.list);
-	} else {
+	else
 		list_add_tail(&cb->list, &dev->write_list.list);
-	}
-
 
 	if (blocking && cl->writing_state != MEI_WRITE_COMPLETE) {
 
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2015-05-25 16:21 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-05-07 12:53 [char-misc-next 01/11] mei: consume flow control on the first chunk of writing Tomas Winkler
2015-05-07 12:53 ` [char-misc-next 02/11] mei: request autosuspend at the end of write Tomas Winkler
2015-05-07 12:54 ` [char-misc-next 03/11] mei: add also write waiting list to runtime pm blockers Tomas Winkler
2015-05-07 12:54 ` [char-misc-next 04/11] uuid: extract macros for assigning raw arrays Tomas Winkler
2015-05-07 12:54 ` [char-misc-next 05/11] mei: bus: report also uuid in module alias Tomas Winkler
2015-05-07 12:54 ` [char-misc-next 06/11] mei: bus: add name and uuid into device attributes Tomas Winkler
2015-05-07 12:54 ` [char-misc-next 07/11] NFC: mei_phy: move all nfc logic from mei driver to nfc Tomas Winkler
2015-05-07 12:54 ` [char-misc-next 08/11] mei: bus: kill mei_cl_ops Tomas Winkler
2015-05-07 12:54 ` [char-misc-next 09/11] NFC: mei_phy: adjust mei nfc header according the spec Tomas Winkler
2015-05-07 12:54 ` [char-misc-next 10/11] mei: export mei client device struct to external use Tomas Winkler
2015-05-07 12:54 ` [char-misc-next 11/11] mei: revamp mei bus code Tomas Winkler
2015-05-24 18:19   ` Greg KH
2015-05-24 21:29     ` Winkler, Tomas
2015-05-25  1:46       ` Greg KH
2015-05-25  4:40         ` Winkler, Tomas
2015-05-25 16:20           ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox