fsi: scom: Reset the FSI2PIB engine for any error
authorEddie James <eajames@linux.ibm.com>
Mon, 29 Mar 2021 15:13:44 +0000 (10:13 -0500)
committerJoel Stanley <joel@jms.id.au>
Fri, 4 Jun 2021 04:49:48 +0000 (14:19 +0930)
The error bits in the FSI2PIB status are only cleared by a reset. So
the driver needs to perform a reset after seeing any of the FSI2PIB
errors, otherwise subsequent operations will also look like failures.

Fixes: 6b293258cded ("fsi: scom: Major overhaul")
Signed-off-by: Eddie James <eajames@linux.ibm.com>
Reviewed-by: Joel Stanley <joel@jms.id.au>
Link: https://lore.kernel.org/r/20210329151344.14246-1-eajames@linux.ibm.com
Signed-off-by: Joel Stanley <joel@jms.id.au>
drivers/fsi/fsi-scom.c

index b45bfab..75d1389 100644 (file)
 #define SCOM_STATUS_PIB_RESP_MASK      0x00007000
 #define SCOM_STATUS_PIB_RESP_SHIFT     12
 
-#define SCOM_STATUS_ANY_ERR            (SCOM_STATUS_PROTECTION | \
-                                        SCOM_STATUS_PARITY |     \
-                                        SCOM_STATUS_PIB_ABORT | \
+#define SCOM_STATUS_FSI2PIB_ERROR      (SCOM_STATUS_PROTECTION |       \
+                                        SCOM_STATUS_PARITY |           \
+                                        SCOM_STATUS_PIB_ABORT)
+#define SCOM_STATUS_ANY_ERR            (SCOM_STATUS_FSI2PIB_ERROR |    \
                                         SCOM_STATUS_PIB_RESP_MASK)
 /* SCOM address encodings */
 #define XSCOM_ADDR_IND_FLAG            BIT_ULL(63)
@@ -240,13 +241,14 @@ static int handle_fsi2pib_status(struct scom_device *scom, uint32_t status)
 {
        uint32_t dummy = -1;
 
-       if (status & SCOM_STATUS_PROTECTION)
-               return -EPERM;
-       if (status & SCOM_STATUS_PARITY) {
+       if (status & SCOM_STATUS_FSI2PIB_ERROR)
                fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy,
                                 sizeof(uint32_t));
+
+       if (status & SCOM_STATUS_PROTECTION)
+               return -EPERM;
+       if (status & SCOM_STATUS_PARITY)
                return -EIO;
-       }
        /* Return -EBUSY on PIB abort to force a retry */
        if (status & SCOM_STATUS_PIB_ABORT)
                return -EBUSY;