net/mlx4_core: Check port out-of-range before using in mlx4_slave_cap
[deliverable/linux.git] / drivers / net / ethernet / mellanox / mlx4 / main.c
index 2fe9fe5f7cfb519c7f11a4a31e434a43d58b4da1..ee6f4fe00837ea2ecd2324f076a7bfa60df2d5b7 100644 (file)
@@ -430,12 +430,17 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
        mlx4_log_num_mgm_entry_size = hca_param.log_mc_entry_sz;
 
        memset(&dev_cap, 0, sizeof(dev_cap));
+       dev->caps.max_qp_dest_rdma = 1 << hca_param.log_rd_per_qp;
        err = mlx4_dev_cap(dev, &dev_cap);
        if (err) {
                mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting.\n");
                return err;
        }
 
+       err = mlx4_QUERY_FW(dev);
+       if (err)
+               mlx4_err(dev, "QUERY_FW command failed: could not get FW version.\n");
+
        page_size = ~dev->caps.page_size_cap + 1;
        mlx4_warn(dev, "HCA minimum page size:%d\n", page_size);
        if (page_size > PAGE_SIZE) {
@@ -480,15 +485,15 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
        dev->caps.num_mgms              = 0;
        dev->caps.num_amgms             = 0;
 
-       for (i = 1; i <= dev->caps.num_ports; ++i)
-               dev->caps.port_mask[i] = dev->caps.port_type[i];
-
        if (dev->caps.num_ports > MLX4_MAX_PORTS) {
                mlx4_err(dev, "HCA has %d ports, but we only support %d, "
                         "aborting.\n", dev->caps.num_ports, MLX4_MAX_PORTS);
                return -ENODEV;
        }
 
+       for (i = 1; i <= dev->caps.num_ports; ++i)
+               dev->caps.port_mask[i] = dev->caps.port_type[i];
+
        if (dev->caps.uar_page_size * (dev->caps.num_uars -
                                       dev->caps.reserved_uars) >
                                       pci_resource_len(dev->pdev, 2)) {
@@ -499,18 +504,6 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
                return -ENODEV;
        }
 
-#if 0
-       mlx4_warn(dev, "sqp_demux:%d\n", dev->caps.sqp_demux);
-       mlx4_warn(dev, "num_uars:%d reserved_uars:%d uar region:0x%x bar2:0x%llx\n",
-                 dev->caps.num_uars, dev->caps.reserved_uars,
-                 dev->caps.uar_page_size * dev->caps.num_uars,
-                 pci_resource_len(dev->pdev, 2));
-       mlx4_warn(dev, "num_eqs:%d reserved_eqs:%d\n", dev->caps.num_eqs,
-                 dev->caps.reserved_eqs);
-       mlx4_warn(dev, "num_pds:%d reserved_pds:%d slave_pd_shift:%d pd_base:%d\n",
-                 dev->caps.num_pds, dev->caps.reserved_pds,
-                 dev->caps.slave_pd_shift, dev->caps.pd_base);
-#endif
        return 0;
 }
 
This page took 0.02566 seconds and 5 git commands to generate.