2 * Copyright (c) 2006 - 2011 Intel Corporation. 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
34 #include <linux/module.h>
35 #include <linux/moduleparam.h>
36 #include <linux/random.h>
37 #include <linux/highmem.h>
38 #include <linux/slab.h>
39 #include <asm/byteorder.h>
41 #include <rdma/ib_verbs.h>
42 #include <rdma/iw_cm.h>
43 #include <rdma/ib_user_verbs.h>
47 #include <rdma/ib_umem.h>
49 atomic_t mod_qp_timouts
;
51 atomic_t sw_qps_destroyed
;
53 static void nes_unregister_ofa_device(struct nes_ib_device
*nesibdev
);
54 static int nes_dereg_mr(struct ib_mr
*ib_mr
);
59 static struct ib_mw
*nes_alloc_mw(struct ib_pd
*ibpd
, enum ib_mw_type type
,
60 struct ib_udata
*udata
)
62 struct nes_pd
*nespd
= to_nespd(ibpd
);
63 struct nes_vnic
*nesvnic
= to_nesvnic(ibpd
->device
);
64 struct nes_device
*nesdev
= nesvnic
->nesdev
;
65 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
66 struct nes_cqp_request
*cqp_request
;
69 struct nes_hw_cqp_wqe
*cqp_wqe
;
73 u32 next_stag_index
= 0;
77 if (type
!= IB_MW_TYPE_1
)
78 return ERR_PTR(-EINVAL
);
80 get_random_bytes(&next_stag_index
, sizeof(next_stag_index
));
81 stag_key
= (u8
)next_stag_index
;
85 next_stag_index
>>= 8;
86 next_stag_index
%= nesadapter
->max_mr
;
88 ret
= nes_alloc_resource(nesadapter
, nesadapter
->allocated_mrs
,
89 nesadapter
->max_mr
, &stag_index
, &next_stag_index
, NES_RESOURCE_MW
);
94 nesmr
= kzalloc(sizeof(*nesmr
), GFP_KERNEL
);
96 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
, stag_index
);
97 return ERR_PTR(-ENOMEM
);
100 stag
= stag_index
<< 8;
102 stag
+= (u32
)stag_key
;
104 nes_debug(NES_DBG_MR
, "Registering STag 0x%08X, index = 0x%08X\n",
107 /* Register the region with the adapter */
108 cqp_request
= nes_get_cqp_request(nesdev
);
109 if (cqp_request
== NULL
) {
111 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
, stag_index
);
112 return ERR_PTR(-ENOMEM
);
115 cqp_request
->waiting
= 1;
116 cqp_wqe
= &cqp_request
->cqp_wqe
;
118 cqp_wqe
->wqe_words
[NES_CQP_WQE_OPCODE_IDX
] =
119 cpu_to_le32( NES_CQP_ALLOCATE_STAG
| NES_CQP_STAG_RIGHTS_REMOTE_READ
|
120 NES_CQP_STAG_RIGHTS_REMOTE_WRITE
| NES_CQP_STAG_VA_TO
|
121 NES_CQP_STAG_REM_ACC_EN
);
123 nes_fill_init_cqp_wqe(cqp_wqe
, nesdev
);
124 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX
, (nespd
->pd_id
& 0x00007fff));
125 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_STAG_IDX
, stag
);
127 atomic_set(&cqp_request
->refcount
, 2);
128 nes_post_cqp_request(nesdev
, cqp_request
);
131 ret
= wait_event_timeout(cqp_request
->waitq
, (cqp_request
->request_done
!= 0),
133 nes_debug(NES_DBG_MR
, "Register STag 0x%08X completed, wait_event_timeout ret = %u,"
134 " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
135 stag
, ret
, cqp_request
->major_code
, cqp_request
->minor_code
);
136 if ((!ret
) || (cqp_request
->major_code
)) {
137 nes_put_cqp_request(nesdev
, cqp_request
);
139 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
, stag_index
);
141 return ERR_PTR(-ETIME
);
143 return ERR_PTR(-ENOMEM
);
146 nes_put_cqp_request(nesdev
, cqp_request
);
148 nesmr
->ibmw
.rkey
= stag
;
149 nesmr
->mode
= IWNES_MEMREG_TYPE_MW
;
152 nesmr
->pbls_used
= 0;
161 static int nes_dealloc_mw(struct ib_mw
*ibmw
)
163 struct nes_mr
*nesmr
= to_nesmw(ibmw
);
164 struct nes_vnic
*nesvnic
= to_nesvnic(ibmw
->device
);
165 struct nes_device
*nesdev
= nesvnic
->nesdev
;
166 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
167 struct nes_hw_cqp_wqe
*cqp_wqe
;
168 struct nes_cqp_request
*cqp_request
;
172 /* Deallocate the window with the adapter */
173 cqp_request
= nes_get_cqp_request(nesdev
);
174 if (cqp_request
== NULL
) {
175 nes_debug(NES_DBG_MR
, "Failed to get a cqp_request.\n");
178 cqp_request
->waiting
= 1;
179 cqp_wqe
= &cqp_request
->cqp_wqe
;
180 nes_fill_init_cqp_wqe(cqp_wqe
, nesdev
);
181 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_OPCODE_IDX
, NES_CQP_DEALLOCATE_STAG
);
182 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_STAG_IDX
, ibmw
->rkey
);
184 atomic_set(&cqp_request
->refcount
, 2);
185 nes_post_cqp_request(nesdev
, cqp_request
);
188 nes_debug(NES_DBG_MR
, "Waiting for deallocate STag 0x%08X to complete.\n",
190 ret
= wait_event_timeout(cqp_request
->waitq
, (0 != cqp_request
->request_done
),
192 nes_debug(NES_DBG_MR
, "Deallocate STag completed, wait_event_timeout ret = %u,"
193 " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
194 ret
, cqp_request
->major_code
, cqp_request
->minor_code
);
197 else if (cqp_request
->major_code
)
200 nes_put_cqp_request(nesdev
, cqp_request
);
202 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
,
203 (ibmw
->rkey
& 0x0fffff00) >> 8);
213 static int alloc_fast_reg_mr(struct nes_device
*nesdev
, struct nes_pd
*nespd
,
214 u32 stag
, u32 page_count
)
216 struct nes_hw_cqp_wqe
*cqp_wqe
;
217 struct nes_cqp_request
*cqp_request
;
220 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
223 u64 region_length
= page_count
* PAGE_SIZE
;
226 cqp_request
= nes_get_cqp_request(nesdev
);
227 if (cqp_request
== NULL
) {
228 nes_debug(NES_DBG_MR
, "Failed to get a cqp_request.\n");
231 nes_debug(NES_DBG_MR
, "alloc_fast_reg_mr: page_count = %d, "
232 "region_length = %llu\n",
233 page_count
, region_length
);
234 cqp_request
->waiting
= 1;
235 cqp_wqe
= &cqp_request
->cqp_wqe
;
237 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
238 if (nesadapter
->free_4kpbl
> 0) {
239 nesadapter
->free_4kpbl
--;
240 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
242 /* No 4kpbl's available: */
243 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
244 nes_debug(NES_DBG_MR
, "Out of Pbls\n");
245 nes_free_cqp_request(nesdev
, cqp_request
);
249 opcode
= NES_CQP_ALLOCATE_STAG
| NES_CQP_STAG_MR
|
250 NES_CQP_STAG_PBL_BLK_SIZE
| NES_CQP_STAG_VA_TO
|
251 NES_CQP_STAG_REM_ACC_EN
;
253 * The current OFED API does not support the zero based TO option.
254 * If added then need to changed the NES_CQP_STAG_VA* option. Also,
255 * the API does not support that ability to have the MR set for local
256 * access only when created and not allow the SQ op to override. Given
257 * this the remote enable must be set here.
260 nes_fill_init_cqp_wqe(cqp_wqe
, nesdev
);
261 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_OPCODE_IDX
, opcode
);
262 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_PBL_BLK_COUNT_IDX
, 1);
264 cqp_wqe
->wqe_words
[NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX
] =
265 cpu_to_le32((u32
)(region_length
>> 8) & 0xff000000);
266 cqp_wqe
->wqe_words
[NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX
] |=
267 cpu_to_le32(nespd
->pd_id
& 0x00007fff);
269 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_STAG_IDX
, stag
);
270 set_wqe_64bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_VA_LOW_IDX
, 0);
271 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_LEN_LOW_IDX
, 0);
272 set_wqe_64bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_PA_LOW_IDX
, 0);
273 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_PBL_LEN_IDX
, (page_count
* 8));
274 cqp_wqe
->wqe_words
[NES_CQP_WQE_OPCODE_IDX
] |= cpu_to_le32(NES_CQP_STAG_PBL_BLK_SIZE
);
277 atomic_set(&cqp_request
->refcount
, 2);
278 nes_post_cqp_request(nesdev
, cqp_request
);
281 ret
= wait_event_timeout(cqp_request
->waitq
,
282 (0 != cqp_request
->request_done
),
285 nes_debug(NES_DBG_MR
, "Allocate STag 0x%08X completed, "
286 "wait_event_timeout ret = %u, CQP Major:Minor codes = "
287 "0x%04X:0x%04X.\n", stag
, ret
, cqp_request
->major_code
,
288 cqp_request
->minor_code
);
289 major_code
= cqp_request
->major_code
;
290 nes_put_cqp_request(nesdev
, cqp_request
);
292 if (!ret
|| major_code
) {
293 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
294 nesadapter
->free_4kpbl
++;
295 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
308 static struct ib_mr
*nes_alloc_mr(struct ib_pd
*ibpd
,
309 enum ib_mr_type mr_type
,
312 struct nes_pd
*nespd
= to_nespd(ibpd
);
313 struct nes_vnic
*nesvnic
= to_nesvnic(ibpd
->device
);
314 struct nes_device
*nesdev
= nesvnic
->nesdev
;
315 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
322 struct nes_mr
*nesmr
;
327 if (mr_type
!= IB_MR_TYPE_MEM_REG
)
328 return ERR_PTR(-EINVAL
);
330 if (max_num_sg
> (NES_4K_PBL_CHUNK_SIZE
/ sizeof(u64
)))
331 return ERR_PTR(-E2BIG
);
334 * Note: Set to always use a fixed length single page entry PBL. This is to allow
335 * for the fast_reg_mr operation to always know the size of the PBL.
337 if (max_num_sg
> (NES_4K_PBL_CHUNK_SIZE
/ sizeof(u64
)))
338 return ERR_PTR(-E2BIG
);
340 get_random_bytes(&next_stag_index
, sizeof(next_stag_index
));
341 stag_key
= (u8
)next_stag_index
;
342 next_stag_index
>>= 8;
343 next_stag_index
%= nesadapter
->max_mr
;
345 err
= nes_alloc_resource(nesadapter
, nesadapter
->allocated_mrs
,
346 nesadapter
->max_mr
, &stag_index
,
347 &next_stag_index
, NES_RESOURCE_FAST_MR
);
351 nesmr
= kzalloc(sizeof(*nesmr
), GFP_KERNEL
);
353 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
, stag_index
);
354 return ERR_PTR(-ENOMEM
);
357 stag
= stag_index
<< 8;
359 stag
+= (u32
)stag_key
;
361 nes_debug(NES_DBG_MR
, "Allocating STag 0x%08X index = 0x%08X\n",
364 ret
= alloc_fast_reg_mr(nesdev
, nespd
, stag
, max_num_sg
);
367 nesmr
->ibmr
.rkey
= stag
;
368 nesmr
->ibmr
.lkey
= stag
;
369 nesmr
->mode
= IWNES_MEMREG_TYPE_FMEM
;
373 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
, stag_index
);
374 return ERR_PTR(-ENOMEM
);
377 nesmr
->pages
= pci_alloc_consistent(nesdev
->pcidev
,
378 max_num_sg
* sizeof(u64
),
383 nesmr
->max_pages
= max_num_sg
;
390 return ERR_PTR(-ENOMEM
);
393 static int nes_set_page(struct ib_mr
*ibmr
, u64 addr
)
395 struct nes_mr
*nesmr
= to_nesmr(ibmr
);
397 if (unlikely(nesmr
->npages
== nesmr
->max_pages
))
400 nesmr
->pages
[nesmr
->npages
++] = cpu_to_le64(addr
);
405 static int nes_map_mr_sg(struct ib_mr
*ibmr
, struct scatterlist
*sg
,
406 int sg_nents
, unsigned int *sg_offset
)
408 struct nes_mr
*nesmr
= to_nesmr(ibmr
);
412 return ib_sg_to_pages(ibmr
, sg
, sg_nents
, sg_offset
, nes_set_page
);
418 static int nes_query_device(struct ib_device
*ibdev
, struct ib_device_attr
*props
,
419 struct ib_udata
*uhw
)
421 struct nes_vnic
*nesvnic
= to_nesvnic(ibdev
);
422 struct nes_device
*nesdev
= nesvnic
->nesdev
;
423 struct nes_ib_device
*nesibdev
= nesvnic
->nesibdev
;
425 if (uhw
->inlen
|| uhw
->outlen
)
428 memset(props
, 0, sizeof(*props
));
429 memcpy(&props
->sys_image_guid
, nesvnic
->netdev
->dev_addr
, 6);
431 props
->fw_ver
= nesdev
->nesadapter
->firmware_version
;
432 props
->device_cap_flags
= nesdev
->nesadapter
->device_cap_flags
;
433 props
->vendor_id
= nesdev
->nesadapter
->vendor_id
;
434 props
->vendor_part_id
= nesdev
->nesadapter
->vendor_part_id
;
435 props
->hw_ver
= nesdev
->nesadapter
->hw_rev
;
436 props
->max_mr_size
= 0x80000000;
437 props
->max_qp
= nesibdev
->max_qp
;
438 props
->max_qp_wr
= nesdev
->nesadapter
->max_qp_wr
- 2;
439 props
->max_sge
= nesdev
->nesadapter
->max_sge
;
440 props
->max_cq
= nesibdev
->max_cq
;
441 props
->max_cqe
= nesdev
->nesadapter
->max_cqe
;
442 props
->max_mr
= nesibdev
->max_mr
;
443 props
->max_mw
= nesibdev
->max_mr
;
444 props
->max_pd
= nesibdev
->max_pd
;
445 props
->max_sge_rd
= 1;
446 switch (nesdev
->nesadapter
->max_irrq_wr
) {
448 props
->max_qp_rd_atom
= 2;
451 props
->max_qp_rd_atom
= 8;
454 props
->max_qp_rd_atom
= 32;
457 props
->max_qp_rd_atom
= 64;
460 props
->max_qp_rd_atom
= 0;
462 props
->max_qp_init_rd_atom
= props
->max_qp_rd_atom
;
463 props
->atomic_cap
= IB_ATOMIC_NONE
;
464 props
->max_map_per_fmr
= 1;
473 static int nes_query_port(struct ib_device
*ibdev
, u8 port
, struct ib_port_attr
*props
)
475 struct nes_vnic
*nesvnic
= to_nesvnic(ibdev
);
476 struct net_device
*netdev
= nesvnic
->netdev
;
478 memset(props
, 0, sizeof(*props
));
480 props
->max_mtu
= IB_MTU_4096
;
482 if (netdev
->mtu
>= 4096)
483 props
->active_mtu
= IB_MTU_4096
;
484 else if (netdev
->mtu
>= 2048)
485 props
->active_mtu
= IB_MTU_2048
;
486 else if (netdev
->mtu
>= 1024)
487 props
->active_mtu
= IB_MTU_1024
;
488 else if (netdev
->mtu
>= 512)
489 props
->active_mtu
= IB_MTU_512
;
491 props
->active_mtu
= IB_MTU_256
;
497 if (netif_queue_stopped(netdev
))
498 props
->state
= IB_PORT_DOWN
;
499 else if (nesvnic
->linkup
)
500 props
->state
= IB_PORT_ACTIVE
;
502 props
->state
= IB_PORT_DOWN
;
503 props
->phys_state
= 0;
504 props
->port_cap_flags
= IB_PORT_CM_SUP
| IB_PORT_REINIT_SUP
|
505 IB_PORT_VENDOR_CLASS_SUP
| IB_PORT_BOOT_MGMT_SUP
;
506 props
->gid_tbl_len
= 1;
507 props
->pkey_tbl_len
= 1;
508 props
->qkey_viol_cntr
= 0;
509 props
->active_width
= IB_WIDTH_4X
;
510 props
->active_speed
= IB_SPEED_SDR
;
511 props
->max_msg_sz
= 0x80000000;
519 static int nes_query_pkey(struct ib_device
*ibdev
, u8 port
, u16 index
, u16
*pkey
)
529 static int nes_query_gid(struct ib_device
*ibdev
, u8 port
,
530 int index
, union ib_gid
*gid
)
532 struct nes_vnic
*nesvnic
= to_nesvnic(ibdev
);
534 memset(&(gid
->raw
[0]), 0, sizeof(gid
->raw
));
535 memcpy(&(gid
->raw
[0]), nesvnic
->netdev
->dev_addr
, 6);
542 * nes_alloc_ucontext - Allocate the user context data structure. This keeps track
543 * of all objects associated with a particular user-mode client.
545 static struct ib_ucontext
*nes_alloc_ucontext(struct ib_device
*ibdev
,
546 struct ib_udata
*udata
)
548 struct nes_vnic
*nesvnic
= to_nesvnic(ibdev
);
549 struct nes_device
*nesdev
= nesvnic
->nesdev
;
550 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
551 struct nes_alloc_ucontext_req req
;
552 struct nes_alloc_ucontext_resp uresp
;
553 struct nes_ucontext
*nes_ucontext
;
554 struct nes_ib_device
*nesibdev
= nesvnic
->nesibdev
;
557 if (ib_copy_from_udata(&req
, udata
, sizeof(struct nes_alloc_ucontext_req
))) {
558 printk(KERN_ERR PFX
"Invalid structure size on allocate user context.\n");
559 return ERR_PTR(-EINVAL
);
562 if (req
.userspace_ver
!= NES_ABI_USERSPACE_VER
) {
563 printk(KERN_ERR PFX
"Invalid userspace driver version detected. Detected version %d, should be %d\n",
564 req
.userspace_ver
, NES_ABI_USERSPACE_VER
);
565 return ERR_PTR(-EINVAL
);
569 memset(&uresp
, 0, sizeof uresp
);
571 uresp
.max_qps
= nesibdev
->max_qp
;
572 uresp
.max_pds
= nesibdev
->max_pd
;
573 uresp
.wq_size
= nesdev
->nesadapter
->max_qp_wr
* 2;
574 uresp
.virtwq
= nesadapter
->virtwq
;
575 uresp
.kernel_ver
= NES_ABI_KERNEL_VER
;
577 nes_ucontext
= kzalloc(sizeof *nes_ucontext
, GFP_KERNEL
);
579 return ERR_PTR(-ENOMEM
);
581 nes_ucontext
->nesdev
= nesdev
;
582 nes_ucontext
->mmap_wq_offset
= uresp
.max_pds
;
583 nes_ucontext
->mmap_cq_offset
= nes_ucontext
->mmap_wq_offset
+
584 ((sizeof(struct nes_hw_qp_wqe
) * uresp
.max_qps
* 2) + PAGE_SIZE
-1) /
588 if (ib_copy_to_udata(udata
, &uresp
, sizeof uresp
)) {
590 return ERR_PTR(-EFAULT
);
593 INIT_LIST_HEAD(&nes_ucontext
->cq_reg_mem_list
);
594 INIT_LIST_HEAD(&nes_ucontext
->qp_reg_mem_list
);
595 atomic_set(&nes_ucontext
->usecnt
, 1);
596 return &nes_ucontext
->ibucontext
;
601 * nes_dealloc_ucontext
603 static int nes_dealloc_ucontext(struct ib_ucontext
*context
)
605 /* struct nes_vnic *nesvnic = to_nesvnic(context->device); */
606 /* struct nes_device *nesdev = nesvnic->nesdev; */
607 struct nes_ucontext
*nes_ucontext
= to_nesucontext(context
);
609 if (!atomic_dec_and_test(&nes_ucontext
->usecnt
))
619 static int nes_mmap(struct ib_ucontext
*context
, struct vm_area_struct
*vma
)
622 struct nes_vnic
*nesvnic
= to_nesvnic(context
->device
);
623 struct nes_device
*nesdev
= nesvnic
->nesdev
;
624 /* struct nes_adapter *nesadapter = nesdev->nesadapter; */
625 struct nes_ucontext
*nes_ucontext
;
626 struct nes_qp
*nesqp
;
628 nes_ucontext
= to_nesucontext(context
);
631 if (vma
->vm_pgoff
>= nes_ucontext
->mmap_wq_offset
) {
632 index
= (vma
->vm_pgoff
- nes_ucontext
->mmap_wq_offset
) * PAGE_SIZE
;
633 index
/= ((sizeof(struct nes_hw_qp_wqe
) * nesdev
->nesadapter
->max_qp_wr
* 2) +
634 PAGE_SIZE
-1) & (~(PAGE_SIZE
-1));
635 if (!test_bit(index
, nes_ucontext
->allocated_wqs
)) {
636 nes_debug(NES_DBG_MMAP
, "wq %lu not allocated\n", index
);
639 nesqp
= nes_ucontext
->mmap_nesqp
[index
];
641 nes_debug(NES_DBG_MMAP
, "wq %lu has a NULL QP base.\n", index
);
644 if (remap_pfn_range(vma
, vma
->vm_start
,
645 virt_to_phys(nesqp
->hwqp
.sq_vbase
) >> PAGE_SHIFT
,
646 vma
->vm_end
- vma
->vm_start
,
647 vma
->vm_page_prot
)) {
648 nes_debug(NES_DBG_MMAP
, "remap_pfn_range failed.\n");
651 vma
->vm_private_data
= nesqp
;
654 index
= vma
->vm_pgoff
;
655 if (!test_bit(index
, nes_ucontext
->allocated_doorbells
))
658 vma
->vm_page_prot
= pgprot_noncached(vma
->vm_page_prot
);
659 if (io_remap_pfn_range(vma
, vma
->vm_start
,
660 (nesdev
->doorbell_start
+
661 ((nes_ucontext
->mmap_db_index
[index
] - nesdev
->base_doorbell_index
) * 4096))
662 >> PAGE_SHIFT
, PAGE_SIZE
, vma
->vm_page_prot
))
664 vma
->vm_private_data
= nes_ucontext
;
675 static struct ib_pd
*nes_alloc_pd(struct ib_device
*ibdev
,
676 struct ib_ucontext
*context
, struct ib_udata
*udata
)
678 struct nes_pd
*nespd
;
679 struct nes_vnic
*nesvnic
= to_nesvnic(ibdev
);
680 struct nes_device
*nesdev
= nesvnic
->nesdev
;
681 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
682 struct nes_ucontext
*nesucontext
;
683 struct nes_alloc_pd_resp uresp
;
687 nes_debug(NES_DBG_PD
, "nesvnic=%p, netdev=%p %s, ibdev=%p, context=%p, netdev refcnt=%u\n",
688 nesvnic
, nesdev
->netdev
[0], nesdev
->netdev
[0]->name
, ibdev
, context
,
689 netdev_refcnt_read(nesvnic
->netdev
));
691 err
= nes_alloc_resource(nesadapter
, nesadapter
->allocated_pds
,
692 nesadapter
->max_pd
, &pd_num
, &nesadapter
->next_pd
, NES_RESOURCE_PD
);
697 nespd
= kzalloc(sizeof (struct nes_pd
), GFP_KERNEL
);
699 nes_free_resource(nesadapter
, nesadapter
->allocated_pds
, pd_num
);
700 return ERR_PTR(-ENOMEM
);
703 nes_debug(NES_DBG_PD
, "Allocating PD (%p) for ib device %s\n",
704 nespd
, nesvnic
->nesibdev
->ibdev
.name
);
706 nespd
->pd_id
= (pd_num
<< (PAGE_SHIFT
-12)) + nesadapter
->base_pd
;
709 nesucontext
= to_nesucontext(context
);
710 nespd
->mmap_db_index
= find_next_zero_bit(nesucontext
->allocated_doorbells
,
711 NES_MAX_USER_DB_REGIONS
, nesucontext
->first_free_db
);
712 nes_debug(NES_DBG_PD
, "find_first_zero_biton doorbells returned %u, mapping pd_id %u.\n",
713 nespd
->mmap_db_index
, nespd
->pd_id
);
714 if (nespd
->mmap_db_index
>= NES_MAX_USER_DB_REGIONS
) {
715 nes_debug(NES_DBG_PD
, "mmap_db_index > MAX\n");
716 nes_free_resource(nesadapter
, nesadapter
->allocated_pds
, pd_num
);
718 return ERR_PTR(-ENOMEM
);
721 uresp
.pd_id
= nespd
->pd_id
;
722 uresp
.mmap_db_index
= nespd
->mmap_db_index
;
723 if (ib_copy_to_udata(udata
, &uresp
, sizeof (struct nes_alloc_pd_resp
))) {
724 nes_free_resource(nesadapter
, nesadapter
->allocated_pds
, pd_num
);
726 return ERR_PTR(-EFAULT
);
729 set_bit(nespd
->mmap_db_index
, nesucontext
->allocated_doorbells
);
730 nesucontext
->mmap_db_index
[nespd
->mmap_db_index
] = nespd
->pd_id
;
731 nesucontext
->first_free_db
= nespd
->mmap_db_index
+ 1;
734 nes_debug(NES_DBG_PD
, "PD%u structure located @%p.\n", nespd
->pd_id
, nespd
);
742 static int nes_dealloc_pd(struct ib_pd
*ibpd
)
744 struct nes_ucontext
*nesucontext
;
745 struct nes_pd
*nespd
= to_nespd(ibpd
);
746 struct nes_vnic
*nesvnic
= to_nesvnic(ibpd
->device
);
747 struct nes_device
*nesdev
= nesvnic
->nesdev
;
748 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
750 if ((ibpd
->uobject
) && (ibpd
->uobject
->context
)) {
751 nesucontext
= to_nesucontext(ibpd
->uobject
->context
);
752 nes_debug(NES_DBG_PD
, "Clearing bit %u from allocated doorbells\n",
753 nespd
->mmap_db_index
);
754 clear_bit(nespd
->mmap_db_index
, nesucontext
->allocated_doorbells
);
755 nesucontext
->mmap_db_index
[nespd
->mmap_db_index
] = 0;
756 if (nesucontext
->first_free_db
> nespd
->mmap_db_index
) {
757 nesucontext
->first_free_db
= nespd
->mmap_db_index
;
761 nes_debug(NES_DBG_PD
, "Deallocating PD%u structure located @%p.\n",
762 nespd
->pd_id
, nespd
);
763 nes_free_resource(nesadapter
, nesadapter
->allocated_pds
,
764 (nespd
->pd_id
-nesadapter
->base_pd
)>>(PAGE_SHIFT
-12));
774 static struct ib_ah
*nes_create_ah(struct ib_pd
*pd
, struct ib_ah_attr
*ah_attr
)
776 return ERR_PTR(-ENOSYS
);
783 static int nes_destroy_ah(struct ib_ah
*ah
)
790 * nes_get_encoded_size
792 static inline u8
nes_get_encoded_size(int *size
)
798 } else if (*size
<= 128) {
801 } else if (*size
<= 512) {
805 return (encoded_size
);
813 static int nes_setup_virt_qp(struct nes_qp
*nesqp
, struct nes_pbl
*nespbl
,
814 struct nes_vnic
*nesvnic
, int sq_size
, int rq_size
)
821 struct nes_device
*nesdev
= nesvnic
->nesdev
;
822 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
827 pbl_entries
= nespbl
->pbl_size
>> 3;
828 nes_debug(NES_DBG_QP
, "Userspace PBL, pbl_size=%u, pbl_entries = %d pbl_vbase=%p, pbl_pbase=%lx\n",
829 nespbl
->pbl_size
, pbl_entries
,
830 (void *)nespbl
->pbl_vbase
,
831 (unsigned long) nespbl
->pbl_pbase
);
832 pbl
= (__le64
*) nespbl
->pbl_vbase
; /* points to first pbl entry */
833 /* now lets set the sq_vbase as well as rq_vbase addrs we will assign */
834 /* the first pbl to be fro the rq_vbase... */
835 rq_pbl_entries
= (rq_size
* sizeof(struct nes_hw_qp_wqe
)) >> 12;
836 sq_pbl_entries
= (sq_size
* sizeof(struct nes_hw_qp_wqe
)) >> 12;
837 nesqp
->hwqp
.sq_pbase
= (le32_to_cpu(((__le32
*)pbl
)[0])) | ((u64
)((le32_to_cpu(((__le32
*)pbl
)[1]))) << 32);
839 nes_debug(NES_DBG_QP
, "QP nespbl->page is NULL \n");
844 nesqp
->hwqp
.sq_vbase
= kmap(nespbl
->page
);
845 nesqp
->page
= nespbl
->page
;
846 if (!nesqp
->hwqp
.sq_vbase
) {
847 nes_debug(NES_DBG_QP
, "QP sq_vbase kmap failed\n");
852 /* Now to get to sq.. we need to calculate how many */
853 /* PBL entries were used by the rq.. */
854 pbl
+= sq_pbl_entries
;
855 nesqp
->hwqp
.rq_pbase
= (le32_to_cpu(((__le32
*)pbl
)[0])) | ((u64
)((le32_to_cpu(((__le32
*)pbl
)[1]))) << 32);
856 /* nesqp->hwqp.rq_vbase = bus_to_virt(*pbl); */
857 /*nesqp->hwqp.rq_vbase = phys_to_virt(*pbl); */
859 nes_debug(NES_DBG_QP
, "QP sq_vbase= %p sq_pbase=%lx rq_vbase=%p rq_pbase=%lx\n",
860 nesqp
->hwqp
.sq_vbase
, (unsigned long) nesqp
->hwqp
.sq_pbase
,
861 nesqp
->hwqp
.rq_vbase
, (unsigned long) nesqp
->hwqp
.rq_pbase
);
862 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
863 if (!nesadapter
->free_256pbl
) {
864 pci_free_consistent(nesdev
->pcidev
, nespbl
->pbl_size
, nespbl
->pbl_vbase
,
866 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
871 nesadapter
->free_256pbl
--;
872 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
874 nesqp
->pbl_vbase
= pci_alloc_consistent(nesdev
->pcidev
, 256, &nesqp
->pbl_pbase
);
875 pblbuffer
= nesqp
->pbl_vbase
;
876 if (!nesqp
->pbl_vbase
) {
877 /* memory allocated during nes_reg_user_mr() */
878 pci_free_consistent(nesdev
->pcidev
, nespbl
->pbl_size
, nespbl
->pbl_vbase
,
881 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
882 nesadapter
->free_256pbl
++;
883 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
887 memset(nesqp
->pbl_vbase
, 0, 256);
888 /* fill in the page address in the pbl buffer.. */
889 tpbl
= pblbuffer
+ 16;
890 pbl
= (__le64
*)nespbl
->pbl_vbase
;
891 while (sq_pbl_entries
--)
894 while (rq_pbl_entries
--)
897 /* done with memory allocated during nes_reg_user_mr() */
898 pci_free_consistent(nesdev
->pcidev
, nespbl
->pbl_size
, nespbl
->pbl_vbase
,
903 max((u32
)sizeof(struct nes_qp_context
), ((u32
)256)) + 256; /* this is Q2 */
904 /* Round up to a multiple of a page */
905 nesqp
->qp_mem_size
+= PAGE_SIZE
- 1;
906 nesqp
->qp_mem_size
&= ~(PAGE_SIZE
- 1);
908 mem
= pci_alloc_consistent(nesdev
->pcidev
, nesqp
->qp_mem_size
,
909 &nesqp
->hwqp
.q2_pbase
);
912 pci_free_consistent(nesdev
->pcidev
, 256, nesqp
->pbl_vbase
, nesqp
->pbl_pbase
);
913 nesqp
->pbl_vbase
= NULL
;
914 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
915 nesadapter
->free_256pbl
++;
916 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
920 nesqp
->sq_kmapped
= 1;
921 nesqp
->hwqp
.q2_vbase
= mem
;
923 memset(nesqp
->hwqp
.q2_vbase
, 0, 256);
924 nesqp
->nesqp_context
= mem
;
925 memset(nesqp
->nesqp_context
, 0, sizeof(*nesqp
->nesqp_context
));
926 nesqp
->nesqp_context_pbase
= nesqp
->hwqp
.q2_pbase
+ 256;
935 static int nes_setup_mmap_qp(struct nes_qp
*nesqp
, struct nes_vnic
*nesvnic
,
936 int sq_size
, int rq_size
)
939 struct nes_device
*nesdev
= nesvnic
->nesdev
;
941 nesqp
->qp_mem_size
= (sizeof(struct nes_hw_qp_wqe
) * sq_size
) +
942 (sizeof(struct nes_hw_qp_wqe
) * rq_size
) +
943 max((u32
)sizeof(struct nes_qp_context
), ((u32
)256)) +
944 256; /* this is Q2 */
945 /* Round up to a multiple of a page */
946 nesqp
->qp_mem_size
+= PAGE_SIZE
- 1;
947 nesqp
->qp_mem_size
&= ~(PAGE_SIZE
- 1);
949 mem
= pci_alloc_consistent(nesdev
->pcidev
, nesqp
->qp_mem_size
,
950 &nesqp
->hwqp
.sq_pbase
);
953 nes_debug(NES_DBG_QP
, "PCI consistent memory for "
954 "host descriptor rings located @ %p (pa = 0x%08lX.) size = %u.\n",
955 mem
, (unsigned long)nesqp
->hwqp
.sq_pbase
, nesqp
->qp_mem_size
);
957 memset(mem
, 0, nesqp
->qp_mem_size
);
959 nesqp
->hwqp
.sq_vbase
= mem
;
960 mem
+= sizeof(struct nes_hw_qp_wqe
) * sq_size
;
962 nesqp
->hwqp
.rq_vbase
= mem
;
963 nesqp
->hwqp
.rq_pbase
= nesqp
->hwqp
.sq_pbase
+
964 sizeof(struct nes_hw_qp_wqe
) * sq_size
;
965 mem
+= sizeof(struct nes_hw_qp_wqe
) * rq_size
;
967 nesqp
->hwqp
.q2_vbase
= mem
;
968 nesqp
->hwqp
.q2_pbase
= nesqp
->hwqp
.rq_pbase
+
969 sizeof(struct nes_hw_qp_wqe
) * rq_size
;
971 memset(nesqp
->hwqp
.q2_vbase
, 0, 256);
973 nesqp
->nesqp_context
= mem
;
974 nesqp
->nesqp_context_pbase
= nesqp
->hwqp
.q2_pbase
+ 256;
975 memset(nesqp
->nesqp_context
, 0, sizeof(*nesqp
->nesqp_context
));
981 * nes_free_qp_mem() is to free up the qp's pci_alloc_consistent() memory.
983 static void nes_free_qp_mem(struct nes_device
*nesdev
,
984 struct nes_qp
*nesqp
, int virt_wqs
)
987 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
989 pci_free_consistent(nesdev
->pcidev
, nesqp
->qp_mem_size
,
990 nesqp
->hwqp
.sq_vbase
, nesqp
->hwqp
.sq_pbase
);
992 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
993 nesadapter
->free_256pbl
++;
994 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
995 pci_free_consistent(nesdev
->pcidev
, nesqp
->qp_mem_size
, nesqp
->hwqp
.q2_vbase
, nesqp
->hwqp
.q2_pbase
);
996 pci_free_consistent(nesdev
->pcidev
, 256, nesqp
->pbl_vbase
, nesqp
->pbl_pbase
);
997 nesqp
->pbl_vbase
= NULL
;
998 if (nesqp
->sq_kmapped
) {
999 nesqp
->sq_kmapped
= 0;
1000 kunmap(nesqp
->page
);
1009 static struct ib_qp
*nes_create_qp(struct ib_pd
*ibpd
,
1010 struct ib_qp_init_attr
*init_attr
, struct ib_udata
*udata
)
1014 struct nes_pd
*nespd
= to_nespd(ibpd
);
1015 struct nes_vnic
*nesvnic
= to_nesvnic(ibpd
->device
);
1016 struct nes_device
*nesdev
= nesvnic
->nesdev
;
1017 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
1018 struct nes_qp
*nesqp
;
1019 struct nes_cq
*nescq
;
1020 struct nes_ucontext
*nes_ucontext
;
1021 struct nes_hw_cqp_wqe
*cqp_wqe
;
1022 struct nes_cqp_request
*cqp_request
;
1023 struct nes_create_qp_req req
;
1024 struct nes_create_qp_resp uresp
;
1025 struct nes_pbl
*nespbl
= NULL
;
1028 /* u32 counter = 0; */
1030 unsigned long flags
;
1040 if (init_attr
->create_flags
)
1041 return ERR_PTR(-EINVAL
);
1043 atomic_inc(&qps_created
);
1044 switch (init_attr
->qp_type
) {
1046 if (nes_drv_opt
& NES_DRV_OPT_NO_INLINE_DATA
) {
1047 init_attr
->cap
.max_inline_data
= 0;
1049 init_attr
->cap
.max_inline_data
= 64;
1051 sq_size
= init_attr
->cap
.max_send_wr
;
1052 rq_size
= init_attr
->cap
.max_recv_wr
;
1054 /* check if the encoded sizes are OK or not... */
1055 sq_encoded_size
= nes_get_encoded_size(&sq_size
);
1056 rq_encoded_size
= nes_get_encoded_size(&rq_size
);
1058 if ((!sq_encoded_size
) || (!rq_encoded_size
)) {
1059 nes_debug(NES_DBG_QP
, "ERROR bad rq (%u) or sq (%u) size\n",
1061 return ERR_PTR(-EINVAL
);
1064 init_attr
->cap
.max_send_wr
= sq_size
-2;
1065 init_attr
->cap
.max_recv_wr
= rq_size
-1;
1066 nes_debug(NES_DBG_QP
, "RQ size=%u, SQ Size=%u\n", rq_size
, sq_size
);
1068 ret
= nes_alloc_resource(nesadapter
, nesadapter
->allocated_qps
,
1069 nesadapter
->max_qp
, &qp_num
, &nesadapter
->next_qp
, NES_RESOURCE_QP
);
1071 return ERR_PTR(ret
);
1074 /* Need 512 (actually now 1024) byte alignment on this structure */
1075 mem
= kzalloc(sizeof(*nesqp
)+NES_SW_CONTEXT_ALIGN
-1, GFP_KERNEL
);
1077 nes_free_resource(nesadapter
, nesadapter
->allocated_qps
, qp_num
);
1078 nes_debug(NES_DBG_QP
, "Unable to allocate QP\n");
1079 return ERR_PTR(-ENOMEM
);
1081 u64nesqp
= (unsigned long)mem
;
1082 u64nesqp
+= ((u64
)NES_SW_CONTEXT_ALIGN
) - 1;
1083 u64temp
= ((u64
)NES_SW_CONTEXT_ALIGN
) - 1;
1084 u64nesqp
&= ~u64temp
;
1085 nesqp
= (struct nes_qp
*)(unsigned long)u64nesqp
;
1086 /* nes_debug(NES_DBG_QP, "nesqp=%p, allocated buffer=%p. Rounded to closest %u\n",
1087 nesqp, mem, NES_SW_CONTEXT_ALIGN); */
1088 nesqp
->allocated_buffer
= mem
;
1091 if (ib_copy_from_udata(&req
, udata
, sizeof(struct nes_create_qp_req
))) {
1092 nes_free_resource(nesadapter
, nesadapter
->allocated_qps
, qp_num
);
1093 kfree(nesqp
->allocated_buffer
);
1094 nes_debug(NES_DBG_QP
, "ib_copy_from_udata() Failed \n");
1095 return ERR_PTR(-EFAULT
);
1097 if (req
.user_wqe_buffers
) {
1100 if (req
.user_qp_buffer
)
1101 nesqp
->nesuqp_addr
= req
.user_qp_buffer
;
1102 if ((ibpd
->uobject
) && (ibpd
->uobject
->context
)) {
1103 nesqp
->user_mode
= 1;
1104 nes_ucontext
= to_nesucontext(ibpd
->uobject
->context
);
1107 list_for_each_entry(nespbl
, &nes_ucontext
->qp_reg_mem_list
, list
) {
1108 if (nespbl
->user_base
== (unsigned long )req
.user_wqe_buffers
) {
1109 list_del(&nespbl
->list
);
1111 nes_debug(NES_DBG_QP
, "Found PBL for virtual QP. nespbl=%p. user_base=0x%lx\n",
1112 nespbl
, nespbl
->user_base
);
1117 nes_debug(NES_DBG_QP
, "Didn't Find PBL for virtual QP. address = %llx.\n",
1118 (long long unsigned int)req
.user_wqe_buffers
);
1119 nes_free_resource(nesadapter
, nesadapter
->allocated_qps
, qp_num
);
1120 kfree(nesqp
->allocated_buffer
);
1121 return ERR_PTR(-EFAULT
);
1125 nes_ucontext
= to_nesucontext(ibpd
->uobject
->context
);
1126 nesqp
->mmap_sq_db_index
=
1127 find_next_zero_bit(nes_ucontext
->allocated_wqs
,
1128 NES_MAX_USER_WQ_REGIONS
, nes_ucontext
->first_free_wq
);
1129 /* nes_debug(NES_DBG_QP, "find_first_zero_biton wqs returned %u\n",
1130 nespd->mmap_db_index); */
1131 if (nesqp
->mmap_sq_db_index
>= NES_MAX_USER_WQ_REGIONS
) {
1132 nes_debug(NES_DBG_QP
,
1133 "db index > max user regions, failing create QP\n");
1134 nes_free_resource(nesadapter
, nesadapter
->allocated_qps
, qp_num
);
1136 pci_free_consistent(nesdev
->pcidev
, nespbl
->pbl_size
, nespbl
->pbl_vbase
,
1140 kfree(nesqp
->allocated_buffer
);
1141 return ERR_PTR(-ENOMEM
);
1143 set_bit(nesqp
->mmap_sq_db_index
, nes_ucontext
->allocated_wqs
);
1144 nes_ucontext
->mmap_nesqp
[nesqp
->mmap_sq_db_index
] = nesqp
;
1145 nes_ucontext
->first_free_wq
= nesqp
->mmap_sq_db_index
+ 1;
1147 nes_free_resource(nesadapter
, nesadapter
->allocated_qps
, qp_num
);
1148 kfree(nesqp
->allocated_buffer
);
1149 return ERR_PTR(-EFAULT
);
1152 err
= (!virt_wqs
) ? nes_setup_mmap_qp(nesqp
, nesvnic
, sq_size
, rq_size
) :
1153 nes_setup_virt_qp(nesqp
, nespbl
, nesvnic
, sq_size
, rq_size
);
1155 nes_debug(NES_DBG_QP
,
1156 "error geting qp mem code = %d\n", err
);
1157 nes_free_resource(nesadapter
, nesadapter
->allocated_qps
, qp_num
);
1158 kfree(nesqp
->allocated_buffer
);
1159 return ERR_PTR(-ENOMEM
);
1162 nesqp
->hwqp
.sq_size
= sq_size
;
1163 nesqp
->hwqp
.sq_encoded_size
= sq_encoded_size
;
1164 nesqp
->hwqp
.sq_head
= 1;
1165 nesqp
->hwqp
.rq_size
= rq_size
;
1166 nesqp
->hwqp
.rq_encoded_size
= rq_encoded_size
;
1167 /* nes_debug(NES_DBG_QP, "nesqp->nesqp_context_pbase = %p\n",
1168 (void *)nesqp->nesqp_context_pbase);
1170 nesqp
->hwqp
.qp_id
= qp_num
;
1171 nesqp
->ibqp
.qp_num
= nesqp
->hwqp
.qp_id
;
1172 nesqp
->nespd
= nespd
;
1174 nescq
= to_nescq(init_attr
->send_cq
);
1175 nesqp
->nesscq
= nescq
;
1176 nescq
= to_nescq(init_attr
->recv_cq
);
1177 nesqp
->nesrcq
= nescq
;
1179 nesqp
->nesqp_context
->misc
|= cpu_to_le32((u32
)PCI_FUNC(nesdev
->pcidev
->devfn
) <<
1180 NES_QPCONTEXT_MISC_PCI_FCN_SHIFT
);
1181 nesqp
->nesqp_context
->misc
|= cpu_to_le32((u32
)nesqp
->hwqp
.rq_encoded_size
<<
1182 NES_QPCONTEXT_MISC_RQ_SIZE_SHIFT
);
1183 nesqp
->nesqp_context
->misc
|= cpu_to_le32((u32
)nesqp
->hwqp
.sq_encoded_size
<<
1184 NES_QPCONTEXT_MISC_SQ_SIZE_SHIFT
);
1186 nesqp
->nesqp_context
->misc
|= cpu_to_le32(NES_QPCONTEXT_MISC_PRIV_EN
);
1187 nesqp
->nesqp_context
->misc
|= cpu_to_le32(NES_QPCONTEXT_MISC_FAST_REGISTER_EN
);
1189 nesqp
->nesqp_context
->cqs
= cpu_to_le32(nesqp
->nesscq
->hw_cq
.cq_number
+
1190 ((u32
)nesqp
->nesrcq
->hw_cq
.cq_number
<< 16));
1191 u64temp
= (u64
)nesqp
->hwqp
.sq_pbase
;
1192 nesqp
->nesqp_context
->sq_addr_low
= cpu_to_le32((u32
)u64temp
);
1193 nesqp
->nesqp_context
->sq_addr_high
= cpu_to_le32((u32
)(u64temp
>> 32));
1197 u64temp
= (u64
)nesqp
->hwqp
.sq_pbase
;
1198 nesqp
->nesqp_context
->sq_addr_low
= cpu_to_le32((u32
)u64temp
);
1199 nesqp
->nesqp_context
->sq_addr_high
= cpu_to_le32((u32
)(u64temp
>> 32));
1200 u64temp
= (u64
)nesqp
->hwqp
.rq_pbase
;
1201 nesqp
->nesqp_context
->rq_addr_low
= cpu_to_le32((u32
)u64temp
);
1202 nesqp
->nesqp_context
->rq_addr_high
= cpu_to_le32((u32
)(u64temp
>> 32));
1204 u64temp
= (u64
)nesqp
->pbl_pbase
;
1205 nesqp
->nesqp_context
->rq_addr_low
= cpu_to_le32((u32
)u64temp
);
1206 nesqp
->nesqp_context
->rq_addr_high
= cpu_to_le32((u32
)(u64temp
>> 32));
1209 /* nes_debug(NES_DBG_QP, "next_qp_nic_index=%u, using nic_index=%d\n",
1210 nesvnic->next_qp_nic_index,
1211 nesvnic->qp_nic_index[nesvnic->next_qp_nic_index]); */
1212 spin_lock_irqsave(&nesdev
->cqp
.lock
, flags
);
1213 nesqp
->nesqp_context
->misc2
|= cpu_to_le32(
1214 (u32
)nesvnic
->qp_nic_index
[nesvnic
->next_qp_nic_index
] <<
1215 NES_QPCONTEXT_MISC2_NIC_INDEX_SHIFT
);
1216 nesvnic
->next_qp_nic_index
++;
1217 if ((nesvnic
->next_qp_nic_index
> 3) ||
1218 (nesvnic
->qp_nic_index
[nesvnic
->next_qp_nic_index
] == 0xf)) {
1219 nesvnic
->next_qp_nic_index
= 0;
1221 spin_unlock_irqrestore(&nesdev
->cqp
.lock
, flags
);
1223 nesqp
->nesqp_context
->pd_index_wscale
|= cpu_to_le32((u32
)nesqp
->nespd
->pd_id
<< 16);
1224 u64temp
= (u64
)nesqp
->hwqp
.q2_pbase
;
1225 nesqp
->nesqp_context
->q2_addr_low
= cpu_to_le32((u32
)u64temp
);
1226 nesqp
->nesqp_context
->q2_addr_high
= cpu_to_le32((u32
)(u64temp
>> 32));
1227 nesqp
->nesqp_context
->aeq_token_low
= cpu_to_le32((u32
)((unsigned long)(nesqp
)));
1228 nesqp
->nesqp_context
->aeq_token_high
= cpu_to_le32((u32
)(upper_32_bits((unsigned long)(nesqp
))));
1229 nesqp
->nesqp_context
->ird_ord_sizes
= cpu_to_le32(NES_QPCONTEXT_ORDIRD_ALSMM
|
1230 NES_QPCONTEXT_ORDIRD_AAH
|
1231 ((((u32
)nesadapter
->max_irrq_wr
) <<
1232 NES_QPCONTEXT_ORDIRD_IRDSIZE_SHIFT
) & NES_QPCONTEXT_ORDIRD_IRDSIZE_MASK
));
1233 if (disable_mpa_crc
) {
1234 nes_debug(NES_DBG_QP
, "Disabling MPA crc checking due to module option.\n");
1235 nesqp
->nesqp_context
->ird_ord_sizes
|= cpu_to_le32(NES_QPCONTEXT_ORDIRD_RNMC
);
1240 cqp_request
= nes_get_cqp_request(nesdev
);
1241 if (cqp_request
== NULL
) {
1242 nes_debug(NES_DBG_QP
, "Failed to get a cqp_request\n");
1243 nes_free_resource(nesadapter
, nesadapter
->allocated_qps
, qp_num
);
1244 nes_free_qp_mem(nesdev
, nesqp
,virt_wqs
);
1245 kfree(nesqp
->allocated_buffer
);
1246 return ERR_PTR(-ENOMEM
);
1248 cqp_request
->waiting
= 1;
1249 cqp_wqe
= &cqp_request
->cqp_wqe
;
1252 opcode
= NES_CQP_CREATE_QP
| NES_CQP_QP_TYPE_IWARP
|
1253 NES_CQP_QP_IWARP_STATE_IDLE
;
1255 opcode
= NES_CQP_CREATE_QP
| NES_CQP_QP_TYPE_IWARP
| NES_CQP_QP_VIRT_WQS
|
1256 NES_CQP_QP_IWARP_STATE_IDLE
;
1258 opcode
|= NES_CQP_QP_CQS_VALID
;
1259 nes_fill_init_cqp_wqe(cqp_wqe
, nesdev
);
1260 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_OPCODE_IDX
, opcode
);
1261 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_ID_IDX
, nesqp
->hwqp
.qp_id
);
1263 u64temp
= (u64
)nesqp
->nesqp_context_pbase
;
1264 set_wqe_64bit_value(cqp_wqe
->wqe_words
, NES_CQP_QP_WQE_CONTEXT_LOW_IDX
, u64temp
);
1266 atomic_set(&cqp_request
->refcount
, 2);
1267 nes_post_cqp_request(nesdev
, cqp_request
);
1270 nes_debug(NES_DBG_QP
, "Waiting for create iWARP QP%u to complete.\n",
1272 ret
= wait_event_timeout(cqp_request
->waitq
,
1273 (cqp_request
->request_done
!= 0), NES_EVENT_TIMEOUT
);
1274 nes_debug(NES_DBG_QP
, "Create iwarp QP%u completed, wait_event_timeout ret=%u,"
1275 " nesdev->cqp_head = %u, nesdev->cqp.sq_tail = %u,"
1276 " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
1277 nesqp
->hwqp
.qp_id
, ret
, nesdev
->cqp
.sq_head
, nesdev
->cqp
.sq_tail
,
1278 cqp_request
->major_code
, cqp_request
->minor_code
);
1279 if ((!ret
) || (cqp_request
->major_code
)) {
1280 nes_put_cqp_request(nesdev
, cqp_request
);
1281 nes_free_resource(nesadapter
, nesadapter
->allocated_qps
, qp_num
);
1282 nes_free_qp_mem(nesdev
, nesqp
,virt_wqs
);
1283 kfree(nesqp
->allocated_buffer
);
1285 return ERR_PTR(-ETIME
);
1287 return ERR_PTR(-EIO
);
1291 nes_put_cqp_request(nesdev
, cqp_request
);
1293 if (ibpd
->uobject
) {
1294 uresp
.mmap_sq_db_index
= nesqp
->mmap_sq_db_index
;
1295 uresp
.mmap_rq_db_index
= 0;
1296 uresp
.actual_sq_size
= sq_size
;
1297 uresp
.actual_rq_size
= rq_size
;
1298 uresp
.qp_id
= nesqp
->hwqp
.qp_id
;
1299 uresp
.nes_drv_opt
= nes_drv_opt
;
1300 if (ib_copy_to_udata(udata
, &uresp
, sizeof uresp
)) {
1301 nes_free_resource(nesadapter
, nesadapter
->allocated_qps
, qp_num
);
1302 nes_free_qp_mem(nesdev
, nesqp
,virt_wqs
);
1303 kfree(nesqp
->allocated_buffer
);
1304 return ERR_PTR(-EFAULT
);
1308 nes_debug(NES_DBG_QP
, "QP%u structure located @%p.Size = %u.\n",
1309 nesqp
->hwqp
.qp_id
, nesqp
, (u32
)sizeof(*nesqp
));
1310 spin_lock_init(&nesqp
->lock
);
1311 nes_add_ref(&nesqp
->ibqp
);
1314 nes_debug(NES_DBG_QP
, "Invalid QP type: %d\n", init_attr
->qp_type
);
1315 return ERR_PTR(-EINVAL
);
1317 init_completion(&nesqp
->sq_drained
);
1318 init_completion(&nesqp
->rq_drained
);
1320 nesqp
->sig_all
= (init_attr
->sq_sig_type
== IB_SIGNAL_ALL_WR
);
1321 init_timer(&nesqp
->terminate_timer
);
1322 nesqp
->terminate_timer
.function
= nes_terminate_timeout
;
1323 nesqp
->terminate_timer
.data
= (unsigned long)nesqp
;
1325 /* update the QP table */
1326 nesdev
->nesadapter
->qp_table
[nesqp
->hwqp
.qp_id
-NES_FIRST_QPN
] = nesqp
;
1327 nes_debug(NES_DBG_QP
, "netdev refcnt=%u\n",
1328 netdev_refcnt_read(nesvnic
->netdev
));
1330 return &nesqp
->ibqp
;
1336 static void nes_clean_cq(struct nes_qp
*nesqp
, struct nes_cq
*nescq
)
1342 unsigned long flags
= 0;
1344 spin_lock_irqsave(&nescq
->lock
, flags
);
1346 cq_head
= nescq
->hw_cq
.cq_head
;
1347 while (le32_to_cpu(nescq
->hw_cq
.cq_vbase
[cq_head
].cqe_words
[NES_CQE_OPCODE_IDX
]) & NES_CQE_VALID
) {
1349 lo
= le32_to_cpu(nescq
->hw_cq
.cq_vbase
[cq_head
].cqe_words
[NES_CQE_COMP_COMP_CTX_LOW_IDX
]);
1350 hi
= le32_to_cpu(nescq
->hw_cq
.cq_vbase
[cq_head
].cqe_words
[NES_CQE_COMP_COMP_CTX_HIGH_IDX
]);
1351 u64temp
= (((u64
)hi
) << 32) | ((u64
)lo
);
1352 u64temp
&= ~(NES_SW_CONTEXT_ALIGN
-1);
1353 if (u64temp
== (u64
)(unsigned long)nesqp
) {
1354 /* Zero the context value so cqe will be ignored */
1355 nescq
->hw_cq
.cq_vbase
[cq_head
].cqe_words
[NES_CQE_COMP_COMP_CTX_LOW_IDX
] = 0;
1356 nescq
->hw_cq
.cq_vbase
[cq_head
].cqe_words
[NES_CQE_COMP_COMP_CTX_HIGH_IDX
] = 0;
1359 if (++cq_head
>= nescq
->hw_cq
.cq_size
)
1363 spin_unlock_irqrestore(&nescq
->lock
, flags
);
1370 static int nes_destroy_qp(struct ib_qp
*ibqp
)
1372 struct nes_qp
*nesqp
= to_nesqp(ibqp
);
1373 struct nes_ucontext
*nes_ucontext
;
1374 struct ib_qp_attr attr
;
1375 struct iw_cm_id
*cm_id
;
1376 struct iw_cm_event cm_event
;
1379 atomic_inc(&sw_qps_destroyed
);
1380 nesqp
->destroyed
= 1;
1382 /* Blow away the connection if it exists. */
1383 if (nesqp
->ibqp_state
>= IB_QPS_INIT
&& nesqp
->ibqp_state
<= IB_QPS_RTS
) {
1384 /* if (nesqp->ibqp_state == IB_QPS_RTS) { */
1385 attr
.qp_state
= IB_QPS_ERR
;
1386 nes_modify_qp(&nesqp
->ibqp
, &attr
, IB_QP_STATE
, NULL
);
1389 if (((nesqp
->ibqp_state
== IB_QPS_INIT
) ||
1390 (nesqp
->ibqp_state
== IB_QPS_RTR
)) && (nesqp
->cm_id
)) {
1391 cm_id
= nesqp
->cm_id
;
1392 cm_event
.event
= IW_CM_EVENT_CONNECT_REPLY
;
1393 cm_event
.status
= -ETIMEDOUT
;
1394 cm_event
.local_addr
= cm_id
->local_addr
;
1395 cm_event
.remote_addr
= cm_id
->remote_addr
;
1396 cm_event
.private_data
= NULL
;
1397 cm_event
.private_data_len
= 0;
1399 nes_debug(NES_DBG_QP
, "Generating a CM Timeout Event for "
1400 "QP%u. cm_id = %p, refcount = %u. \n",
1401 nesqp
->hwqp
.qp_id
, cm_id
, atomic_read(&nesqp
->refcount
));
1403 cm_id
->rem_ref(cm_id
);
1404 ret
= cm_id
->event_handler(cm_id
, &cm_event
);
1406 nes_debug(NES_DBG_QP
, "OFA CM event_handler returned, ret=%d\n", ret
);
1409 if (nesqp
->user_mode
) {
1410 if ((ibqp
->uobject
)&&(ibqp
->uobject
->context
)) {
1411 nes_ucontext
= to_nesucontext(ibqp
->uobject
->context
);
1412 clear_bit(nesqp
->mmap_sq_db_index
, nes_ucontext
->allocated_wqs
);
1413 nes_ucontext
->mmap_nesqp
[nesqp
->mmap_sq_db_index
] = NULL
;
1414 if (nes_ucontext
->first_free_wq
> nesqp
->mmap_sq_db_index
) {
1415 nes_ucontext
->first_free_wq
= nesqp
->mmap_sq_db_index
;
1418 if (nesqp
->pbl_pbase
&& nesqp
->sq_kmapped
) {
1419 nesqp
->sq_kmapped
= 0;
1420 kunmap(nesqp
->page
);
1423 /* Clean any pending completions from the cq(s) */
1425 nes_clean_cq(nesqp
, nesqp
->nesscq
);
1427 if ((nesqp
->nesrcq
) && (nesqp
->nesrcq
!= nesqp
->nesscq
))
1428 nes_clean_cq(nesqp
, nesqp
->nesrcq
);
1430 nes_rem_ref(&nesqp
->ibqp
);
1438 static struct ib_cq
*nes_create_cq(struct ib_device
*ibdev
,
1439 const struct ib_cq_init_attr
*attr
,
1440 struct ib_ucontext
*context
,
1441 struct ib_udata
*udata
)
1443 int entries
= attr
->cqe
;
1445 struct nes_vnic
*nesvnic
= to_nesvnic(ibdev
);
1446 struct nes_device
*nesdev
= nesvnic
->nesdev
;
1447 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
1448 struct nes_cq
*nescq
;
1449 struct nes_ucontext
*nes_ucontext
= NULL
;
1450 struct nes_cqp_request
*cqp_request
;
1452 struct nes_hw_cqp_wqe
*cqp_wqe
;
1453 struct nes_pbl
*nespbl
= NULL
;
1454 struct nes_create_cq_req req
;
1455 struct nes_create_cq_resp resp
;
1458 u32 pbl_entries
= 1;
1460 unsigned long flags
;
1464 return ERR_PTR(-EINVAL
);
1466 if (entries
> nesadapter
->max_cqe
)
1467 return ERR_PTR(-EINVAL
);
1469 err
= nes_alloc_resource(nesadapter
, nesadapter
->allocated_cqs
,
1470 nesadapter
->max_cq
, &cq_num
, &nesadapter
->next_cq
, NES_RESOURCE_CQ
);
1472 return ERR_PTR(err
);
1475 nescq
= kzalloc(sizeof(struct nes_cq
), GFP_KERNEL
);
1477 nes_free_resource(nesadapter
, nesadapter
->allocated_cqs
, cq_num
);
1478 nes_debug(NES_DBG_CQ
, "Unable to allocate nes_cq struct\n");
1479 return ERR_PTR(-ENOMEM
);
1482 nescq
->hw_cq
.cq_size
= max(entries
+ 1, 5);
1483 nescq
->hw_cq
.cq_number
= cq_num
;
1484 nescq
->ibcq
.cqe
= nescq
->hw_cq
.cq_size
- 1;
1488 nes_ucontext
= to_nesucontext(context
);
1489 if (ib_copy_from_udata(&req
, udata
, sizeof (struct nes_create_cq_req
))) {
1490 nes_free_resource(nesadapter
, nesadapter
->allocated_cqs
, cq_num
);
1492 return ERR_PTR(-EFAULT
);
1494 nesvnic
->mcrq_ucontext
= nes_ucontext
;
1495 nes_ucontext
->mcrqf
= req
.mcrqf
;
1496 if (nes_ucontext
->mcrqf
) {
1497 if (nes_ucontext
->mcrqf
& 0x80000000)
1498 nescq
->hw_cq
.cq_number
= nesvnic
->nic
.qp_id
+ 28 + 2 * ((nes_ucontext
->mcrqf
& 0xf) - 1);
1499 else if (nes_ucontext
->mcrqf
& 0x40000000)
1500 nescq
->hw_cq
.cq_number
= nes_ucontext
->mcrqf
& 0xffff;
1502 nescq
->hw_cq
.cq_number
= nesvnic
->mcrq_qp_id
+ nes_ucontext
->mcrqf
-1;
1503 nescq
->mcrqf
= nes_ucontext
->mcrqf
;
1504 nes_free_resource(nesadapter
, nesadapter
->allocated_cqs
, cq_num
);
1506 nes_debug(NES_DBG_CQ
, "CQ Virtual Address = %08lX, size = %u.\n",
1507 (unsigned long)req
.user_cq_buffer
, entries
);
1509 list_for_each_entry(nespbl
, &nes_ucontext
->cq_reg_mem_list
, list
) {
1510 if (nespbl
->user_base
== (unsigned long )req
.user_cq_buffer
) {
1511 list_del(&nespbl
->list
);
1513 nes_debug(NES_DBG_CQ
, "Found PBL for virtual CQ. nespbl=%p.\n",
1519 nes_free_resource(nesadapter
, nesadapter
->allocated_cqs
, cq_num
);
1521 return ERR_PTR(-EFAULT
);
1524 pbl_entries
= nespbl
->pbl_size
>> 3;
1525 nescq
->cq_mem_size
= 0;
1527 nescq
->cq_mem_size
= nescq
->hw_cq
.cq_size
* sizeof(struct nes_hw_cqe
);
1528 nes_debug(NES_DBG_CQ
, "Attempting to allocate pci memory (%u entries, %u bytes) for CQ%u.\n",
1529 entries
, nescq
->cq_mem_size
, nescq
->hw_cq
.cq_number
);
1531 /* allocate the physical buffer space */
1532 mem
= pci_zalloc_consistent(nesdev
->pcidev
, nescq
->cq_mem_size
,
1533 &nescq
->hw_cq
.cq_pbase
);
1535 printk(KERN_ERR PFX
"Unable to allocate pci memory for cq\n");
1536 nes_free_resource(nesadapter
, nesadapter
->allocated_cqs
, cq_num
);
1538 return ERR_PTR(-ENOMEM
);
1541 nescq
->hw_cq
.cq_vbase
= mem
;
1542 nescq
->hw_cq
.cq_head
= 0;
1543 nes_debug(NES_DBG_CQ
, "CQ%u virtual address @ %p, phys = 0x%08X\n",
1544 nescq
->hw_cq
.cq_number
, nescq
->hw_cq
.cq_vbase
,
1545 (u32
)nescq
->hw_cq
.cq_pbase
);
1548 nescq
->hw_cq
.ce_handler
= nes_iwarp_ce_handler
;
1549 spin_lock_init(&nescq
->lock
);
1551 /* send CreateCQ request to CQP */
1552 cqp_request
= nes_get_cqp_request(nesdev
);
1553 if (cqp_request
== NULL
) {
1554 nes_debug(NES_DBG_CQ
, "Failed to get a cqp_request.\n");
1556 pci_free_consistent(nesdev
->pcidev
, nescq
->cq_mem_size
, mem
,
1557 nescq
->hw_cq
.cq_pbase
);
1559 pci_free_consistent(nesdev
->pcidev
, nespbl
->pbl_size
,
1560 nespbl
->pbl_vbase
, nespbl
->pbl_pbase
);
1564 nes_free_resource(nesadapter
, nesadapter
->allocated_cqs
, cq_num
);
1566 return ERR_PTR(-ENOMEM
);
1568 cqp_request
->waiting
= 1;
1569 cqp_wqe
= &cqp_request
->cqp_wqe
;
1571 opcode
= NES_CQP_CREATE_CQ
| NES_CQP_CQ_CEQ_VALID
|
1572 NES_CQP_CQ_CHK_OVERFLOW
|
1573 NES_CQP_CQ_CEQE_MASK
| ((u32
)nescq
->hw_cq
.cq_size
<< 16);
1575 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
1577 if (pbl_entries
!= 1) {
1578 if (pbl_entries
> 32) {
1580 nes_debug(NES_DBG_CQ
, "pbl_entries=%u, use a 4k PBL\n", pbl_entries
);
1581 if (nesadapter
->free_4kpbl
== 0) {
1582 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
1583 nes_free_cqp_request(nesdev
, cqp_request
);
1585 pci_free_consistent(nesdev
->pcidev
, nescq
->cq_mem_size
, mem
,
1586 nescq
->hw_cq
.cq_pbase
);
1588 pci_free_consistent(nesdev
->pcidev
, nespbl
->pbl_size
,
1589 nespbl
->pbl_vbase
, nespbl
->pbl_pbase
);
1592 nes_free_resource(nesadapter
, nesadapter
->allocated_cqs
, cq_num
);
1594 return ERR_PTR(-ENOMEM
);
1596 opcode
|= (NES_CQP_CQ_VIRT
| NES_CQP_CQ_4KB_CHUNK
);
1597 nescq
->virtual_cq
= 2;
1598 nesadapter
->free_4kpbl
--;
1601 /* use 256 byte pbl */
1602 nes_debug(NES_DBG_CQ
, "pbl_entries=%u, use a 256 byte PBL\n", pbl_entries
);
1603 if (nesadapter
->free_256pbl
== 0) {
1604 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
1605 nes_free_cqp_request(nesdev
, cqp_request
);
1607 pci_free_consistent(nesdev
->pcidev
, nescq
->cq_mem_size
, mem
,
1608 nescq
->hw_cq
.cq_pbase
);
1610 pci_free_consistent(nesdev
->pcidev
, nespbl
->pbl_size
,
1611 nespbl
->pbl_vbase
, nespbl
->pbl_pbase
);
1614 nes_free_resource(nesadapter
, nesadapter
->allocated_cqs
, cq_num
);
1616 return ERR_PTR(-ENOMEM
);
1618 opcode
|= NES_CQP_CQ_VIRT
;
1619 nescq
->virtual_cq
= 1;
1620 nesadapter
->free_256pbl
--;
1625 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
1627 nes_fill_init_cqp_wqe(cqp_wqe
, nesdev
);
1628 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_OPCODE_IDX
, opcode
);
1629 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_ID_IDX
,
1630 (nescq
->hw_cq
.cq_number
| ((u32
)nesdev
->ceq_index
<< 16)));
1633 if (pbl_entries
!= 1)
1634 u64temp
= (u64
)nespbl
->pbl_pbase
;
1636 u64temp
= le64_to_cpu(nespbl
->pbl_vbase
[0]);
1637 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_CQ_WQE_DOORBELL_INDEX_HIGH_IDX
,
1638 nes_ucontext
->mmap_db_index
[0]);
1640 u64temp
= (u64
)nescq
->hw_cq
.cq_pbase
;
1641 cqp_wqe
->wqe_words
[NES_CQP_CQ_WQE_DOORBELL_INDEX_HIGH_IDX
] = 0;
1643 set_wqe_64bit_value(cqp_wqe
->wqe_words
, NES_CQP_CQ_WQE_PBL_LOW_IDX
, u64temp
);
1644 cqp_wqe
->wqe_words
[NES_CQP_CQ_WQE_CQ_CONTEXT_HIGH_IDX
] = 0;
1645 u64temp
= (u64
)(unsigned long)&nescq
->hw_cq
;
1646 cqp_wqe
->wqe_words
[NES_CQP_CQ_WQE_CQ_CONTEXT_LOW_IDX
] =
1647 cpu_to_le32((u32
)(u64temp
>> 1));
1648 cqp_wqe
->wqe_words
[NES_CQP_CQ_WQE_CQ_CONTEXT_HIGH_IDX
] =
1649 cpu_to_le32(((u32
)((u64temp
) >> 33)) & 0x7FFFFFFF);
1651 atomic_set(&cqp_request
->refcount
, 2);
1652 nes_post_cqp_request(nesdev
, cqp_request
);
1655 nes_debug(NES_DBG_CQ
, "Waiting for create iWARP CQ%u to complete.\n",
1656 nescq
->hw_cq
.cq_number
);
1657 ret
= wait_event_timeout(cqp_request
->waitq
, (0 != cqp_request
->request_done
),
1658 NES_EVENT_TIMEOUT
* 2);
1659 nes_debug(NES_DBG_CQ
, "Create iWARP CQ%u completed, wait_event_timeout ret = %d.\n",
1660 nescq
->hw_cq
.cq_number
, ret
);
1661 if ((!ret
) || (cqp_request
->major_code
)) {
1662 nes_put_cqp_request(nesdev
, cqp_request
);
1664 pci_free_consistent(nesdev
->pcidev
, nescq
->cq_mem_size
, mem
,
1665 nescq
->hw_cq
.cq_pbase
);
1667 pci_free_consistent(nesdev
->pcidev
, nespbl
->pbl_size
,
1668 nespbl
->pbl_vbase
, nespbl
->pbl_pbase
);
1671 nes_free_resource(nesadapter
, nesadapter
->allocated_cqs
, cq_num
);
1673 return ERR_PTR(-EIO
);
1675 nes_put_cqp_request(nesdev
, cqp_request
);
1678 /* free the nespbl */
1679 pci_free_consistent(nesdev
->pcidev
, nespbl
->pbl_size
, nespbl
->pbl_vbase
,
1682 resp
.cq_id
= nescq
->hw_cq
.cq_number
;
1683 resp
.cq_size
= nescq
->hw_cq
.cq_size
;
1684 resp
.mmap_db_index
= 0;
1685 if (ib_copy_to_udata(udata
, &resp
, sizeof resp
- sizeof resp
.reserved
)) {
1686 nes_free_resource(nesadapter
, nesadapter
->allocated_cqs
, cq_num
);
1688 return ERR_PTR(-EFAULT
);
1692 return &nescq
->ibcq
;
1699 static int nes_destroy_cq(struct ib_cq
*ib_cq
)
1701 struct nes_cq
*nescq
;
1702 struct nes_device
*nesdev
;
1703 struct nes_vnic
*nesvnic
;
1704 struct nes_adapter
*nesadapter
;
1705 struct nes_hw_cqp_wqe
*cqp_wqe
;
1706 struct nes_cqp_request
*cqp_request
;
1707 unsigned long flags
;
1714 nescq
= to_nescq(ib_cq
);
1715 nesvnic
= to_nesvnic(ib_cq
->device
);
1716 nesdev
= nesvnic
->nesdev
;
1717 nesadapter
= nesdev
->nesadapter
;
1719 nes_debug(NES_DBG_CQ
, "Destroy CQ%u\n", nescq
->hw_cq
.cq_number
);
1721 /* Send DestroyCQ request to CQP */
1722 cqp_request
= nes_get_cqp_request(nesdev
);
1723 if (cqp_request
== NULL
) {
1724 nes_debug(NES_DBG_CQ
, "Failed to get a cqp_request.\n");
1727 cqp_request
->waiting
= 1;
1728 cqp_wqe
= &cqp_request
->cqp_wqe
;
1729 opcode
= NES_CQP_DESTROY_CQ
| (nescq
->hw_cq
.cq_size
<< 16);
1730 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
1731 if (nescq
->virtual_cq
== 1) {
1732 nesadapter
->free_256pbl
++;
1733 if (nesadapter
->free_256pbl
> nesadapter
->max_256pbl
) {
1734 printk(KERN_ERR PFX
"%s: free 256B PBLs(%u) has exceeded the max(%u)\n",
1735 __func__
, nesadapter
->free_256pbl
, nesadapter
->max_256pbl
);
1737 } else if (nescq
->virtual_cq
== 2) {
1738 nesadapter
->free_4kpbl
++;
1739 if (nesadapter
->free_4kpbl
> nesadapter
->max_4kpbl
) {
1740 printk(KERN_ERR PFX
"%s: free 4K PBLs(%u) has exceeded the max(%u)\n",
1741 __func__
, nesadapter
->free_4kpbl
, nesadapter
->max_4kpbl
);
1743 opcode
|= NES_CQP_CQ_4KB_CHUNK
;
1746 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
1748 nes_fill_init_cqp_wqe(cqp_wqe
, nesdev
);
1749 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_OPCODE_IDX
, opcode
);
1750 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_ID_IDX
,
1751 (nescq
->hw_cq
.cq_number
| ((u32
)PCI_FUNC(nesdev
->pcidev
->devfn
) << 16)));
1753 nes_free_resource(nesadapter
, nesadapter
->allocated_cqs
, nescq
->hw_cq
.cq_number
);
1755 atomic_set(&cqp_request
->refcount
, 2);
1756 nes_post_cqp_request(nesdev
, cqp_request
);
1759 nes_debug(NES_DBG_CQ
, "Waiting for destroy iWARP CQ%u to complete.\n",
1760 nescq
->hw_cq
.cq_number
);
1761 ret
= wait_event_timeout(cqp_request
->waitq
, (0 != cqp_request
->request_done
),
1763 nes_debug(NES_DBG_CQ
, "Destroy iWARP CQ%u completed, wait_event_timeout ret = %u,"
1764 " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
1765 nescq
->hw_cq
.cq_number
, ret
, cqp_request
->major_code
,
1766 cqp_request
->minor_code
);
1768 nes_debug(NES_DBG_CQ
, "iWARP CQ%u destroy timeout expired\n",
1769 nescq
->hw_cq
.cq_number
);
1771 } else if (cqp_request
->major_code
) {
1772 nes_debug(NES_DBG_CQ
, "iWARP CQ%u destroy failed\n",
1773 nescq
->hw_cq
.cq_number
);
1778 nes_put_cqp_request(nesdev
, cqp_request
);
1780 if (nescq
->cq_mem_size
)
1781 pci_free_consistent(nesdev
->pcidev
, nescq
->cq_mem_size
,
1782 nescq
->hw_cq
.cq_vbase
, nescq
->hw_cq
.cq_pbase
);
1791 static u32
root_256(struct nes_device
*nesdev
,
1792 struct nes_root_vpbl
*root_vpbl
,
1793 struct nes_root_vpbl
*new_root
,
1799 if (pbl_count_4k
== 1) {
1800 new_root
->pbl_vbase
= pci_alloc_consistent(nesdev
->pcidev
,
1801 512, &new_root
->pbl_pbase
);
1803 if (new_root
->pbl_vbase
== NULL
)
1806 leaf_pbl
= (u64
)root_vpbl
->pbl_pbase
;
1807 for (i
= 0; i
< 16; i
++) {
1808 new_root
->pbl_vbase
[i
].pa_low
=
1809 cpu_to_le32((u32
)leaf_pbl
);
1810 new_root
->pbl_vbase
[i
].pa_high
=
1811 cpu_to_le32((u32
)((((u64
)leaf_pbl
) >> 32)));
1815 for (i
= 3; i
>= 0; i
--) {
1817 root_vpbl
->pbl_vbase
[j
] = root_vpbl
->pbl_vbase
[i
];
1818 leaf_pbl
= le32_to_cpu(root_vpbl
->pbl_vbase
[j
].pa_low
) +
1819 (((u64
)le32_to_cpu(root_vpbl
->pbl_vbase
[j
].pa_high
))
1821 for (k
= 1; k
< 16; k
++) {
1823 root_vpbl
->pbl_vbase
[j
+ k
].pa_low
=
1824 cpu_to_le32((u32
)leaf_pbl
);
1825 root_vpbl
->pbl_vbase
[j
+ k
].pa_high
=
1826 cpu_to_le32((u32
)((((u64
)leaf_pbl
) >> 32)));
1838 static int nes_reg_mr(struct nes_device
*nesdev
, struct nes_pd
*nespd
,
1839 u32 stag
, u64 region_length
, struct nes_root_vpbl
*root_vpbl
,
1840 dma_addr_t single_buffer
, u16 pbl_count_4k
,
1841 u16 residual_page_count_4k
, int acc
, u64
*iova_start
,
1842 u16
*actual_pbl_cnt
, u8
*used_4k_pbls
)
1844 struct nes_hw_cqp_wqe
*cqp_wqe
;
1845 struct nes_cqp_request
*cqp_request
;
1846 unsigned long flags
;
1848 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
1850 u16 pbl_count_256
= 0;
1852 u8 use_256_pbls
= 0;
1854 u16 use_two_level
= (pbl_count_4k
> 1) ? 1 : 0;
1855 struct nes_root_vpbl new_root
= { 0, NULL
, NULL
};
1859 /* Register the region with the adapter */
1860 cqp_request
= nes_get_cqp_request(nesdev
);
1861 if (cqp_request
== NULL
) {
1862 nes_debug(NES_DBG_MR
, "Failed to get a cqp_request.\n");
1865 cqp_request
->waiting
= 1;
1866 cqp_wqe
= &cqp_request
->cqp_wqe
;
1869 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
1871 pg_cnt
= ((pbl_count_4k
- 1) * 512) + residual_page_count_4k
;
1872 pbl_count_256
= (pg_cnt
+ 31) / 32;
1874 if (pbl_count_256
<= nesadapter
->free_256pbl
)
1876 else if (pbl_count_4k
<= nesadapter
->free_4kpbl
)
1878 } else if (pg_cnt
<= 2048) {
1879 if (((pbl_count_4k
+ use_two_level
) <= nesadapter
->free_4kpbl
) &&
1880 (nesadapter
->free_4kpbl
> (nesadapter
->max_4kpbl
>> 1))) {
1882 } else if ((pbl_count_256
+ 1) <= nesadapter
->free_256pbl
) {
1885 } else if ((pbl_count_4k
+ use_two_level
) <= nesadapter
->free_4kpbl
) {
1889 if ((pbl_count_4k
+ 1) <= nesadapter
->free_4kpbl
)
1894 pbl_count
= pbl_count_256
;
1895 nesadapter
->free_256pbl
-= pbl_count
+ use_two_level
;
1896 } else if (use_4k_pbls
) {
1897 pbl_count
= pbl_count_4k
;
1898 nesadapter
->free_4kpbl
-= pbl_count
+ use_two_level
;
1900 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
1901 nes_debug(NES_DBG_MR
, "Out of Pbls\n");
1902 nes_free_cqp_request(nesdev
, cqp_request
);
1906 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
1909 if (use_256_pbls
&& use_two_level
) {
1910 if (root_256(nesdev
, root_vpbl
, &new_root
, pbl_count_4k
) == 1) {
1911 if (new_root
.pbl_pbase
!= 0)
1912 root_vpbl
= &new_root
;
1914 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
1915 nesadapter
->free_256pbl
+= pbl_count_256
+ use_two_level
;
1918 if (pbl_count_4k
== 1)
1920 pbl_count
= pbl_count_4k
;
1922 if ((pbl_count_4k
+ use_two_level
) <= nesadapter
->free_4kpbl
) {
1923 nesadapter
->free_4kpbl
-= pbl_count
+ use_two_level
;
1926 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
1928 if (use_4k_pbls
== 0)
1933 opcode
= NES_CQP_REGISTER_STAG
| NES_CQP_STAG_RIGHTS_LOCAL_READ
|
1934 NES_CQP_STAG_VA_TO
| NES_CQP_STAG_MR
;
1935 if (acc
& IB_ACCESS_LOCAL_WRITE
)
1936 opcode
|= NES_CQP_STAG_RIGHTS_LOCAL_WRITE
;
1937 if (acc
& IB_ACCESS_REMOTE_WRITE
)
1938 opcode
|= NES_CQP_STAG_RIGHTS_REMOTE_WRITE
| NES_CQP_STAG_REM_ACC_EN
;
1939 if (acc
& IB_ACCESS_REMOTE_READ
)
1940 opcode
|= NES_CQP_STAG_RIGHTS_REMOTE_READ
| NES_CQP_STAG_REM_ACC_EN
;
1941 if (acc
& IB_ACCESS_MW_BIND
)
1942 opcode
|= NES_CQP_STAG_RIGHTS_WINDOW_BIND
| NES_CQP_STAG_REM_ACC_EN
;
1944 nes_fill_init_cqp_wqe(cqp_wqe
, nesdev
);
1945 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_OPCODE_IDX
, opcode
);
1946 set_wqe_64bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_VA_LOW_IDX
, *iova_start
);
1947 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_LEN_LOW_IDX
, region_length
);
1949 cqp_wqe
->wqe_words
[NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX
] =
1950 cpu_to_le32((u32
)(region_length
>> 8) & 0xff000000);
1951 cqp_wqe
->wqe_words
[NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX
] |=
1952 cpu_to_le32(nespd
->pd_id
& 0x00007fff);
1953 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_STAG_IDX
, stag
);
1955 if (pbl_count
== 0) {
1956 set_wqe_64bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_PA_LOW_IDX
, single_buffer
);
1958 set_wqe_64bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_PA_LOW_IDX
, root_vpbl
->pbl_pbase
);
1959 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_PBL_BLK_COUNT_IDX
, pbl_count
);
1960 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_PBL_LEN_IDX
, (pg_cnt
* 8));
1963 cqp_wqe
->wqe_words
[NES_CQP_WQE_OPCODE_IDX
] |= cpu_to_le32(NES_CQP_STAG_PBL_BLK_SIZE
);
1967 atomic_set(&cqp_request
->refcount
, 2);
1968 nes_post_cqp_request(nesdev
, cqp_request
);
1971 ret
= wait_event_timeout(cqp_request
->waitq
, (0 != cqp_request
->request_done
),
1973 nes_debug(NES_DBG_MR
, "Register STag 0x%08X completed, wait_event_timeout ret = %u,"
1974 " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
1975 stag
, ret
, cqp_request
->major_code
, cqp_request
->minor_code
);
1976 major_code
= cqp_request
->major_code
;
1977 nes_put_cqp_request(nesdev
, cqp_request
);
1979 if ((!ret
|| major_code
) && pbl_count
!= 0) {
1980 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
1982 nesadapter
->free_256pbl
+= pbl_count
+ use_two_level
;
1983 else if (use_4k_pbls
)
1984 nesadapter
->free_4kpbl
+= pbl_count
+ use_two_level
;
1985 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
1987 if (new_root
.pbl_pbase
)
1988 pci_free_consistent(nesdev
->pcidev
, 512, new_root
.pbl_vbase
,
1989 new_root
.pbl_pbase
);
1993 else if (major_code
)
1996 *actual_pbl_cnt
= pbl_count
+ use_two_level
;
1997 *used_4k_pbls
= use_4k_pbls
;
2005 struct ib_mr
*nes_reg_phys_mr(struct ib_pd
*ib_pd
, u64 addr
, u64 size
,
2006 int acc
, u64
*iova_start
)
2009 struct nes_pd
*nespd
= to_nespd(ib_pd
);
2010 struct nes_vnic
*nesvnic
= to_nesvnic(ib_pd
->device
);
2011 struct nes_device
*nesdev
= nesvnic
->nesdev
;
2012 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
2013 struct nes_mr
*nesmr
;
2015 struct nes_vpbl vpbl
;
2016 struct nes_root_vpbl root_vpbl
;
2020 u32 next_stag_index
= 0;
2029 vpbl
.pbl_vbase
= NULL
;
2030 root_vpbl
.pbl_vbase
= NULL
;
2031 root_vpbl
.pbl_pbase
= 0;
2033 get_random_bytes(&next_stag_index
, sizeof(next_stag_index
));
2034 stag_key
= (u8
)next_stag_index
;
2038 next_stag_index
>>= 8;
2039 next_stag_index
%= nesadapter
->max_mr
;
2041 if ((addr
^ *iova_start
) & ~PAGE_MASK
)
2042 return ERR_PTR(-EINVAL
);
2044 err
= nes_alloc_resource(nesadapter
, nesadapter
->allocated_mrs
, nesadapter
->max_mr
,
2045 &stag_index
, &next_stag_index
, NES_RESOURCE_PHYS_MR
);
2047 return ERR_PTR(err
);
2050 nesmr
= kzalloc(sizeof(*nesmr
), GFP_KERNEL
);
2052 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
, stag_index
);
2053 return ERR_PTR(-ENOMEM
);
2056 /* Allocate a 4K buffer for the PBL */
2057 vpbl
.pbl_vbase
= pci_alloc_consistent(nesdev
->pcidev
, 4096,
2059 nes_debug(NES_DBG_MR
, "Allocating leaf PBL, va = %p, pa = 0x%016lX\n",
2060 vpbl
.pbl_vbase
, (unsigned long)vpbl
.pbl_pbase
);
2061 if (!vpbl
.pbl_vbase
) {
2062 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
, stag_index
);
2063 ibmr
= ERR_PTR(-ENOMEM
);
2071 if (mask
& ~PAGE_MASK
) {
2072 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
, stag_index
);
2073 nes_debug(NES_DBG_MR
, "Invalid buffer addr or size\n");
2074 ibmr
= ERR_PTR(-EINVAL
);
2079 region_length
+= size
;
2080 vpbl
.pbl_vbase
[0].pa_low
= cpu_to_le32((u32
)addr
& PAGE_MASK
);
2081 vpbl
.pbl_vbase
[0].pa_high
= cpu_to_le32((u32
)((((u64
)addr
) >> 32)));
2083 stag
= stag_index
<< 8;
2085 stag
+= (u32
)stag_key
;
2087 nes_debug(NES_DBG_MR
, "Registering STag 0x%08X, VA = 0x%016lX,"
2088 " length = 0x%016lX, index = 0x%08X\n",
2089 stag
, (unsigned long)*iova_start
, (unsigned long)region_length
, stag_index
);
2091 /* Make the leaf PBL the root if only one PBL */
2092 root_vpbl
.pbl_pbase
= vpbl
.pbl_pbase
;
2099 ret
= nes_reg_mr(nesdev
, nespd
, stag
, region_length
, &root_vpbl
,
2100 addr
, pbl_count
, 1, acc
, iova_start
,
2101 &nesmr
->pbls_used
, &nesmr
->pbl_4k
);
2104 nesmr
->ibmr
.rkey
= stag
;
2105 nesmr
->ibmr
.lkey
= stag
;
2106 nesmr
->mode
= IWNES_MEMREG_TYPE_MEM
;
2107 ibmr
= &nesmr
->ibmr
;
2110 ibmr
= ERR_PTR(-ENOMEM
);
2114 /* single PBL case */
2115 pci_free_consistent(nesdev
->pcidev
, 4096, vpbl
.pbl_vbase
, vpbl
.pbl_pbase
);
2123 static struct ib_mr
*nes_get_dma_mr(struct ib_pd
*pd
, int acc
)
2127 nes_debug(NES_DBG_MR
, "\n");
2129 return nes_reg_phys_mr(pd
, 0, 0xffffffffffULL
, acc
, &kva
);
2135 static struct ib_mr
*nes_reg_user_mr(struct ib_pd
*pd
, u64 start
, u64 length
,
2136 u64 virt
, int acc
, struct ib_udata
*udata
)
2141 dma_addr_t last_dma_addr
= 0;
2142 dma_addr_t first_dma_addr
= 0;
2143 struct nes_pd
*nespd
= to_nespd(pd
);
2144 struct nes_vnic
*nesvnic
= to_nesvnic(pd
->device
);
2145 struct nes_device
*nesdev
= nesvnic
->nesdev
;
2146 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
2147 struct ib_mr
*ibmr
= ERR_PTR(-EINVAL
);
2148 struct scatterlist
*sg
;
2149 struct nes_ucontext
*nes_ucontext
;
2150 struct nes_pbl
*nespbl
;
2151 struct nes_mr
*nesmr
;
2152 struct ib_umem
*region
;
2153 struct nes_mem_reg_req req
;
2154 struct nes_vpbl vpbl
;
2155 struct nes_root_vpbl root_vpbl
;
2156 int entry
, page_index
;
2158 int err
, pbl_depth
= 0;
2163 u32 next_stag_index
;
2165 u32 root_pbl_index
= 0;
2166 u32 cur_pbl_index
= 0;
2173 region
= ib_umem_get(pd
->uobject
->context
, start
, length
, acc
, 0);
2174 if (IS_ERR(region
)) {
2175 return (struct ib_mr
*)region
;
2178 nes_debug(NES_DBG_MR
, "User base = 0x%lX, Virt base = 0x%lX, length = %u,"
2179 " offset = %u, page size = %u.\n",
2180 (unsigned long int)start
, (unsigned long int)virt
, (u32
)length
,
2181 ib_umem_offset(region
), region
->page_size
);
2183 skip_pages
= ((u32
)ib_umem_offset(region
)) >> 12;
2185 if (ib_copy_from_udata(&req
, udata
, sizeof(req
))) {
2186 ib_umem_release(region
);
2187 return ERR_PTR(-EFAULT
);
2189 nes_debug(NES_DBG_MR
, "Memory Registration type = %08X.\n", req
.reg_type
);
2191 switch (req
.reg_type
) {
2192 case IWNES_MEMREG_TYPE_MEM
:
2195 vpbl
.pbl_vbase
= NULL
;
2196 root_vpbl
.pbl_vbase
= NULL
;
2197 root_vpbl
.pbl_pbase
= 0;
2199 get_random_bytes(&next_stag_index
, sizeof(next_stag_index
));
2200 stag_key
= (u8
)next_stag_index
;
2202 driver_key
= next_stag_index
& 0x70000000;
2204 next_stag_index
>>= 8;
2205 next_stag_index
%= nesadapter
->max_mr
;
2207 err
= nes_alloc_resource(nesadapter
, nesadapter
->allocated_mrs
,
2208 nesadapter
->max_mr
, &stag_index
, &next_stag_index
, NES_RESOURCE_USER_MR
);
2210 ib_umem_release(region
);
2211 return ERR_PTR(err
);
2214 nesmr
= kzalloc(sizeof(*nesmr
), GFP_KERNEL
);
2216 ib_umem_release(region
);
2217 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
, stag_index
);
2218 return ERR_PTR(-ENOMEM
);
2220 nesmr
->region
= region
;
2222 for_each_sg(region
->sg_head
.sgl
, sg
, region
->nmap
, entry
) {
2223 if (sg_dma_address(sg
) & ~PAGE_MASK
) {
2224 ib_umem_release(region
);
2225 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
, stag_index
);
2226 nes_debug(NES_DBG_MR
, "Unaligned Memory Buffer: 0x%x\n",
2227 (unsigned int) sg_dma_address(sg
));
2228 ibmr
= ERR_PTR(-EINVAL
);
2230 goto reg_user_mr_err
;
2233 if (!sg_dma_len(sg
)) {
2234 ib_umem_release(region
);
2235 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
,
2237 nes_debug(NES_DBG_MR
, "Invalid Buffer Size\n");
2238 ibmr
= ERR_PTR(-EINVAL
);
2240 goto reg_user_mr_err
;
2243 region_length
+= sg_dma_len(sg
);
2244 chunk_pages
= sg_dma_len(sg
) >> 12;
2245 region_length
-= skip_pages
<< 12;
2246 for (page_index
= skip_pages
; page_index
< chunk_pages
; page_index
++) {
2248 if ((page_count
!= 0) && (page_count
<< 12) - (ib_umem_offset(region
) & (4096 - 1)) >= region
->length
)
2250 if ((page_count
&0x01FF) == 0) {
2251 if (page_count
>= 1024 * 512) {
2252 ib_umem_release(region
);
2253 nes_free_resource(nesadapter
,
2254 nesadapter
->allocated_mrs
, stag_index
);
2256 ibmr
= ERR_PTR(-E2BIG
);
2257 goto reg_user_mr_err
;
2259 if (root_pbl_index
== 1) {
2260 root_vpbl
.pbl_vbase
= pci_alloc_consistent(nesdev
->pcidev
,
2261 8192, &root_vpbl
.pbl_pbase
);
2262 nes_debug(NES_DBG_MR
, "Allocating root PBL, va = %p, pa = 0x%08X\n",
2263 root_vpbl
.pbl_vbase
, (unsigned int)root_vpbl
.pbl_pbase
);
2264 if (!root_vpbl
.pbl_vbase
) {
2265 ib_umem_release(region
);
2266 pci_free_consistent(nesdev
->pcidev
, 4096, vpbl
.pbl_vbase
,
2268 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
,
2271 ibmr
= ERR_PTR(-ENOMEM
);
2272 goto reg_user_mr_err
;
2274 root_vpbl
.leaf_vpbl
= kzalloc(sizeof(*root_vpbl
.leaf_vpbl
)*1024,
2276 if (!root_vpbl
.leaf_vpbl
) {
2277 ib_umem_release(region
);
2278 pci_free_consistent(nesdev
->pcidev
, 8192, root_vpbl
.pbl_vbase
,
2279 root_vpbl
.pbl_pbase
);
2280 pci_free_consistent(nesdev
->pcidev
, 4096, vpbl
.pbl_vbase
,
2282 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
,
2285 ibmr
= ERR_PTR(-ENOMEM
);
2286 goto reg_user_mr_err
;
2288 root_vpbl
.pbl_vbase
[0].pa_low
=
2289 cpu_to_le32((u32
)vpbl
.pbl_pbase
);
2290 root_vpbl
.pbl_vbase
[0].pa_high
=
2291 cpu_to_le32((u32
)((((u64
)vpbl
.pbl_pbase
) >> 32)));
2292 root_vpbl
.leaf_vpbl
[0] = vpbl
;
2294 vpbl
.pbl_vbase
= pci_alloc_consistent(nesdev
->pcidev
, 4096,
2296 nes_debug(NES_DBG_MR
, "Allocating leaf PBL, va = %p, pa = 0x%08X\n",
2297 vpbl
.pbl_vbase
, (unsigned int)vpbl
.pbl_pbase
);
2298 if (!vpbl
.pbl_vbase
) {
2299 ib_umem_release(region
);
2300 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
, stag_index
);
2301 ibmr
= ERR_PTR(-ENOMEM
);
2303 goto reg_user_mr_err
;
2305 if (1 <= root_pbl_index
) {
2306 root_vpbl
.pbl_vbase
[root_pbl_index
].pa_low
=
2307 cpu_to_le32((u32
)vpbl
.pbl_pbase
);
2308 root_vpbl
.pbl_vbase
[root_pbl_index
].pa_high
=
2309 cpu_to_le32((u32
)((((u64
)vpbl
.pbl_pbase
)>>32)));
2310 root_vpbl
.leaf_vpbl
[root_pbl_index
] = vpbl
;
2316 if (page_count
!= 0) {
2317 if ((last_dma_addr
+4096) !=
2318 (sg_dma_address(sg
)+
2321 last_dma_addr
= sg_dma_address(sg
)+
2324 first_dma_addr
= sg_dma_address(sg
)+
2326 last_dma_addr
= first_dma_addr
;
2330 vpbl
.pbl_vbase
[cur_pbl_index
].pa_low
=
2331 cpu_to_le32((u32
)(sg_dma_address(sg
)+
2332 (page_index
*4096)));
2333 vpbl
.pbl_vbase
[cur_pbl_index
].pa_high
=
2334 cpu_to_le32((u32
)((((u64
)(sg_dma_address(sg
)+
2335 (page_index
*4096))) >> 32)));
2342 nes_debug(NES_DBG_MR
, "calculating stag, stag_index=0x%08x, driver_key=0x%08x,"
2343 " stag_key=0x%08x\n",
2344 stag_index
, driver_key
, stag_key
);
2345 stag
= stag_index
<< 8;
2347 stag
+= (u32
)stag_key
;
2350 /* Make the leaf PBL the root if only one PBL */
2351 if (root_pbl_index
== 1) {
2352 root_vpbl
.pbl_pbase
= vpbl
.pbl_pbase
;
2358 pbl_count
= root_pbl_index
;
2361 nes_debug(NES_DBG_MR
, "Registering STag 0x%08X, VA = 0x%08X, length = 0x%08X,"
2362 " index = 0x%08X, region->length=0x%08llx, pbl_count = %u\n",
2363 stag
, (unsigned int)iova_start
,
2364 (unsigned int)region_length
, stag_index
,
2365 (unsigned long long)region
->length
, pbl_count
);
2366 ret
= nes_reg_mr(nesdev
, nespd
, stag
, region
->length
, &root_vpbl
,
2367 first_dma_addr
, pbl_count
, (u16
)cur_pbl_index
, acc
,
2368 &iova_start
, &nesmr
->pbls_used
, &nesmr
->pbl_4k
);
2370 nes_debug(NES_DBG_MR
, "ret=%d\n", ret
);
2373 nesmr
->ibmr
.rkey
= stag
;
2374 nesmr
->ibmr
.lkey
= stag
;
2375 nesmr
->mode
= IWNES_MEMREG_TYPE_MEM
;
2376 ibmr
= &nesmr
->ibmr
;
2378 ib_umem_release(region
);
2380 ibmr
= ERR_PTR(-ENOMEM
);
2384 /* free the resources */
2385 if (root_pbl_index
== 1) {
2386 pci_free_consistent(nesdev
->pcidev
, 4096, vpbl
.pbl_vbase
,
2389 for (page_index
=0; page_index
<root_pbl_index
; page_index
++) {
2390 pci_free_consistent(nesdev
->pcidev
, 4096,
2391 root_vpbl
.leaf_vpbl
[page_index
].pbl_vbase
,
2392 root_vpbl
.leaf_vpbl
[page_index
].pbl_pbase
);
2394 kfree(root_vpbl
.leaf_vpbl
);
2395 pci_free_consistent(nesdev
->pcidev
, 8192, root_vpbl
.pbl_vbase
,
2396 root_vpbl
.pbl_pbase
);
2399 nes_debug(NES_DBG_MR
, "Leaving, ibmr=%p", ibmr
);
2402 case IWNES_MEMREG_TYPE_QP
:
2403 case IWNES_MEMREG_TYPE_CQ
:
2404 if (!region
->length
) {
2405 nes_debug(NES_DBG_MR
, "Unable to register zero length region for CQ\n");
2406 ib_umem_release(region
);
2407 return ERR_PTR(-EINVAL
);
2409 nespbl
= kzalloc(sizeof(*nespbl
), GFP_KERNEL
);
2411 nes_debug(NES_DBG_MR
, "Unable to allocate PBL\n");
2412 ib_umem_release(region
);
2413 return ERR_PTR(-ENOMEM
);
2415 nesmr
= kzalloc(sizeof(*nesmr
), GFP_KERNEL
);
2417 ib_umem_release(region
);
2419 nes_debug(NES_DBG_MR
, "Unable to allocate nesmr\n");
2420 return ERR_PTR(-ENOMEM
);
2422 nesmr
->region
= region
;
2423 nes_ucontext
= to_nesucontext(pd
->uobject
->context
);
2424 pbl_depth
= region
->length
>> 12;
2425 pbl_depth
+= (region
->length
& (4096-1)) ? 1 : 0;
2426 nespbl
->pbl_size
= pbl_depth
*sizeof(u64
);
2427 if (req
.reg_type
== IWNES_MEMREG_TYPE_QP
) {
2428 nes_debug(NES_DBG_MR
, "Attempting to allocate QP PBL memory");
2430 nes_debug(NES_DBG_MR
, "Attempting to allocate CP PBL memory");
2433 nes_debug(NES_DBG_MR
, " %u bytes, %u entries.\n",
2434 nespbl
->pbl_size
, pbl_depth
);
2435 pbl
= pci_alloc_consistent(nesdev
->pcidev
, nespbl
->pbl_size
,
2436 &nespbl
->pbl_pbase
);
2438 ib_umem_release(region
);
2441 nes_debug(NES_DBG_MR
, "Unable to allocate PBL memory\n");
2442 return ERR_PTR(-ENOMEM
);
2445 nespbl
->pbl_vbase
= (u64
*)pbl
;
2446 nespbl
->user_base
= start
;
2447 nes_debug(NES_DBG_MR
, "Allocated PBL memory, %u bytes, pbl_pbase=%lx,"
2448 " pbl_vbase=%p user_base=0x%lx\n",
2449 nespbl
->pbl_size
, (unsigned long) nespbl
->pbl_pbase
,
2450 (void *) nespbl
->pbl_vbase
, nespbl
->user_base
);
2452 for_each_sg(region
->sg_head
.sgl
, sg
, region
->nmap
, entry
) {
2453 chunk_pages
= sg_dma_len(sg
) >> 12;
2454 chunk_pages
+= (sg_dma_len(sg
) & (4096-1)) ? 1 : 0;
2456 nespbl
->page
= sg_page(sg
);
2460 for (page_index
= 0; page_index
< chunk_pages
; page_index
++) {
2461 ((__le32
*)pbl
)[0] = cpu_to_le32((u32
)
2462 (sg_dma_address(sg
)+
2463 (page_index
*4096)));
2464 ((__le32
*)pbl
)[1] = cpu_to_le32(((u64
)
2465 (sg_dma_address(sg
)+
2466 (page_index
*4096)))>>32);
2467 nes_debug(NES_DBG_MR
, "pbl=%p, *pbl=0x%016llx, 0x%08x%08x\n", pbl
,
2468 (unsigned long long)*pbl
,
2469 le32_to_cpu(((__le32
*)pbl
)[1]), le32_to_cpu(((__le32
*)pbl
)[0]));
2474 if (req
.reg_type
== IWNES_MEMREG_TYPE_QP
) {
2475 list_add_tail(&nespbl
->list
, &nes_ucontext
->qp_reg_mem_list
);
2477 list_add_tail(&nespbl
->list
, &nes_ucontext
->cq_reg_mem_list
);
2479 nesmr
->ibmr
.rkey
= -1;
2480 nesmr
->ibmr
.lkey
= -1;
2481 nesmr
->mode
= req
.reg_type
;
2482 return &nesmr
->ibmr
;
2485 ib_umem_release(region
);
2486 return ERR_PTR(-ENOSYS
);
2493 static int nes_dereg_mr(struct ib_mr
*ib_mr
)
2495 struct nes_mr
*nesmr
= to_nesmr(ib_mr
);
2496 struct nes_vnic
*nesvnic
= to_nesvnic(ib_mr
->device
);
2497 struct nes_device
*nesdev
= nesvnic
->nesdev
;
2498 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
2499 struct nes_hw_cqp_wqe
*cqp_wqe
;
2500 struct nes_cqp_request
*cqp_request
;
2501 unsigned long flags
;
2508 pci_free_consistent(nesdev
->pcidev
,
2509 nesmr
->max_pages
* sizeof(u64
),
2513 if (nesmr
->region
) {
2514 ib_umem_release(nesmr
->region
);
2516 if (nesmr
->mode
!= IWNES_MEMREG_TYPE_MEM
) {
2521 /* Deallocate the region with the adapter */
2523 cqp_request
= nes_get_cqp_request(nesdev
);
2524 if (cqp_request
== NULL
) {
2525 nes_debug(NES_DBG_MR
, "Failed to get a cqp_request.\n");
2528 cqp_request
->waiting
= 1;
2529 cqp_wqe
= &cqp_request
->cqp_wqe
;
2531 nes_fill_init_cqp_wqe(cqp_wqe
, nesdev
);
2532 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_OPCODE_IDX
,
2533 NES_CQP_DEALLOCATE_STAG
| NES_CQP_STAG_VA_TO
|
2534 NES_CQP_STAG_DEALLOC_PBLS
| NES_CQP_STAG_MR
);
2535 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_STAG_WQE_STAG_IDX
, ib_mr
->rkey
);
2537 atomic_set(&cqp_request
->refcount
, 2);
2538 nes_post_cqp_request(nesdev
, cqp_request
);
2541 nes_debug(NES_DBG_MR
, "Waiting for deallocate STag 0x%08X completed\n", ib_mr
->rkey
);
2542 ret
= wait_event_timeout(cqp_request
->waitq
, (cqp_request
->request_done
!= 0),
2544 nes_debug(NES_DBG_MR
, "Deallocate STag 0x%08X completed, wait_event_timeout ret = %u,"
2545 " CQP Major:Minor codes = 0x%04X:0x%04X\n",
2546 ib_mr
->rkey
, ret
, cqp_request
->major_code
, cqp_request
->minor_code
);
2548 major_code
= cqp_request
->major_code
;
2549 minor_code
= cqp_request
->minor_code
;
2551 nes_put_cqp_request(nesdev
, cqp_request
);
2554 nes_debug(NES_DBG_MR
, "Timeout waiting to destroy STag,"
2555 " ib_mr=%p, rkey = 0x%08X\n",
2556 ib_mr
, ib_mr
->rkey
);
2558 } else if (major_code
) {
2559 nes_debug(NES_DBG_MR
, "Error (0x%04X:0x%04X) while attempting"
2560 " to destroy STag, ib_mr=%p, rkey = 0x%08X\n",
2561 major_code
, minor_code
, ib_mr
, ib_mr
->rkey
);
2565 if (nesmr
->pbls_used
!= 0) {
2566 spin_lock_irqsave(&nesadapter
->pbl_lock
, flags
);
2567 if (nesmr
->pbl_4k
) {
2568 nesadapter
->free_4kpbl
+= nesmr
->pbls_used
;
2569 if (nesadapter
->free_4kpbl
> nesadapter
->max_4kpbl
)
2570 printk(KERN_ERR PFX
"free 4KB PBLs(%u) has "
2571 "exceeded the max(%u)\n",
2572 nesadapter
->free_4kpbl
,
2573 nesadapter
->max_4kpbl
);
2575 nesadapter
->free_256pbl
+= nesmr
->pbls_used
;
2576 if (nesadapter
->free_256pbl
> nesadapter
->max_256pbl
)
2577 printk(KERN_ERR PFX
"free 256B PBLs(%u) has "
2578 "exceeded the max(%u)\n",
2579 nesadapter
->free_256pbl
,
2580 nesadapter
->max_256pbl
);
2582 spin_unlock_irqrestore(&nesadapter
->pbl_lock
, flags
);
2584 nes_free_resource(nesadapter
, nesadapter
->allocated_mrs
,
2585 (ib_mr
->rkey
& 0x0fffff00) >> 8);
2596 static ssize_t
show_rev(struct device
*dev
, struct device_attribute
*attr
,
2599 struct nes_ib_device
*nesibdev
=
2600 container_of(dev
, struct nes_ib_device
, ibdev
.dev
);
2601 struct nes_vnic
*nesvnic
= nesibdev
->nesvnic
;
2603 nes_debug(NES_DBG_INIT
, "\n");
2604 return sprintf(buf
, "%x\n", nesvnic
->nesdev
->nesadapter
->hw_rev
);
2611 static ssize_t
show_hca(struct device
*dev
, struct device_attribute
*attr
,
2614 nes_debug(NES_DBG_INIT
, "\n");
2615 return sprintf(buf
, "NES020\n");
2622 static ssize_t
show_board(struct device
*dev
, struct device_attribute
*attr
,
2625 nes_debug(NES_DBG_INIT
, "\n");
2626 return sprintf(buf
, "%.*s\n", 32, "NES020 Board ID");
2630 static DEVICE_ATTR(hw_rev
, S_IRUGO
, show_rev
, NULL
);
2631 static DEVICE_ATTR(hca_type
, S_IRUGO
, show_hca
, NULL
);
2632 static DEVICE_ATTR(board_id
, S_IRUGO
, show_board
, NULL
);
2634 static struct device_attribute
*nes_dev_attributes
[] = {
2644 static int nes_query_qp(struct ib_qp
*ibqp
, struct ib_qp_attr
*attr
,
2645 int attr_mask
, struct ib_qp_init_attr
*init_attr
)
2647 struct nes_qp
*nesqp
= to_nesqp(ibqp
);
2649 nes_debug(NES_DBG_QP
, "\n");
2651 attr
->qp_access_flags
= 0;
2652 attr
->cap
.max_send_wr
= nesqp
->hwqp
.sq_size
;
2653 attr
->cap
.max_recv_wr
= nesqp
->hwqp
.rq_size
;
2654 attr
->cap
.max_recv_sge
= 1;
2655 if (nes_drv_opt
& NES_DRV_OPT_NO_INLINE_DATA
)
2656 attr
->cap
.max_inline_data
= 0;
2658 attr
->cap
.max_inline_data
= 64;
2660 init_attr
->event_handler
= nesqp
->ibqp
.event_handler
;
2661 init_attr
->qp_context
= nesqp
->ibqp
.qp_context
;
2662 init_attr
->send_cq
= nesqp
->ibqp
.send_cq
;
2663 init_attr
->recv_cq
= nesqp
->ibqp
.recv_cq
;
2664 init_attr
->srq
= nesqp
->ibqp
.srq
;
2665 init_attr
->cap
= attr
->cap
;
2674 int nes_hw_modify_qp(struct nes_device
*nesdev
, struct nes_qp
*nesqp
,
2675 u32 next_iwarp_state
, u32 termlen
, u32 wait_completion
)
2677 struct nes_hw_cqp_wqe
*cqp_wqe
;
2678 /* struct iw_cm_id *cm_id = nesqp->cm_id; */
2679 /* struct iw_cm_event cm_event; */
2680 struct nes_cqp_request
*cqp_request
;
2684 nes_debug(NES_DBG_MOD_QP
, "QP%u, refcount=%d\n",
2685 nesqp
->hwqp
.qp_id
, atomic_read(&nesqp
->refcount
));
2687 cqp_request
= nes_get_cqp_request(nesdev
);
2688 if (cqp_request
== NULL
) {
2689 nes_debug(NES_DBG_MOD_QP
, "Failed to get a cqp_request.\n");
2692 if (wait_completion
) {
2693 cqp_request
->waiting
= 1;
2695 cqp_request
->waiting
= 0;
2697 cqp_wqe
= &cqp_request
->cqp_wqe
;
2699 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_OPCODE_IDX
,
2700 NES_CQP_MODIFY_QP
| NES_CQP_QP_TYPE_IWARP
| next_iwarp_state
);
2701 nes_debug(NES_DBG_MOD_QP
, "using next_iwarp_state=%08x, wqe_words=%08x\n",
2702 next_iwarp_state
, le32_to_cpu(cqp_wqe
->wqe_words
[NES_CQP_WQE_OPCODE_IDX
]));
2703 nes_fill_init_cqp_wqe(cqp_wqe
, nesdev
);
2704 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_WQE_ID_IDX
, nesqp
->hwqp
.qp_id
);
2705 set_wqe_64bit_value(cqp_wqe
->wqe_words
, NES_CQP_QP_WQE_CONTEXT_LOW_IDX
, (u64
)nesqp
->nesqp_context_pbase
);
2707 /* If sending a terminate message, fill in the length (in words) */
2708 if (((next_iwarp_state
& NES_CQP_QP_IWARP_STATE_MASK
) == NES_CQP_QP_IWARP_STATE_TERMINATE
) &&
2709 !(next_iwarp_state
& NES_CQP_QP_TERM_DONT_SEND_TERM_MSG
)) {
2710 termlen
= ((termlen
+ 3) >> 2) << NES_CQP_OP_TERMLEN_SHIFT
;
2711 set_wqe_32bit_value(cqp_wqe
->wqe_words
, NES_CQP_QP_WQE_NEW_MSS_IDX
, termlen
);
2714 atomic_set(&cqp_request
->refcount
, 2);
2715 nes_post_cqp_request(nesdev
, cqp_request
);
2718 if (wait_completion
) {
2719 /* nes_debug(NES_DBG_MOD_QP, "Waiting for modify iWARP QP%u to complete.\n",
2720 nesqp->hwqp.qp_id); */
2721 ret
= wait_event_timeout(cqp_request
->waitq
, (cqp_request
->request_done
!= 0),
2723 nes_debug(NES_DBG_MOD_QP
, "Modify iwarp QP%u completed, wait_event_timeout ret=%u, "
2724 "CQP Major:Minor codes = 0x%04X:0x%04X.\n",
2725 nesqp
->hwqp
.qp_id
, ret
, cqp_request
->major_code
, cqp_request
->minor_code
);
2726 major_code
= cqp_request
->major_code
;
2728 nes_debug(NES_DBG_MOD_QP
, "Modify iwarp QP%u failed"
2729 "CQP Major:Minor codes = 0x%04X:0x%04X, intended next state = 0x%08X.\n",
2730 nesqp
->hwqp
.qp_id
, cqp_request
->major_code
,
2731 cqp_request
->minor_code
, next_iwarp_state
);
2734 nes_put_cqp_request(nesdev
, cqp_request
);
2738 else if (major_code
)
2751 int nes_modify_qp(struct ib_qp
*ibqp
, struct ib_qp_attr
*attr
,
2752 int attr_mask
, struct ib_udata
*udata
)
2754 struct nes_qp
*nesqp
= to_nesqp(ibqp
);
2755 struct nes_vnic
*nesvnic
= to_nesvnic(ibqp
->device
);
2756 struct nes_device
*nesdev
= nesvnic
->nesdev
;
2759 u32 next_iwarp_state
= 0;
2761 unsigned long qplockflags
;
2763 u16 original_last_aeq
;
2764 u8 issue_modify_qp
= 0;
2767 nes_debug(NES_DBG_MOD_QP
, "QP%u: QP State=%u, cur QP State=%u,"
2768 " iwarp_state=0x%X, refcount=%d\n",
2769 nesqp
->hwqp
.qp_id
, attr
->qp_state
, nesqp
->ibqp_state
,
2770 nesqp
->iwarp_state
, atomic_read(&nesqp
->refcount
));
2772 spin_lock_irqsave(&nesqp
->lock
, qplockflags
);
2774 nes_debug(NES_DBG_MOD_QP
, "QP%u: hw_iwarp_state=0x%X, hw_tcp_state=0x%X,"
2775 " QP Access Flags=0x%X, attr_mask = 0x%0x\n",
2776 nesqp
->hwqp
.qp_id
, nesqp
->hw_iwarp_state
,
2777 nesqp
->hw_tcp_state
, attr
->qp_access_flags
, attr_mask
);
2779 if (attr_mask
& IB_QP_STATE
) {
2780 switch (attr
->qp_state
) {
2782 nes_debug(NES_DBG_MOD_QP
, "QP%u: new state = init\n",
2784 if (nesqp
->iwarp_state
> (u32
)NES_CQP_QP_IWARP_STATE_IDLE
) {
2785 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2788 next_iwarp_state
= NES_CQP_QP_IWARP_STATE_IDLE
;
2789 issue_modify_qp
= 1;
2792 nes_debug(NES_DBG_MOD_QP
, "QP%u: new state = rtr\n",
2794 if (nesqp
->iwarp_state
>(u32
)NES_CQP_QP_IWARP_STATE_IDLE
) {
2795 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2798 next_iwarp_state
= NES_CQP_QP_IWARP_STATE_IDLE
;
2799 issue_modify_qp
= 1;
2802 nes_debug(NES_DBG_MOD_QP
, "QP%u: new state = rts\n",
2804 if (nesqp
->iwarp_state
>(u32
)NES_CQP_QP_IWARP_STATE_RTS
) {
2805 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2808 if (nesqp
->cm_id
== NULL
) {
2809 nes_debug(NES_DBG_MOD_QP
, "QP%u: Failing attempt to move QP to RTS without a CM_ID. \n",
2810 nesqp
->hwqp
.qp_id
);
2811 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2814 next_iwarp_state
= NES_CQP_QP_IWARP_STATE_RTS
;
2815 if (nesqp
->iwarp_state
!= NES_CQP_QP_IWARP_STATE_RTS
)
2816 next_iwarp_state
|= NES_CQP_QP_CONTEXT_VALID
|
2817 NES_CQP_QP_ARP_VALID
| NES_CQP_QP_ORD_VALID
;
2818 issue_modify_qp
= 1;
2819 nesqp
->hw_tcp_state
= NES_AEQE_TCP_STATE_ESTABLISHED
;
2820 nesqp
->hw_iwarp_state
= NES_AEQE_IWARP_STATE_RTS
;
2821 nesqp
->hte_added
= 1;
2824 issue_modify_qp
= 1;
2825 nes_debug(NES_DBG_MOD_QP
, "QP%u: new state=closing. SQ head=%u, SQ tail=%u\n",
2826 nesqp
->hwqp
.qp_id
, nesqp
->hwqp
.sq_head
, nesqp
->hwqp
.sq_tail
);
2827 if (nesqp
->iwarp_state
== (u32
)NES_CQP_QP_IWARP_STATE_CLOSING
) {
2828 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2831 if (nesqp
->iwarp_state
> (u32
)NES_CQP_QP_IWARP_STATE_CLOSING
) {
2832 nes_debug(NES_DBG_MOD_QP
, "QP%u: State change to closing"
2833 " ignored due to current iWARP state\n",
2835 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2838 if (nesqp
->hw_iwarp_state
!= NES_AEQE_IWARP_STATE_RTS
) {
2839 nes_debug(NES_DBG_MOD_QP
, "QP%u: State change to closing"
2840 " already done based on hw state.\n",
2842 issue_modify_qp
= 0;
2844 switch (nesqp
->hw_iwarp_state
) {
2845 case NES_AEQE_IWARP_STATE_CLOSING
:
2846 next_iwarp_state
= NES_CQP_QP_IWARP_STATE_CLOSING
;
2848 case NES_AEQE_IWARP_STATE_TERMINATE
:
2849 next_iwarp_state
= NES_CQP_QP_IWARP_STATE_TERMINATE
;
2851 case NES_AEQE_IWARP_STATE_ERROR
:
2852 next_iwarp_state
= NES_CQP_QP_IWARP_STATE_ERROR
;
2855 next_iwarp_state
= NES_CQP_QP_IWARP_STATE_CLOSING
;
2856 nesqp
->hw_iwarp_state
= NES_AEQE_IWARP_STATE_CLOSING
;
2862 nes_debug(NES_DBG_MOD_QP
, "QP%u: new state = terminate\n",
2864 if (nesqp
->iwarp_state
>=(u32
)NES_CQP_QP_IWARP_STATE_TERMINATE
) {
2865 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2868 /* next_iwarp_state = (NES_CQP_QP_IWARP_STATE_TERMINATE | 0x02000000); */
2869 next_iwarp_state
= NES_CQP_QP_IWARP_STATE_TERMINATE
;
2870 nesqp
->hw_iwarp_state
= NES_AEQE_IWARP_STATE_TERMINATE
;
2871 issue_modify_qp
= 1;
2875 if (nesqp
->iwarp_state
== (u32
)NES_CQP_QP_IWARP_STATE_ERROR
) {
2876 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2879 nes_debug(NES_DBG_MOD_QP
, "QP%u: new state = error\n",
2881 if (nesqp
->term_flags
)
2882 del_timer(&nesqp
->terminate_timer
);
2884 next_iwarp_state
= NES_CQP_QP_IWARP_STATE_ERROR
;
2885 /* next_iwarp_state = (NES_CQP_QP_IWARP_STATE_TERMINATE | 0x02000000); */
2886 if (nesqp
->hte_added
) {
2887 nes_debug(NES_DBG_MOD_QP
, "set CQP_QP_DEL_HTE\n");
2888 next_iwarp_state
|= NES_CQP_QP_DEL_HTE
;
2889 nesqp
->hte_added
= 0;
2891 if ((nesqp
->hw_tcp_state
> NES_AEQE_TCP_STATE_CLOSED
) &&
2892 (nesdev
->iw_status
) &&
2893 (nesqp
->hw_tcp_state
!= NES_AEQE_TCP_STATE_TIME_WAIT
)) {
2894 next_iwarp_state
|= NES_CQP_QP_RESET
;
2896 nes_debug(NES_DBG_MOD_QP
, "QP%u NOT setting NES_CQP_QP_RESET since TCP state = %u\n",
2897 nesqp
->hwqp
.qp_id
, nesqp
->hw_tcp_state
);
2900 issue_modify_qp
= 1;
2901 nesqp
->hw_iwarp_state
= NES_AEQE_IWARP_STATE_ERROR
;
2904 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2909 nesqp
->ibqp_state
= attr
->qp_state
;
2910 nesqp
->iwarp_state
= next_iwarp_state
& NES_CQP_QP_IWARP_STATE_MASK
;
2911 nes_debug(NES_DBG_MOD_QP
, "Change nesqp->iwarp_state=%08x\n",
2912 nesqp
->iwarp_state
);
2915 if (attr_mask
& IB_QP_ACCESS_FLAGS
) {
2916 if (attr
->qp_access_flags
& IB_ACCESS_LOCAL_WRITE
) {
2917 nesqp
->nesqp_context
->misc
|= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_WRITE_EN
|
2918 NES_QPCONTEXT_MISC_RDMA_READ_EN
);
2919 issue_modify_qp
= 1;
2921 if (attr
->qp_access_flags
& IB_ACCESS_REMOTE_WRITE
) {
2922 nesqp
->nesqp_context
->misc
|= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_WRITE_EN
);
2923 issue_modify_qp
= 1;
2925 if (attr
->qp_access_flags
& IB_ACCESS_REMOTE_READ
) {
2926 nesqp
->nesqp_context
->misc
|= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_READ_EN
);
2927 issue_modify_qp
= 1;
2929 if (attr
->qp_access_flags
& IB_ACCESS_MW_BIND
) {
2930 nesqp
->nesqp_context
->misc
|= cpu_to_le32(NES_QPCONTEXT_MISC_WBIND_EN
);
2931 issue_modify_qp
= 1;
2934 if (nesqp
->user_mode
) {
2935 nesqp
->nesqp_context
->misc
|= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_WRITE_EN
|
2936 NES_QPCONTEXT_MISC_RDMA_READ_EN
);
2937 issue_modify_qp
= 1;
2941 original_last_aeq
= nesqp
->last_aeq
;
2942 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2944 nes_debug(NES_DBG_MOD_QP
, "issue_modify_qp=%u\n", issue_modify_qp
);
2949 if (issue_modify_qp
) {
2950 nes_debug(NES_DBG_MOD_QP
, "call nes_hw_modify_qp\n");
2951 ret
= nes_hw_modify_qp(nesdev
, nesqp
, next_iwarp_state
, 0, 1);
2953 nes_debug(NES_DBG_MOD_QP
, "nes_hw_modify_qp (next_iwarp_state = 0x%08X)"
2954 " failed for QP%u.\n",
2955 next_iwarp_state
, nesqp
->hwqp
.qp_id
);
2959 if ((issue_modify_qp
) && (nesqp
->ibqp_state
> IB_QPS_RTS
)) {
2960 nes_debug(NES_DBG_MOD_QP
, "QP%u Issued ModifyQP refcount (%d),"
2961 " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
2962 nesqp
->hwqp
.qp_id
, atomic_read(&nesqp
->refcount
),
2963 original_last_aeq
, nesqp
->last_aeq
);
2964 if (!ret
|| original_last_aeq
!= NES_AEQE_AEID_RDMAP_ROE_BAD_LLP_CLOSE
) {
2966 if (nesqp
->cm_id
&& nesqp
->hw_tcp_state
!= 0) {
2967 nes_debug(NES_DBG_MOD_QP
, "QP%u Queuing fake disconnect for QP refcount (%d),"
2968 " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
2969 nesqp
->hwqp
.qp_id
, atomic_read(&nesqp
->refcount
),
2970 original_last_aeq
, nesqp
->last_aeq
);
2971 /* this one is for the cm_disconnect thread */
2972 spin_lock_irqsave(&nesqp
->lock
, qplockflags
);
2973 nesqp
->hw_tcp_state
= NES_AEQE_TCP_STATE_CLOSED
;
2974 nesqp
->last_aeq
= NES_AEQE_AEID_RESET_SENT
;
2975 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2976 nes_cm_disconn(nesqp
);
2978 nes_debug(NES_DBG_MOD_QP
, "QP%u No fake disconnect, QP refcount=%d\n",
2979 nesqp
->hwqp
.qp_id
, atomic_read(&nesqp
->refcount
));
2982 spin_lock_irqsave(&nesqp
->lock
, qplockflags
);
2984 /* These two are for the timer thread */
2985 if (atomic_inc_return(&nesqp
->close_timer_started
) == 1) {
2986 nesqp
->cm_id
->add_ref(nesqp
->cm_id
);
2987 nes_debug(NES_DBG_MOD_QP
, "QP%u Not decrementing QP refcount (%d),"
2988 " need ae to finish up, original_last_aeq = 0x%04X."
2989 " last_aeq = 0x%04X, scheduling timer.\n",
2990 nesqp
->hwqp
.qp_id
, atomic_read(&nesqp
->refcount
),
2991 original_last_aeq
, nesqp
->last_aeq
);
2992 schedule_nes_timer(nesqp
->cm_node
, (struct sk_buff
*) nesqp
, NES_TIMER_TYPE_CLOSE
, 1, 0);
2994 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2996 spin_unlock_irqrestore(&nesqp
->lock
, qplockflags
);
2997 nes_debug(NES_DBG_MOD_QP
, "QP%u Not decrementing QP refcount (%d),"
2998 " need ae to finish up, original_last_aeq = 0x%04X."
2999 " last_aeq = 0x%04X.\n",
3000 nesqp
->hwqp
.qp_id
, atomic_read(&nesqp
->refcount
),
3001 original_last_aeq
, nesqp
->last_aeq
);
3005 nes_debug(NES_DBG_MOD_QP
, "QP%u Decrementing QP refcount (%d), No ae to finish up,"
3006 " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
3007 nesqp
->hwqp
.qp_id
, atomic_read(&nesqp
->refcount
),
3008 original_last_aeq
, nesqp
->last_aeq
);
3011 nes_debug(NES_DBG_MOD_QP
, "QP%u Decrementing QP refcount (%d), No ae to finish up,"
3012 " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
3013 nesqp
->hwqp
.qp_id
, atomic_read(&nesqp
->refcount
),
3014 original_last_aeq
, nesqp
->last_aeq
);
3019 nes_debug(NES_DBG_MOD_QP
, "QP%u Leaving, refcount=%d\n",
3020 nesqp
->hwqp
.qp_id
, atomic_read(&nesqp
->refcount
));
3027 * nes_muticast_attach
3029 static int nes_multicast_attach(struct ib_qp
*ibqp
, union ib_gid
*gid
, u16 lid
)
3031 nes_debug(NES_DBG_INIT
, "\n");
3037 * nes_multicast_detach
3039 static int nes_multicast_detach(struct ib_qp
*ibqp
, union ib_gid
*gid
, u16 lid
)
3041 nes_debug(NES_DBG_INIT
, "\n");
3049 static int nes_process_mad(struct ib_device
*ibdev
, int mad_flags
,
3050 u8 port_num
, const struct ib_wc
*in_wc
, const struct ib_grh
*in_grh
,
3051 const struct ib_mad_hdr
*in
, size_t in_mad_size
,
3052 struct ib_mad_hdr
*out
, size_t *out_mad_size
,
3053 u16
*out_mad_pkey_index
)
3055 nes_debug(NES_DBG_INIT
, "\n");
3060 fill_wqe_sg_send(struct nes_hw_qp_wqe
*wqe
, struct ib_send_wr
*ib_wr
, u32 uselkey
)
3063 int total_payload_length
= 0;
3064 for (sge_index
= 0; sge_index
< ib_wr
->num_sge
; sge_index
++) {
3065 set_wqe_64bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_FRAG0_LOW_IDX
+(sge_index
*4),
3066 ib_wr
->sg_list
[sge_index
].addr
);
3067 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_LENGTH0_IDX
+ (sge_index
*4),
3068 ib_wr
->sg_list
[sge_index
].length
);
3070 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_STAG0_IDX
+ (sge_index
*4),
3071 (ib_wr
->sg_list
[sge_index
].lkey
));
3073 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_STAG0_IDX
+ (sge_index
*4), 0);
3075 total_payload_length
+= ib_wr
->sg_list
[sge_index
].length
;
3077 nes_debug(NES_DBG_IW_TX
, "UC UC UC, sending total_payload_length=%u \n",
3078 total_payload_length
);
3079 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX
,
3080 total_payload_length
);
3086 static int nes_post_send(struct ib_qp
*ibqp
, struct ib_send_wr
*ib_wr
,
3087 struct ib_send_wr
**bad_wr
)
3090 unsigned long flags
= 0;
3091 struct nes_vnic
*nesvnic
= to_nesvnic(ibqp
->device
);
3092 struct nes_device
*nesdev
= nesvnic
->nesdev
;
3093 struct nes_qp
*nesqp
= to_nesqp(ibqp
);
3094 struct nes_hw_qp_wqe
*wqe
;
3096 u32 qsize
= nesqp
->hwqp
.sq_size
;
3102 if (nesqp
->ibqp_state
> IB_QPS_RTS
) {
3107 spin_lock_irqsave(&nesqp
->lock
, flags
);
3109 head
= nesqp
->hwqp
.sq_head
;
3112 /* Check for QP error */
3113 if (nesqp
->term_flags
) {
3118 /* Check for SQ overflow */
3119 if (((head
+ (2 * qsize
) - nesqp
->hwqp
.sq_tail
) % qsize
) == (qsize
- 1)) {
3124 wqe
= &nesqp
->hwqp
.sq_vbase
[head
];
3125 /* nes_debug(NES_DBG_IW_TX, "processing sq wqe for QP%u at %p, head = %u.\n",
3126 nesqp->hwqp.qp_id, wqe, head); */
3127 nes_fill_init_qp_wqe(wqe
, nesqp
, head
);
3128 u64temp
= (u64
)(ib_wr
->wr_id
);
3129 set_wqe_64bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_COMP_SCRATCH_LOW_IDX
,
3131 switch (ib_wr
->opcode
) {
3133 case IB_WR_SEND_WITH_INV
:
3134 if (IB_WR_SEND
== ib_wr
->opcode
) {
3135 if (ib_wr
->send_flags
& IB_SEND_SOLICITED
)
3136 wqe_misc
= NES_IWARP_SQ_OP_SENDSE
;
3138 wqe_misc
= NES_IWARP_SQ_OP_SEND
;
3140 if (ib_wr
->send_flags
& IB_SEND_SOLICITED
)
3141 wqe_misc
= NES_IWARP_SQ_OP_SENDSEINV
;
3143 wqe_misc
= NES_IWARP_SQ_OP_SENDINV
;
3145 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_INV_STAG_LOW_IDX
,
3146 ib_wr
->ex
.invalidate_rkey
);
3149 if (ib_wr
->num_sge
> nesdev
->nesadapter
->max_sge
) {
3154 if (ib_wr
->send_flags
& IB_SEND_FENCE
)
3155 wqe_misc
|= NES_IWARP_SQ_WQE_LOCAL_FENCE
;
3157 if ((ib_wr
->send_flags
& IB_SEND_INLINE
) &&
3158 ((nes_drv_opt
& NES_DRV_OPT_NO_INLINE_DATA
) == 0) &&
3159 (ib_wr
->sg_list
[0].length
<= 64)) {
3160 memcpy(&wqe
->wqe_words
[NES_IWARP_SQ_WQE_IMM_DATA_START_IDX
],
3161 (void *)(unsigned long)ib_wr
->sg_list
[0].addr
, ib_wr
->sg_list
[0].length
);
3162 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX
,
3163 ib_wr
->sg_list
[0].length
);
3164 wqe_misc
|= NES_IWARP_SQ_WQE_IMM_DATA
;
3166 fill_wqe_sg_send(wqe
, ib_wr
, 1);
3170 case IB_WR_RDMA_WRITE
:
3171 wqe_misc
= NES_IWARP_SQ_OP_RDMAW
;
3172 if (ib_wr
->num_sge
> nesdev
->nesadapter
->max_sge
) {
3173 nes_debug(NES_DBG_IW_TX
, "Exceeded max sge, ib_wr=%u, max=%u\n",
3174 ib_wr
->num_sge
, nesdev
->nesadapter
->max_sge
);
3179 if (ib_wr
->send_flags
& IB_SEND_FENCE
)
3180 wqe_misc
|= NES_IWARP_SQ_WQE_LOCAL_FENCE
;
3182 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_RDMA_STAG_IDX
,
3183 rdma_wr(ib_wr
)->rkey
);
3184 set_wqe_64bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_RDMA_TO_LOW_IDX
,
3185 rdma_wr(ib_wr
)->remote_addr
);
3187 if ((ib_wr
->send_flags
& IB_SEND_INLINE
) &&
3188 ((nes_drv_opt
& NES_DRV_OPT_NO_INLINE_DATA
) == 0) &&
3189 (ib_wr
->sg_list
[0].length
<= 64)) {
3190 memcpy(&wqe
->wqe_words
[NES_IWARP_SQ_WQE_IMM_DATA_START_IDX
],
3191 (void *)(unsigned long)ib_wr
->sg_list
[0].addr
, ib_wr
->sg_list
[0].length
);
3192 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX
,
3193 ib_wr
->sg_list
[0].length
);
3194 wqe_misc
|= NES_IWARP_SQ_WQE_IMM_DATA
;
3196 fill_wqe_sg_send(wqe
, ib_wr
, 1);
3199 wqe
->wqe_words
[NES_IWARP_SQ_WQE_RDMA_LENGTH_IDX
] =
3200 wqe
->wqe_words
[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX
];
3202 case IB_WR_RDMA_READ
:
3203 case IB_WR_RDMA_READ_WITH_INV
:
3204 /* iWARP only supports 1 sge for RDMA reads */
3205 if (ib_wr
->num_sge
> 1) {
3206 nes_debug(NES_DBG_IW_TX
, "Exceeded max sge, ib_wr=%u, max=1\n",
3211 if (ib_wr
->opcode
== IB_WR_RDMA_READ
) {
3212 wqe_misc
= NES_IWARP_SQ_OP_RDMAR
;
3214 wqe_misc
= NES_IWARP_SQ_OP_RDMAR_LOCINV
;
3215 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_INV_STAG_LOW_IDX
,
3216 ib_wr
->ex
.invalidate_rkey
);
3219 set_wqe_64bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_RDMA_TO_LOW_IDX
,
3220 rdma_wr(ib_wr
)->remote_addr
);
3221 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_RDMA_STAG_IDX
,
3222 rdma_wr(ib_wr
)->rkey
);
3223 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_RDMA_LENGTH_IDX
,
3224 ib_wr
->sg_list
->length
);
3225 set_wqe_64bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_FRAG0_LOW_IDX
,
3226 ib_wr
->sg_list
->addr
);
3227 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_STAG0_IDX
,
3228 ib_wr
->sg_list
->lkey
);
3230 case IB_WR_LOCAL_INV
:
3231 wqe_misc
= NES_IWARP_SQ_OP_LOCINV
;
3232 set_wqe_32bit_value(wqe
->wqe_words
,
3233 NES_IWARP_SQ_LOCINV_WQE_INV_STAG_IDX
,
3234 ib_wr
->ex
.invalidate_rkey
);
3238 struct nes_mr
*mr
= to_nesmr(reg_wr(ib_wr
)->mr
);
3239 int page_shift
= ilog2(reg_wr(ib_wr
)->mr
->page_size
);
3240 int flags
= reg_wr(ib_wr
)->access
;
3242 if (mr
->npages
> (NES_4K_PBL_CHUNK_SIZE
/ sizeof(u64
))) {
3243 nes_debug(NES_DBG_IW_TX
, "SQ_FMR: bad page_list_len\n");
3247 wqe_misc
= NES_IWARP_SQ_OP_FAST_REG
;
3248 set_wqe_64bit_value(wqe
->wqe_words
,
3249 NES_IWARP_SQ_FMR_WQE_VA_FBO_LOW_IDX
,
3251 set_wqe_32bit_value(wqe
->wqe_words
,
3252 NES_IWARP_SQ_FMR_WQE_LENGTH_LOW_IDX
,
3254 set_wqe_32bit_value(wqe
->wqe_words
,
3255 NES_IWARP_SQ_FMR_WQE_LENGTH_HIGH_IDX
, 0);
3256 set_wqe_32bit_value(wqe
->wqe_words
,
3257 NES_IWARP_SQ_FMR_WQE_MR_STAG_IDX
,
3258 reg_wr(ib_wr
)->key
);
3260 if (page_shift
== 12) {
3261 wqe_misc
|= NES_IWARP_SQ_FMR_WQE_PAGE_SIZE_4K
;
3262 } else if (page_shift
== 21) {
3263 wqe_misc
|= NES_IWARP_SQ_FMR_WQE_PAGE_SIZE_2M
;
3265 nes_debug(NES_DBG_IW_TX
, "Invalid page shift,"
3266 " ib_wr=%u, max=1\n", ib_wr
->num_sge
);
3271 /* Set access_flags */
3272 wqe_misc
|= NES_IWARP_SQ_FMR_WQE_RIGHTS_ENABLE_LOCAL_READ
;
3273 if (flags
& IB_ACCESS_LOCAL_WRITE
)
3274 wqe_misc
|= NES_IWARP_SQ_FMR_WQE_RIGHTS_ENABLE_LOCAL_WRITE
;
3276 if (flags
& IB_ACCESS_REMOTE_WRITE
)
3277 wqe_misc
|= NES_IWARP_SQ_FMR_WQE_RIGHTS_ENABLE_REMOTE_WRITE
;
3279 if (flags
& IB_ACCESS_REMOTE_READ
)
3280 wqe_misc
|= NES_IWARP_SQ_FMR_WQE_RIGHTS_ENABLE_REMOTE_READ
;
3282 if (flags
& IB_ACCESS_MW_BIND
)
3283 wqe_misc
|= NES_IWARP_SQ_FMR_WQE_RIGHTS_ENABLE_WINDOW_BIND
;
3285 /* Fill in PBL info: */
3286 set_wqe_64bit_value(wqe
->wqe_words
,
3287 NES_IWARP_SQ_FMR_WQE_PBL_ADDR_LOW_IDX
,
3290 set_wqe_32bit_value(wqe
->wqe_words
,
3291 NES_IWARP_SQ_FMR_WQE_PBL_LENGTH_IDX
,
3294 nes_debug(NES_DBG_IW_TX
, "SQ_REG_MR: iova_start: %llx, "
3295 "length: %d, rkey: %0x, pgl_paddr: %llx, "
3296 "page_list_len: %u, wqe_misc: %x\n",
3297 (unsigned long long) mr
->ibmr
.iova
,
3300 (unsigned long long) mr
->paddr
,
3314 if ((ib_wr
->send_flags
& IB_SEND_SIGNALED
) || nesqp
->sig_all
)
3315 wqe_misc
|= NES_IWARP_SQ_WQE_SIGNALED_COMPL
;
3317 wqe
->wqe_words
[NES_IWARP_SQ_WQE_MISC_IDX
] = cpu_to_le32(wqe_misc
);
3319 ib_wr
= ib_wr
->next
;
3327 nesqp
->hwqp
.sq_head
= head
;
3330 counter
= min(wqe_count
, ((u32
)255));
3331 wqe_count
-= counter
;
3332 nes_write32(nesdev
->regs
+ NES_WQE_ALLOC
,
3333 (counter
<< 24) | 0x00800000 | nesqp
->hwqp
.qp_id
);
3336 spin_unlock_irqrestore(&nesqp
->lock
, flags
);
3348 static int nes_post_recv(struct ib_qp
*ibqp
, struct ib_recv_wr
*ib_wr
,
3349 struct ib_recv_wr
**bad_wr
)
3352 unsigned long flags
= 0;
3353 struct nes_vnic
*nesvnic
= to_nesvnic(ibqp
->device
);
3354 struct nes_device
*nesdev
= nesvnic
->nesdev
;
3355 struct nes_qp
*nesqp
= to_nesqp(ibqp
);
3356 struct nes_hw_qp_wqe
*wqe
;
3359 u32 qsize
= nesqp
->hwqp
.rq_size
;
3363 u32 total_payload_length
;
3365 if (nesqp
->ibqp_state
> IB_QPS_RTS
) {
3370 spin_lock_irqsave(&nesqp
->lock
, flags
);
3372 head
= nesqp
->hwqp
.rq_head
;
3375 /* Check for QP error */
3376 if (nesqp
->term_flags
) {
3381 if (ib_wr
->num_sge
> nesdev
->nesadapter
->max_sge
) {
3385 /* Check for RQ overflow */
3386 if (((head
+ (2 * qsize
) - nesqp
->hwqp
.rq_tail
) % qsize
) == (qsize
- 1)) {
3391 nes_debug(NES_DBG_IW_RX
, "ibwr sge count = %u.\n", ib_wr
->num_sge
);
3392 wqe
= &nesqp
->hwqp
.rq_vbase
[head
];
3394 /* nes_debug(NES_DBG_IW_RX, "QP%u:processing rq wqe at %p, head = %u.\n",
3395 nesqp->hwqp.qp_id, wqe, head); */
3396 nes_fill_init_qp_wqe(wqe
, nesqp
, head
);
3397 u64temp
= (u64
)(ib_wr
->wr_id
);
3398 set_wqe_64bit_value(wqe
->wqe_words
, NES_IWARP_SQ_WQE_COMP_SCRATCH_LOW_IDX
,
3400 total_payload_length
= 0;
3401 for (sge_index
=0; sge_index
< ib_wr
->num_sge
; sge_index
++) {
3402 set_wqe_64bit_value(wqe
->wqe_words
, NES_IWARP_RQ_WQE_FRAG0_LOW_IDX
+(sge_index
*4),
3403 ib_wr
->sg_list
[sge_index
].addr
);
3404 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_RQ_WQE_LENGTH0_IDX
+(sge_index
*4),
3405 ib_wr
->sg_list
[sge_index
].length
);
3406 set_wqe_32bit_value(wqe
->wqe_words
,NES_IWARP_RQ_WQE_STAG0_IDX
+(sge_index
*4),
3407 ib_wr
->sg_list
[sge_index
].lkey
);
3409 total_payload_length
+= ib_wr
->sg_list
[sge_index
].length
;
3411 set_wqe_32bit_value(wqe
->wqe_words
, NES_IWARP_RQ_WQE_TOTAL_PAYLOAD_IDX
,
3412 total_payload_length
);
3414 ib_wr
= ib_wr
->next
;
3421 nesqp
->hwqp
.rq_head
= head
;
3424 counter
= min(wqe_count
, ((u32
)255));
3425 wqe_count
-= counter
;
3426 nes_write32(nesdev
->regs
+NES_WQE_ALLOC
, (counter
<<24) | nesqp
->hwqp
.qp_id
);
3429 spin_unlock_irqrestore(&nesqp
->lock
, flags
);
3438 * nes_drain_sq - drain sq
3439 * @ibqp: pointer to ibqp
3441 static void nes_drain_sq(struct ib_qp
*ibqp
)
3443 struct nes_qp
*nesqp
= to_nesqp(ibqp
);
3445 if (nesqp
->hwqp
.sq_tail
!= nesqp
->hwqp
.sq_head
)
3446 wait_for_completion(&nesqp
->sq_drained
);
3450 * nes_drain_rq - drain rq
3451 * @ibqp: pointer to ibqp
3453 static void nes_drain_rq(struct ib_qp
*ibqp
)
3455 struct nes_qp
*nesqp
= to_nesqp(ibqp
);
3457 if (nesqp
->hwqp
.rq_tail
!= nesqp
->hwqp
.rq_head
)
3458 wait_for_completion(&nesqp
->rq_drained
);
3464 static int nes_poll_cq(struct ib_cq
*ibcq
, int num_entries
, struct ib_wc
*entry
)
3468 unsigned long flags
= 0;
3469 struct nes_vnic
*nesvnic
= to_nesvnic(ibcq
->device
);
3470 struct nes_device
*nesdev
= nesvnic
->nesdev
;
3471 struct nes_cq
*nescq
= to_nescq(ibcq
);
3472 struct nes_qp
*nesqp
;
3473 struct nes_hw_cqe cqe
;
3480 u32 move_cq_head
= 1;
3483 nes_debug(NES_DBG_CQ
, "\n");
3485 spin_lock_irqsave(&nescq
->lock
, flags
);
3487 head
= nescq
->hw_cq
.cq_head
;
3488 cq_size
= nescq
->hw_cq
.cq_size
;
3490 while (cqe_count
< num_entries
) {
3491 if ((le32_to_cpu(nescq
->hw_cq
.cq_vbase
[head
].cqe_words
[NES_CQE_OPCODE_IDX
]) &
3492 NES_CQE_VALID
) == 0)
3496 * Make sure we read CQ entry contents *after*
3497 * we've checked the valid bit.
3501 cqe
= nescq
->hw_cq
.cq_vbase
[head
];
3502 u32temp
= le32_to_cpu(cqe
.cqe_words
[NES_CQE_COMP_COMP_CTX_LOW_IDX
]);
3503 wqe_index
= u32temp
& (nesdev
->nesadapter
->max_qp_wr
- 1);
3504 u32temp
&= ~(NES_SW_CONTEXT_ALIGN
-1);
3505 /* parse CQE, get completion context from WQE (either rq or sq) */
3506 u64temp
= (((u64
)(le32_to_cpu(cqe
.cqe_words
[NES_CQE_COMP_COMP_CTX_HIGH_IDX
])))<<32) |
3510 nesqp
= (struct nes_qp
*)(unsigned long)u64temp
;
3511 memset(entry
, 0, sizeof *entry
);
3512 if (cqe
.cqe_words
[NES_CQE_ERROR_CODE_IDX
] == 0) {
3513 entry
->status
= IB_WC_SUCCESS
;
3515 err_code
= le32_to_cpu(cqe
.cqe_words
[NES_CQE_ERROR_CODE_IDX
]);
3516 if (NES_IWARP_CQE_MAJOR_DRV
== (err_code
>> 16)) {
3517 entry
->status
= err_code
& 0x0000ffff;
3519 /* The rest of the cqe's will be marked as flushed */
3520 nescq
->hw_cq
.cq_vbase
[head
].cqe_words
[NES_CQE_ERROR_CODE_IDX
] =
3521 cpu_to_le32((NES_IWARP_CQE_MAJOR_FLUSH
<< 16) |
3522 NES_IWARP_CQE_MINOR_FLUSH
);
3524 entry
->status
= IB_WC_WR_FLUSH_ERR
;
3527 entry
->qp
= &nesqp
->ibqp
;
3528 entry
->src_qp
= nesqp
->hwqp
.qp_id
;
3530 if (le32_to_cpu(cqe
.cqe_words
[NES_CQE_OPCODE_IDX
]) & NES_CQE_SQ
) {
3531 if (nesqp
->skip_lsmm
) {
3532 nesqp
->skip_lsmm
= 0;
3533 nesqp
->hwqp
.sq_tail
++;
3536 /* Working on a SQ Completion*/
3537 wrid
= (((u64
)(cpu_to_le32((u32
)nesqp
->hwqp
.sq_vbase
[wqe_index
].
3538 wqe_words
[NES_IWARP_SQ_WQE_COMP_SCRATCH_HIGH_IDX
]))) << 32) |
3539 ((u64
)(cpu_to_le32((u32
)nesqp
->hwqp
.sq_vbase
[wqe_index
].
3540 wqe_words
[NES_IWARP_SQ_WQE_COMP_SCRATCH_LOW_IDX
])));
3541 entry
->byte_len
= le32_to_cpu(nesqp
->hwqp
.sq_vbase
[wqe_index
].
3542 wqe_words
[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX
]);
3544 switch (le32_to_cpu(nesqp
->hwqp
.sq_vbase
[wqe_index
].
3545 wqe_words
[NES_IWARP_SQ_WQE_MISC_IDX
]) & 0x3f) {
3546 case NES_IWARP_SQ_OP_RDMAW
:
3547 nes_debug(NES_DBG_CQ
, "Operation = RDMA WRITE.\n");
3548 entry
->opcode
= IB_WC_RDMA_WRITE
;
3550 case NES_IWARP_SQ_OP_RDMAR
:
3551 nes_debug(NES_DBG_CQ
, "Operation = RDMA READ.\n");
3552 entry
->opcode
= IB_WC_RDMA_READ
;
3553 entry
->byte_len
= le32_to_cpu(nesqp
->hwqp
.sq_vbase
[wqe_index
].
3554 wqe_words
[NES_IWARP_SQ_WQE_RDMA_LENGTH_IDX
]);
3556 case NES_IWARP_SQ_OP_SENDINV
:
3557 case NES_IWARP_SQ_OP_SENDSEINV
:
3558 case NES_IWARP_SQ_OP_SEND
:
3559 case NES_IWARP_SQ_OP_SENDSE
:
3560 nes_debug(NES_DBG_CQ
, "Operation = Send.\n");
3561 entry
->opcode
= IB_WC_SEND
;
3563 case NES_IWARP_SQ_OP_LOCINV
:
3564 entry
->opcode
= IB_WC_LOCAL_INV
;
3566 case NES_IWARP_SQ_OP_FAST_REG
:
3567 entry
->opcode
= IB_WC_REG_MR
;
3571 nesqp
->hwqp
.sq_tail
= (wqe_index
+1)&(nesqp
->hwqp
.sq_size
- 1);
3572 if ((entry
->status
!= IB_WC_SUCCESS
) && (nesqp
->hwqp
.sq_tail
!= nesqp
->hwqp
.sq_head
)) {
3574 wq_tail
= nesqp
->hwqp
.sq_tail
;
3577 /* Working on a RQ Completion*/
3578 entry
->byte_len
= le32_to_cpu(cqe
.cqe_words
[NES_CQE_PAYLOAD_LENGTH_IDX
]);
3579 wrid
= ((u64
)(le32_to_cpu(nesqp
->hwqp
.rq_vbase
[wqe_index
].wqe_words
[NES_IWARP_RQ_WQE_COMP_SCRATCH_LOW_IDX
]))) |
3580 ((u64
)(le32_to_cpu(nesqp
->hwqp
.rq_vbase
[wqe_index
].wqe_words
[NES_IWARP_RQ_WQE_COMP_SCRATCH_HIGH_IDX
]))<<32);
3581 entry
->opcode
= IB_WC_RECV
;
3583 nesqp
->hwqp
.rq_tail
= (wqe_index
+1)&(nesqp
->hwqp
.rq_size
- 1);
3584 if ((entry
->status
!= IB_WC_SUCCESS
) && (nesqp
->hwqp
.rq_tail
!= nesqp
->hwqp
.rq_head
)) {
3586 wq_tail
= nesqp
->hwqp
.rq_tail
;
3590 if (nesqp
->iwarp_state
> NES_CQP_QP_IWARP_STATE_RTS
) {
3591 if (nesqp
->hwqp
.sq_tail
== nesqp
->hwqp
.sq_head
)
3592 complete(&nesqp
->sq_drained
);
3593 if (nesqp
->hwqp
.rq_tail
== nesqp
->hwqp
.rq_head
)
3594 complete(&nesqp
->rq_drained
);
3597 entry
->wr_id
= wrid
;
3603 nescq
->hw_cq
.cq_vbase
[head
].cqe_words
[NES_CQE_OPCODE_IDX
] = 0;
3604 if (++head
>= cq_size
)
3606 nescq
->polled_completions
++;
3608 if ((nescq
->polled_completions
> (cq_size
/ 2)) ||
3609 (nescq
->polled_completions
== 255)) {
3610 nes_debug(NES_DBG_CQ
, "CQ%u Issuing CQE Allocate since more than half of cqes"
3611 " are pending %u of %u.\n",
3612 nescq
->hw_cq
.cq_number
, nescq
->polled_completions
, cq_size
);
3613 nes_write32(nesdev
->regs
+NES_CQE_ALLOC
,
3614 nescq
->hw_cq
.cq_number
| (nescq
->polled_completions
<< 16));
3615 nescq
->polled_completions
= 0;
3618 /* Update the wqe index and set status to flush */
3619 wqe_index
= le32_to_cpu(cqe
.cqe_words
[NES_CQE_COMP_COMP_CTX_LOW_IDX
]);
3620 wqe_index
= (wqe_index
& (~(nesdev
->nesadapter
->max_qp_wr
- 1))) | wq_tail
;
3621 nescq
->hw_cq
.cq_vbase
[head
].cqe_words
[NES_CQE_COMP_COMP_CTX_LOW_IDX
] =
3622 cpu_to_le32(wqe_index
);
3623 move_cq_head
= 1; /* ready for next pass */
3627 if (nescq
->polled_completions
) {
3628 nes_write32(nesdev
->regs
+NES_CQE_ALLOC
,
3629 nescq
->hw_cq
.cq_number
| (nescq
->polled_completions
<< 16));
3630 nescq
->polled_completions
= 0;
3633 nescq
->hw_cq
.cq_head
= head
;
3634 nes_debug(NES_DBG_CQ
, "Reporting %u completions for CQ%u.\n",
3635 cqe_count
, nescq
->hw_cq
.cq_number
);
3637 spin_unlock_irqrestore(&nescq
->lock
, flags
);
3646 static int nes_req_notify_cq(struct ib_cq
*ibcq
, enum ib_cq_notify_flags notify_flags
)
3648 struct nes_vnic
*nesvnic
= to_nesvnic(ibcq
->device
);
3649 struct nes_device
*nesdev
= nesvnic
->nesdev
;
3650 struct nes_cq
*nescq
= to_nescq(ibcq
);
3653 nes_debug(NES_DBG_CQ
, "Requesting notification for CQ%u.\n",
3654 nescq
->hw_cq
.cq_number
);
3656 cq_arm
= nescq
->hw_cq
.cq_number
;
3657 if ((notify_flags
& IB_CQ_SOLICITED_MASK
) == IB_CQ_NEXT_COMP
)
3658 cq_arm
|= NES_CQE_ALLOC_NOTIFY_NEXT
;
3659 else if ((notify_flags
& IB_CQ_SOLICITED_MASK
) == IB_CQ_SOLICITED
)
3660 cq_arm
|= NES_CQE_ALLOC_NOTIFY_SE
;
3664 nes_write32(nesdev
->regs
+NES_CQE_ALLOC
, cq_arm
);
3665 nes_read32(nesdev
->regs
+NES_CQE_ALLOC
);
3670 static int nes_port_immutable(struct ib_device
*ibdev
, u8 port_num
,
3671 struct ib_port_immutable
*immutable
)
3673 struct ib_port_attr attr
;
3676 err
= nes_query_port(ibdev
, port_num
, &attr
);
3680 immutable
->pkey_tbl_len
= attr
.pkey_tbl_len
;
3681 immutable
->gid_tbl_len
= attr
.gid_tbl_len
;
3682 immutable
->core_cap_flags
= RDMA_CORE_PORT_IWARP
;
3687 static void get_dev_fw_str(struct ib_device
*dev
, char *str
,
3690 struct nes_ib_device
*nesibdev
=
3691 container_of(dev
, struct nes_ib_device
, ibdev
);
3692 struct nes_vnic
*nesvnic
= nesibdev
->nesvnic
;
3694 nes_debug(NES_DBG_INIT
, "\n");
3695 snprintf(str
, str_len
, "%u.%u",
3696 (nesvnic
->nesdev
->nesadapter
->firmware_version
>> 16),
3697 (nesvnic
->nesdev
->nesadapter
->firmware_version
& 0x000000ff));
3701 * nes_init_ofa_device
3703 struct nes_ib_device
*nes_init_ofa_device(struct net_device
*netdev
)
3705 struct nes_ib_device
*nesibdev
;
3706 struct nes_vnic
*nesvnic
= netdev_priv(netdev
);
3707 struct nes_device
*nesdev
= nesvnic
->nesdev
;
3709 nesibdev
= (struct nes_ib_device
*)ib_alloc_device(sizeof(struct nes_ib_device
));
3710 if (nesibdev
== NULL
) {
3713 strlcpy(nesibdev
->ibdev
.name
, "nes%d", IB_DEVICE_NAME_MAX
);
3714 nesibdev
->ibdev
.owner
= THIS_MODULE
;
3716 nesibdev
->ibdev
.node_type
= RDMA_NODE_RNIC
;
3717 memset(&nesibdev
->ibdev
.node_guid
, 0, sizeof(nesibdev
->ibdev
.node_guid
));
3718 memcpy(&nesibdev
->ibdev
.node_guid
, netdev
->dev_addr
, 6);
3720 nesibdev
->ibdev
.uverbs_cmd_mask
=
3721 (1ull << IB_USER_VERBS_CMD_GET_CONTEXT
) |
3722 (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE
) |
3723 (1ull << IB_USER_VERBS_CMD_QUERY_PORT
) |
3724 (1ull << IB_USER_VERBS_CMD_ALLOC_PD
) |
3725 (1ull << IB_USER_VERBS_CMD_DEALLOC_PD
) |
3726 (1ull << IB_USER_VERBS_CMD_REG_MR
) |
3727 (1ull << IB_USER_VERBS_CMD_DEREG_MR
) |
3728 (1ull << IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL
) |
3729 (1ull << IB_USER_VERBS_CMD_CREATE_CQ
) |
3730 (1ull << IB_USER_VERBS_CMD_DESTROY_CQ
) |
3731 (1ull << IB_USER_VERBS_CMD_CREATE_AH
) |
3732 (1ull << IB_USER_VERBS_CMD_DESTROY_AH
) |
3733 (1ull << IB_USER_VERBS_CMD_REQ_NOTIFY_CQ
) |
3734 (1ull << IB_USER_VERBS_CMD_CREATE_QP
) |
3735 (1ull << IB_USER_VERBS_CMD_MODIFY_QP
) |
3736 (1ull << IB_USER_VERBS_CMD_POLL_CQ
) |
3737 (1ull << IB_USER_VERBS_CMD_DESTROY_QP
) |
3738 (1ull << IB_USER_VERBS_CMD_ALLOC_MW
) |
3739 (1ull << IB_USER_VERBS_CMD_BIND_MW
) |
3740 (1ull << IB_USER_VERBS_CMD_DEALLOC_MW
) |
3741 (1ull << IB_USER_VERBS_CMD_POST_RECV
) |
3742 (1ull << IB_USER_VERBS_CMD_POST_SEND
);
3744 nesibdev
->ibdev
.phys_port_cnt
= 1;
3745 nesibdev
->ibdev
.num_comp_vectors
= 1;
3746 nesibdev
->ibdev
.dma_device
= &nesdev
->pcidev
->dev
;
3747 nesibdev
->ibdev
.dev
.parent
= &nesdev
->pcidev
->dev
;
3748 nesibdev
->ibdev
.query_device
= nes_query_device
;
3749 nesibdev
->ibdev
.query_port
= nes_query_port
;
3750 nesibdev
->ibdev
.query_pkey
= nes_query_pkey
;
3751 nesibdev
->ibdev
.query_gid
= nes_query_gid
;
3752 nesibdev
->ibdev
.alloc_ucontext
= nes_alloc_ucontext
;
3753 nesibdev
->ibdev
.dealloc_ucontext
= nes_dealloc_ucontext
;
3754 nesibdev
->ibdev
.mmap
= nes_mmap
;
3755 nesibdev
->ibdev
.alloc_pd
= nes_alloc_pd
;
3756 nesibdev
->ibdev
.dealloc_pd
= nes_dealloc_pd
;
3757 nesibdev
->ibdev
.create_ah
= nes_create_ah
;
3758 nesibdev
->ibdev
.destroy_ah
= nes_destroy_ah
;
3759 nesibdev
->ibdev
.create_qp
= nes_create_qp
;
3760 nesibdev
->ibdev
.modify_qp
= nes_modify_qp
;
3761 nesibdev
->ibdev
.query_qp
= nes_query_qp
;
3762 nesibdev
->ibdev
.destroy_qp
= nes_destroy_qp
;
3763 nesibdev
->ibdev
.create_cq
= nes_create_cq
;
3764 nesibdev
->ibdev
.destroy_cq
= nes_destroy_cq
;
3765 nesibdev
->ibdev
.poll_cq
= nes_poll_cq
;
3766 nesibdev
->ibdev
.get_dma_mr
= nes_get_dma_mr
;
3767 nesibdev
->ibdev
.reg_user_mr
= nes_reg_user_mr
;
3768 nesibdev
->ibdev
.dereg_mr
= nes_dereg_mr
;
3769 nesibdev
->ibdev
.alloc_mw
= nes_alloc_mw
;
3770 nesibdev
->ibdev
.dealloc_mw
= nes_dealloc_mw
;
3772 nesibdev
->ibdev
.alloc_mr
= nes_alloc_mr
;
3773 nesibdev
->ibdev
.map_mr_sg
= nes_map_mr_sg
;
3775 nesibdev
->ibdev
.attach_mcast
= nes_multicast_attach
;
3776 nesibdev
->ibdev
.detach_mcast
= nes_multicast_detach
;
3777 nesibdev
->ibdev
.process_mad
= nes_process_mad
;
3779 nesibdev
->ibdev
.req_notify_cq
= nes_req_notify_cq
;
3780 nesibdev
->ibdev
.post_send
= nes_post_send
;
3781 nesibdev
->ibdev
.post_recv
= nes_post_recv
;
3782 nesibdev
->ibdev
.drain_sq
= nes_drain_sq
;
3783 nesibdev
->ibdev
.drain_rq
= nes_drain_rq
;
3785 nesibdev
->ibdev
.iwcm
= kzalloc(sizeof(*nesibdev
->ibdev
.iwcm
), GFP_KERNEL
);
3786 if (nesibdev
->ibdev
.iwcm
== NULL
) {
3787 ib_dealloc_device(&nesibdev
->ibdev
);
3790 nesibdev
->ibdev
.iwcm
->add_ref
= nes_add_ref
;
3791 nesibdev
->ibdev
.iwcm
->rem_ref
= nes_rem_ref
;
3792 nesibdev
->ibdev
.iwcm
->get_qp
= nes_get_qp
;
3793 nesibdev
->ibdev
.iwcm
->connect
= nes_connect
;
3794 nesibdev
->ibdev
.iwcm
->accept
= nes_accept
;
3795 nesibdev
->ibdev
.iwcm
->reject
= nes_reject
;
3796 nesibdev
->ibdev
.iwcm
->create_listen
= nes_create_listen
;
3797 nesibdev
->ibdev
.iwcm
->destroy_listen
= nes_destroy_listen
;
3798 nesibdev
->ibdev
.get_port_immutable
= nes_port_immutable
;
3799 nesibdev
->ibdev
.get_dev_fw_str
= get_dev_fw_str
;
3800 memcpy(nesibdev
->ibdev
.iwcm
->ifname
, netdev
->name
,
3801 sizeof(nesibdev
->ibdev
.iwcm
->ifname
));
3808 * nes_handle_delayed_event
3810 static void nes_handle_delayed_event(unsigned long data
)
3812 struct nes_vnic
*nesvnic
= (void *) data
;
3814 if (nesvnic
->delayed_event
!= nesvnic
->last_dispatched_event
) {
3815 struct ib_event event
;
3817 event
.device
= &nesvnic
->nesibdev
->ibdev
;
3820 event
.event
= nesvnic
->delayed_event
;
3821 event
.element
.port_num
= nesvnic
->logical_port
+ 1;
3822 ib_dispatch_event(&event
);
3826 nesvnic
->event_timer
.function
= NULL
;
3830 void nes_port_ibevent(struct nes_vnic
*nesvnic
)
3832 struct nes_ib_device
*nesibdev
= nesvnic
->nesibdev
;
3833 struct nes_device
*nesdev
= nesvnic
->nesdev
;
3834 struct ib_event event
;
3835 event
.device
= &nesibdev
->ibdev
;
3836 event
.element
.port_num
= nesvnic
->logical_port
+ 1;
3837 event
.event
= nesdev
->iw_status
? IB_EVENT_PORT_ACTIVE
: IB_EVENT_PORT_ERR
;
3839 if (!nesvnic
->event_timer
.function
) {
3840 ib_dispatch_event(&event
);
3841 nesvnic
->last_dispatched_event
= event
.event
;
3842 nesvnic
->event_timer
.function
= nes_handle_delayed_event
;
3843 nesvnic
->event_timer
.data
= (unsigned long) nesvnic
;
3844 nesvnic
->event_timer
.expires
= jiffies
+ NES_EVENT_DELAY
;
3845 add_timer(&nesvnic
->event_timer
);
3847 mod_timer(&nesvnic
->event_timer
, jiffies
+ NES_EVENT_DELAY
);
3849 nesvnic
->delayed_event
= event
.event
;
3854 * nes_destroy_ofa_device
3856 void nes_destroy_ofa_device(struct nes_ib_device
*nesibdev
)
3858 if (nesibdev
== NULL
)
3861 nes_unregister_ofa_device(nesibdev
);
3863 kfree(nesibdev
->ibdev
.iwcm
);
3864 ib_dealloc_device(&nesibdev
->ibdev
);
3869 * nes_register_ofa_device
3871 int nes_register_ofa_device(struct nes_ib_device
*nesibdev
)
3873 struct nes_vnic
*nesvnic
= nesibdev
->nesvnic
;
3874 struct nes_device
*nesdev
= nesvnic
->nesdev
;
3875 struct nes_adapter
*nesadapter
= nesdev
->nesadapter
;
3878 ret
= ib_register_device(&nesvnic
->nesibdev
->ibdev
, NULL
);
3883 /* Get the resources allocated to this device */
3884 nesibdev
->max_cq
= (nesadapter
->max_cq
-NES_FIRST_QPN
) / nesadapter
->port_count
;
3885 nesibdev
->max_mr
= nesadapter
->max_mr
/ nesadapter
->port_count
;
3886 nesibdev
->max_qp
= (nesadapter
->max_qp
-NES_FIRST_QPN
) / nesadapter
->port_count
;
3887 nesibdev
->max_pd
= nesadapter
->max_pd
/ nesadapter
->port_count
;
3889 for (i
= 0; i
< ARRAY_SIZE(nes_dev_attributes
); ++i
) {
3890 ret
= device_create_file(&nesibdev
->ibdev
.dev
, nes_dev_attributes
[i
]);
3894 device_remove_file(&nesibdev
->ibdev
.dev
,
3895 nes_dev_attributes
[i
]);
3897 ib_unregister_device(&nesibdev
->ibdev
);
3902 nesvnic
->of_device_registered
= 1;
3909 * nes_unregister_ofa_device
3911 static void nes_unregister_ofa_device(struct nes_ib_device
*nesibdev
)
3913 struct nes_vnic
*nesvnic
= nesibdev
->nesvnic
;
3916 for (i
= 0; i
< ARRAY_SIZE(nes_dev_attributes
); ++i
) {
3917 device_remove_file(&nesibdev
->ibdev
.dev
, nes_dev_attributes
[i
]);
3920 if (nesvnic
->of_device_registered
) {
3921 ib_unregister_device(&nesibdev
->ibdev
);
3924 nesvnic
->of_device_registered
= 0;