[HW] fix FW checking in MTHCA and add it to MLX4. [mlnx: 4271]
[mirror/winof/.git] / hw / mlx4 / kernel / bus / net / fw.c
index 04f9ff5..1e7231e 100644 (file)
@@ -42,6 +42,9 @@ enum {
        MLX4_COMMAND_INTERFACE_NEW_PORT_CMDS    = 3,
 };
 
+#define FW_MAX_UNSUPPORTED     0x200050000I64
+#define FW_MIN_SUPPORTED       0x200060000I64
+
 #define MLX4_GET(dest, source, offset)                                         \
        {                                                             \
                void *__p = (char *) (source) + (offset);                       \
@@ -565,17 +568,30 @@ int mlx4_QUERY_FW(struct mlx4_dev *dev)
                goto out;
        }
 
+       if (dev->caps.fw_ver < FW_MAX_UNSUPPORTED) {
+               mlx4_err(dev, "HCA FW version %d.%d.%d is not supported. Use %d.%d.%d or higher.\n",
+                       (int) (dev->caps.fw_ver >> 32), (int) (dev->caps.fw_ver >> 16) & 0xffff,
+                       (int) (dev->caps.fw_ver & 0xffff), (int) (FW_MAX_UNSUPPORTED >> 32),
+                       (int) (FW_MAX_UNSUPPORTED>> 16) & 0xffff, (int) (FW_MAX_UNSUPPORTED & 0xffff));
+               err = -ENODEV;
+               goto out;
+       }
+       else 
+       if (dev->caps.fw_ver < FW_MIN_SUPPORTED) {
+               mlx4_err(dev, "The HCA FW version is not the latest one. \n"
+                       "If you meet any issues with the HCA please first try to upgrade the FW to version %d.%d.%d or higher.\n",
+                       (int) (FW_MIN_SUPPORTED >> 32), (int) (FW_MIN_SUPPORTED >> 16) & 0xffff, (int) (FW_MIN_SUPPORTED & 0xffff));
+       }
+
        if (cmd_if_rev < MLX4_COMMAND_INTERFACE_NEW_PORT_CMDS)
                dev->flags |= MLX4_FLAG_OLD_PORT_CMDS;
 
        MLX4_GET(lg, outbox, QUERY_FW_MAX_CMD_OFFSET);
        cmd->max_cmds = 1 << lg;
 
-       mlx4_dbg(dev, "FW version %d.%d.%03d (cmd intf rev %d), max commands %d\n",
-                (int) (dev->caps.fw_ver >> 32),
-                (int) (dev->caps.fw_ver >> 16) & 0xffff,
-                (int) dev->caps.fw_ver & 0xffff,
-                cmd_if_rev, cmd->max_cmds);
+       mlx4_dbg(dev, "Current FW version %d.%d.%03d (cmd intf rev %d), max commands %d\n",
+               (int) (dev->caps.fw_ver >> 32), (int) (dev->caps.fw_ver >> 16) & 0xffff,
+               (int) dev->caps.fw_ver & 0xffff, cmd_if_rev, cmd->max_cmds);
 
        MLX4_GET(fw->catas_offset, outbox, QUERY_FW_ERR_START_OFFSET);
        MLX4_GET(fw->catas_size,   outbox, QUERY_FW_ERR_SIZE_OFFSET);