devm_free_irq(pdata->dev, pdata->dev_irq, pdata);
 
+       tasklet_kill(&pdata->tasklet_dev);
+       tasklet_kill(&pdata->tasklet_ecc);
+
        if (pdata->vdata->ecc_support && (pdata->dev_irq != pdata->ecc_irq))
                devm_free_irq(pdata->dev, pdata->ecc_irq, pdata);
 
 
        xgbe_i2c_disable(pdata);
        xgbe_i2c_clear_all_interrupts(pdata);
 
-       if (pdata->dev_irq != pdata->i2c_irq)
+       if (pdata->dev_irq != pdata->i2c_irq) {
                devm_free_irq(pdata->dev, pdata->i2c_irq, pdata);
+               tasklet_kill(&pdata->tasklet_i2c);
+       }
 }
 
 static int xgbe_i2c_start(struct xgbe_prv_data *pdata)
 
        /* Disable auto-negotiation */
        xgbe_an_disable_all(pdata);
 
-       if (pdata->dev_irq != pdata->an_irq)
+       if (pdata->dev_irq != pdata->an_irq) {
                devm_free_irq(pdata->dev, pdata->an_irq, pdata);
+               tasklet_kill(&pdata->tasklet_an);
+       }
 
        pdata->phy_if.phy_impl.stop(pdata);