diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_roce.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_roce.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/main.c | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/mr.c | 85 |
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 | |||
24 | struct ocrdma_dev; | 26 | struct ocrdma_dev; |
25 | 27 | ||
26 | enum be_interrupt_mode { | 28 | enum 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. */ |
53 | struct ocrdma_driver { | 55 | struct 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 | ||
39 | void 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 | |||
47 | void mlx5_cleanup_mr_table(struct mlx5_core_dev *dev) | ||
48 | { | ||
49 | } | ||
50 | |||
39 | int mlx5_core_create_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr, | 51 | int 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 | } |
78 | EXPORT_SYMBOL(mlx5_core_create_mkey); | 96 | EXPORT_SYMBOL(mlx5_core_create_mkey); |
79 | 97 | ||
80 | int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr) | 98 | int 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 | } |
100 | EXPORT_SYMBOL(mlx5_core_destroy_mkey); | 124 | EXPORT_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 | } |
146 | EXPORT_SYMBOL(mlx5_core_dump_fill_mkey); | 170 | EXPORT_SYMBOL(mlx5_core_dump_fill_mkey); |
171 | |||
172 | int 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 | } | ||
203 | EXPORT_SYMBOL(mlx5_core_create_psv); | ||
204 | |||
205 | int 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 | |||
228 | out: | ||
229 | return err; | ||
230 | } | ||
231 | EXPORT_SYMBOL(mlx5_core_destroy_psv); | ||