/* is another pf loaded on this engine? */
        if (load_code != FW_MSG_CODE_DRV_LOAD_COMMON_CHIP &&
            load_code != FW_MSG_CODE_DRV_LOAD_COMMON) {
-               /* build my FW version dword */
-               u32 my_fw = (bp->fw_major) + (bp->fw_minor << 8) +
-                               (bp->fw_rev << 16) + (bp->fw_eng << 24);
+               u8 loaded_fw_major, loaded_fw_minor, loaded_fw_rev, loaded_fw_eng;
+               u32 loaded_fw;
 
                /* read loaded FW from chip */
-               u32 loaded_fw = REG_RD(bp, XSEM_REG_PRAM);
+               loaded_fw = REG_RD(bp, XSEM_REG_PRAM);
 
-               DP(BNX2X_MSG_SP, "loaded fw %x, my fw %x\n",
-                  loaded_fw, my_fw);
+               loaded_fw_major = loaded_fw & 0xff;
+               loaded_fw_minor = (loaded_fw >> 8) & 0xff;
+               loaded_fw_rev = (loaded_fw >> 16) & 0xff;
+               loaded_fw_eng = (loaded_fw >> 24) & 0xff;
+
+               DP(BNX2X_MSG_SP, "loaded fw 0x%x major 0x%x minor 0x%x rev 0x%x eng 0x%x\n",
+                  loaded_fw, loaded_fw_major, loaded_fw_minor, loaded_fw_rev, loaded_fw_eng);
 
                /* abort nic load if version mismatch */
-               if (my_fw != loaded_fw) {
+               if (loaded_fw_major != BCM_5710_FW_MAJOR_VERSION ||
+                   loaded_fw_minor != BCM_5710_FW_MINOR_VERSION ||
+                   loaded_fw_eng != BCM_5710_FW_ENGINEERING_VERSION ||
+                   loaded_fw_rev < BCM_5710_FW_REVISION_VERSION_V15) {
                        if (print_err)
-                               BNX2X_ERR("bnx2x with FW %x was already loaded which mismatches my %x FW. Aborting\n",
-                                         loaded_fw, my_fw);
+                               BNX2X_ERR("loaded FW incompatible. Aborting\n");
                        else
-                               BNX2X_DEV_INFO("bnx2x with FW %x was already loaded which mismatches my %x FW, possibly due to MF UNDI\n",
-                                              loaded_fw, my_fw);
+                               BNX2X_DEV_INFO("loaded FW incompatible, possibly due to MF UNDI\n");
+
                        return -EBUSY;
                }
        }
 
 
        bnx2x_read_fwinfo(bp);
 
-       if (IS_PF(bp)) {
-               rc = bnx2x_init_firmware(bp);
-
-               if (rc) {
-                       bnx2x_free_mem_bp(bp);
-                       return rc;
-               }
-       }
-
        func = BP_FUNC(bp);
 
        /* need to reset chip if undi was active */
 
                rc = bnx2x_prev_unload(bp);
                if (rc) {
-                       bnx2x_release_firmware(bp);
                        bnx2x_free_mem_bp(bp);
                        return rc;
                }
             (u8 *)bp->arr, len);                                       \
 } while (0)
 
-int bnx2x_init_firmware(struct bnx2x *bp)
+static int bnx2x_init_firmware(struct bnx2x *bp)
 {
        const char *fw_file_name, *fw_file_name_v15;
        struct bnx2x_fw_file_hdr *fw_hdr;
        return rc;
 }
 
-void bnx2x_release_firmware(struct bnx2x *bp)
+static void bnx2x_release_firmware(struct bnx2x *bp)
 {
        kfree(bp->init_ops_offsets);
        kfree(bp->init_ops);
        return 0;
 
 init_one_freemem:
-       bnx2x_release_firmware(bp);
        bnx2x_free_mem_bp(bp);
 
 init_one_exit: