#include <linux/ip.h>
 #include <linux/ipv6.h>
 #include <net/ip6_checksum.h>
+#include <linux/firmware.h>
 #include "bnx2x_cmn.h"
 
 #ifdef BCM_VLAN
        return rc;
 }
 
+static void bnx2x_release_firmware(struct bnx2x *bp)
+{
+       kfree(bp->init_ops_offsets);
+       kfree(bp->init_ops);
+       kfree(bp->init_data);
+       release_firmware(bp->firmware);
+}
+
 /* must be called with rtnl_lock */
 int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
 {
        u32 load_code;
        int i, rc;
 
+       /* Set init arrays */
+       rc = bnx2x_init_firmware(bp);
+       if (rc) {
+               BNX2X_ERR("Error loading firmware\n");
+               return rc;
+       }
+
 #ifdef BNX2X_STOP_ON_ERROR
        if (unlikely(bp->panic))
                return -EPERM;
 #endif
        bnx2x_inc_load_cnt(bp);
 
+       bnx2x_release_firmware(bp);
+
        return 0;
 
 #ifdef BCM_CNIC
                netif_napi_del(&bnx2x_fp(bp, i, napi));
        bnx2x_free_mem(bp);
 
+       bnx2x_release_firmware(bp);
+
        return rc;
 }
 
 
        *speed = (val & PCICFG_LINK_SPEED) >> PCICFG_LINK_SPEED_SHIFT;
 }
 
-static int __devinit bnx2x_check_firmware(struct bnx2x *bp)
+static int bnx2x_check_firmware(struct bnx2x *bp)
 {
        const struct firmware *firmware = bp->firmware;
        struct bnx2x_fw_file_hdr *fw_hdr;
             (u8 *)bp->arr, len);                                       \
 } while (0)
 
-static int __devinit bnx2x_init_firmware(struct bnx2x *bp, struct device *dev)
+int bnx2x_init_firmware(struct bnx2x *bp)
 {
        const char *fw_file_name;
        struct bnx2x_fw_file_hdr *fw_hdr;
        else if (CHIP_IS_E1H(bp))
                fw_file_name = FW_FILE_NAME_E1H;
        else {
-               dev_err(dev, "Unsupported chip revision\n");
+               BNX2X_ERR("Unsupported chip revision\n");
                return -EINVAL;
        }
 
-       dev_info(dev, "Loading %s\n", fw_file_name);
+       BNX2X_DEV_INFO("Loading %s\n", fw_file_name);
 
-       rc = request_firmware(&bp->firmware, fw_file_name, dev);
+       rc = request_firmware(&bp->firmware, fw_file_name, &bp->pdev->dev);
        if (rc) {
-               dev_err(dev, "Can't load firmware file %s\n", fw_file_name);
+               BNX2X_ERR("Can't load firmware file %s\n", fw_file_name);
                goto request_firmware_exit;
        }
 
        rc = bnx2x_check_firmware(bp);
        if (rc) {
-               dev_err(dev, "Corrupt firmware file %s\n", fw_file_name);
+               BNX2X_ERR("Corrupt firmware file %s\n", fw_file_name);
                goto request_firmware_exit;
        }
 
        if (rc)
                goto init_one_exit;
 
-       /* Set init arrays */
-       rc = bnx2x_init_firmware(bp, &pdev->dev);
-       if (rc) {
-               dev_err(&pdev->dev, "Error loading firmware\n");
-               goto init_one_exit;
-       }
-
        rc = register_netdev(dev);
        if (rc) {
                dev_err(&pdev->dev, "Cannot register net device\n");
        /* Make sure RESET task is not scheduled before continuing */
        cancel_delayed_work_sync(&bp->reset_task);
 
-       kfree(bp->init_ops_offsets);
-       kfree(bp->init_ops);
-       kfree(bp->init_data);
-       release_firmware(bp->firmware);
-
        if (bp->regview)
                iounmap(bp->regview);