[PATCH linux dev-5.14] spi: fsi: Print status on error

Joel Stanley joel at jms.id.au
Fri Oct 22 09:49:50 AEDT 2021


On Thu, 21 Oct 2021 at 16:10, Eddie James <eajames at linux.ibm.com> wrote:
>
> Print the SPI engine status register when an error is detected. This
> will aid tremendously in debugging failed transactions.
>
> Signed-off-by: Eddie James <eajames at linux.ibm.com>
> Link: https://lore.kernel.org/r/20211004195149.29759-1-eajames@linux.ibm.com
> Signed-off-by: Mark Brown <broonie at kernel.org>
> ---
>  drivers/spi/spi-fsi.c | 48 ++++++++++++++++++++++++-------------------

Thanks, applied.


>  1 file changed, 27 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/spi/spi-fsi.c b/drivers/spi/spi-fsi.c
> index 829770b8ec74..9be18db03722 100644
> --- a/drivers/spi/spi-fsi.c
> +++ b/drivers/spi/spi-fsi.c
> @@ -234,6 +234,26 @@ static int fsi_spi_reset(struct fsi_spi *ctx)
>         return fsi_spi_write_reg(ctx, SPI_FSI_STATUS, 0ULL);
>  }
>
> +static int fsi_spi_status(struct fsi_spi *ctx, u64 *status, const char *dir)
> +{
> +       int rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS, status);
> +
> +       if (rc)
> +               return rc;
> +
> +       if (*status & SPI_FSI_STATUS_ANY_ERROR) {
> +               dev_err(ctx->dev, "%s error: %08llx\n", dir, *status);
> +
> +               rc = fsi_spi_reset(ctx);
> +               if (rc)
> +                       return rc;
> +
> +               return -EREMOTEIO;
> +       }
> +
> +       return 0;
> +}
> +
>  static void fsi_spi_sequence_add(struct fsi_spi_sequence *seq, u8 val)
>  {
>         /*
> @@ -273,18 +293,9 @@ static int fsi_spi_transfer_data(struct fsi_spi *ctx,
>                                 return rc;
>
>                         do {
> -                               rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS,
> -                                                     &status);
> +                               rc = fsi_spi_status(ctx, &status, "TX");
>                                 if (rc)
>                                         return rc;
> -
> -                               if (status & SPI_FSI_STATUS_ANY_ERROR) {
> -                                       rc = fsi_spi_reset(ctx);
> -                                       if (rc)
> -                                               return rc;
> -
> -                                       return -EREMOTEIO;
> -                               }
>                         } while (status & SPI_FSI_STATUS_TDR_FULL);
>
>                         sent += nb;
> @@ -296,18 +307,9 @@ static int fsi_spi_transfer_data(struct fsi_spi *ctx,
>
>                 while (transfer->len > recv) {
>                         do {
> -                               rc = fsi_spi_read_reg(ctx, SPI_FSI_STATUS,
> -                                                     &status);
> +                               rc = fsi_spi_status(ctx, &status, "RX");
>                                 if (rc)
>                                         return rc;
> -
> -                               if (status & SPI_FSI_STATUS_ANY_ERROR) {
> -                                       rc = fsi_spi_reset(ctx);
> -                                       if (rc)
> -                                               return rc;
> -
> -                                       return -EREMOTEIO;
> -                               }
>                         } while (!(status & SPI_FSI_STATUS_RDR_FULL));
>
>                         rc = fsi_spi_read_reg(ctx, SPI_FSI_DATA_RX, &in);
> @@ -348,8 +350,12 @@ static int fsi_spi_transfer_init(struct fsi_spi *ctx)
>                 if (status & (SPI_FSI_STATUS_ANY_ERROR |
>                               SPI_FSI_STATUS_TDR_FULL |
>                               SPI_FSI_STATUS_RDR_FULL)) {
> -                       if (reset)
> +                       if (reset) {
> +                               dev_err(ctx->dev,
> +                                       "Initialization error: %08llx\n",
> +                                       status);
>                                 return -EIO;
> +                       }
>
>                         rc = fsi_spi_reset(ctx);
>                         if (rc)
> --
> 2.27.0
>


More information about the openbmc mailing list