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

Eddie James eajames at linux.vnet.ibm.com
Sat Feb 3 10:14:47 AEDT 2018

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>

Joel, I based this on top of the "Fixup SBEFIFO and OCC locking" series. Let me
know if I need to put this first and rebase that series... thanks.

 drivers/fsi/fsi-sbefifo.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/fsi/fsi-sbefifo.c b/drivers/fsi/fsi-sbefifo.c
index 4d024ed..7a6c4e1 100644
--- a/drivers/fsi/fsi-sbefifo.c
+++ b/drivers/fsi/fsi-sbefifo.c
@@ -713,8 +713,10 @@ static ssize_t sbefifo_write_common(struct sbefifo_client *client,
 	n = sbefifo_buf_nbwriteable(&client->wbuf);
 	spin_lock_irqsave(&sbefifo->list_lock, flags);
-	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) {
 		spin_unlock_irqrestore(&sbefifo->list_lock, flags);
 		ret = -EAGAIN;

More information about the openbmc mailing list