Hi Lorenzo, Update the patch v3: diff --git a/a/drivers/net/ethernet/airoha/airoha_eth.c b/b/drivers/net/ethernet/airoha/airoha_eth.c index 79418e6..9fa1543 100755 --- a/a/drivers/net/ethernet/airoha/airoha_eth.c +++ b/b/drivers/net/ethernet/airoha/airoha_eth.c @@ -2713,13 +2713,31 @@ static int airoha_qdma_set_trtcm_param(struct airoha_qdma *qdma, int channel, FIELD_PREP(TRTCM_PARAM_INDEX_MASK, idx) | FIELD_PREP(TRTCM_PARAM_RATE_TYPE_MASK, mode); - airoha_qdma_wr(qdma, REG_TRTCM_DATA_LOW(addr), val); - airoha_qdma_wr(qdma, REG_TRTCM_CFG_PARAM(addr), config); + int i; - return read_poll_timeout(airoha_qdma_rr, val, - val & TRTCM_PARAM_RW_DONE_MASK, - USEC_PER_MSEC, 10 * USEC_PER_MSEC, true, - qdma, REG_TRTCM_CFG_PARAM(addr)); + for (i = 0; i < 100; i++) { + u32 data = 0; + + airoha_qdma_wr(qdma, REG_TRTCM_DATA_LOW(addr), val); + wmb(); + airoha_qdma_wr(qdma, REG_TRTCM_CFG_PARAM(addr), config); + wmb(); + + if (read_poll_timeout(airoha_qdma_rr, data, + data & TRTCM_PARAM_RW_DONE_MASK, + USEC_PER_MSEC, 10 * USEC_PER_MSEC, + true, qdma, REG_TRTCM_CFG_PARAM(addr))) + continue; + + if (airoha_qdma_get_trtcm_param(qdma, channel, addr, param, + mode, &data, NULL)) + continue; + + if (data == val) + return 0; + } + + return -EBUSY; } static int airoha_qdma_set_trtcm_config(struct airoha_qdma *qdma, int channel, Best Regards, Leto