[HW] fix FW checking in MTHCA and add it to MLX4. [mlnx: 4271]
authorleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sun, 3 May 2009 09:32:01 +0000 (09:32 +0000)
committerleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sun, 3 May 2009 09:32:01 +0000 (09:32 +0000)
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2142 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

hw/mlx4/kernel/bus/net/fw.c
hw/mthca/kernel/mthca_main.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);
index 70a72e1..6b41f25 100644 (file)
@@ -82,10 +82,10 @@ static struct {
        int is_memfree;\r
        int is_pcie;\r
 } mthca_hca_table[] = {\r
-       { MTHCA_FW_VER(3, 3, 2), MTHCA_FW_VER(3, 4, 0), 0, 0 }, /* TAVOR */\r
-       { MTHCA_FW_VER(4, 7, 0), MTHCA_FW_VER(4, 7, 400), 0, 1 },       /* ARBEL_COMPAT */\r
-       { MTHCA_FW_VER(5, 1, 0), MTHCA_FW_VER(5, 1, 400), 1, 1 },       /* ARBEL_NATIVE */\r
-       { MTHCA_FW_VER(1, 0, 800), MTHCA_FW_VER(1, 1, 0), 1, 1 },       /* SINAI */\r
+       { MTHCA_FW_VER(3, 3, 2), MTHCA_FW_VER(3, 5, 0), 0, 0 }, /* TAVOR */\r
+       { MTHCA_FW_VER(4, 7, 0), MTHCA_FW_VER(4, 8, 200), 0, 1 },       /* ARBEL_COMPAT */\r
+       { MTHCA_FW_VER(5, 1, 0), MTHCA_FW_VER(5, 3, 0), 1, 1 }, /* ARBEL_NATIVE */\r
+       { MTHCA_FW_VER(1, 0, 800), MTHCA_FW_VER(1, 2, 0), 1, 1 },       /* SINAI */\r
        { MTHCA_FW_VER(0, 0, 0), MTHCA_FW_VER(0, 0, 0), 0, 0 }          /* LIVEFISH */\r
 };\r
 \r
@@ -916,10 +916,10 @@ static int        mthca_check_fw(struct mthca_dev *mdev, struct pci_device_id *p_id)
                HCA_PRINT_EV(TRACE_LEVEL_ERROR ,HCA_DBG_LOW ,("HCA FW version %d.%d.%d is not supported. Use %d.%d.%d or higher.\n",\r
                           (int) (mdev->fw_ver >> 32), (int) (mdev->fw_ver >> 16) & 0xffff,\r
                           (int) (mdev->fw_ver & 0xffff),\r
-                          (int) (mthca_hca_table[p_id->driver_data].min_supported_fw >> 32),\r
-                          (int) (mthca_hca_table[p_id->driver_data].min_supported_fw >> 16) & 0xffff,\r
-                          (int) (mthca_hca_table[p_id->driver_data].min_supported_fw & 0xffff)));\r
-               err = -EINVAL;\r
+                          (int) (mthca_hca_table[p_id->driver_data].max_unsupported_fw >> 32),\r
+                          (int) (mthca_hca_table[p_id->driver_data].max_unsupported_fw >> 16) & 0xffff,\r
+                          (int) (mthca_hca_table[p_id->driver_data].max_unsupported_fw & 0xffff)));\r
+               err = -ENODEV;\r
        }\r
        else \r
        if (mdev->fw_ver < mthca_hca_table[p_id->driver_data].min_supported_fw) {\r