On Fri, Oct 04, 2019 at 12:21:33PM +0300, Ioana Ciornei wrote: > From: Ioana Radulescu <ruxandra.radule...@nxp.com> > > Throughout the driver there are several places where we wait > indefinitely for DPIO portal commands to be executed, while > the portal returns a busy response code. > > Even though in theory we are guaranteed the portals become > available eventually, in practice the QBMan hardware module > may become unresponsive in various corner cases. > > Make sure we can never get stuck in an infinite while loop > by adding a retry counter for all portal commands. > > Signed-off-by: Ioana Radulescu <ruxandra.radule...@nxp.com> > Signed-off-by: Ioana Ciornei <ioana.cior...@nxp.com> > --- > drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 30 > ++++++++++++++++++++---- > drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h | 8 +++++++ > 2 files changed, 33 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > index 2c5072fa9aa0..29702756734c 100644 > --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > @@ -221,6 +221,7 @@ static void xdp_release_buf(struct dpaa2_eth_priv *priv, > struct dpaa2_eth_channel *ch, > dma_addr_t addr) > { > + int retries = 0; > int err; > > ch->xdp.drop_bufs[ch->xdp.drop_cnt++] = addr; > @@ -229,8 +230,11 @@ static void xdp_release_buf(struct dpaa2_eth_priv *priv, > > while ((err = dpaa2_io_service_release(ch->dpio, priv->bpid, > ch->xdp.drop_bufs, > - ch->xdp.drop_cnt)) == -EBUSY) > + ch->xdp.drop_cnt)) == -EBUSY) { > + if (retries++ >= DPAA2_ETH_SWP_BUSY_RETRIES) > + break; > cpu_relax(); > + } > > if (err) { > free_bufs(priv, ch->xdp.drop_bufs, ch->xdp.drop_cnt); > @@ -458,7 +462,7 @@ static int consume_frames(struct dpaa2_eth_channel *ch, > struct dpaa2_eth_fq *fq = NULL; > struct dpaa2_dq *dq; > const struct dpaa2_fd *fd; > - int cleaned = 0; > + int cleaned = 0, retries = 0; > int is_last; > > do { > @@ -469,6 +473,11 @@ static int consume_frames(struct dpaa2_eth_channel *ch, > * the store until we get some sort of valid response > * token (either a valid frame or an "empty dequeue") > */ > + if (retries++ >= DPAA2_ETH_SWP_BUSY_RETRIES) { > + netdev_err_once(priv->net_dev, > + "Unable to read a valid dequeue > response\n"); > + return 0; > + } > continue;
Hi Ioana It seems a bit odd that here you could return -ETIMEDOUT, but you print an error, and return 0. But in the two cases above in void functions, you don't print anything. Please at least return -ETIMEDOUT when you can. Andrew