[PATCH linux dev-4.10] drivers: fsi: sbefifo: don't delete canceled xfrs in write
Christopher Bostic
cbostic at linux.vnet.ibm.com
Tue Feb 6 02:58:38 AEDT 2018
Reviewed-by: Christopher Bostic <clbostic at linux.vnet.ibm.com>
On 2/2/18 5:14 PM, Eddie James wrote:
> 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
Eddie,
Small nitpick 'change' should be 'chance'. Not sure its worth a
re-spin unless there are other changes required.
Thanks
-Chris
> 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