Re: [PATCH v4 5/5] spi: spi-geni-qcom: Don't keep a local state variable

From: Doug Anderson
Date: Thu Jun 18 2020 - 16:10:03 EST


Hi,

On Thu, Jun 18, 2020 at 11:05 AM Stephen Boyd <swboyd@xxxxxxxxxxxx> wrote:
>
> Quoting Douglas Anderson (2020-06-18 08:06:26)
> > @@ -126,20 +120,23 @@ static void handle_fifo_timeout(struct spi_master *spi,
> > struct geni_se *se = &mas->se;
> >
> > spin_lock_irq(&mas->lock);
> > - reinit_completion(&mas->xfer_done);
> > - mas->cur_mcmd = CMD_CANCEL;
> > - geni_se_cancel_m_cmd(se);
> > + reinit_completion(&mas->cancel_done);
> > writel(0, se->base + SE_GENI_TX_WATERMARK_REG);
> > + mas->cur_xfer = NULL;
>
> BTW, is this necessary? It's subtlely placed here without a comment why.

I believe so. Now that we don't have the "cur_mcmd" we rely on
cur_xfer being NULL to tell the difference between a "done" for chip
select vs. a "done" for transfer.

* When we start a transfer we set "cur_xfer" to a non-NULL pointer.
When the transfer finishes we set it to NULL again.

* When we start a chip select transfer we _don't_ explicitly set it to
NULL because it should already be NULL.

* When we are aborting a transfer we need to NULL so we can handle the
chip select that will come next.

I suppose it's possible that we could get by without without NULLing
it because I believe when the "abort" IRQ finally fires then it will
include a "DONE" and that would presumably NULL it out. ...but I
guess if both the cancel and abort timed out and no IRQ ever fired
then nothing would have NULLed it and the next chip select would be
confused.

Prior to getting rid of "cur_mcmd" this all wasn't needed because
"cur_xfer" was only ever looked at if "cur_mcmd" was set to
"CMD_XFER".


One part of my change that is technically not related to the removal
of "cur_mcmd" is the part where I do "mas->tx_rem_bytes =
mas->rx_rem_bytes = 0;". I can split that as a separate change if you
want but it seemed fine to just clean up this extra bit of state here.

-Doug