If async event shows up unexpectedly ack it and continue
until expected event is received.

Fixes: 857721d62d42 ("common/cnxk: add BPHY communication with atf")

Signed-off-by: Tomasz Duszynski <tduszyn...@marvell.com>
---
 drivers/common/cnxk/roc_bphy_cgx.c | 52 +++++++++++-------------------
 1 file changed, 19 insertions(+), 33 deletions(-)

diff --git a/drivers/common/cnxk/roc_bphy_cgx.c 
b/drivers/common/cnxk/roc_bphy_cgx.c
index db70bafd9b..1de5195657 100644
--- a/drivers/common/cnxk/roc_bphy_cgx.c
+++ b/drivers/common/cnxk/roc_bphy_cgx.c
@@ -65,8 +65,7 @@ roc_bphy_cgx_ack(struct roc_bphy_cgx *roc_cgx, unsigned int 
lmac,
 }
 
 static int
-roc_bphy_cgx_wait_for_ownership(struct roc_bphy_cgx *roc_cgx, unsigned int 
lmac,
-                               uint64_t *scr0)
+roc_bphy_cgx_wait_ack(struct roc_bphy_cgx *roc_cgx, unsigned int lmac, 
uint64_t *scr0, bool ack)
 {
        int tries = 5000;
        uint64_t scr1;
@@ -75,16 +74,18 @@ roc_bphy_cgx_wait_for_ownership(struct roc_bphy_cgx 
*roc_cgx, unsigned int lmac,
                *scr0 = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_SCRATCH0);
                scr1 = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_SCRATCH1);
 
-               if (FIELD_GET(SCR1_OWN_STATUS, scr1) == ETH_OWN_NON_SECURE_SW &&
-                   FIELD_GET(SCR0_ETH_EVT_STS_S_ACK, *scr0) == 0)
-                       break;
-
                /* clear async events if any */
-               if (FIELD_GET(SCR0_ETH_EVT_STS_S_EVT_TYPE, *scr0) ==
-                   ETH_EVT_ASYNC &&
-                   FIELD_GET(SCR0_ETH_EVT_STS_S_ACK, *scr0))
+               if (FIELD_GET(SCR0_ETH_EVT_STS_S_EVT_TYPE, *scr0) == 
ETH_EVT_ASYNC &&
+                   FIELD_GET(SCR0_ETH_EVT_STS_S_ACK, *scr0)) {
                        roc_bphy_cgx_ack(roc_cgx, lmac, scr0);
+                       goto skip;
+               }
 
+               if (FIELD_GET(SCR1_OWN_STATUS, scr1) == ETH_OWN_NON_SECURE_SW &&
+                   FIELD_GET(SCR0_ETH_EVT_STS_S_ACK, *scr0) == ack)
+                       break;
+
+skip:
                plt_delay_ms(1);
        } while (--tries);
 
@@ -92,29 +93,20 @@ roc_bphy_cgx_wait_for_ownership(struct roc_bphy_cgx 
*roc_cgx, unsigned int lmac,
 }
 
 static int
-roc_bphy_cgx_wait_for_ack(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
-                         uint64_t *scr0)
+roc_bphy_cgx_wait_for_ownership(struct roc_bphy_cgx *roc_cgx, unsigned int 
lmac, uint64_t *scr0)
 {
-       int tries = 5000;
-       uint64_t scr1;
-
-       do {
-               *scr0 = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_SCRATCH0);
-               scr1 = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_SCRATCH1);
-
-               if (FIELD_GET(SCR1_OWN_STATUS, scr1) == ETH_OWN_NON_SECURE_SW &&
-                   FIELD_GET(SCR0_ETH_EVT_STS_S_ACK, *scr0))
-                       break;
-
-               plt_delay_ms(1);
-       } while (--tries);
+       return roc_bphy_cgx_wait_ack(roc_cgx, lmac, scr0, false);
+}
 
-       return tries ? 0 : -ETIMEDOUT;
+static int
+roc_bphy_cgx_wait_for_ack(struct roc_bphy_cgx *roc_cgx, unsigned int lmac, 
uint64_t *scr0)
+{
+       return roc_bphy_cgx_wait_ack(roc_cgx, lmac, scr0, true);
 }
 
 static int
-roc_bphy_cgx_intf_req(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
-                     uint64_t scr1, uint64_t *scr0)
+roc_bphy_cgx_intf_req(struct roc_bphy_cgx *roc_cgx, unsigned int lmac, 
uint64_t scr1,
+                     uint64_t *scr0)
 {
        uint8_t cmd_id = FIELD_GET(SCR1_ETH_CMD_ID, scr1);
        int ret;
@@ -142,12 +134,6 @@ roc_bphy_cgx_intf_req(struct roc_bphy_cgx *roc_cgx, 
unsigned int lmac,
        if (cmd_id == ETH_CMD_INTF_SHUTDOWN)
                goto out;
 
-       if (FIELD_GET(SCR0_ETH_EVT_STS_S_EVT_TYPE, *scr0) != ETH_EVT_CMD_RESP) {
-               plt_err("received async event instead of cmd resp event");
-               ret = -EIO;
-               goto out;
-       }
-
        if (FIELD_GET(SCR0_ETH_EVT_STS_S_ID, *scr0) != cmd_id) {
                plt_err("received resp for cmd %d expected for cmd %d",
                        (int)FIELD_GET(SCR0_ETH_EVT_STS_S_ID, *scr0), cmd_id);
-- 
2.34.1

Reply via email to