hc
2024-05-14 bedbef8ad3e75a304af6361af235302bcc61d06b
kernel/drivers/infiniband/hw/ocrdma/ocrdma_main.c
....@@ -62,8 +62,6 @@
6262 MODULE_AUTHOR("Emulex Corporation");
6363 MODULE_LICENSE("Dual BSD/GPL");
6464
65
-static DEFINE_IDR(ocrdma_dev_id);
66
-
6765 void ocrdma_get_guid(struct ocrdma_dev *dev, u8 *guid)
6866 {
6967 u8 mac_addr[6];
....@@ -114,15 +112,98 @@
114112 snprintf(str, IB_FW_VERSION_NAME_MAX, "%s", &dev->attr.fw_ver[0]);
115113 }
116114
115
+/* OCRDMA sysfs interface */
116
+static ssize_t hw_rev_show(struct device *device,
117
+ struct device_attribute *attr, char *buf)
118
+{
119
+ struct ocrdma_dev *dev =
120
+ rdma_device_to_drv_device(device, struct ocrdma_dev, ibdev);
121
+
122
+ return scnprintf(buf, PAGE_SIZE, "0x%x\n", dev->nic_info.pdev->vendor);
123
+}
124
+static DEVICE_ATTR_RO(hw_rev);
125
+
126
+static ssize_t hca_type_show(struct device *device,
127
+ struct device_attribute *attr, char *buf)
128
+{
129
+ struct ocrdma_dev *dev =
130
+ rdma_device_to_drv_device(device, struct ocrdma_dev, ibdev);
131
+
132
+ return scnprintf(buf, PAGE_SIZE, "%s\n", &dev->model_number[0]);
133
+}
134
+static DEVICE_ATTR_RO(hca_type);
135
+
136
+static struct attribute *ocrdma_attributes[] = {
137
+ &dev_attr_hw_rev.attr,
138
+ &dev_attr_hca_type.attr,
139
+ NULL
140
+};
141
+
142
+static const struct attribute_group ocrdma_attr_group = {
143
+ .attrs = ocrdma_attributes,
144
+};
145
+
146
+static const struct ib_device_ops ocrdma_dev_ops = {
147
+ .owner = THIS_MODULE,
148
+ .driver_id = RDMA_DRIVER_OCRDMA,
149
+ .uverbs_abi_ver = OCRDMA_ABI_VERSION,
150
+
151
+ .alloc_mr = ocrdma_alloc_mr,
152
+ .alloc_pd = ocrdma_alloc_pd,
153
+ .alloc_ucontext = ocrdma_alloc_ucontext,
154
+ .create_ah = ocrdma_create_ah,
155
+ .create_cq = ocrdma_create_cq,
156
+ .create_qp = ocrdma_create_qp,
157
+ .dealloc_pd = ocrdma_dealloc_pd,
158
+ .dealloc_ucontext = ocrdma_dealloc_ucontext,
159
+ .dereg_mr = ocrdma_dereg_mr,
160
+ .destroy_ah = ocrdma_destroy_ah,
161
+ .destroy_cq = ocrdma_destroy_cq,
162
+ .destroy_qp = ocrdma_destroy_qp,
163
+ .get_dev_fw_str = get_dev_fw_str,
164
+ .get_dma_mr = ocrdma_get_dma_mr,
165
+ .get_link_layer = ocrdma_link_layer,
166
+ .get_port_immutable = ocrdma_port_immutable,
167
+ .map_mr_sg = ocrdma_map_mr_sg,
168
+ .mmap = ocrdma_mmap,
169
+ .modify_qp = ocrdma_modify_qp,
170
+ .poll_cq = ocrdma_poll_cq,
171
+ .post_recv = ocrdma_post_recv,
172
+ .post_send = ocrdma_post_send,
173
+ .process_mad = ocrdma_process_mad,
174
+ .query_ah = ocrdma_query_ah,
175
+ .query_device = ocrdma_query_device,
176
+ .query_pkey = ocrdma_query_pkey,
177
+ .query_port = ocrdma_query_port,
178
+ .query_qp = ocrdma_query_qp,
179
+ .reg_user_mr = ocrdma_reg_user_mr,
180
+ .req_notify_cq = ocrdma_arm_cq,
181
+ .resize_cq = ocrdma_resize_cq,
182
+
183
+ INIT_RDMA_OBJ_SIZE(ib_ah, ocrdma_ah, ibah),
184
+ INIT_RDMA_OBJ_SIZE(ib_cq, ocrdma_cq, ibcq),
185
+ INIT_RDMA_OBJ_SIZE(ib_pd, ocrdma_pd, ibpd),
186
+ INIT_RDMA_OBJ_SIZE(ib_ucontext, ocrdma_ucontext, ibucontext),
187
+};
188
+
189
+static const struct ib_device_ops ocrdma_dev_srq_ops = {
190
+ .create_srq = ocrdma_create_srq,
191
+ .destroy_srq = ocrdma_destroy_srq,
192
+ .modify_srq = ocrdma_modify_srq,
193
+ .post_srq_recv = ocrdma_post_srq_recv,
194
+ .query_srq = ocrdma_query_srq,
195
+
196
+ INIT_RDMA_OBJ_SIZE(ib_srq, ocrdma_srq, ibsrq),
197
+};
198
+
117199 static int ocrdma_register_device(struct ocrdma_dev *dev)
118200 {
119
- strlcpy(dev->ibdev.name, "ocrdma%d", IB_DEVICE_NAME_MAX);
201
+ int ret;
202
+
120203 ocrdma_get_guid(dev, (u8 *)&dev->ibdev.node_guid);
121204 BUILD_BUG_ON(sizeof(OCRDMA_NODE_DESC) > IB_DEVICE_NODE_DESC_MAX);
122205 memcpy(dev->ibdev.node_desc, OCRDMA_NODE_DESC,
123206 sizeof(OCRDMA_NODE_DESC));
124
- dev->ibdev.owner = THIS_MODULE;
125
- dev->ibdev.uverbs_abi_ver = OCRDMA_ABI_VERSION;
126207 dev->ibdev.uverbs_cmd_mask =
127208 OCRDMA_UVERBS(GET_CONTEXT) |
128209 OCRDMA_UVERBS(QUERY_DEVICE) |
....@@ -154,50 +235,10 @@
154235 dev->ibdev.phys_port_cnt = 1;
155236 dev->ibdev.num_comp_vectors = dev->eq_cnt;
156237
157
- /* mandatory verbs. */
158
- dev->ibdev.query_device = ocrdma_query_device;
159
- dev->ibdev.query_port = ocrdma_query_port;
160
- dev->ibdev.modify_port = ocrdma_modify_port;
161
- dev->ibdev.get_netdev = ocrdma_get_netdev;
162
- dev->ibdev.get_link_layer = ocrdma_link_layer;
163
- dev->ibdev.alloc_pd = ocrdma_alloc_pd;
164
- dev->ibdev.dealloc_pd = ocrdma_dealloc_pd;
165
-
166
- dev->ibdev.create_cq = ocrdma_create_cq;
167
- dev->ibdev.destroy_cq = ocrdma_destroy_cq;
168
- dev->ibdev.resize_cq = ocrdma_resize_cq;
169
-
170
- dev->ibdev.create_qp = ocrdma_create_qp;
171
- dev->ibdev.modify_qp = ocrdma_modify_qp;
172
- dev->ibdev.query_qp = ocrdma_query_qp;
173
- dev->ibdev.destroy_qp = ocrdma_destroy_qp;
174
-
175
- dev->ibdev.query_pkey = ocrdma_query_pkey;
176
- dev->ibdev.create_ah = ocrdma_create_ah;
177
- dev->ibdev.destroy_ah = ocrdma_destroy_ah;
178
- dev->ibdev.query_ah = ocrdma_query_ah;
179
-
180
- dev->ibdev.poll_cq = ocrdma_poll_cq;
181
- dev->ibdev.post_send = ocrdma_post_send;
182
- dev->ibdev.post_recv = ocrdma_post_recv;
183
- dev->ibdev.req_notify_cq = ocrdma_arm_cq;
184
-
185
- dev->ibdev.get_dma_mr = ocrdma_get_dma_mr;
186
- dev->ibdev.dereg_mr = ocrdma_dereg_mr;
187
- dev->ibdev.reg_user_mr = ocrdma_reg_user_mr;
188
-
189
- dev->ibdev.alloc_mr = ocrdma_alloc_mr;
190
- dev->ibdev.map_mr_sg = ocrdma_map_mr_sg;
191
-
192238 /* mandatory to support user space verbs consumer. */
193
- dev->ibdev.alloc_ucontext = ocrdma_alloc_ucontext;
194
- dev->ibdev.dealloc_ucontext = ocrdma_dealloc_ucontext;
195
- dev->ibdev.mmap = ocrdma_mmap;
196239 dev->ibdev.dev.parent = &dev->nic_info.pdev->dev;
197240
198
- dev->ibdev.process_mad = ocrdma_process_mad;
199
- dev->ibdev.get_port_immutable = ocrdma_port_immutable;
200
- dev->ibdev.get_dev_fw_str = get_dev_fw_str;
241
+ ib_set_device_ops(&dev->ibdev, &ocrdma_dev_ops);
201242
202243 if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {
203244 dev->ibdev.uverbs_cmd_mask |=
....@@ -207,14 +248,16 @@
207248 OCRDMA_UVERBS(DESTROY_SRQ) |
208249 OCRDMA_UVERBS(POST_SRQ_RECV);
209250
210
- dev->ibdev.create_srq = ocrdma_create_srq;
211
- dev->ibdev.modify_srq = ocrdma_modify_srq;
212
- dev->ibdev.query_srq = ocrdma_query_srq;
213
- dev->ibdev.destroy_srq = ocrdma_destroy_srq;
214
- dev->ibdev.post_srq_recv = ocrdma_post_srq_recv;
251
+ ib_set_device_ops(&dev->ibdev, &ocrdma_dev_srq_ops);
215252 }
216
- dev->ibdev.driver_id = RDMA_DRIVER_OCRDMA;
217
- return ib_register_device(&dev->ibdev, NULL);
253
+ rdma_set_device_sysfs_group(&dev->ibdev, &ocrdma_attr_group);
254
+ ret = ib_device_set_netdev(&dev->ibdev, dev->nic_info.netdev, 1);
255
+ if (ret)
256
+ return ret;
257
+
258
+ dma_set_max_seg_size(&dev->nic_info.pdev->dev, UINT_MAX);
259
+ return ib_register_device(&dev->ibdev, "ocrdma%d",
260
+ &dev->nic_info.pdev->dev);
218261 }
219262
220263 static int ocrdma_alloc_resources(struct ocrdma_dev *dev)
....@@ -260,59 +303,24 @@
260303 kfree(dev->cq_tbl);
261304 }
262305
263
-/* OCRDMA sysfs interface */
264
-static ssize_t show_rev(struct device *device, struct device_attribute *attr,
265
- char *buf)
266
-{
267
- struct ocrdma_dev *dev = dev_get_drvdata(device);
268
-
269
- return scnprintf(buf, PAGE_SIZE, "0x%x\n", dev->nic_info.pdev->vendor);
270
-}
271
-
272
-static ssize_t show_hca_type(struct device *device,
273
- struct device_attribute *attr, char *buf)
274
-{
275
- struct ocrdma_dev *dev = dev_get_drvdata(device);
276
-
277
- return scnprintf(buf, PAGE_SIZE, "%s\n", &dev->model_number[0]);
278
-}
279
-
280
-static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
281
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca_type, NULL);
282
-
283
-static struct device_attribute *ocrdma_attributes[] = {
284
- &dev_attr_hw_rev,
285
- &dev_attr_hca_type
286
-};
287
-
288
-static void ocrdma_remove_sysfiles(struct ocrdma_dev *dev)
289
-{
290
- int i;
291
-
292
- for (i = 0; i < ARRAY_SIZE(ocrdma_attributes); i++)
293
- device_remove_file(&dev->ibdev.dev, ocrdma_attributes[i]);
294
-}
295
-
296306 static struct ocrdma_dev *ocrdma_add(struct be_dev_info *dev_info)
297307 {
298
- int status = 0, i;
308
+ int status = 0;
299309 u8 lstate = 0;
300310 struct ocrdma_dev *dev;
301311
302
- dev = (struct ocrdma_dev *)ib_alloc_device(sizeof(struct ocrdma_dev));
312
+ dev = ib_alloc_device(ocrdma_dev, ibdev);
303313 if (!dev) {
304314 pr_err("Unable to allocate ib device\n");
305315 return NULL;
306316 }
317
+
307318 dev->mbx_cmd = kzalloc(sizeof(struct ocrdma_mqe_emb_cmd), GFP_KERNEL);
308319 if (!dev->mbx_cmd)
309
- goto idr_err;
320
+ goto init_err;
310321
311322 memcpy(&dev->nic_info, dev_info, sizeof(*dev_info));
312
- dev->id = idr_alloc(&ocrdma_dev_id, NULL, 0, 0, GFP_KERNEL);
313
- if (dev->id < 0)
314
- goto idr_err;
315
-
323
+ dev->id = PCI_FUNC(dev->nic_info.pdev->devfn);
316324 status = ocrdma_init_hw(dev);
317325 if (status)
318326 goto init_err;
....@@ -331,9 +339,6 @@
331339 if (!status)
332340 ocrdma_update_link_state(dev, lstate);
333341
334
- for (i = 0; i < ARRAY_SIZE(ocrdma_attributes); i++)
335
- if (device_create_file(&dev->ibdev.dev, ocrdma_attributes[i]))
336
- goto sysfs_err;
337342 /* Init stats */
338343 ocrdma_add_port_stats(dev);
339344 /* Interrupt Moderation */
....@@ -348,14 +353,10 @@
348353 dev_name(&dev->nic_info.pdev->dev), dev->id);
349354 return dev;
350355
351
-sysfs_err:
352
- ocrdma_remove_sysfiles(dev);
353356 alloc_err:
354357 ocrdma_free_resources(dev);
355358 ocrdma_cleanup_hw(dev);
356359 init_err:
357
- idr_remove(&ocrdma_dev_id, dev->id);
358
-idr_err:
359360 kfree(dev->mbx_cmd);
360361 ib_dealloc_device(&dev->ibdev);
361362 pr_err("%s() leaving. ret=%d\n", __func__, status);
....@@ -365,7 +366,6 @@
365366 static void ocrdma_remove_free(struct ocrdma_dev *dev)
366367 {
367368
368
- idr_remove(&ocrdma_dev_id, dev->id);
369369 kfree(dev->mbx_cmd);
370370 ib_dealloc_device(&dev->ibdev);
371371 }
....@@ -376,7 +376,6 @@
376376 * of the registered clients.
377377 */
378378 cancel_delayed_work_sync(&dev->eqd_work);
379
- ocrdma_remove_sysfiles(dev);
380379 ib_unregister_device(&dev->ibdev);
381380
382381 ocrdma_rem_port_stats(dev);
....@@ -471,7 +470,6 @@
471470 {
472471 be_roce_unregister_driver(&ocrdma_drv);
473472 ocrdma_rem_debugfs();
474
- idr_destroy(&ocrdma_dev_id);
475473 }
476474
477475 module_init(ocrdma_init_module);