IB/mlx5: Save flow table priority handler instead of index
[cascardo/linux.git] / drivers / infiniband / hw / mlx5 / main.c
index a84bb76..de7b5b3 100644 (file)
@@ -233,23 +233,19 @@ static int set_roce_addr(struct ib_device *device, u8 port_num,
                         const union ib_gid *gid,
                         const struct ib_gid_attr *attr)
 {
-       struct mlx5_ib_dev *dev = to_mdev(device);
-       u32  in[MLX5_ST_SZ_DW(set_roce_address_in)];
-       u32 out[MLX5_ST_SZ_DW(set_roce_address_out)];
+       struct mlx5_ib_dev *dev = to_mdev(device);
+       u32  in[MLX5_ST_SZ_DW(set_roce_address_in)]  = {0};
+       u32 out[MLX5_ST_SZ_DW(set_roce_address_out)] = {0};
        void *in_addr = MLX5_ADDR_OF(set_roce_address_in, in, roce_address);
        enum rdma_link_layer ll = mlx5_ib_port_link_layer(device, port_num);
 
        if (ll != IB_LINK_LAYER_ETHERNET)
                return -EINVAL;
 
-       memset(in, 0, sizeof(in));
-
        ib_gid_to_mlx5_roce_addr(gid, attr, in_addr);
 
        MLX5_SET(set_roce_address_in, in, roce_address_index, index);
        MLX5_SET(set_roce_address_in, in, opcode, MLX5_CMD_OP_SET_ROCE_ADDRESS);
-
-       memset(out, 0, sizeof(out));
        return mlx5_cmd_exec(dev->mdev, in, sizeof(in), out, sizeof(out));
 }
 
@@ -535,6 +531,26 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
                                resp.response_length += sizeof(resp.tso_caps);
                        }
                }
+
+               if (field_avail(typeof(resp), rss_caps, uhw->outlen)) {
+                       resp.rss_caps.rx_hash_function =
+                                               MLX5_RX_HASH_FUNC_TOEPLITZ;
+                       resp.rss_caps.rx_hash_fields_mask =
+                                               MLX5_RX_HASH_SRC_IPV4 |
+                                               MLX5_RX_HASH_DST_IPV4 |
+                                               MLX5_RX_HASH_SRC_IPV6 |
+                                               MLX5_RX_HASH_DST_IPV6 |
+                                               MLX5_RX_HASH_SRC_PORT_TCP |
+                                               MLX5_RX_HASH_DST_PORT_TCP |
+                                               MLX5_RX_HASH_SRC_PORT_UDP |
+                                               MLX5_RX_HASH_DST_PORT_UDP;
+                       resp.response_length += sizeof(resp.rss_caps);
+               }
+       } else {
+               if (field_avail(typeof(resp), tso_caps, uhw->outlen))
+                       resp.response_length += sizeof(resp.tso_caps);
+               if (field_avail(typeof(resp), rss_caps, uhw->outlen))
+                       resp.response_length += sizeof(resp.rss_caps);
        }
 
        if (MLX5_CAP_GEN(mdev, ipoib_basic_offloads)) {
@@ -598,6 +614,17 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
        if (!mlx5_core_is_pf(mdev))
                props->device_cap_flags |= IB_DEVICE_VIRTUAL_FUNCTION;
 
+       if (mlx5_ib_port_link_layer(ibdev, 1) ==
+           IB_LINK_LAYER_ETHERNET) {
+               props->rss_caps.max_rwq_indirection_tables =
+                       1 << MLX5_CAP_GEN(dev->mdev, log_max_rqt);
+               props->rss_caps.max_rwq_indirection_table_size =
+                       1 << MLX5_CAP_GEN(dev->mdev, log_max_rqt_size);
+               props->rss_caps.supported_qpts = 1 << IB_QPT_RAW_PACKET;
+               props->max_wq_type_rq =
+                       1 << MLX5_CAP_GEN(dev->mdev, log_max_rq);
+       }
+
        if (uhw->outlen) {
                err = ib_copy_to_udata(uhw, &resp, resp.response_length);
 
@@ -752,8 +779,7 @@ static int mlx5_query_hca_port(struct ib_device *ibdev, u8 port,
                                     &props->active_width);
        if (err)
                goto out;
-       err = mlx5_query_port_proto_oper(mdev, &props->active_speed, MLX5_PTYS_IB,
-                                        port);
+       err = mlx5_query_port_ib_proto_oper(mdev, &props->active_speed, port);
        if (err)
                goto out;
 
@@ -1628,7 +1654,7 @@ static int mlx5_ib_destroy_flow(struct ib_flow *flow_id)
        }
 
        mlx5_del_flow_rule(handler->rule);
-       put_flow_table(dev, &dev->flow_db.prios[handler->prio], true);
+       put_flow_table(dev, handler->prio, true);
        mutex_unlock(&dev->flow_db.lock);
 
        kfree(handler);
@@ -1750,7 +1776,7 @@ static struct mlx5_ib_flow_handler *create_flow_rule(struct mlx5_ib_dev *dev,
                goto free;
        }
 
-       handler->prio = ft_prio - dev->flow_db.prios;
+       handler->prio = ft_prio;
 
        ft_prio->flow_table = ft;
 free:
@@ -1835,6 +1861,7 @@ static struct mlx5_ib_flow_handler *create_leftovers_rule(struct mlx5_ib_dev *de
                                                 &leftovers_specs[LEFTOVERS_UC].flow_attr,
                                                 dst);
                if (IS_ERR(handler_ucast)) {
+                       mlx5_del_flow_rule(handler->rule);
                        kfree(handler);
                        handler = handler_ucast;
                } else {
@@ -2228,7 +2255,7 @@ static int create_umr_res(struct mlx5_ib_dev *dev)
                goto error_0;
        }
 
-       pd = ib_alloc_pd(&dev->ib_dev);
+       pd = ib_alloc_pd(&dev->ib_dev, 0);
        if (IS_ERR(pd)) {
                mlx5_ib_dbg(dev, "Couldn't create PD for sync UMR QP\n");
                ret = PTR_ERR(pd);