/* snapshot of IRQ numbers */
        u32 irqs_table[4];
        u32 num_irqs;
+       bool irq_enabled;
        struct cpts *cpts;
        u32 emac_port;
 };
                return IRQ_NONE;
 
        cpsw_intr_disable(priv);
-       cpsw_disable_irq(priv);
+       if (priv->irq_enabled == true) {
+               cpsw_disable_irq(priv);
+               priv->irq_enabled = false;
+       }
 
        if (netif_running(priv->ndev)) {
                napi_schedule(&priv->napi);
 
        num_rx = cpdma_chan_process(priv->rxch, budget);
        if (num_rx < budget) {
+               struct cpsw_priv *prim_cpsw;
+
                napi_complete(napi);
                cpsw_intr_enable(priv);
                cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
-               cpsw_enable_irq(priv);
+               prim_cpsw = cpsw_get_slave_priv(priv, 0);
+               if (prim_cpsw->irq_enabled == false) {
+                       cpsw_enable_irq(priv);
+                       prim_cpsw->irq_enabled = true;
+               }
        }
 
        if (num_rx || num_tx)
 static int cpsw_ndo_open(struct net_device *ndev)
 {
        struct cpsw_priv *priv = netdev_priv(ndev);
+       struct cpsw_priv *prim_cpsw;
        int i, ret;
        u32 reg;
 
                cpsw_set_coalesce(ndev, &coal);
        }
 
+       prim_cpsw = cpsw_get_slave_priv(priv, 0);
+       if (prim_cpsw->irq_enabled == false) {
+               if ((priv == prim_cpsw) || !netif_running(prim_cpsw->ndev)) {
+                       prim_cpsw->irq_enabled = true;
+                       cpsw_enable_irq(prim_cpsw);
+               }
+       }
+
        cpdma_ctlr_start(priv->dma);
        cpsw_intr_enable(priv);
        napi_enable(&priv->napi);
                priv_sl2->irqs_table[i] = priv->irqs_table[i];
                priv_sl2->num_irqs = priv->num_irqs;
        }
-
+       priv->irq_enabled = true;
        ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
 
        ndev->netdev_ops = &cpsw_netdev_ops;