struct stmmac_channel *ch =
                container_of(napi, struct stmmac_channel, rxtx_napi);
        struct stmmac_priv *priv = ch->priv_data;
-       int rx_done, tx_done;
+       int rx_done, tx_done, rxtx_done;
        u32 chan = ch->index;
 
        priv->xstats.napi_poll++;
 
        rx_done = stmmac_rx_zc(priv, budget, chan);
 
+       rxtx_done = max(tx_done, rx_done);
+
        /* If either TX or RX work is not complete, return budget
         * and keep pooling
         */
-       if (tx_done >= budget || rx_done >= budget)
+       if (rxtx_done >= budget)
                return budget;
 
        /* all work done, exit the polling mode */
-       if (napi_complete_done(napi, rx_done)) {
+       if (napi_complete_done(napi, rxtx_done)) {
                unsigned long flags;
 
                spin_lock_irqsave(&ch->lock, flags);
                spin_unlock_irqrestore(&ch->lock, flags);
        }
 
-       return min(rx_done, budget - 1);
+       return min(rxtx_done, budget - 1);
 }
 
 /**