struct dpaa2_eth_channel *ch,
                            dma_addr_t addr)
 {
+       int retries = 0;
        int err;
 
        ch->xdp.drop_bufs[ch->xdp.drop_cnt++] = addr;
 
        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);
        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 {
                         * 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 -ETIMEDOUT;
+                       }
                        continue;
                }
 
 
                fq->consume(priv, ch, fd, fq);
                cleaned++;
+               retries = 0;
        } while (!is_last);
 
        if (!cleaned)
        u64 buf_array[DPAA2_ETH_BUFS_PER_CMD];
        struct page *page;
        dma_addr_t addr;
+       int retries = 0;
        int i, err;
 
        for (i = 0; i < DPAA2_ETH_BUFS_PER_CMD; i++) {
 release_bufs:
        /* In case the portal is busy, retry until successful */
        while ((err = dpaa2_io_service_release(ch->dpio, bpid,
-                                              buf_array, i)) == -EBUSY)
+                                              buf_array, i)) == -EBUSY) {
+               if (retries++ >= DPAA2_ETH_SWP_BUSY_RETRIES)
+                       break;
                cpu_relax();
+       }
 
        /* If release command failed, clean up and bail out;
         * not much else we can do about it
 static void drain_bufs(struct dpaa2_eth_priv *priv, int count)
 {
        u64 buf_array[DPAA2_ETH_BUFS_PER_CMD];
+       int retries = 0;
        int ret;
 
        do {
                ret = dpaa2_io_service_acquire(NULL, priv->bpid,
                                               buf_array, count);
                if (ret < 0) {
+                       if (ret == -EBUSY &&
+                           retries++ >= DPAA2_ETH_SWP_BUSY_RETRIES)
+                               continue;
                        netdev_err(priv->net_dev, "dpaa2_io_service_acquire() failed\n");
                        return;
                }
                free_bufs(priv, buf_array, ret);
+               retries = 0;
        } while (ret);
 }
 
                                                    ch->store);
                dequeues++;
                cpu_relax();
-       } while (err == -EBUSY);
+       } while (err == -EBUSY && dequeues < DPAA2_ETH_SWP_BUSY_RETRIES);
 
        ch->stats.dequeue_portal_busy += dequeues;
        if (unlikely(err))
        struct netdev_queue *nq;
        int store_cleaned, work_done;
        struct list_head rx_list;
+       int retries = 0;
        int err;
 
        ch = container_of(napi, struct dpaa2_eth_channel, napi);
                refill_pool(priv, ch, priv->bpid);
 
                store_cleaned = consume_frames(ch, &fq);
-               if (!store_cleaned)
+               if (store_cleaned <= 0)
                        break;
                if (fq->type == DPAA2_RX_FQ) {
                        rx_cleaned += store_cleaned;
        do {
                err = dpaa2_io_service_rearm(ch->dpio, &ch->nctx);
                cpu_relax();
-       } while (err == -EBUSY);
+       } while (err == -EBUSY && retries++ < DPAA2_ETH_SWP_BUSY_RETRIES);
        WARN_ONCE(err, "CDAN notifications rearm failed on core %d",
                  ch->nctx.desired_cpu);