[PATCH linux dev-4.10 05/16] fsi: sbefifo: don't delete canceled xfrs in write

Andrew Jeffery andrew at aj.id.au
Thu Feb 15 23:35:55 AEDT 2018

From: Eddie James <eajames at linux.vnet.ibm.com>

The write function was deleting canceled transfers before they had a
change to run and complete. This results in not acking the EOT and not
reading the rest of the data left in the FIFO for the canceled transfer.
This is the cause of the EBADMSG errors found in the OCC driver, as the
next op reads the data left over.

Fix it by just checking the first entry of the list instead of
iterating and canceling.

Signed-off-by: Eddie James <eajames at linux.vnet.ibm.com>
 drivers/fsi/fsi-sbefifo.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/fsi/fsi-sbefifo.c b/drivers/fsi/fsi-sbefifo.c
index e15cd10bad8c..5829e6aba9d3 100644
--- a/drivers/fsi/fsi-sbefifo.c
+++ b/drivers/fsi/fsi-sbefifo.c
@@ -709,7 +709,10 @@ static ssize_t sbefifo_write_common(struct sbefifo_client *client,
 	n = sbefifo_buf_nbwriteable(&client->wbuf);
-	xfr = sbefifo_next_xfr(sbefifo);	/* next xfr to be executed */
+	/* next xfr to be executed */
+	xfr = list_first_entry_or_null(&sbefifo->xfrs, struct sbefifo_xfr,
+				       xfrs);
 	if ((client->f_flags & O_NONBLOCK) && xfr && n < len) {

More information about the openbmc mailing list