aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/emulex/benet/be_roce.c6
-rw-r--r--drivers/net/ethernet/emulex/benet/be_roce.h3
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/main.c1
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/mr.c85
4 files changed, 95 insertions, 0 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_roce.c b/drivers/net/ethernet/emulex/benet/be_roce.c
index 9cd5415fe017..aa7f94375108 100644
--- a/drivers/net/ethernet/emulex/benet/be_roce.c
+++ b/drivers/net/ethernet/emulex/benet/be_roce.c
@@ -35,6 +35,12 @@ static void _be_roce_dev_add(struct be_adapter *adapter)
35 35
36 if (!ocrdma_drv) 36 if (!ocrdma_drv)
37 return; 37 return;
38
39 if (ocrdma_drv->be_abi_version != BE_ROCE_ABI_VERSION) {
40 dev_warn(&pdev->dev, "Cannot initialize RoCE due to ocrdma ABI mismatch\n");
41 return;
42 }
43
38 if (pdev->device == OC_DEVICE_ID5) { 44 if (pdev->device == OC_DEVICE_ID5) {
39 /* only msix is supported on these devices */ 45 /* only msix is supported on these devices */
40 if (!msix_enabled(adapter)) 46 if (!msix_enabled(adapter))
diff --git a/drivers/net/ethernet/emulex/benet/be_roce.h b/drivers/net/ethernet/emulex/benet/be_roce.h
index 2cd1129e19af..1bfb16164df8 100644
--- a/drivers/net/ethernet/emulex/benet/be_roce.h
+++ b/drivers/net/ethernet/emulex/benet/be_roce.h
@@ -21,6 +21,8 @@
21#include <linux/pci.h> 21#include <linux/pci.h>
22#include <linux/netdevice.h> 22#include <linux/netdevice.h>
23 23
24#define BE_ROCE_ABI_VERSION 1
25
24struct ocrdma_dev; 26struct ocrdma_dev;
25 27
26enum be_interrupt_mode { 28enum be_interrupt_mode {
@@ -52,6 +54,7 @@ struct be_dev_info {
52/* ocrdma driver register's the callback functions with nic driver. */ 54/* ocrdma driver register's the callback functions with nic driver. */
53struct ocrdma_driver { 55struct ocrdma_driver {
54 unsigned char name[32]; 56 unsigned char name[32];
57 u32 be_abi_version;
55 struct ocrdma_dev *(*add) (struct be_dev_info *dev_info); 58 struct ocrdma_dev *(*add) (struct be_dev_info *dev_info);
56 void (*remove) (struct ocrdma_dev *); 59 void (*remove) (struct ocrdma_dev *);
57 void (*state_change_handler) (struct ocrdma_dev *, u32 new_state); 60 void (*state_change_handler) (struct ocrdma_dev *, u32 new_state);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
index a064f06e0cb8..96a0617f7609 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
@@ -446,6 +446,7 @@ int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev)
446 mlx5_init_cq_table(dev); 446 mlx5_init_cq_table(dev);
447 mlx5_init_qp_table(dev); 447 mlx5_init_qp_table(dev);
448 mlx5_init_srq_table(dev); 448 mlx5_init_srq_table(dev);
449 mlx5_init_mr_table(dev);
449 450
450 return 0; 451 return 0;
451 452
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mr.c b/drivers/net/ethernet/mellanox/mlx5/core/mr.c
index 35e514dc7b7d..4cc927649404 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/mr.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/mr.c
@@ -36,11 +36,24 @@
36#include <linux/mlx5/cmd.h> 36#include <linux/mlx5/cmd.h>
37#include "mlx5_core.h" 37#include "mlx5_core.h"
38 38
39void mlx5_init_mr_table(struct mlx5_core_dev *dev)
40{
41 struct mlx5_mr_table *table = &dev->priv.mr_table;
42
43 rwlock_init(&table->lock);
44 INIT_RADIX_TREE(&table->tree, GFP_ATOMIC);
45}
46
47void mlx5_cleanup_mr_table(struct mlx5_core_dev *dev)
48{
49}
50
39int mlx5_core_create_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr, 51int mlx5_core_create_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr,
40 struct mlx5_create_mkey_mbox_in *in, int inlen, 52 struct mlx5_create_mkey_mbox_in *in, int inlen,
41 mlx5_cmd_cbk_t callback, void *context, 53 mlx5_cmd_cbk_t callback, void *context,
42 struct mlx5_create_mkey_mbox_out *out) 54 struct mlx5_create_mkey_mbox_out *out)
43{ 55{
56 struct mlx5_mr_table *table = &dev->priv.mr_table;
44 struct mlx5_create_mkey_mbox_out lout; 57 struct mlx5_create_mkey_mbox_out lout;
45 int err; 58 int err;
46 u8 key; 59 u8 key;
@@ -73,14 +86,21 @@ int mlx5_core_create_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr,
73 mlx5_core_dbg(dev, "out 0x%x, key 0x%x, mkey 0x%x\n", 86 mlx5_core_dbg(dev, "out 0x%x, key 0x%x, mkey 0x%x\n",
74 be32_to_cpu(lout.mkey), key, mr->key); 87 be32_to_cpu(lout.mkey), key, mr->key);
75 88
89 /* connect to MR tree */
90 write_lock_irq(&table->lock);
91 err = radix_tree_insert(&table->tree, mlx5_base_mkey(mr->key), mr);
92 write_unlock_irq(&table->lock);
93
76 return err; 94 return err;
77} 95}
78EXPORT_SYMBOL(mlx5_core_create_mkey); 96EXPORT_SYMBOL(mlx5_core_create_mkey);
79 97
80int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr) 98int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr)
81{ 99{
100 struct mlx5_mr_table *table = &dev->priv.mr_table;
82 struct mlx5_destroy_mkey_mbox_in in; 101 struct mlx5_destroy_mkey_mbox_in in;
83 struct mlx5_destroy_mkey_mbox_out out; 102 struct mlx5_destroy_mkey_mbox_out out;
103 unsigned long flags;
84 int err; 104 int err;
85 105
86 memset(&in, 0, sizeof(in)); 106 memset(&in, 0, sizeof(in));
@@ -95,6 +115,10 @@ int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr)
95 if (out.hdr.status) 115 if (out.hdr.status)
96 return mlx5_cmd_status_to_err(&out.hdr); 116 return mlx5_cmd_status_to_err(&out.hdr);
97 117
118 write_lock_irqsave(&table->lock, flags);
119 radix_tree_delete(&table->tree, mlx5_base_mkey(mr->key));
120 write_unlock_irqrestore(&table->lock, flags);
121
98 return err; 122 return err;
99} 123}
100EXPORT_SYMBOL(mlx5_core_destroy_mkey); 124EXPORT_SYMBOL(mlx5_core_destroy_mkey);
@@ -144,3 +168,64 @@ int mlx5_core_dump_fill_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr,
144 return err; 168 return err;
145} 169}
146EXPORT_SYMBOL(mlx5_core_dump_fill_mkey); 170EXPORT_SYMBOL(mlx5_core_dump_fill_mkey);
171
172int mlx5_core_create_psv(struct mlx5_core_dev *dev, u32 pdn,
173 int npsvs, u32 *sig_index)
174{
175 struct mlx5_allocate_psv_in in;
176 struct mlx5_allocate_psv_out out;
177 int i, err;
178
179 if (npsvs > MLX5_MAX_PSVS)
180 return -EINVAL;
181
182 memset(&in, 0, sizeof(in));
183 memset(&out, 0, sizeof(out));
184
185 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_CREATE_PSV);
186 in.npsv_pd = cpu_to_be32((npsvs << 28) | pdn);
187 err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
188 if (err) {
189 mlx5_core_err(dev, "cmd exec failed %d\n", err);
190 return err;
191 }
192
193 if (out.hdr.status) {
194 mlx5_core_err(dev, "create_psv bad status %d\n", out.hdr.status);
195 return mlx5_cmd_status_to_err(&out.hdr);
196 }
197
198 for (i = 0; i < npsvs; i++)
199 sig_index[i] = be32_to_cpu(out.psv_idx[i]) & 0xffffff;
200
201 return err;
202}
203EXPORT_SYMBOL(mlx5_core_create_psv);
204
205int mlx5_core_destroy_psv(struct mlx5_core_dev *dev, int psv_num)
206{
207 struct mlx5_destroy_psv_in in;
208 struct mlx5_destroy_psv_out out;
209 int err;
210
211 memset(&in, 0, sizeof(in));
212 memset(&out, 0, sizeof(out));
213
214 in.psv_number = cpu_to_be32(psv_num);
215 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_DESTROY_PSV);
216 err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
217 if (err) {
218 mlx5_core_err(dev, "destroy_psv cmd exec failed %d\n", err);
219 goto out;
220 }
221
222 if (out.hdr.status) {
223 mlx5_core_err(dev, "destroy_psv bad status %d\n", out.hdr.status);
224 err = mlx5_cmd_status_to_err(&out.hdr);
225 goto out;
226 }
227
228out:
229 return err;
230}
231EXPORT_SYMBOL(mlx5_core_destroy_psv);