static int cpsw_probe(struct platform_device *pdev)
 {
-       struct cpsw_platform_data       *data = pdev->dev.platform_data;
+       struct cpsw_platform_data       *data;
        struct net_device               *ndev;
        struct cpsw_priv                *priv;
        struct cpdma_params             dma_params;
                                goto clean_ale_ret;
                        }
                        priv->irqs_table[k] = i;
-                       priv->num_irqs = k;
+                       priv->num_irqs = k + 1;
                }
                k++;
        }
        return 0;
 
 clean_irq_ret:
-       free_irq(ndev->irq, priv);
+       for (i = 0; i < priv->num_irqs; i++)
+               free_irq(priv->irqs_table[i], priv);
 clean_ale_ret:
        cpsw_ale_destroy(priv->ale);
 clean_dma_ret:
        pm_runtime_disable(&pdev->dev);
        kfree(priv->slaves);
 clean_ndev_ret:
-       free_netdev(ndev);
+       kfree(priv->data.slave_data);
+       free_netdev(priv->ndev);
        return ret;
 }
 
 {
        struct net_device *ndev = platform_get_drvdata(pdev);
        struct cpsw_priv *priv = netdev_priv(ndev);
+       int i;
 
-       pr_info("removing device");
        platform_set_drvdata(pdev, NULL);
+       if (priv->data.dual_emac)
+               unregister_netdev(cpsw_get_slave_ndev(priv, 1));
+       unregister_netdev(ndev);
 
        cpts_unregister(priv->cpts);
-       free_irq(ndev->irq, priv);
+       for (i = 0; i < priv->num_irqs; i++)
+               free_irq(priv->irqs_table[i], priv);
+
        cpsw_ale_destroy(priv->ale);
        cpdma_chan_destroy(priv->txch);
        cpdma_chan_destroy(priv->rxch);
        pm_runtime_disable(&pdev->dev);
        clk_put(priv->clk);
        kfree(priv->slaves);
+       kfree(priv->data.slave_data);
+       if (priv->data.dual_emac)
+               free_netdev(cpsw_get_slave_ndev(priv, 1));
        free_netdev(ndev);
-
        return 0;
 }