2 * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved.
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and/or other materials
21 * provided with the distribution.
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32 #include <linux/module.h>
33 #include <linux/moduleparam.h>
34 #include <linux/device.h>
35 #include <linux/netdevice.h>
36 #include <linux/etherdevice.h>
37 #include <linux/delay.h>
38 #include <linux/errno.h>
39 #include <linux/list.h>
40 #include <linux/spinlock.h>
41 #include <linux/ethtool.h>
42 #include <linux/rtnetlink.h>
43 #include <linux/inetdevice.h>
47 #include <asm/byteorder.h>
49 #include <rdma/iw_cm.h>
50 #include <rdma/ib_verbs.h>
51 #include <rdma/ib_smi.h>
52 #include <rdma/ib_umem.h>
53 #include <rdma/ib_user_verbs.h>
57 static int fastreg_support
= 1;
58 module_param(fastreg_support
, int, 0644);
59 MODULE_PARM_DESC(fastreg_support
, "Advertise fastreg support (default=1)");
61 static struct ib_ah
*c4iw_ah_create(struct ib_pd
*pd
,
62 struct rdma_ah_attr
*ah_attr
,
63 struct ib_udata
*udata
)
66 return ERR_PTR(-ENOSYS
);
69 static int c4iw_ah_destroy(struct ib_ah
*ah
)
74 static int c4iw_multicast_attach(struct ib_qp
*ibqp
, union ib_gid
*gid
, u16 lid
)
79 static int c4iw_multicast_detach(struct ib_qp
*ibqp
, union ib_gid
*gid
, u16 lid
)
84 static int c4iw_process_mad(struct ib_device
*ibdev
, int mad_flags
,
85 u8 port_num
, const struct ib_wc
*in_wc
,
86 const struct ib_grh
*in_grh
,
87 const struct ib_mad_hdr
*in_mad
,
89 struct ib_mad_hdr
*out_mad
,
91 u16
*out_mad_pkey_index
)
96 void _c4iw_free_ucontext(struct kref
*kref
)
98 struct c4iw_ucontext
*ucontext
;
100 struct c4iw_mm_entry
*mm
, *tmp
;
102 ucontext
= container_of(kref
, struct c4iw_ucontext
, kref
);
103 rhp
= to_c4iw_dev(ucontext
->ibucontext
.device
);
105 pr_debug("ucontext %p\n", ucontext
);
106 list_for_each_entry_safe(mm
, tmp
, &ucontext
->mmaps
, entry
)
108 c4iw_release_dev_ucontext(&rhp
->rdev
, &ucontext
->uctx
);
112 static int c4iw_dealloc_ucontext(struct ib_ucontext
*context
)
114 struct c4iw_ucontext
*ucontext
= to_c4iw_ucontext(context
);
116 pr_debug("context %p\n", context
);
117 c4iw_put_ucontext(ucontext
);
121 static struct ib_ucontext
*c4iw_alloc_ucontext(struct ib_device
*ibdev
,
122 struct ib_udata
*udata
)
124 struct c4iw_ucontext
*context
;
125 struct c4iw_dev
*rhp
= to_c4iw_dev(ibdev
);
126 struct c4iw_alloc_ucontext_resp uresp
;
128 struct c4iw_mm_entry
*mm
= NULL
;
130 pr_debug("ibdev %p\n", ibdev
);
131 context
= kzalloc(sizeof(*context
), GFP_KERNEL
);
137 c4iw_init_dev_ucontext(&rhp
->rdev
, &context
->uctx
);
138 INIT_LIST_HEAD(&context
->mmaps
);
139 spin_lock_init(&context
->mmap_lock
);
140 kref_init(&context
->kref
);
142 if (udata
->outlen
< sizeof(uresp
) - sizeof(uresp
.reserved
)) {
143 pr_err_once("Warning - downlevel libcxgb4 (non-fatal), device status page disabled\n");
144 rhp
->rdev
.flags
|= T4_STATUS_PAGE_DISABLED
;
146 mm
= kmalloc(sizeof(*mm
), GFP_KERNEL
);
152 uresp
.status_page_size
= PAGE_SIZE
;
154 spin_lock(&context
->mmap_lock
);
155 uresp
.status_page_key
= context
->key
;
156 context
->key
+= PAGE_SIZE
;
157 spin_unlock(&context
->mmap_lock
);
159 ret
= ib_copy_to_udata(udata
, &uresp
,
160 sizeof(uresp
) - sizeof(uresp
.reserved
));
164 mm
->key
= uresp
.status_page_key
;
165 mm
->addr
= virt_to_phys(rhp
->rdev
.status_page
);
167 insert_mmap(context
, mm
);
169 return &context
->ibucontext
;
178 static int c4iw_mmap(struct ib_ucontext
*context
, struct vm_area_struct
*vma
)
180 int len
= vma
->vm_end
- vma
->vm_start
;
181 u32 key
= vma
->vm_pgoff
<< PAGE_SHIFT
;
182 struct c4iw_rdev
*rdev
;
184 struct c4iw_mm_entry
*mm
;
185 struct c4iw_ucontext
*ucontext
;
188 pr_debug("pgoff 0x%lx key 0x%x len %d\n", vma
->vm_pgoff
,
191 if (vma
->vm_start
& (PAGE_SIZE
-1))
194 rdev
= &(to_c4iw_dev(context
->device
)->rdev
);
195 ucontext
= to_c4iw_ucontext(context
);
197 mm
= remove_mmap(ucontext
, key
, len
);
203 if ((addr
>= pci_resource_start(rdev
->lldi
.pdev
, 0)) &&
204 (addr
< (pci_resource_start(rdev
->lldi
.pdev
, 0) +
205 pci_resource_len(rdev
->lldi
.pdev
, 0)))) {
208 * MA_SYNC register...
210 vma
->vm_page_prot
= pgprot_noncached(vma
->vm_page_prot
);
211 ret
= io_remap_pfn_range(vma
, vma
->vm_start
,
213 len
, vma
->vm_page_prot
);
214 } else if ((addr
>= pci_resource_start(rdev
->lldi
.pdev
, 2)) &&
215 (addr
< (pci_resource_start(rdev
->lldi
.pdev
, 2) +
216 pci_resource_len(rdev
->lldi
.pdev
, 2)))) {
219 * Map user DB or OCQP memory...
221 if (addr
>= rdev
->oc_mw_pa
)
222 vma
->vm_page_prot
= t4_pgprot_wc(vma
->vm_page_prot
);
224 if (!is_t4(rdev
->lldi
.adapter_type
))
226 t4_pgprot_wc(vma
->vm_page_prot
);
229 pgprot_noncached(vma
->vm_page_prot
);
231 ret
= io_remap_pfn_range(vma
, vma
->vm_start
,
233 len
, vma
->vm_page_prot
);
237 * Map WQ or CQ contig dma memory...
239 ret
= remap_pfn_range(vma
, vma
->vm_start
,
241 len
, vma
->vm_page_prot
);
247 static int c4iw_deallocate_pd(struct ib_pd
*pd
)
249 struct c4iw_dev
*rhp
;
252 php
= to_c4iw_pd(pd
);
254 pr_debug("ibpd %p pdid 0x%x\n", pd
, php
->pdid
);
255 c4iw_put_resource(&rhp
->rdev
.resource
.pdid_table
, php
->pdid
);
256 mutex_lock(&rhp
->rdev
.stats
.lock
);
257 rhp
->rdev
.stats
.pd
.cur
--;
258 mutex_unlock(&rhp
->rdev
.stats
.lock
);
263 static struct ib_pd
*c4iw_allocate_pd(struct ib_device
*ibdev
,
264 struct ib_ucontext
*context
,
265 struct ib_udata
*udata
)
269 struct c4iw_dev
*rhp
;
271 pr_debug("ibdev %p\n", ibdev
);
272 rhp
= (struct c4iw_dev
*) ibdev
;
273 pdid
= c4iw_get_resource(&rhp
->rdev
.resource
.pdid_table
);
275 return ERR_PTR(-EINVAL
);
276 php
= kzalloc(sizeof(*php
), GFP_KERNEL
);
278 c4iw_put_resource(&rhp
->rdev
.resource
.pdid_table
, pdid
);
279 return ERR_PTR(-ENOMEM
);
284 if (ib_copy_to_udata(udata
, &php
->pdid
, sizeof(u32
))) {
285 c4iw_deallocate_pd(&php
->ibpd
);
286 return ERR_PTR(-EFAULT
);
289 mutex_lock(&rhp
->rdev
.stats
.lock
);
290 rhp
->rdev
.stats
.pd
.cur
++;
291 if (rhp
->rdev
.stats
.pd
.cur
> rhp
->rdev
.stats
.pd
.max
)
292 rhp
->rdev
.stats
.pd
.max
= rhp
->rdev
.stats
.pd
.cur
;
293 mutex_unlock(&rhp
->rdev
.stats
.lock
);
294 pr_debug("pdid 0x%0x ptr 0x%p\n", pdid
, php
);
298 static int c4iw_query_pkey(struct ib_device
*ibdev
, u8 port
, u16 index
,
301 pr_debug("ibdev %p\n", ibdev
);
306 static int c4iw_query_gid(struct ib_device
*ibdev
, u8 port
, int index
,
309 struct c4iw_dev
*dev
;
311 pr_debug("ibdev %p, port %d, index %d, gid %p\n",
312 ibdev
, port
, index
, gid
);
315 dev
= to_c4iw_dev(ibdev
);
316 memset(&(gid
->raw
[0]), 0, sizeof(gid
->raw
));
317 memcpy(&(gid
->raw
[0]), dev
->rdev
.lldi
.ports
[port
-1]->dev_addr
, 6);
321 static int c4iw_query_device(struct ib_device
*ibdev
, struct ib_device_attr
*props
,
322 struct ib_udata
*uhw
)
325 struct c4iw_dev
*dev
;
327 pr_debug("ibdev %p\n", ibdev
);
329 if (uhw
->inlen
|| uhw
->outlen
)
332 dev
= to_c4iw_dev(ibdev
);
333 memset(props
, 0, sizeof *props
);
334 memcpy(&props
->sys_image_guid
, dev
->rdev
.lldi
.ports
[0]->dev_addr
, 6);
335 props
->hw_ver
= CHELSIO_CHIP_RELEASE(dev
->rdev
.lldi
.adapter_type
);
336 props
->fw_ver
= dev
->rdev
.lldi
.fw_vers
;
337 props
->device_cap_flags
= dev
->device_cap_flags
;
338 props
->page_size_cap
= T4_PAGESIZE_MASK
;
339 props
->vendor_id
= (u32
)dev
->rdev
.lldi
.pdev
->vendor
;
340 props
->vendor_part_id
= (u32
)dev
->rdev
.lldi
.pdev
->device
;
341 props
->max_mr_size
= T4_MAX_MR_SIZE
;
342 props
->max_qp
= dev
->rdev
.lldi
.vr
->qp
.size
/ 2;
343 props
->max_qp_wr
= dev
->rdev
.hw_queue
.t4_max_qp_depth
;
344 props
->max_sge
= T4_MAX_RECV_SGE
;
345 props
->max_sge_rd
= 1;
346 props
->max_res_rd_atom
= dev
->rdev
.lldi
.max_ird_adapter
;
347 props
->max_qp_rd_atom
= min(dev
->rdev
.lldi
.max_ordird_qp
,
348 c4iw_max_read_depth
);
349 props
->max_qp_init_rd_atom
= props
->max_qp_rd_atom
;
350 props
->max_cq
= dev
->rdev
.lldi
.vr
->qp
.size
;
351 props
->max_cqe
= dev
->rdev
.hw_queue
.t4_max_cq_depth
;
352 props
->max_mr
= c4iw_num_stags(&dev
->rdev
);
353 props
->max_pd
= T4_MAX_NUM_PD
;
354 props
->local_ca_ack_delay
= 0;
355 props
->max_fast_reg_page_list_len
=
356 t4_max_fr_depth(dev
->rdev
.lldi
.ulptx_memwrite_dsgl
&& use_dsgl
);
361 static int c4iw_query_port(struct ib_device
*ibdev
, u8 port
,
362 struct ib_port_attr
*props
)
364 struct c4iw_dev
*dev
;
365 struct net_device
*netdev
;
366 struct in_device
*inetdev
;
368 pr_debug("ibdev %p\n", ibdev
);
370 dev
= to_c4iw_dev(ibdev
);
371 netdev
= dev
->rdev
.lldi
.ports
[port
-1];
372 /* props being zeroed by the caller, avoid zeroing it here */
373 props
->max_mtu
= IB_MTU_4096
;
374 props
->active_mtu
= ib_mtu_int_to_enum(netdev
->mtu
);
376 if (!netif_carrier_ok(netdev
))
377 props
->state
= IB_PORT_DOWN
;
379 inetdev
= in_dev_get(netdev
);
381 if (inetdev
->ifa_list
)
382 props
->state
= IB_PORT_ACTIVE
;
384 props
->state
= IB_PORT_INIT
;
387 props
->state
= IB_PORT_INIT
;
390 props
->port_cap_flags
=
392 IB_PORT_SNMP_TUNNEL_SUP
|
394 IB_PORT_DEVICE_MGMT_SUP
|
395 IB_PORT_VENDOR_CLASS_SUP
| IB_PORT_BOOT_MGMT_SUP
;
396 props
->gid_tbl_len
= 1;
397 props
->pkey_tbl_len
= 1;
398 props
->active_width
= 2;
399 props
->active_speed
= IB_SPEED_DDR
;
400 props
->max_msg_sz
= -1;
405 static ssize_t
show_rev(struct device
*dev
, struct device_attribute
*attr
,
408 struct c4iw_dev
*c4iw_dev
= container_of(dev
, struct c4iw_dev
,
410 pr_debug("dev 0x%p\n", dev
);
411 return sprintf(buf
, "%d\n",
412 CHELSIO_CHIP_RELEASE(c4iw_dev
->rdev
.lldi
.adapter_type
));
415 static ssize_t
show_hca(struct device
*dev
, struct device_attribute
*attr
,
418 struct c4iw_dev
*c4iw_dev
= container_of(dev
, struct c4iw_dev
,
420 struct ethtool_drvinfo info
;
421 struct net_device
*lldev
= c4iw_dev
->rdev
.lldi
.ports
[0];
423 pr_debug("dev 0x%p\n", dev
);
424 lldev
->ethtool_ops
->get_drvinfo(lldev
, &info
);
425 return sprintf(buf
, "%s\n", info
.driver
);
428 static ssize_t
show_board(struct device
*dev
, struct device_attribute
*attr
,
431 struct c4iw_dev
*c4iw_dev
= container_of(dev
, struct c4iw_dev
,
433 pr_debug("dev 0x%p\n", dev
);
434 return sprintf(buf
, "%x.%x\n", c4iw_dev
->rdev
.lldi
.pdev
->vendor
,
435 c4iw_dev
->rdev
.lldi
.pdev
->device
);
450 static const char * const names
[] = {
451 [IP4INSEGS
] = "ip4InSegs",
452 [IP4OUTSEGS
] = "ip4OutSegs",
453 [IP4RETRANSSEGS
] = "ip4RetransSegs",
454 [IP4OUTRSTS
] = "ip4OutRsts",
455 [IP6INSEGS
] = "ip6InSegs",
456 [IP6OUTSEGS
] = "ip6OutSegs",
457 [IP6RETRANSSEGS
] = "ip6RetransSegs",
458 [IP6OUTRSTS
] = "ip6OutRsts"
461 static struct rdma_hw_stats
*c4iw_alloc_stats(struct ib_device
*ibdev
,
464 BUILD_BUG_ON(ARRAY_SIZE(names
) != NR_COUNTERS
);
469 return rdma_alloc_hw_stats_struct(names
, NR_COUNTERS
,
470 RDMA_HW_STATS_DEFAULT_LIFESPAN
);
473 static int c4iw_get_mib(struct ib_device
*ibdev
,
474 struct rdma_hw_stats
*stats
,
477 struct tp_tcp_stats v4
, v6
;
478 struct c4iw_dev
*c4iw_dev
= to_c4iw_dev(ibdev
);
480 cxgb4_get_tcp_stats(c4iw_dev
->rdev
.lldi
.pdev
, &v4
, &v6
);
481 stats
->value
[IP4INSEGS
] = v4
.tcp_in_segs
;
482 stats
->value
[IP4OUTSEGS
] = v4
.tcp_out_segs
;
483 stats
->value
[IP4RETRANSSEGS
] = v4
.tcp_retrans_segs
;
484 stats
->value
[IP4OUTRSTS
] = v4
.tcp_out_rsts
;
485 stats
->value
[IP6INSEGS
] = v6
.tcp_in_segs
;
486 stats
->value
[IP6OUTSEGS
] = v6
.tcp_out_segs
;
487 stats
->value
[IP6RETRANSSEGS
] = v6
.tcp_retrans_segs
;
488 stats
->value
[IP6OUTRSTS
] = v6
.tcp_out_rsts
;
490 return stats
->num_counters
;
493 static DEVICE_ATTR(hw_rev
, S_IRUGO
, show_rev
, NULL
);
494 static DEVICE_ATTR(hca_type
, S_IRUGO
, show_hca
, NULL
);
495 static DEVICE_ATTR(board_id
, S_IRUGO
, show_board
, NULL
);
497 static struct device_attribute
*c4iw_class_attributes
[] = {
503 static int c4iw_port_immutable(struct ib_device
*ibdev
, u8 port_num
,
504 struct ib_port_immutable
*immutable
)
506 struct ib_port_attr attr
;
509 immutable
->core_cap_flags
= RDMA_CORE_PORT_IWARP
;
511 err
= ib_query_port(ibdev
, port_num
, &attr
);
515 immutable
->pkey_tbl_len
= attr
.pkey_tbl_len
;
516 immutable
->gid_tbl_len
= attr
.gid_tbl_len
;
521 static void get_dev_fw_str(struct ib_device
*dev
, char *str
)
523 struct c4iw_dev
*c4iw_dev
= container_of(dev
, struct c4iw_dev
,
525 pr_debug("dev 0x%p\n", dev
);
527 snprintf(str
, IB_FW_VERSION_NAME_MAX
, "%u.%u.%u.%u",
528 FW_HDR_FW_VER_MAJOR_G(c4iw_dev
->rdev
.lldi
.fw_vers
),
529 FW_HDR_FW_VER_MINOR_G(c4iw_dev
->rdev
.lldi
.fw_vers
),
530 FW_HDR_FW_VER_MICRO_G(c4iw_dev
->rdev
.lldi
.fw_vers
),
531 FW_HDR_FW_VER_BUILD_G(c4iw_dev
->rdev
.lldi
.fw_vers
));
534 void c4iw_register_device(struct work_struct
*work
)
538 struct uld_ctx
*ctx
= container_of(work
, struct uld_ctx
, reg_work
);
539 struct c4iw_dev
*dev
= ctx
->dev
;
541 pr_debug("c4iw_dev %p\n", dev
);
542 strlcpy(dev
->ibdev
.name
, "cxgb4_%d", IB_DEVICE_NAME_MAX
);
543 memset(&dev
->ibdev
.node_guid
, 0, sizeof(dev
->ibdev
.node_guid
));
544 memcpy(&dev
->ibdev
.node_guid
, dev
->rdev
.lldi
.ports
[0]->dev_addr
, 6);
545 dev
->ibdev
.owner
= THIS_MODULE
;
546 dev
->device_cap_flags
= IB_DEVICE_LOCAL_DMA_LKEY
| IB_DEVICE_MEM_WINDOW
;
548 dev
->device_cap_flags
|= IB_DEVICE_MEM_MGT_EXTENSIONS
;
549 dev
->ibdev
.local_dma_lkey
= 0;
550 dev
->ibdev
.uverbs_cmd_mask
=
551 (1ull << IB_USER_VERBS_CMD_GET_CONTEXT
) |
552 (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE
) |
553 (1ull << IB_USER_VERBS_CMD_QUERY_PORT
) |
554 (1ull << IB_USER_VERBS_CMD_ALLOC_PD
) |
555 (1ull << IB_USER_VERBS_CMD_DEALLOC_PD
) |
556 (1ull << IB_USER_VERBS_CMD_REG_MR
) |
557 (1ull << IB_USER_VERBS_CMD_DEREG_MR
) |
558 (1ull << IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL
) |
559 (1ull << IB_USER_VERBS_CMD_CREATE_CQ
) |
560 (1ull << IB_USER_VERBS_CMD_DESTROY_CQ
) |
561 (1ull << IB_USER_VERBS_CMD_REQ_NOTIFY_CQ
) |
562 (1ull << IB_USER_VERBS_CMD_CREATE_QP
) |
563 (1ull << IB_USER_VERBS_CMD_MODIFY_QP
) |
564 (1ull << IB_USER_VERBS_CMD_QUERY_QP
) |
565 (1ull << IB_USER_VERBS_CMD_POLL_CQ
) |
566 (1ull << IB_USER_VERBS_CMD_DESTROY_QP
) |
567 (1ull << IB_USER_VERBS_CMD_POST_SEND
) |
568 (1ull << IB_USER_VERBS_CMD_POST_RECV
);
569 dev
->ibdev
.node_type
= RDMA_NODE_RNIC
;
570 BUILD_BUG_ON(sizeof(C4IW_NODE_DESC
) > IB_DEVICE_NODE_DESC_MAX
);
571 memcpy(dev
->ibdev
.node_desc
, C4IW_NODE_DESC
, sizeof(C4IW_NODE_DESC
));
572 dev
->ibdev
.phys_port_cnt
= dev
->rdev
.lldi
.nports
;
573 dev
->ibdev
.num_comp_vectors
= dev
->rdev
.lldi
.nciq
;
574 dev
->ibdev
.dev
.parent
= &dev
->rdev
.lldi
.pdev
->dev
;
575 dev
->ibdev
.query_device
= c4iw_query_device
;
576 dev
->ibdev
.query_port
= c4iw_query_port
;
577 dev
->ibdev
.query_pkey
= c4iw_query_pkey
;
578 dev
->ibdev
.query_gid
= c4iw_query_gid
;
579 dev
->ibdev
.alloc_ucontext
= c4iw_alloc_ucontext
;
580 dev
->ibdev
.dealloc_ucontext
= c4iw_dealloc_ucontext
;
581 dev
->ibdev
.mmap
= c4iw_mmap
;
582 dev
->ibdev
.alloc_pd
= c4iw_allocate_pd
;
583 dev
->ibdev
.dealloc_pd
= c4iw_deallocate_pd
;
584 dev
->ibdev
.create_ah
= c4iw_ah_create
;
585 dev
->ibdev
.destroy_ah
= c4iw_ah_destroy
;
586 dev
->ibdev
.create_qp
= c4iw_create_qp
;
587 dev
->ibdev
.modify_qp
= c4iw_ib_modify_qp
;
588 dev
->ibdev
.query_qp
= c4iw_ib_query_qp
;
589 dev
->ibdev
.destroy_qp
= c4iw_destroy_qp
;
590 dev
->ibdev
.create_cq
= c4iw_create_cq
;
591 dev
->ibdev
.destroy_cq
= c4iw_destroy_cq
;
592 dev
->ibdev
.resize_cq
= c4iw_resize_cq
;
593 dev
->ibdev
.poll_cq
= c4iw_poll_cq
;
594 dev
->ibdev
.get_dma_mr
= c4iw_get_dma_mr
;
595 dev
->ibdev
.reg_user_mr
= c4iw_reg_user_mr
;
596 dev
->ibdev
.dereg_mr
= c4iw_dereg_mr
;
597 dev
->ibdev
.alloc_mw
= c4iw_alloc_mw
;
598 dev
->ibdev
.dealloc_mw
= c4iw_dealloc_mw
;
599 dev
->ibdev
.alloc_mr
= c4iw_alloc_mr
;
600 dev
->ibdev
.map_mr_sg
= c4iw_map_mr_sg
;
601 dev
->ibdev
.attach_mcast
= c4iw_multicast_attach
;
602 dev
->ibdev
.detach_mcast
= c4iw_multicast_detach
;
603 dev
->ibdev
.process_mad
= c4iw_process_mad
;
604 dev
->ibdev
.req_notify_cq
= c4iw_arm_cq
;
605 dev
->ibdev
.post_send
= c4iw_post_send
;
606 dev
->ibdev
.post_recv
= c4iw_post_receive
;
607 dev
->ibdev
.alloc_hw_stats
= c4iw_alloc_stats
;
608 dev
->ibdev
.get_hw_stats
= c4iw_get_mib
;
609 dev
->ibdev
.uverbs_abi_ver
= C4IW_UVERBS_ABI_VERSION
;
610 dev
->ibdev
.get_port_immutable
= c4iw_port_immutable
;
611 dev
->ibdev
.get_dev_fw_str
= get_dev_fw_str
;
613 dev
->ibdev
.iwcm
= kmalloc(sizeof(struct iw_cm_verbs
), GFP_KERNEL
);
614 if (!dev
->ibdev
.iwcm
) {
616 goto err_dealloc_ctx
;
619 dev
->ibdev
.iwcm
->connect
= c4iw_connect
;
620 dev
->ibdev
.iwcm
->accept
= c4iw_accept_cr
;
621 dev
->ibdev
.iwcm
->reject
= c4iw_reject_cr
;
622 dev
->ibdev
.iwcm
->create_listen
= c4iw_create_listen
;
623 dev
->ibdev
.iwcm
->destroy_listen
= c4iw_destroy_listen
;
624 dev
->ibdev
.iwcm
->add_ref
= c4iw_qp_add_ref
;
625 dev
->ibdev
.iwcm
->rem_ref
= c4iw_qp_rem_ref
;
626 dev
->ibdev
.iwcm
->get_qp
= c4iw_get_qp
;
627 memcpy(dev
->ibdev
.iwcm
->ifname
, dev
->rdev
.lldi
.ports
[0]->name
,
628 sizeof(dev
->ibdev
.iwcm
->ifname
));
630 ret
= ib_register_device(&dev
->ibdev
, NULL
);
634 for (i
= 0; i
< ARRAY_SIZE(c4iw_class_attributes
); ++i
) {
635 ret
= device_create_file(&dev
->ibdev
.dev
,
636 c4iw_class_attributes
[i
]);
638 goto err_unregister_device
;
641 err_unregister_device
:
642 ib_unregister_device(&dev
->ibdev
);
644 kfree(dev
->ibdev
.iwcm
);
646 pr_err("%s - Failed registering iwarp device: %d\n",
647 pci_name(ctx
->lldi
.pdev
), ret
);
652 void c4iw_unregister_device(struct c4iw_dev
*dev
)
656 pr_debug("c4iw_dev %p\n", dev
);
657 for (i
= 0; i
< ARRAY_SIZE(c4iw_class_attributes
); ++i
)
658 device_remove_file(&dev
->ibdev
.dev
,
659 c4iw_class_attributes
[i
]);
660 ib_unregister_device(&dev
->ibdev
);
661 kfree(dev
->ibdev
.iwcm
);