}
 }
 
-static void bnx2x_free_irq(struct bnx2x *bp)
+static void bnx2x_free_irq(struct bnx2x *bp, bool disable_only)
 {
        if (bp->flags & USING_MSIX_FLAG) {
-               bnx2x_free_msix_irqs(bp);
+               if (!disable_only)
+                       bnx2x_free_msix_irqs(bp);
                pci_disable_msix(bp->pdev);
                bp->flags &= ~USING_MSIX_FLAG;
 
        } else if (bp->flags & USING_MSI_FLAG) {
-               free_irq(bp->pdev->irq, bp->dev);
+               if (!disable_only)
+                       free_irq(bp->pdev->irq, bp->dev);
                pci_disable_msi(bp->pdev);
                bp->flags &= ~USING_MSI_FLAG;
 
-       } else
+       } else if (!disable_only)
                free_irq(bp->pdev->irq, bp->dev);
 }
 
 
        rc = bnx2x_set_num_queues(bp);
 
-       if (bnx2x_alloc_mem(bp))
+       if (bnx2x_alloc_mem(bp)) {
+               bnx2x_free_irq(bp, true);
                return -ENOMEM;
+       }
 
        for_each_queue(bp, i)
                bnx2x_fp(bp, i, disable_tpa) =
        if (bp->flags & USING_MSIX_FLAG) {
                rc = bnx2x_req_msix_irqs(bp);
                if (rc) {
-                       pci_disable_msix(bp->pdev);
+                       bnx2x_free_irq(bp, true);
                        goto load_error1;
                }
        } else {
                rc = bnx2x_req_irq(bp);
                if (rc) {
                        BNX2X_ERR("IRQ request failed  rc %d, aborting\n", rc);
-                       if (bp->flags & USING_MSI_FLAG)
-                               pci_disable_msi(bp->pdev);
+                       bnx2x_free_irq(bp, true);
                        goto load_error1;
                }
                if (bp->flags & USING_MSI_FLAG) {
                bnx2x_free_rx_sge_range(bp, bp->fp + i, NUM_RX_SGE);
 load_error2:
        /* Release IRQs */
-       bnx2x_free_irq(bp);
+       bnx2x_free_irq(bp, false);
 load_error1:
        bnx2x_napi_disable(bp);
        for_each_queue(bp, i)
        bnx2x_stats_handle(bp, STATS_EVENT_STOP);
 
        /* Release IRQs */
-       bnx2x_free_irq(bp);
+       bnx2x_free_irq(bp, false);
 
        /* Wait until tx fastpath tasks complete */
        for_each_queue(bp, i) {
        DP(BNX2X_MSG_STATS, "stats_state - DISABLED\n");
 
        /* Release IRQs */
-       bnx2x_free_irq(bp);
+       bnx2x_free_irq(bp, false);
 
        if (CHIP_IS_E1(bp)) {
                struct mac_configuration_cmd *config =