int                     num_tx, num_rx;
 
        num_tx = cpdma_chan_process(priv->txch, 128);
-       num_rx = cpdma_chan_process(priv->rxch, budget);
-
-       if (num_rx || num_tx)
-               cpsw_dbg(priv, intr, "poll %d rx, %d tx pkts\n",
-                        num_rx, num_tx);
+       if (num_tx)
+               cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
 
+       num_rx = cpdma_chan_process(priv->rxch, budget);
        if (num_rx < budget) {
                napi_complete(napi);
                cpsw_intr_enable(priv);
-               cpdma_ctlr_eoi(priv->dma);
+               cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
                cpsw_enable_irq(priv);
        }
 
+       if (num_rx || num_tx)
+               cpsw_dbg(priv, intr, "poll %d rx, %d tx pkts\n",
+                        num_rx, num_tx);
+
        return num_rx;
 }
 
        cpdma_ctlr_start(priv->dma);
        cpsw_intr_enable(priv);
        napi_enable(&priv->napi);
-       cpdma_ctlr_eoi(priv->dma);
+       cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
+       cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
 
        if (priv->data.dual_emac)
                priv->slaves[priv->emac_port].open_stat = true;
        cpdma_chan_start(priv->txch);
        cpdma_ctlr_int_ctrl(priv->dma, true);
        cpsw_intr_enable(priv);
-       cpdma_ctlr_eoi(priv->dma);
+       cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
+       cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
+
 }
 
 static struct net_device_stats *cpsw_ndo_get_stats(struct net_device *ndev)
        cpsw_interrupt(ndev->irq, priv);
        cpdma_ctlr_int_ctrl(priv->dma, true);
        cpsw_intr_enable(priv);
-       cpdma_ctlr_eoi(priv->dma);
+       cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
+       cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
+
 }
 #endif
 
 
        return 0;
 }
 
-void cpdma_ctlr_eoi(struct cpdma_ctlr *ctlr)
+void cpdma_ctlr_eoi(struct cpdma_ctlr *ctlr, u32 value)
 {
-       dma_reg_write(ctlr, CPDMA_MACEOIVECTOR, 0);
+       dma_reg_write(ctlr, CPDMA_MACEOIVECTOR, value);
 }
 
 struct cpdma_chan *cpdma_chan_create(struct cpdma_ctlr *ctlr, int chan_num,
 
 
 #define CPDMA_RX_SOURCE_PORT(__status__)       ((__status__ >> 16) & 0x7)
 
+#define CPDMA_EOI_RX_THRESH    0x0
+#define CPDMA_EOI_RX           0x1
+#define CPDMA_EOI_TX           0x2
+#define CPDMA_EOI_MISC         0x3
+
 struct cpdma_params {
        struct device           *dev;
        void __iomem            *dmaregs;
 int cpdma_chan_process(struct cpdma_chan *chan, int quota);
 
 int cpdma_ctlr_int_ctrl(struct cpdma_ctlr *ctlr, bool enable);
-void cpdma_ctlr_eoi(struct cpdma_ctlr *ctlr);
+void cpdma_ctlr_eoi(struct cpdma_ctlr *ctlr, u32 value);
 int cpdma_chan_int_ctrl(struct cpdma_chan *chan, bool enable);
 bool cpdma_check_free_tx_desc(struct cpdma_chan *chan);