[14] = "Ethernet protocol control support",
                [15] = "Ethernet Backplane autoneg support",
                [16] = "CONFIG DEV support",
-               [17] = "Asymmetric EQs support"
+               [17] = "Asymmetric EQs support",
+               [18] = "More than 80 VFs support"
        };
        int i;
 
                dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_VLAN_CONTROL;
        if (field32 & (1 << 20))
                dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_FSM;
+       if (field32 & (1 << 21))
+               dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_80_VFS;
 
        if (dev->flags & MLX4_FLAG_OLD_PORT_CMDS) {
                for (i = 1; i <= dev_cap->num_ports; ++i) {
 
        return dev_flags & ~MLX4_FLAG_MASTER;
 }
 
+enum {
+       MLX4_DEV_CAP_CHECK_NUM_VFS_ABOVE_64 = -1,
+};
+
+static int mlx4_check_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap,
+                             int *nvfs)
+{
+       int requested_vfs = nvfs[0] + nvfs[1] + nvfs[2];
+       /* Checking for 64 VFs as a limitation of CX2 */
+       if (!(dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_80_VFS) &&
+           requested_vfs >= 64) {
+               mlx4_err(dev, "Requested %d VFs, but FW does not support more than 64\n",
+                        requested_vfs);
+               return MLX4_DEV_CAP_CHECK_NUM_VFS_ABOVE_64;
+       }
+       return 0;
+}
+
 static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
                         int total_vfs, int *nvfs, struct mlx4_priv *priv)
 {
                                goto err_fw;
                        }
 
+                       if (mlx4_check_dev_cap(dev, dev_cap, nvfs))
+                               goto err_fw;
+
                        if (!(dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_SYS_EQS)) {
                                u64 dev_flags = mlx4_enable_sriov(dev, pdev, total_vfs,
                                                                  existing_vfs);
                                mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting.\n");
                                goto err_fw;
                        }
+
+                       if (mlx4_check_dev_cap(dev, dev_cap, nvfs))
+                               goto err_fw;
                }
        }
 
 
 
 enum {
        MLX4_MAX_NUM_PF         = 16,
-       MLX4_MAX_NUM_VF         = 64,
+       MLX4_MAX_NUM_VF         = 126,
        MLX4_MAX_NUM_VF_P_PORT  = 64,
        MLX4_MFUNC_MAX          = 80,
        MLX4_MAX_EQ_NUM         = 1024,
        MLX4_DEV_CAP_FLAG2_ETH_PROT_CTRL        = 1LL <<  14,
        MLX4_DEV_CAP_FLAG2_ETH_BACKPL_AN_REP    = 1LL <<  15,
        MLX4_DEV_CAP_FLAG2_CONFIG_DEV           = 1LL <<  16,
-       MLX4_DEV_CAP_FLAG2_SYS_EQS              = 1LL <<  17
+       MLX4_DEV_CAP_FLAG2_SYS_EQS              = 1LL <<  17,
+       MLX4_DEV_CAP_FLAG2_80_VFS               = 1LL <<  18
 };
 
 enum {