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 <[email protected]>
---
 drivers/fsi/fsi-scom.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/fsi/fsi-scom.c b/drivers/fsi/fsi-scom.c
index b45bfab7b7f5..75d1389e2626 100644
--- a/drivers/fsi/fsi-scom.c
+++ b/drivers/fsi/fsi-scom.c
@@ -38,9 +38,10 @@
 #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;
-- 
2.27.0

Reply via email to