]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/infiniband/hw/nes/nes_verbs.c
RDMA/nes: Make symbols used only in a single source file static
[linux-2.6-omap-h63xx.git] / drivers / infiniband / hw / nes / nes_verbs.c
1 /*
2  * Copyright (c) 2006 - 2008 NetEffect, Inc. All rights reserved.
3  *
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:
9  *
10  *     Redistribution and use in source and binary forms, with or
11  *     without modification, are permitted provided that the following
12  *     conditions are met:
13  *
14  *      - Redistributions of source code must retain the above
15  *        copyright notice, this list of conditions and the following
16  *        disclaimer.
17  *
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.
22  *
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
30  * SOFTWARE.
31  *
32  */
33
34 #include <linux/module.h>
35 #include <linux/moduleparam.h>
36 #include <linux/random.h>
37 #include <linux/highmem.h>
38 #include <asm/byteorder.h>
39
40 #include <rdma/ib_verbs.h>
41 #include <rdma/iw_cm.h>
42 #include <rdma/ib_user_verbs.h>
43
44 #include "nes.h"
45
46 #include <rdma/ib_umem.h>
47
48 atomic_t mod_qp_timouts;
49 atomic_t qps_created;
50 atomic_t sw_qps_destroyed;
51
52 static void nes_unregister_ofa_device(struct nes_ib_device *nesibdev);
53
54 /**
55  * nes_alloc_mw
56  */
57 static struct ib_mw *nes_alloc_mw(struct ib_pd *ibpd) {
58         unsigned long flags;
59         struct nes_pd *nespd = to_nespd(ibpd);
60         struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
61         struct nes_device *nesdev = nesvnic->nesdev;
62         struct nes_adapter *nesadapter = nesdev->nesadapter;
63         struct nes_cqp_request *cqp_request;
64         struct nes_mr *nesmr;
65         struct ib_mw *ibmw;
66         struct nes_hw_cqp_wqe *cqp_wqe;
67         int ret;
68         u32 stag;
69         u32 stag_index = 0;
70         u32 next_stag_index = 0;
71         u32 driver_key = 0;
72         u8 stag_key = 0;
73
74         get_random_bytes(&next_stag_index, sizeof(next_stag_index));
75         stag_key = (u8)next_stag_index;
76
77         driver_key = 0;
78
79         next_stag_index >>= 8;
80         next_stag_index %= nesadapter->max_mr;
81
82         ret = nes_alloc_resource(nesadapter, nesadapter->allocated_mrs,
83                         nesadapter->max_mr, &stag_index, &next_stag_index);
84         if (ret) {
85                 return ERR_PTR(ret);
86         }
87
88         nesmr = kzalloc(sizeof(*nesmr), GFP_KERNEL);
89         if (!nesmr) {
90                 nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
91                 return ERR_PTR(-ENOMEM);
92         }
93
94         stag = stag_index << 8;
95         stag |= driver_key;
96         stag += (u32)stag_key;
97
98         nes_debug(NES_DBG_MR, "Registering STag 0x%08X, index = 0x%08X\n",
99                         stag, stag_index);
100
101         /* Register the region with the adapter */
102         cqp_request = nes_get_cqp_request(nesdev);
103         if (cqp_request == NULL) {
104                 kfree(nesmr);
105                 nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
106                 return ERR_PTR(-ENOMEM);
107         }
108
109         cqp_request->waiting = 1;
110         cqp_wqe = &cqp_request->cqp_wqe;
111
112         cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] =
113                         cpu_to_le32( NES_CQP_ALLOCATE_STAG | NES_CQP_STAG_RIGHTS_REMOTE_READ |
114                         NES_CQP_STAG_RIGHTS_REMOTE_WRITE | NES_CQP_STAG_VA_TO |
115                         NES_CQP_STAG_REM_ACC_EN);
116
117         nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
118         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX, (nespd->pd_id & 0x00007fff));
119         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, stag);
120
121         atomic_set(&cqp_request->refcount, 2);
122         nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
123
124         /* Wait for CQP */
125         ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
126                         NES_EVENT_TIMEOUT);
127         nes_debug(NES_DBG_MR, "Register STag 0x%08X completed, wait_event_timeout ret = %u,"
128                         " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
129                         stag, ret, cqp_request->major_code, cqp_request->minor_code);
130         if ((!ret) || (cqp_request->major_code)) {
131                 if (atomic_dec_and_test(&cqp_request->refcount)) {
132                         if (cqp_request->dynamic) {
133                                 kfree(cqp_request);
134                         } else {
135                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
136                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
137                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
138                         }
139                 }
140                 kfree(nesmr);
141                 nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
142                 if (!ret) {
143                         return ERR_PTR(-ETIME);
144                 } else {
145                         return ERR_PTR(-ENOMEM);
146                 }
147         } else {
148                 if (atomic_dec_and_test(&cqp_request->refcount)) {
149                         if (cqp_request->dynamic) {
150                                 kfree(cqp_request);
151                         } else {
152                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
153                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
154                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
155                         }
156                 }
157         }
158
159         nesmr->ibmw.rkey = stag;
160         nesmr->mode = IWNES_MEMREG_TYPE_MW;
161         ibmw = &nesmr->ibmw;
162         nesmr->pbl_4k = 0;
163         nesmr->pbls_used = 0;
164
165         return ibmw;
166 }
167
168
169 /**
170  * nes_dealloc_mw
171  */
172 static int nes_dealloc_mw(struct ib_mw *ibmw)
173 {
174         struct nes_mr *nesmr = to_nesmw(ibmw);
175         struct nes_vnic *nesvnic = to_nesvnic(ibmw->device);
176         struct nes_device *nesdev = nesvnic->nesdev;
177         struct nes_adapter *nesadapter = nesdev->nesadapter;
178         struct nes_hw_cqp_wqe *cqp_wqe;
179         struct nes_cqp_request *cqp_request;
180         int err = 0;
181         unsigned long flags;
182         int ret;
183
184         /* Deallocate the window with the adapter */
185         cqp_request = nes_get_cqp_request(nesdev);
186         if (cqp_request == NULL) {
187                 nes_debug(NES_DBG_MR, "Failed to get a cqp_request.\n");
188                 return -ENOMEM;
189         }
190         cqp_request->waiting = 1;
191         cqp_wqe = &cqp_request->cqp_wqe;
192         nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
193         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, NES_CQP_DEALLOCATE_STAG);
194         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, ibmw->rkey);
195
196         atomic_set(&cqp_request->refcount, 2);
197         nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
198
199         /* Wait for CQP */
200         nes_debug(NES_DBG_MR, "Waiting for deallocate STag 0x%08X to complete.\n",
201                         ibmw->rkey);
202         ret = wait_event_timeout(cqp_request->waitq, (0 != cqp_request->request_done),
203                         NES_EVENT_TIMEOUT);
204         nes_debug(NES_DBG_MR, "Deallocate STag completed, wait_event_timeout ret = %u,"
205                         " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
206                         ret, cqp_request->major_code, cqp_request->minor_code);
207         if ((!ret) || (cqp_request->major_code)) {
208                 if (atomic_dec_and_test(&cqp_request->refcount)) {
209                         if (cqp_request->dynamic) {
210                                 kfree(cqp_request);
211                         } else {
212                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
213                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
214                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
215                         }
216                 }
217                 if (!ret) {
218                         err = -ETIME;
219                 } else {
220                         err = -EIO;
221                 }
222         } else {
223                 if (atomic_dec_and_test(&cqp_request->refcount)) {
224                         if (cqp_request->dynamic) {
225                                 kfree(cqp_request);
226                         } else {
227                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
228                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
229                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
230                         }
231                 }
232         }
233
234         nes_free_resource(nesadapter, nesadapter->allocated_mrs,
235                         (ibmw->rkey & 0x0fffff00) >> 8);
236         kfree(nesmr);
237
238         return err;
239 }
240
241
242 /**
243  * nes_bind_mw
244  */
245 static int nes_bind_mw(struct ib_qp *ibqp, struct ib_mw *ibmw,
246                 struct ib_mw_bind *ibmw_bind)
247 {
248         u64 u64temp;
249         struct nes_vnic *nesvnic = to_nesvnic(ibqp->device);
250         struct nes_device *nesdev = nesvnic->nesdev;
251         /* struct nes_mr *nesmr = to_nesmw(ibmw); */
252         struct nes_qp *nesqp = to_nesqp(ibqp);
253         struct nes_hw_qp_wqe *wqe;
254         unsigned long flags = 0;
255         u32 head;
256         u32 wqe_misc = 0;
257         u32 qsize;
258
259         if (nesqp->ibqp_state > IB_QPS_RTS)
260                 return -EINVAL;
261
262                 spin_lock_irqsave(&nesqp->lock, flags);
263
264         head = nesqp->hwqp.sq_head;
265         qsize = nesqp->hwqp.sq_tail;
266
267         /* Check for SQ overflow */
268         if (((head + (2 * qsize) - nesqp->hwqp.sq_tail) % qsize) == (qsize - 1)) {
269                         spin_unlock_irqrestore(&nesqp->lock, flags);
270                 return -EINVAL;
271         }
272
273         wqe = &nesqp->hwqp.sq_vbase[head];
274         /* nes_debug(NES_DBG_MR, "processing sq wqe at %p, head = %u.\n", wqe, head); */
275         nes_fill_init_qp_wqe(wqe, nesqp, head);
276         u64temp = ibmw_bind->wr_id;
277         set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_COMP_SCRATCH_LOW_IDX, u64temp);
278         wqe_misc = NES_IWARP_SQ_OP_BIND;
279
280         wqe_misc |= NES_IWARP_SQ_WQE_LOCAL_FENCE;
281
282         if (ibmw_bind->send_flags & IB_SEND_SIGNALED)
283                 wqe_misc |= NES_IWARP_SQ_WQE_SIGNALED_COMPL;
284
285         if (ibmw_bind->mw_access_flags & IB_ACCESS_REMOTE_WRITE) {
286                 wqe_misc |= NES_CQP_STAG_RIGHTS_REMOTE_WRITE;
287         }
288         if (ibmw_bind->mw_access_flags & IB_ACCESS_REMOTE_READ) {
289                 wqe_misc |= NES_CQP_STAG_RIGHTS_REMOTE_READ;
290         }
291
292         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_MISC_IDX, wqe_misc);
293         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_BIND_WQE_MR_IDX, ibmw_bind->mr->lkey);
294         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_BIND_WQE_MW_IDX, ibmw->rkey);
295         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_BIND_WQE_LENGTH_LOW_IDX,
296                         ibmw_bind->length);
297         wqe->wqe_words[NES_IWARP_SQ_BIND_WQE_LENGTH_HIGH_IDX] = 0;
298         u64temp = (u64)ibmw_bind->addr;
299         set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_BIND_WQE_VA_FBO_LOW_IDX, u64temp);
300
301         head++;
302         if (head >= qsize)
303                 head = 0;
304
305         nesqp->hwqp.sq_head = head;
306         barrier();
307
308         nes_write32(nesdev->regs+NES_WQE_ALLOC,
309                         (1 << 24) | 0x00800000 | nesqp->hwqp.qp_id);
310
311                 spin_unlock_irqrestore(&nesqp->lock, flags);
312
313         return 0;
314 }
315
316
317 /**
318  * nes_alloc_fmr
319  */
320 static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd,
321                 int ibmr_access_flags,
322                 struct ib_fmr_attr *ibfmr_attr)
323 {
324         unsigned long flags;
325         struct nes_pd *nespd = to_nespd(ibpd);
326         struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
327         struct nes_device *nesdev = nesvnic->nesdev;
328         struct nes_adapter *nesadapter = nesdev->nesadapter;
329         struct nes_fmr *nesfmr;
330         struct nes_cqp_request *cqp_request;
331         struct nes_hw_cqp_wqe *cqp_wqe;
332         int ret;
333         u32 stag;
334         u32 stag_index = 0;
335         u32 next_stag_index = 0;
336         u32 driver_key = 0;
337         u32 opcode = 0;
338         u8 stag_key = 0;
339         int i=0;
340         struct nes_vpbl vpbl;
341
342         get_random_bytes(&next_stag_index, sizeof(next_stag_index));
343         stag_key = (u8)next_stag_index;
344
345         driver_key = 0;
346
347         next_stag_index >>= 8;
348         next_stag_index %= nesadapter->max_mr;
349
350         ret = nes_alloc_resource(nesadapter, nesadapter->allocated_mrs,
351                         nesadapter->max_mr, &stag_index, &next_stag_index);
352         if (ret) {
353                 goto failed_resource_alloc;
354         }
355
356         nesfmr = kzalloc(sizeof(*nesfmr), GFP_KERNEL);
357         if (!nesfmr) {
358                 ret = -ENOMEM;
359                 goto failed_fmr_alloc;
360         }
361
362         nesfmr->nesmr.mode = IWNES_MEMREG_TYPE_FMR;
363         if (ibfmr_attr->max_pages == 1) {
364                 /* use zero length PBL */
365                 nesfmr->nesmr.pbl_4k = 0;
366                 nesfmr->nesmr.pbls_used = 0;
367         } else if (ibfmr_attr->max_pages <= 32) {
368                 /* use PBL 256 */
369                 nesfmr->nesmr.pbl_4k = 0;
370                 nesfmr->nesmr.pbls_used = 1;
371         } else if (ibfmr_attr->max_pages <= 512) {
372                 /* use 4K PBLs */
373                 nesfmr->nesmr.pbl_4k = 1;
374                 nesfmr->nesmr.pbls_used = 1;
375         } else {
376                 /* use two level 4K PBLs */
377                 /* add support for two level 256B PBLs */
378                 nesfmr->nesmr.pbl_4k = 1;
379                 nesfmr->nesmr.pbls_used = 1 + (ibfmr_attr->max_pages >> 9) +
380                                 ((ibfmr_attr->max_pages & 511) ? 1 : 0);
381         }
382         /* Register the region with the adapter */
383         spin_lock_irqsave(&nesadapter->pbl_lock, flags);
384
385         /* track PBL resources */
386         if (nesfmr->nesmr.pbls_used != 0) {
387                 if (nesfmr->nesmr.pbl_4k) {
388                         if (nesfmr->nesmr.pbls_used > nesadapter->free_4kpbl) {
389                                 spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
390                                 ret = -ENOMEM;
391                                 goto failed_vpbl_alloc;
392                         } else {
393                                 nesadapter->free_4kpbl -= nesfmr->nesmr.pbls_used;
394                         }
395                 } else {
396                         if (nesfmr->nesmr.pbls_used > nesadapter->free_256pbl) {
397                                 spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
398                                 ret = -ENOMEM;
399                                 goto failed_vpbl_alloc;
400                         } else {
401                                 nesadapter->free_256pbl -= nesfmr->nesmr.pbls_used;
402                         }
403                 }
404         }
405
406         /* one level pbl */
407         if (nesfmr->nesmr.pbls_used == 0) {
408                 nesfmr->root_vpbl.pbl_vbase = NULL;
409                 nes_debug(NES_DBG_MR,  "zero level pbl \n");
410         } else if (nesfmr->nesmr.pbls_used == 1) {
411                 /* can change it to kmalloc & dma_map_single */
412                 nesfmr->root_vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 4096,
413                                 &nesfmr->root_vpbl.pbl_pbase);
414                 if (!nesfmr->root_vpbl.pbl_vbase) {
415                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
416                         ret = -ENOMEM;
417                         goto failed_vpbl_alloc;
418                 }
419                 nesfmr->leaf_pbl_cnt = 0;
420                 nes_debug(NES_DBG_MR, "one level pbl, root_vpbl.pbl_vbase=%p \n",
421                                 nesfmr->root_vpbl.pbl_vbase);
422         }
423         /* two level pbl */
424         else {
425                 nesfmr->root_vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 8192,
426                                 &nesfmr->root_vpbl.pbl_pbase);
427                 if (!nesfmr->root_vpbl.pbl_vbase) {
428                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
429                         ret = -ENOMEM;
430                         goto failed_vpbl_alloc;
431                 }
432
433                 nesfmr->root_vpbl.leaf_vpbl = kzalloc(sizeof(*nesfmr->root_vpbl.leaf_vpbl)*1024, GFP_KERNEL);
434                 if (!nesfmr->root_vpbl.leaf_vpbl) {
435                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
436                         ret = -ENOMEM;
437                         goto failed_leaf_vpbl_alloc;
438                 }
439
440                 nesfmr->leaf_pbl_cnt = nesfmr->nesmr.pbls_used-1;
441                 nes_debug(NES_DBG_MR, "two level pbl, root_vpbl.pbl_vbase=%p"
442                                 " leaf_pbl_cnt=%d root_vpbl.leaf_vpbl=%p\n",
443                                 nesfmr->root_vpbl.pbl_vbase, nesfmr->leaf_pbl_cnt, nesfmr->root_vpbl.leaf_vpbl);
444
445                 for (i=0; i<nesfmr->leaf_pbl_cnt; i++)
446                         nesfmr->root_vpbl.leaf_vpbl[i].pbl_vbase = NULL;
447
448                 for (i=0; i<nesfmr->leaf_pbl_cnt; i++) {
449                         vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 4096,
450                                         &vpbl.pbl_pbase);
451
452                         if (!vpbl.pbl_vbase) {
453                                 ret = -ENOMEM;
454                                 spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
455                                 goto failed_leaf_vpbl_pages_alloc;
456                         }
457
458                         nesfmr->root_vpbl.pbl_vbase[i].pa_low = cpu_to_le32((u32)vpbl.pbl_pbase);
459                         nesfmr->root_vpbl.pbl_vbase[i].pa_high = cpu_to_le32((u32)((((u64)vpbl.pbl_pbase)>>32)));
460                         nesfmr->root_vpbl.leaf_vpbl[i] = vpbl;
461
462                         nes_debug(NES_DBG_MR, "pbase_low=0x%x, pbase_high=0x%x, vpbl=%p\n",
463                                         nesfmr->root_vpbl.pbl_vbase[i].pa_low,
464                                         nesfmr->root_vpbl.pbl_vbase[i].pa_high,
465                                         &nesfmr->root_vpbl.leaf_vpbl[i]);
466                 }
467         }
468         nesfmr->ib_qp = NULL;
469         nesfmr->access_rights =0;
470
471         stag = stag_index << 8;
472         stag |= driver_key;
473         stag += (u32)stag_key;
474
475         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
476         cqp_request = nes_get_cqp_request(nesdev);
477         if (cqp_request == NULL) {
478                 nes_debug(NES_DBG_MR, "Failed to get a cqp_request.\n");
479                 ret = -ENOMEM;
480                 goto failed_leaf_vpbl_pages_alloc;
481         }
482         cqp_request->waiting = 1;
483         cqp_wqe = &cqp_request->cqp_wqe;
484
485         nes_debug(NES_DBG_MR, "Registering STag 0x%08X, index = 0x%08X\n",
486                         stag, stag_index);
487
488         opcode = NES_CQP_ALLOCATE_STAG | NES_CQP_STAG_VA_TO | NES_CQP_STAG_MR;
489
490         if (nesfmr->nesmr.pbl_4k == 1)
491                 opcode |= NES_CQP_STAG_PBL_BLK_SIZE;
492
493         if (ibmr_access_flags & IB_ACCESS_REMOTE_WRITE) {
494                 opcode |= NES_CQP_STAG_RIGHTS_REMOTE_WRITE |
495                                 NES_CQP_STAG_RIGHTS_LOCAL_WRITE | NES_CQP_STAG_REM_ACC_EN;
496                 nesfmr->access_rights |=
497                                 NES_CQP_STAG_RIGHTS_REMOTE_WRITE | NES_CQP_STAG_RIGHTS_LOCAL_WRITE |
498                                 NES_CQP_STAG_REM_ACC_EN;
499         }
500
501         if (ibmr_access_flags & IB_ACCESS_REMOTE_READ) {
502                 opcode |= NES_CQP_STAG_RIGHTS_REMOTE_READ |
503                                 NES_CQP_STAG_RIGHTS_LOCAL_READ | NES_CQP_STAG_REM_ACC_EN;
504                 nesfmr->access_rights |=
505                                 NES_CQP_STAG_RIGHTS_REMOTE_READ | NES_CQP_STAG_RIGHTS_LOCAL_READ |
506                                 NES_CQP_STAG_REM_ACC_EN;
507         }
508
509         nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
510         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, opcode);
511         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX, (nespd->pd_id & 0x00007fff));
512         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, stag);
513
514         cqp_wqe->wqe_words[NES_CQP_STAG_WQE_PBL_BLK_COUNT_IDX] =
515                         cpu_to_le32((nesfmr->nesmr.pbls_used>1) ?
516                         (nesfmr->nesmr.pbls_used-1) : nesfmr->nesmr.pbls_used);
517
518         atomic_set(&cqp_request->refcount, 2);
519         nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
520
521         /* Wait for CQP */
522         ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
523                         NES_EVENT_TIMEOUT);
524         nes_debug(NES_DBG_MR, "Register STag 0x%08X completed, wait_event_timeout ret = %u,"
525                         " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
526                         stag, ret, cqp_request->major_code, cqp_request->minor_code);
527
528         if ((!ret) || (cqp_request->major_code)) {
529                 if (atomic_dec_and_test(&cqp_request->refcount)) {
530                         if (cqp_request->dynamic) {
531                                 kfree(cqp_request);
532                         } else {
533                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
534                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
535                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
536                         }
537                 }
538                 ret = (!ret) ? -ETIME : -EIO;
539                 goto failed_leaf_vpbl_pages_alloc;
540         } else {
541                 if (atomic_dec_and_test(&cqp_request->refcount)) {
542                         if (cqp_request->dynamic) {
543                                 kfree(cqp_request);
544                         } else {
545                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
546                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
547                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
548                         }
549                 }
550         }
551
552         nesfmr->nesmr.ibfmr.lkey = stag;
553         nesfmr->nesmr.ibfmr.rkey = stag;
554         nesfmr->attr = *ibfmr_attr;
555
556         return &nesfmr->nesmr.ibfmr;
557
558         failed_leaf_vpbl_pages_alloc:
559         /* unroll all allocated pages */
560         for (i=0; i<nesfmr->leaf_pbl_cnt; i++) {
561                 if (nesfmr->root_vpbl.leaf_vpbl[i].pbl_vbase) {
562                         pci_free_consistent(nesdev->pcidev, 4096, nesfmr->root_vpbl.leaf_vpbl[i].pbl_vbase,
563                                         nesfmr->root_vpbl.leaf_vpbl[i].pbl_pbase);
564                 }
565         }
566         if (nesfmr->root_vpbl.leaf_vpbl)
567                 kfree(nesfmr->root_vpbl.leaf_vpbl);
568
569         failed_leaf_vpbl_alloc:
570         if (nesfmr->leaf_pbl_cnt == 0) {
571                 if (nesfmr->root_vpbl.pbl_vbase)
572                         pci_free_consistent(nesdev->pcidev, 4096, nesfmr->root_vpbl.pbl_vbase,
573                                         nesfmr->root_vpbl.pbl_pbase);
574         } else
575                 pci_free_consistent(nesdev->pcidev, 8192, nesfmr->root_vpbl.pbl_vbase,
576                                 nesfmr->root_vpbl.pbl_pbase);
577
578         failed_vpbl_alloc:
579         kfree(nesfmr);
580
581         failed_fmr_alloc:
582         nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
583
584         failed_resource_alloc:
585         return ERR_PTR(ret);
586 }
587
588
589 /**
590  * nes_dealloc_fmr
591  */
592 static int nes_dealloc_fmr(struct ib_fmr *ibfmr)
593 {
594         struct nes_mr *nesmr = to_nesmr_from_ibfmr(ibfmr);
595         struct nes_fmr *nesfmr = to_nesfmr(nesmr);
596         struct nes_vnic *nesvnic = to_nesvnic(ibfmr->device);
597         struct nes_device *nesdev = nesvnic->nesdev;
598         struct nes_mr temp_nesmr = *nesmr;
599         int i = 0;
600
601         temp_nesmr.ibmw.device = ibfmr->device;
602         temp_nesmr.ibmw.pd = ibfmr->pd;
603         temp_nesmr.ibmw.rkey = ibfmr->rkey;
604         temp_nesmr.ibmw.uobject = NULL;
605
606         /* free the resources */
607         if (nesfmr->leaf_pbl_cnt == 0) {
608                 /* single PBL case */
609                 if (nesfmr->root_vpbl.pbl_vbase)
610                         pci_free_consistent(nesdev->pcidev, 4096, nesfmr->root_vpbl.pbl_vbase,
611                                         nesfmr->root_vpbl.pbl_pbase);
612         } else {
613                 for (i = 0; i < nesfmr->leaf_pbl_cnt; i++) {
614                         pci_free_consistent(nesdev->pcidev, 4096, nesfmr->root_vpbl.leaf_vpbl[i].pbl_vbase,
615                                         nesfmr->root_vpbl.leaf_vpbl[i].pbl_pbase);
616                 }
617                 kfree(nesfmr->root_vpbl.leaf_vpbl);
618                 pci_free_consistent(nesdev->pcidev, 8192, nesfmr->root_vpbl.pbl_vbase,
619                                 nesfmr->root_vpbl.pbl_pbase);
620         }
621
622         return nes_dealloc_mw(&temp_nesmr.ibmw);
623 }
624
625
626 /**
627  * nes_map_phys_fmr
628  */
629 static int nes_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list,
630                 int list_len, u64 iova)
631 {
632         return 0;
633 }
634
635
636 /**
637  * nes_unmap_frm
638  */
639 static int nes_unmap_fmr(struct list_head *ibfmr_list)
640 {
641         return 0;
642 }
643
644
645
646 /**
647  * nes_query_device
648  */
649 static int nes_query_device(struct ib_device *ibdev, struct ib_device_attr *props)
650 {
651         struct nes_vnic *nesvnic = to_nesvnic(ibdev);
652         struct nes_device *nesdev = nesvnic->nesdev;
653         struct nes_ib_device *nesibdev = nesvnic->nesibdev;
654
655         memset(props, 0, sizeof(*props));
656         memcpy(&props->sys_image_guid, nesvnic->netdev->dev_addr, 6);
657
658         props->fw_ver = nesdev->nesadapter->fw_ver;
659         props->device_cap_flags = nesdev->nesadapter->device_cap_flags;
660         props->vendor_id = nesdev->nesadapter->vendor_id;
661         props->vendor_part_id = nesdev->nesadapter->vendor_part_id;
662         props->hw_ver = nesdev->nesadapter->hw_rev;
663         props->max_mr_size = 0x80000000;
664         props->max_qp = nesibdev->max_qp;
665         props->max_qp_wr = nesdev->nesadapter->max_qp_wr - 2;
666         props->max_sge = nesdev->nesadapter->max_sge;
667         props->max_cq = nesibdev->max_cq;
668         props->max_cqe = nesdev->nesadapter->max_cqe - 1;
669         props->max_mr = nesibdev->max_mr;
670         props->max_mw = nesibdev->max_mr;
671         props->max_pd = nesibdev->max_pd;
672         props->max_sge_rd = 1;
673         switch (nesdev->nesadapter->max_irrq_wr) {
674                 case 0:
675                         props->max_qp_rd_atom = 1;
676                         break;
677                 case 1:
678                         props->max_qp_rd_atom = 4;
679                         break;
680                 case 2:
681                         props->max_qp_rd_atom = 16;
682                         break;
683                 case 3:
684                         props->max_qp_rd_atom = 32;
685                         break;
686                 default:
687                         props->max_qp_rd_atom = 0;
688         }
689         props->max_qp_init_rd_atom = props->max_qp_wr;
690         props->atomic_cap = IB_ATOMIC_NONE;
691         props->max_map_per_fmr = 1;
692
693         return 0;
694 }
695
696
697 /**
698  * nes_query_port
699  */
700 static int nes_query_port(struct ib_device *ibdev, u8 port, struct ib_port_attr *props)
701 {
702         memset(props, 0, sizeof(*props));
703
704         props->max_mtu = IB_MTU_2048;
705         props->active_mtu = IB_MTU_2048;
706         props->lid = 1;
707         props->lmc = 0;
708         props->sm_lid = 0;
709         props->sm_sl = 0;
710         props->state = IB_PORT_ACTIVE;
711         props->phys_state = 0;
712         props->port_cap_flags = IB_PORT_CM_SUP | IB_PORT_REINIT_SUP |
713                         IB_PORT_VENDOR_CLASS_SUP | IB_PORT_BOOT_MGMT_SUP;
714         props->gid_tbl_len = 1;
715         props->pkey_tbl_len = 1;
716         props->qkey_viol_cntr = 0;
717         props->active_width = IB_WIDTH_4X;
718         props->active_speed = 1;
719         props->max_msg_sz = 0x80000000;
720
721         return 0;
722 }
723
724
725 /**
726  * nes_modify_port
727  */
728 static int nes_modify_port(struct ib_device *ibdev, u8 port,
729                 int port_modify_mask, struct ib_port_modify *props)
730 {
731         return 0;
732 }
733
734
735 /**
736  * nes_query_pkey
737  */
738 static int nes_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
739 {
740         *pkey = 0;
741         return 0;
742 }
743
744
745 /**
746  * nes_query_gid
747  */
748 static int nes_query_gid(struct ib_device *ibdev, u8 port,
749                 int index, union ib_gid *gid)
750 {
751         struct nes_vnic *nesvnic = to_nesvnic(ibdev);
752
753         memset(&(gid->raw[0]), 0, sizeof(gid->raw));
754         memcpy(&(gid->raw[0]), nesvnic->netdev->dev_addr, 6);
755
756         return 0;
757 }
758
759
760 /**
761  * nes_alloc_ucontext - Allocate the user context data structure. This keeps track
762  * of all objects associated with a particular user-mode client.
763  */
764 static struct ib_ucontext *nes_alloc_ucontext(struct ib_device *ibdev,
765                 struct ib_udata *udata)
766 {
767         struct nes_vnic *nesvnic = to_nesvnic(ibdev);
768         struct nes_device *nesdev = nesvnic->nesdev;
769         struct nes_adapter *nesadapter = nesdev->nesadapter;
770         struct nes_alloc_ucontext_req req;
771         struct nes_alloc_ucontext_resp uresp;
772         struct nes_ucontext *nes_ucontext;
773         struct nes_ib_device *nesibdev = nesvnic->nesibdev;
774
775
776         if (ib_copy_from_udata(&req, udata, sizeof(struct nes_alloc_ucontext_req))) {
777                 printk(KERN_ERR PFX "Invalid structure size on allocate user context.\n");
778                 return ERR_PTR(-EINVAL);
779         }
780
781         if (req.userspace_ver != NES_ABI_USERSPACE_VER) {
782                 printk(KERN_ERR PFX "Invalid userspace driver version detected. Detected version %d, should be %d\n",
783                         req.userspace_ver, NES_ABI_USERSPACE_VER);
784                 return ERR_PTR(-EINVAL);
785         }
786
787
788         memset(&uresp, 0, sizeof uresp);
789
790         uresp.max_qps = nesibdev->max_qp;
791         uresp.max_pds = nesibdev->max_pd;
792         uresp.wq_size = nesdev->nesadapter->max_qp_wr * 2;
793         uresp.virtwq = nesadapter->virtwq;
794         uresp.kernel_ver = NES_ABI_KERNEL_VER;
795
796         nes_ucontext = kzalloc(sizeof *nes_ucontext, GFP_KERNEL);
797         if (!nes_ucontext)
798                 return ERR_PTR(-ENOMEM);
799
800         nes_ucontext->nesdev = nesdev;
801         nes_ucontext->mmap_wq_offset = uresp.max_pds;
802         nes_ucontext->mmap_cq_offset = nes_ucontext->mmap_wq_offset +
803                         ((sizeof(struct nes_hw_qp_wqe) * uresp.max_qps * 2) + PAGE_SIZE-1) /
804                         PAGE_SIZE;
805
806
807         if (ib_copy_to_udata(udata, &uresp, sizeof uresp)) {
808                 kfree(nes_ucontext);
809                 return ERR_PTR(-EFAULT);
810         }
811
812         INIT_LIST_HEAD(&nes_ucontext->cq_reg_mem_list);
813         INIT_LIST_HEAD(&nes_ucontext->qp_reg_mem_list);
814         atomic_set(&nes_ucontext->usecnt, 1);
815         return &nes_ucontext->ibucontext;
816 }
817
818
819 /**
820  * nes_dealloc_ucontext
821  */
822 static int nes_dealloc_ucontext(struct ib_ucontext *context)
823 {
824         /* struct nes_vnic *nesvnic = to_nesvnic(context->device); */
825         /* struct nes_device *nesdev = nesvnic->nesdev; */
826         struct nes_ucontext *nes_ucontext = to_nesucontext(context);
827
828         if (!atomic_dec_and_test(&nes_ucontext->usecnt))
829           return 0;
830         kfree(nes_ucontext);
831         return 0;
832 }
833
834
835 /**
836  * nes_mmap
837  */
838 static int nes_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
839 {
840         unsigned long index;
841         struct nes_vnic *nesvnic = to_nesvnic(context->device);
842         struct nes_device *nesdev = nesvnic->nesdev;
843         /* struct nes_adapter *nesadapter = nesdev->nesadapter; */
844         struct nes_ucontext *nes_ucontext;
845         struct nes_qp *nesqp;
846
847         nes_ucontext = to_nesucontext(context);
848
849
850         if (vma->vm_pgoff >= nes_ucontext->mmap_wq_offset) {
851                 index = (vma->vm_pgoff - nes_ucontext->mmap_wq_offset) * PAGE_SIZE;
852                 index /= ((sizeof(struct nes_hw_qp_wqe) * nesdev->nesadapter->max_qp_wr * 2) +
853                                 PAGE_SIZE-1) & (~(PAGE_SIZE-1));
854                 if (!test_bit(index, nes_ucontext->allocated_wqs)) {
855                         nes_debug(NES_DBG_MMAP, "wq %lu not allocated\n", index);
856                         return -EFAULT;
857                 }
858                 nesqp = nes_ucontext->mmap_nesqp[index];
859                 if (nesqp == NULL) {
860                         nes_debug(NES_DBG_MMAP, "wq %lu has a NULL QP base.\n", index);
861                         return -EFAULT;
862                 }
863                 if (remap_pfn_range(vma, vma->vm_start,
864                                 virt_to_phys(nesqp->hwqp.sq_vbase) >> PAGE_SHIFT,
865                                 vma->vm_end - vma->vm_start,
866                                 vma->vm_page_prot)) {
867                         nes_debug(NES_DBG_MMAP, "remap_pfn_range failed.\n");
868                         return -EAGAIN;
869                 }
870                 vma->vm_private_data = nesqp;
871                 return 0;
872         } else {
873                 index = vma->vm_pgoff;
874                 if (!test_bit(index, nes_ucontext->allocated_doorbells))
875                         return -EFAULT;
876
877                 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
878                 if (io_remap_pfn_range(vma, vma->vm_start,
879                                 (nesdev->doorbell_start +
880                                 ((nes_ucontext->mmap_db_index[index] - nesdev->base_doorbell_index) * 4096))
881                                 >> PAGE_SHIFT, PAGE_SIZE, vma->vm_page_prot))
882                         return -EAGAIN;
883                 vma->vm_private_data = nes_ucontext;
884                 return 0;
885         }
886
887         return -ENOSYS;
888 }
889
890
891 /**
892  * nes_alloc_pd
893  */
894 static struct ib_pd *nes_alloc_pd(struct ib_device *ibdev,
895                 struct ib_ucontext *context, struct ib_udata *udata)
896 {
897         struct nes_pd *nespd;
898         struct nes_vnic *nesvnic = to_nesvnic(ibdev);
899         struct nes_device *nesdev = nesvnic->nesdev;
900         struct nes_adapter *nesadapter = nesdev->nesadapter;
901         struct nes_ucontext *nesucontext;
902         struct nes_alloc_pd_resp uresp;
903         u32 pd_num = 0;
904         int err;
905
906         nes_debug(NES_DBG_PD, "nesvnic=%p, netdev=%p %s, ibdev=%p, context=%p, netdev refcnt=%u\n",
907                         nesvnic, nesdev->netdev[0], nesdev->netdev[0]->name, ibdev, context,
908                         atomic_read(&nesvnic->netdev->refcnt));
909
910         err = nes_alloc_resource(nesadapter, nesadapter->allocated_pds,
911                         nesadapter->max_pd, &pd_num, &nesadapter->next_pd);
912         if (err) {
913                 return ERR_PTR(err);
914         }
915
916         nespd = kzalloc(sizeof (struct nes_pd), GFP_KERNEL);
917         if (!nespd) {
918                 nes_free_resource(nesadapter, nesadapter->allocated_pds, pd_num);
919                 return ERR_PTR(-ENOMEM);
920         }
921
922         nes_debug(NES_DBG_PD, "Allocating PD (%p) for ib device %s\n",
923                         nespd, nesvnic->nesibdev->ibdev.name);
924
925         nespd->pd_id = (pd_num << (PAGE_SHIFT-12)) + nesadapter->base_pd;
926
927         if (context) {
928                 nesucontext = to_nesucontext(context);
929                 nespd->mmap_db_index = find_next_zero_bit(nesucontext->allocated_doorbells,
930                                 NES_MAX_USER_DB_REGIONS, nesucontext->first_free_db);
931                 nes_debug(NES_DBG_PD, "find_first_zero_biton doorbells returned %u, mapping pd_id %u.\n",
932                                 nespd->mmap_db_index, nespd->pd_id);
933                 if (nespd->mmap_db_index >= NES_MAX_USER_DB_REGIONS) {
934                         nes_debug(NES_DBG_PD, "mmap_db_index > MAX\n");
935                         nes_free_resource(nesadapter, nesadapter->allocated_pds, pd_num);
936                         kfree(nespd);
937                         return ERR_PTR(-ENOMEM);
938                 }
939
940                 uresp.pd_id = nespd->pd_id;
941                 uresp.mmap_db_index = nespd->mmap_db_index;
942                 if (ib_copy_to_udata(udata, &uresp, sizeof (struct nes_alloc_pd_resp))) {
943                         nes_free_resource(nesadapter, nesadapter->allocated_pds, pd_num);
944                         kfree(nespd);
945                         return ERR_PTR(-EFAULT);
946                 }
947
948                 set_bit(nespd->mmap_db_index, nesucontext->allocated_doorbells);
949                 nesucontext->mmap_db_index[nespd->mmap_db_index] = nespd->pd_id;
950                 nesucontext->first_free_db = nespd->mmap_db_index + 1;
951         }
952
953         nes_debug(NES_DBG_PD, "PD%u structure located @%p.\n", nespd->pd_id, nespd);
954         return &nespd->ibpd;
955 }
956
957
958 /**
959  * nes_dealloc_pd
960  */
961 static int nes_dealloc_pd(struct ib_pd *ibpd)
962 {
963         struct nes_ucontext *nesucontext;
964         struct nes_pd *nespd = to_nespd(ibpd);
965         struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
966         struct nes_device *nesdev = nesvnic->nesdev;
967         struct nes_adapter *nesadapter = nesdev->nesadapter;
968
969         if ((ibpd->uobject) && (ibpd->uobject->context)) {
970                 nesucontext = to_nesucontext(ibpd->uobject->context);
971                 nes_debug(NES_DBG_PD, "Clearing bit %u from allocated doorbells\n",
972                                 nespd->mmap_db_index);
973                 clear_bit(nespd->mmap_db_index, nesucontext->allocated_doorbells);
974                 nesucontext->mmap_db_index[nespd->mmap_db_index] = 0;
975                 if (nesucontext->first_free_db > nespd->mmap_db_index) {
976                         nesucontext->first_free_db = nespd->mmap_db_index;
977                 }
978         }
979
980         nes_debug(NES_DBG_PD, "Deallocating PD%u structure located @%p.\n",
981                         nespd->pd_id, nespd);
982         nes_free_resource(nesadapter, nesadapter->allocated_pds,
983                         (nespd->pd_id-nesadapter->base_pd)>>(PAGE_SHIFT-12));
984         kfree(nespd);
985
986         return 0;
987 }
988
989
990 /**
991  * nes_create_ah
992  */
993 static struct ib_ah *nes_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
994 {
995         return ERR_PTR(-ENOSYS);
996 }
997
998
999 /**
1000  * nes_destroy_ah
1001  */
1002 static int nes_destroy_ah(struct ib_ah *ah)
1003 {
1004         return -ENOSYS;
1005 }
1006
1007
1008 /**
1009  * nes_get_encoded_size
1010  */
1011 static inline u8 nes_get_encoded_size(int *size)
1012 {
1013         u8 encoded_size = 0;
1014         if (*size <= 32) {
1015                 *size = 32;
1016                 encoded_size = 1;
1017         } else if (*size <= 128) {
1018                 *size = 128;
1019                 encoded_size = 2;
1020         } else if (*size <= 512) {
1021                 *size = 512;
1022                 encoded_size = 3;
1023         }
1024         return (encoded_size);
1025 }
1026
1027
1028
1029 /**
1030  * nes_setup_virt_qp
1031  */
1032 static int nes_setup_virt_qp(struct nes_qp *nesqp, struct nes_pbl *nespbl,
1033                 struct nes_vnic *nesvnic, int sq_size, int rq_size)
1034 {
1035         unsigned long flags;
1036         void *mem;
1037         __le64 *pbl = NULL;
1038         __le64 *tpbl;
1039         __le64 *pblbuffer;
1040         struct nes_device *nesdev = nesvnic->nesdev;
1041         struct nes_adapter *nesadapter = nesdev->nesadapter;
1042         u32 pbl_entries;
1043         u8 rq_pbl_entries;
1044         u8 sq_pbl_entries;
1045
1046         pbl_entries = nespbl->pbl_size >> 3;
1047         nes_debug(NES_DBG_QP, "Userspace PBL, pbl_size=%u, pbl_entries = %d pbl_vbase=%p, pbl_pbase=%lx\n",
1048                         nespbl->pbl_size, pbl_entries,
1049                         (void *)nespbl->pbl_vbase,
1050                         (unsigned long) nespbl->pbl_pbase);
1051         pbl = (__le64 *) nespbl->pbl_vbase; /* points to first pbl entry */
1052         /* now lets set the sq_vbase as well as rq_vbase addrs we will assign */
1053         /* the first pbl to be fro the rq_vbase... */
1054         rq_pbl_entries = (rq_size * sizeof(struct nes_hw_qp_wqe)) >> 12;
1055         sq_pbl_entries = (sq_size * sizeof(struct nes_hw_qp_wqe)) >> 12;
1056         nesqp->hwqp.sq_pbase = (le32_to_cpu(((__le32 *)pbl)[0])) | ((u64)((le32_to_cpu(((__le32 *)pbl)[1]))) << 32);
1057         if (!nespbl->page) {
1058                 nes_debug(NES_DBG_QP, "QP nespbl->page is NULL \n");
1059                 kfree(nespbl);
1060                 return -ENOMEM;
1061         }
1062
1063         nesqp->hwqp.sq_vbase = kmap(nespbl->page);
1064         nesqp->page = nespbl->page;
1065         if (!nesqp->hwqp.sq_vbase) {
1066                 nes_debug(NES_DBG_QP, "QP sq_vbase kmap failed\n");
1067                 kfree(nespbl);
1068                 return -ENOMEM;
1069         }
1070
1071         /* Now to get to sq.. we need to calculate how many */
1072         /* PBL entries were used by the rq.. */
1073         pbl += sq_pbl_entries;
1074         nesqp->hwqp.rq_pbase = (le32_to_cpu(((__le32 *)pbl)[0])) | ((u64)((le32_to_cpu(((__le32 *)pbl)[1]))) << 32);
1075         /* nesqp->hwqp.rq_vbase = bus_to_virt(*pbl); */
1076         /*nesqp->hwqp.rq_vbase = phys_to_virt(*pbl); */
1077
1078         nes_debug(NES_DBG_QP, "QP sq_vbase= %p sq_pbase=%lx rq_vbase=%p rq_pbase=%lx\n",
1079                   nesqp->hwqp.sq_vbase, (unsigned long) nesqp->hwqp.sq_pbase,
1080                   nesqp->hwqp.rq_vbase, (unsigned long) nesqp->hwqp.rq_pbase);
1081         spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1082         if (!nesadapter->free_256pbl) {
1083                 pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
1084                                 nespbl->pbl_pbase);
1085                 spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1086                 kunmap(nesqp->page);
1087                 kfree(nespbl);
1088                 return -ENOMEM;
1089         }
1090         nesadapter->free_256pbl--;
1091         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1092
1093         nesqp->pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 256, &nesqp->pbl_pbase);
1094         pblbuffer = nesqp->pbl_vbase;
1095         if (!nesqp->pbl_vbase) {
1096                 /* memory allocated during nes_reg_user_mr() */
1097                 pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
1098                                     nespbl->pbl_pbase);
1099                 kfree(nespbl);
1100                 spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1101                 nesadapter->free_256pbl++;
1102                 spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1103                 kunmap(nesqp->page);
1104                 return -ENOMEM;
1105         }
1106         memset(nesqp->pbl_vbase, 0, 256);
1107         /* fill in the page address in the pbl buffer.. */
1108         tpbl = pblbuffer + 16;
1109         pbl = (__le64 *)nespbl->pbl_vbase;
1110         while (sq_pbl_entries--)
1111                 *tpbl++ = *pbl++;
1112         tpbl = pblbuffer;
1113         while (rq_pbl_entries--)
1114                 *tpbl++ = *pbl++;
1115
1116         /* done with memory allocated during nes_reg_user_mr() */
1117         pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
1118                             nespbl->pbl_pbase);
1119         kfree(nespbl);
1120
1121         nesqp->qp_mem_size =
1122                         max((u32)sizeof(struct nes_qp_context), ((u32)256)) + 256;     /* this is Q2 */
1123         /* Round up to a multiple of a page */
1124         nesqp->qp_mem_size += PAGE_SIZE - 1;
1125         nesqp->qp_mem_size &= ~(PAGE_SIZE - 1);
1126
1127         mem = pci_alloc_consistent(nesdev->pcidev, nesqp->qp_mem_size,
1128                         &nesqp->hwqp.q2_pbase);
1129
1130         if (!mem) {
1131                 pci_free_consistent(nesdev->pcidev, 256, nesqp->pbl_vbase, nesqp->pbl_pbase);
1132                 nesqp->pbl_vbase = NULL;
1133                 spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1134                 nesadapter->free_256pbl++;
1135                 spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1136                 kunmap(nesqp->page);
1137                 return -ENOMEM;
1138         }
1139         nesqp->hwqp.q2_vbase = mem;
1140         mem += 256;
1141         memset(nesqp->hwqp.q2_vbase, 0, 256);
1142         nesqp->nesqp_context = mem;
1143         memset(nesqp->nesqp_context, 0, sizeof(*nesqp->nesqp_context));
1144         nesqp->nesqp_context_pbase = nesqp->hwqp.q2_pbase + 256;
1145
1146         return 0;
1147 }
1148
1149
1150 /**
1151  * nes_setup_mmap_qp
1152  */
1153 static int nes_setup_mmap_qp(struct nes_qp *nesqp, struct nes_vnic *nesvnic,
1154                 int sq_size, int rq_size)
1155 {
1156         void *mem;
1157         struct nes_device *nesdev = nesvnic->nesdev;
1158
1159         nesqp->qp_mem_size = (sizeof(struct nes_hw_qp_wqe) * sq_size) +
1160                         (sizeof(struct nes_hw_qp_wqe) * rq_size) +
1161                         max((u32)sizeof(struct nes_qp_context), ((u32)256)) +
1162                         256; /* this is Q2 */
1163         /* Round up to a multiple of a page */
1164         nesqp->qp_mem_size += PAGE_SIZE - 1;
1165         nesqp->qp_mem_size &= ~(PAGE_SIZE - 1);
1166
1167         mem = pci_alloc_consistent(nesdev->pcidev, nesqp->qp_mem_size,
1168                         &nesqp->hwqp.sq_pbase);
1169         if (!mem)
1170                 return -ENOMEM;
1171         nes_debug(NES_DBG_QP, "PCI consistent memory for "
1172                         "host descriptor rings located @ %p (pa = 0x%08lX.) size = %u.\n",
1173                         mem, (unsigned long)nesqp->hwqp.sq_pbase, nesqp->qp_mem_size);
1174
1175         memset(mem, 0, nesqp->qp_mem_size);
1176
1177         nesqp->hwqp.sq_vbase = mem;
1178         mem += sizeof(struct nes_hw_qp_wqe) * sq_size;
1179
1180         nesqp->hwqp.rq_vbase = mem;
1181         nesqp->hwqp.rq_pbase = nesqp->hwqp.sq_pbase +
1182                         sizeof(struct nes_hw_qp_wqe) * sq_size;
1183         mem += sizeof(struct nes_hw_qp_wqe) * rq_size;
1184
1185         nesqp->hwqp.q2_vbase = mem;
1186         nesqp->hwqp.q2_pbase = nesqp->hwqp.rq_pbase +
1187                         sizeof(struct nes_hw_qp_wqe) * rq_size;
1188         mem += 256;
1189         memset(nesqp->hwqp.q2_vbase, 0, 256);
1190
1191         nesqp->nesqp_context = mem;
1192         nesqp->nesqp_context_pbase = nesqp->hwqp.q2_pbase + 256;
1193         memset(nesqp->nesqp_context, 0, sizeof(*nesqp->nesqp_context));
1194         return 0;
1195 }
1196
1197
1198 /**
1199  * nes_free_qp_mem() is to free up the qp's pci_alloc_consistent() memory.
1200  */
1201 static inline void nes_free_qp_mem(struct nes_device *nesdev,
1202                 struct nes_qp *nesqp, int virt_wqs)
1203 {
1204         unsigned long flags;
1205         struct nes_adapter *nesadapter = nesdev->nesadapter;
1206         if (!virt_wqs) {
1207                 pci_free_consistent(nesdev->pcidev, nesqp->qp_mem_size,
1208                                 nesqp->hwqp.sq_vbase, nesqp->hwqp.sq_pbase);
1209         }else {
1210                 spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1211                 nesadapter->free_256pbl++;
1212                 spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1213                 pci_free_consistent(nesdev->pcidev, nesqp->qp_mem_size, nesqp->hwqp.q2_vbase, nesqp->hwqp.q2_pbase);
1214                 pci_free_consistent(nesdev->pcidev, 256, nesqp->pbl_vbase, nesqp->pbl_pbase );
1215                 nesqp->pbl_vbase = NULL;
1216                 kunmap(nesqp->page);
1217         }
1218 }
1219
1220
1221 /**
1222  * nes_create_qp
1223  */
1224 static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
1225                 struct ib_qp_init_attr *init_attr, struct ib_udata *udata)
1226 {
1227         u64 u64temp= 0;
1228         u64 u64nesqp = 0;
1229         struct nes_pd *nespd = to_nespd(ibpd);
1230         struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
1231         struct nes_device *nesdev = nesvnic->nesdev;
1232         struct nes_adapter *nesadapter = nesdev->nesadapter;
1233         struct nes_qp *nesqp;
1234         struct nes_cq *nescq;
1235         struct nes_ucontext *nes_ucontext;
1236         struct nes_hw_cqp_wqe *cqp_wqe;
1237         struct nes_cqp_request *cqp_request;
1238         struct nes_create_qp_req req;
1239         struct nes_create_qp_resp uresp;
1240         struct nes_pbl  *nespbl = NULL;
1241         u32 qp_num = 0;
1242         u32 opcode = 0;
1243         /* u32 counter = 0; */
1244         void *mem;
1245         unsigned long flags;
1246         int ret;
1247         int err;
1248         int virt_wqs = 0;
1249         int sq_size;
1250         int rq_size;
1251         u8 sq_encoded_size;
1252         u8 rq_encoded_size;
1253         /* int counter; */
1254
1255         atomic_inc(&qps_created);
1256         switch (init_attr->qp_type) {
1257                 case IB_QPT_RC:
1258                         if (nes_drv_opt & NES_DRV_OPT_NO_INLINE_DATA) {
1259                                 init_attr->cap.max_inline_data = 0;
1260                         } else {
1261                                 init_attr->cap.max_inline_data = 64;
1262                         }
1263                         sq_size = init_attr->cap.max_send_wr;
1264                         rq_size = init_attr->cap.max_recv_wr;
1265
1266                         // check if the encoded sizes are OK or not...
1267                         sq_encoded_size = nes_get_encoded_size(&sq_size);
1268                         rq_encoded_size = nes_get_encoded_size(&rq_size);
1269
1270                         if ((!sq_encoded_size) || (!rq_encoded_size)) {
1271                                 nes_debug(NES_DBG_QP, "ERROR bad rq (%u) or sq (%u) size\n",
1272                                                 rq_size, sq_size);
1273                                 return ERR_PTR(-EINVAL);
1274                         }
1275
1276                         init_attr->cap.max_send_wr = sq_size -2;
1277                         init_attr->cap.max_recv_wr = rq_size -1;
1278                         nes_debug(NES_DBG_QP, "RQ size=%u, SQ Size=%u\n", rq_size, sq_size);
1279
1280                         ret = nes_alloc_resource(nesadapter, nesadapter->allocated_qps,
1281                                         nesadapter->max_qp, &qp_num, &nesadapter->next_qp);
1282                         if (ret) {
1283                                 return ERR_PTR(ret);
1284                         }
1285
1286                         /* Need 512 (actually now 1024) byte alignment on this structure */
1287                         mem = kzalloc(sizeof(*nesqp)+NES_SW_CONTEXT_ALIGN-1, GFP_KERNEL);
1288                         if (!mem) {
1289                                 nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1290                                 nes_debug(NES_DBG_QP, "Unable to allocate QP\n");
1291                                 return ERR_PTR(-ENOMEM);
1292                         }
1293                         u64nesqp = (unsigned long)mem;
1294                         u64nesqp += ((u64)NES_SW_CONTEXT_ALIGN) - 1;
1295                         u64temp = ((u64)NES_SW_CONTEXT_ALIGN) - 1;
1296                         u64nesqp &= ~u64temp;
1297                         nesqp = (struct nes_qp *)(unsigned long)u64nesqp;
1298                         /* nes_debug(NES_DBG_QP, "nesqp=%p, allocated buffer=%p.  Rounded to closest %u\n",
1299                                         nesqp, mem, NES_SW_CONTEXT_ALIGN); */
1300                         nesqp->allocated_buffer = mem;
1301
1302                         if (udata) {
1303                                 if (ib_copy_from_udata(&req, udata, sizeof(struct nes_create_qp_req))) {
1304                                         nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1305                                         kfree(nesqp->allocated_buffer);
1306                                         nes_debug(NES_DBG_QP, "ib_copy_from_udata() Failed \n");
1307                                         return NULL;
1308                                 }
1309                                 if (req.user_wqe_buffers) {
1310                                         virt_wqs = 1;
1311                                 }
1312                                 if ((ibpd->uobject) && (ibpd->uobject->context)) {
1313                                         nesqp->user_mode = 1;
1314                                         nes_ucontext = to_nesucontext(ibpd->uobject->context);
1315                                         if (virt_wqs) {
1316                                                 err = 1;
1317                                                 list_for_each_entry(nespbl, &nes_ucontext->qp_reg_mem_list, list) {
1318                                                         if (nespbl->user_base == (unsigned long )req.user_wqe_buffers) {
1319                                                                 list_del(&nespbl->list);
1320                                                                 err = 0;
1321                                                                 nes_debug(NES_DBG_QP, "Found PBL for virtual QP. nespbl=%p. user_base=0x%lx\n",
1322                                                                           nespbl, nespbl->user_base);
1323                                                                 break;
1324                                                         }
1325                                                 }
1326                                                 if (err) {
1327                                                         nes_debug(NES_DBG_QP, "Didn't Find PBL for virtual QP. address = %llx.\n",
1328                                                                   (long long unsigned int)req.user_wqe_buffers);
1329                                                         nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1330                                                         kfree(nesqp->allocated_buffer);
1331                                                         return ERR_PTR(-EFAULT);
1332                                                 }
1333                                         }
1334
1335                                         nes_ucontext = to_nesucontext(ibpd->uobject->context);
1336                                         nesqp->mmap_sq_db_index =
1337                                                 find_next_zero_bit(nes_ucontext->allocated_wqs,
1338                                                                    NES_MAX_USER_WQ_REGIONS, nes_ucontext->first_free_wq);
1339                                         /* nes_debug(NES_DBG_QP, "find_first_zero_biton wqs returned %u\n",
1340                                                         nespd->mmap_db_index); */
1341                                         if (nesqp->mmap_sq_db_index >= NES_MAX_USER_WQ_REGIONS) {
1342                                                 nes_debug(NES_DBG_QP,
1343                                                           "db index > max user regions, failing create QP\n");
1344                                                 nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1345                                                 if (virt_wqs) {
1346                                                         pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
1347                                                                             nespbl->pbl_pbase);
1348                                                         kfree(nespbl);
1349                                                 }
1350                                                 kfree(nesqp->allocated_buffer);
1351                                                 return ERR_PTR(-ENOMEM);
1352                                         }
1353                                         set_bit(nesqp->mmap_sq_db_index, nes_ucontext->allocated_wqs);
1354                                         nes_ucontext->mmap_nesqp[nesqp->mmap_sq_db_index] = nesqp;
1355                                         nes_ucontext->first_free_wq = nesqp->mmap_sq_db_index + 1;
1356                                 } else {
1357                                         nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1358                                         kfree(nesqp->allocated_buffer);
1359                                         return ERR_PTR(-EFAULT);
1360                                 }
1361                         }
1362                         err = (!virt_wqs) ? nes_setup_mmap_qp(nesqp, nesvnic, sq_size, rq_size) :
1363                                         nes_setup_virt_qp(nesqp, nespbl, nesvnic, sq_size, rq_size);
1364                         if (err) {
1365                                 nes_debug(NES_DBG_QP,
1366                                           "error geting qp mem code = %d\n", err);
1367                                 nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1368                                 kfree(nesqp->allocated_buffer);
1369                                 return ERR_PTR(-ENOMEM);
1370                         }
1371
1372                         nesqp->hwqp.sq_size = sq_size;
1373                         nesqp->hwqp.sq_encoded_size = sq_encoded_size;
1374                         nesqp->hwqp.sq_head = 1;
1375                         nesqp->hwqp.rq_size = rq_size;
1376                         nesqp->hwqp.rq_encoded_size = rq_encoded_size;
1377                         /* nes_debug(NES_DBG_QP, "nesqp->nesqp_context_pbase = %p\n",
1378                                         (void *)nesqp->nesqp_context_pbase);
1379                         */
1380                         nesqp->hwqp.qp_id = qp_num;
1381                         nesqp->ibqp.qp_num = nesqp->hwqp.qp_id;
1382                         nesqp->nespd = nespd;
1383
1384                         nescq = to_nescq(init_attr->send_cq);
1385                         nesqp->nesscq = nescq;
1386                         nescq = to_nescq(init_attr->recv_cq);
1387                         nesqp->nesrcq = nescq;
1388
1389                         nesqp->nesqp_context->misc |= cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) <<
1390                                         NES_QPCONTEXT_MISC_PCI_FCN_SHIFT);
1391                         nesqp->nesqp_context->misc |= cpu_to_le32((u32)nesqp->hwqp.rq_encoded_size <<
1392                                         NES_QPCONTEXT_MISC_RQ_SIZE_SHIFT);
1393                         nesqp->nesqp_context->misc |= cpu_to_le32((u32)nesqp->hwqp.sq_encoded_size <<
1394                                         NES_QPCONTEXT_MISC_SQ_SIZE_SHIFT);
1395                                 nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_PRIV_EN);
1396                                 nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_FAST_REGISTER_EN);
1397                         nesqp->nesqp_context->cqs = cpu_to_le32(nesqp->nesscq->hw_cq.cq_number +
1398                                         ((u32)nesqp->nesrcq->hw_cq.cq_number << 16));
1399                         u64temp = (u64)nesqp->hwqp.sq_pbase;
1400                         nesqp->nesqp_context->sq_addr_low = cpu_to_le32((u32)u64temp);
1401                         nesqp->nesqp_context->sq_addr_high = cpu_to_le32((u32)(u64temp >> 32));
1402
1403
1404                         if (!virt_wqs) {
1405                                 u64temp = (u64)nesqp->hwqp.sq_pbase;
1406                                 nesqp->nesqp_context->sq_addr_low = cpu_to_le32((u32)u64temp);
1407                                 nesqp->nesqp_context->sq_addr_high = cpu_to_le32((u32)(u64temp >> 32));
1408                                 u64temp = (u64)nesqp->hwqp.rq_pbase;
1409                                 nesqp->nesqp_context->rq_addr_low = cpu_to_le32((u32)u64temp);
1410                                 nesqp->nesqp_context->rq_addr_high = cpu_to_le32((u32)(u64temp >> 32));
1411                         } else {
1412                                 u64temp = (u64)nesqp->pbl_pbase;
1413                                 nesqp->nesqp_context->rq_addr_low = cpu_to_le32((u32)u64temp);
1414                                 nesqp->nesqp_context->rq_addr_high = cpu_to_le32((u32)(u64temp >> 32));
1415                         }
1416
1417                         /* nes_debug(NES_DBG_QP, "next_qp_nic_index=%u, using nic_index=%d\n",
1418                                         nesvnic->next_qp_nic_index,
1419                                         nesvnic->qp_nic_index[nesvnic->next_qp_nic_index]); */
1420                         spin_lock_irqsave(&nesdev->cqp.lock, flags);
1421                         nesqp->nesqp_context->misc2 |= cpu_to_le32(
1422                                         (u32)nesvnic->qp_nic_index[nesvnic->next_qp_nic_index] <<
1423                                         NES_QPCONTEXT_MISC2_NIC_INDEX_SHIFT);
1424                         nesvnic->next_qp_nic_index++;
1425                         if ((nesvnic->next_qp_nic_index > 3) ||
1426                                         (nesvnic->qp_nic_index[nesvnic->next_qp_nic_index] == 0xf)) {
1427                                 nesvnic->next_qp_nic_index = 0;
1428                         }
1429                         spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
1430
1431                         nesqp->nesqp_context->pd_index_wscale |= cpu_to_le32((u32)nesqp->nespd->pd_id << 16);
1432                         u64temp = (u64)nesqp->hwqp.q2_pbase;
1433                         nesqp->nesqp_context->q2_addr_low = cpu_to_le32((u32)u64temp);
1434                         nesqp->nesqp_context->q2_addr_high = cpu_to_le32((u32)(u64temp >> 32));
1435                         nesqp->nesqp_context->aeq_token_low =  cpu_to_le32((u32)((unsigned long)(nesqp)));
1436                         nesqp->nesqp_context->aeq_token_high =  cpu_to_le32((u32)(upper_32_bits((unsigned long)(nesqp))));
1437                         nesqp->nesqp_context->ird_ord_sizes = cpu_to_le32(NES_QPCONTEXT_ORDIRD_ALSMM |
1438                                         ((((u32)nesadapter->max_irrq_wr) <<
1439                                         NES_QPCONTEXT_ORDIRD_IRDSIZE_SHIFT) & NES_QPCONTEXT_ORDIRD_IRDSIZE_MASK));
1440                         if (disable_mpa_crc) {
1441                                 nes_debug(NES_DBG_QP, "Disabling MPA crc checking due to module option.\n");
1442                                 nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32(NES_QPCONTEXT_ORDIRD_RNMC);
1443                         }
1444
1445
1446                         /* Create the QP */
1447                         cqp_request = nes_get_cqp_request(nesdev);
1448                         if (cqp_request == NULL) {
1449                                 nes_debug(NES_DBG_QP, "Failed to get a cqp_request\n");
1450                                 nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1451                                 nes_free_qp_mem(nesdev, nesqp,virt_wqs);
1452                                 kfree(nesqp->allocated_buffer);
1453                                 return ERR_PTR(-ENOMEM);
1454                         }
1455                         cqp_request->waiting = 1;
1456                         cqp_wqe = &cqp_request->cqp_wqe;
1457
1458                         if (!virt_wqs) {
1459                                 opcode = NES_CQP_CREATE_QP | NES_CQP_QP_TYPE_IWARP |
1460                                         NES_CQP_QP_IWARP_STATE_IDLE;
1461                         } else {
1462                                 opcode = NES_CQP_CREATE_QP | NES_CQP_QP_TYPE_IWARP | NES_CQP_QP_VIRT_WQS |
1463                                         NES_CQP_QP_IWARP_STATE_IDLE;
1464                         }
1465                         opcode |= NES_CQP_QP_CQS_VALID;
1466                         nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1467                         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, opcode);
1468                         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX, nesqp->hwqp.qp_id);
1469
1470                         u64temp = (u64)nesqp->nesqp_context_pbase;
1471                         set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_QP_WQE_CONTEXT_LOW_IDX, u64temp);
1472
1473                         atomic_set(&cqp_request->refcount, 2);
1474                         nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
1475
1476                         /* Wait for CQP */
1477                         nes_debug(NES_DBG_QP, "Waiting for create iWARP QP%u to complete.\n",
1478                                         nesqp->hwqp.qp_id);
1479                         ret = wait_event_timeout(cqp_request->waitq,
1480                                         (cqp_request->request_done != 0), NES_EVENT_TIMEOUT);
1481                         nes_debug(NES_DBG_QP, "Create iwarp QP%u completed, wait_event_timeout ret=%u,"
1482                                         " nesdev->cqp_head = %u, nesdev->cqp.sq_tail = %u,"
1483                                         " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
1484                                         nesqp->hwqp.qp_id, ret, nesdev->cqp.sq_head, nesdev->cqp.sq_tail,
1485                                         cqp_request->major_code, cqp_request->minor_code);
1486                         if ((!ret) || (cqp_request->major_code)) {
1487                                 if (atomic_dec_and_test(&cqp_request->refcount)) {
1488                                         if (cqp_request->dynamic) {
1489                                                 kfree(cqp_request);
1490                                         } else {
1491                                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
1492                                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
1493                                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
1494                                         }
1495                                 }
1496                                 nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1497                                 nes_free_qp_mem(nesdev, nesqp,virt_wqs);
1498                                 kfree(nesqp->allocated_buffer);
1499                                 if (!ret) {
1500                                         return ERR_PTR(-ETIME);
1501                                 } else {
1502                                         return ERR_PTR(-EIO);
1503                                 }
1504                         } else {
1505                                 if (atomic_dec_and_test(&cqp_request->refcount)) {
1506                                         if (cqp_request->dynamic) {
1507                                                 kfree(cqp_request);
1508                                         } else {
1509                                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
1510                                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
1511                                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
1512                                         }
1513                                 }
1514                         }
1515
1516                         if (ibpd->uobject) {
1517                                 uresp.mmap_sq_db_index = nesqp->mmap_sq_db_index;
1518                                 uresp.actual_sq_size = sq_size;
1519                                 uresp.actual_rq_size = rq_size;
1520                                 uresp.qp_id = nesqp->hwqp.qp_id;
1521                                 uresp.nes_drv_opt = nes_drv_opt;
1522                                 if (ib_copy_to_udata(udata, &uresp, sizeof uresp)) {
1523                                         nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1524                                         nes_free_qp_mem(nesdev, nesqp,virt_wqs);
1525                                         kfree(nesqp->allocated_buffer);
1526                                         return ERR_PTR(-EFAULT);
1527                                 }
1528                         }
1529
1530                         nes_debug(NES_DBG_QP, "QP%u structure located @%p.Size = %u.\n",
1531                                         nesqp->hwqp.qp_id, nesqp, (u32)sizeof(*nesqp));
1532                         spin_lock_init(&nesqp->lock);
1533                         init_waitqueue_head(&nesqp->state_waitq);
1534                         init_waitqueue_head(&nesqp->kick_waitq);
1535                         nes_add_ref(&nesqp->ibqp);
1536                         break;
1537                 default:
1538                         nes_debug(NES_DBG_QP, "Invalid QP type: %d\n", init_attr->qp_type);
1539                         return ERR_PTR(-EINVAL);
1540                         break;
1541         }
1542
1543         /* update the QP table */
1544         nesdev->nesadapter->qp_table[nesqp->hwqp.qp_id-NES_FIRST_QPN] = nesqp;
1545         nes_debug(NES_DBG_QP, "netdev refcnt=%u\n",
1546                         atomic_read(&nesvnic->netdev->refcnt));
1547
1548         return &nesqp->ibqp;
1549 }
1550
1551
1552 /**
1553  * nes_destroy_qp
1554  */
1555 static int nes_destroy_qp(struct ib_qp *ibqp)
1556 {
1557         struct nes_qp *nesqp = to_nesqp(ibqp);
1558         /* struct nes_vnic *nesvnic = to_nesvnic(ibqp->device); */
1559         struct nes_ucontext *nes_ucontext;
1560         struct ib_qp_attr attr;
1561         struct iw_cm_id *cm_id;
1562         struct iw_cm_event cm_event;
1563         int ret;
1564
1565         atomic_inc(&sw_qps_destroyed);
1566         nesqp->destroyed = 1;
1567
1568         /* Blow away the connection if it exists. */
1569         if (nesqp->ibqp_state >= IB_QPS_INIT && nesqp->ibqp_state <= IB_QPS_RTS) {
1570                 /* if (nesqp->ibqp_state == IB_QPS_RTS) { */
1571                 attr.qp_state = IB_QPS_ERR;
1572                 nes_modify_qp(&nesqp->ibqp, &attr, IB_QP_STATE, NULL);
1573         }
1574
1575         if (((nesqp->ibqp_state == IB_QPS_INIT) ||
1576                         (nesqp->ibqp_state == IB_QPS_RTR)) && (nesqp->cm_id)) {
1577                 cm_id = nesqp->cm_id;
1578                 cm_event.event = IW_CM_EVENT_CONNECT_REPLY;
1579                 cm_event.status = IW_CM_EVENT_STATUS_TIMEOUT;
1580                 cm_event.local_addr = cm_id->local_addr;
1581                 cm_event.remote_addr = cm_id->remote_addr;
1582                 cm_event.private_data = NULL;
1583                 cm_event.private_data_len = 0;
1584
1585                 nes_debug(NES_DBG_QP, "Generating a CM Timeout Event for "
1586                                 "QP%u. cm_id = %p, refcount = %u. \n",
1587                                 nesqp->hwqp.qp_id, cm_id, atomic_read(&nesqp->refcount));
1588
1589                 cm_id->rem_ref(cm_id);
1590                 ret = cm_id->event_handler(cm_id, &cm_event);
1591                 if (ret)
1592                         nes_debug(NES_DBG_QP, "OFA CM event_handler returned, ret=%d\n", ret);
1593         }
1594
1595
1596         if (nesqp->user_mode) {
1597                 if ((ibqp->uobject)&&(ibqp->uobject->context)) {
1598                         nes_ucontext = to_nesucontext(ibqp->uobject->context);
1599                         clear_bit(nesqp->mmap_sq_db_index, nes_ucontext->allocated_wqs);
1600                         nes_ucontext->mmap_nesqp[nesqp->mmap_sq_db_index] = NULL;
1601                         if (nes_ucontext->first_free_wq > nesqp->mmap_sq_db_index) {
1602                                 nes_ucontext->first_free_wq = nesqp->mmap_sq_db_index;
1603                         }
1604                 }
1605                 if (nesqp->pbl_pbase)
1606                         kunmap(nesqp->page);
1607         }
1608
1609         nes_rem_ref(&nesqp->ibqp);
1610         return 0;
1611 }
1612
1613
1614 /**
1615  * nes_create_cq
1616  */
1617 static struct ib_cq *nes_create_cq(struct ib_device *ibdev, int entries,
1618                 int comp_vector,
1619                 struct ib_ucontext *context, struct ib_udata *udata)
1620 {
1621         u64 u64temp;
1622         struct nes_vnic *nesvnic = to_nesvnic(ibdev);
1623         struct nes_device *nesdev = nesvnic->nesdev;
1624         struct nes_adapter *nesadapter = nesdev->nesadapter;
1625         struct nes_cq *nescq;
1626         struct nes_ucontext *nes_ucontext = NULL;
1627         struct nes_cqp_request *cqp_request;
1628         void *mem = NULL;
1629         struct nes_hw_cqp_wqe *cqp_wqe;
1630         struct nes_pbl *nespbl = NULL;
1631         struct nes_create_cq_req req;
1632         struct nes_create_cq_resp resp;
1633         u32 cq_num = 0;
1634         u32 opcode = 0;
1635         u32 pbl_entries = 1;
1636         int err;
1637         unsigned long flags;
1638         int ret;
1639
1640         err = nes_alloc_resource(nesadapter, nesadapter->allocated_cqs,
1641                         nesadapter->max_cq, &cq_num, &nesadapter->next_cq);
1642         if (err) {
1643                 return ERR_PTR(err);
1644         }
1645
1646         nescq = kzalloc(sizeof(struct nes_cq), GFP_KERNEL);
1647         if (!nescq) {
1648                 nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1649                 nes_debug(NES_DBG_CQ, "Unable to allocate nes_cq struct\n");
1650                 return ERR_PTR(-ENOMEM);
1651         }
1652
1653         nescq->hw_cq.cq_size = max(entries + 1, 5);
1654         nescq->hw_cq.cq_number = cq_num;
1655         nescq->ibcq.cqe = nescq->hw_cq.cq_size - 1;
1656
1657
1658         if (context) {
1659                 nes_ucontext = to_nesucontext(context);
1660                 if (ib_copy_from_udata(&req, udata, sizeof (struct nes_create_cq_req))) {
1661                         nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1662                         kfree(nescq);
1663                         return ERR_PTR(-EFAULT);
1664                 }
1665                 nesvnic->mcrq_ucontext = nes_ucontext;
1666                 nes_ucontext->mcrqf = req.mcrqf;
1667                 if (nes_ucontext->mcrqf) {
1668                         if (nes_ucontext->mcrqf & 0x80000000)
1669                                 nescq->hw_cq.cq_number = nesvnic->nic.qp_id + 12 + (nes_ucontext->mcrqf & 0xf) - 1;
1670                         else if (nes_ucontext->mcrqf & 0x40000000)
1671                                 nescq->hw_cq.cq_number = nes_ucontext->mcrqf & 0xffff;
1672                         else
1673                                 nescq->hw_cq.cq_number = nesvnic->mcrq_qp_id + nes_ucontext->mcrqf-1;
1674                         nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1675                 }
1676                 nes_debug(NES_DBG_CQ, "CQ Virtual Address = %08lX, size = %u.\n",
1677                                 (unsigned long)req.user_cq_buffer, entries);
1678                 err = 1;
1679                 list_for_each_entry(nespbl, &nes_ucontext->cq_reg_mem_list, list) {
1680                         if (nespbl->user_base == (unsigned long )req.user_cq_buffer) {
1681                                 list_del(&nespbl->list);
1682                                 err = 0;
1683                                 nes_debug(NES_DBG_CQ, "Found PBL for virtual CQ. nespbl=%p.\n",
1684                                                 nespbl);
1685                                 break;
1686                         }
1687                 }
1688                 if (err) {
1689                         nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1690                         kfree(nescq);
1691                         return ERR_PTR(-EFAULT);
1692                 }
1693
1694                 pbl_entries = nespbl->pbl_size >> 3;
1695                 nescq->cq_mem_size = 0;
1696         } else {
1697                 nescq->cq_mem_size = nescq->hw_cq.cq_size * sizeof(struct nes_hw_cqe);
1698                 nes_debug(NES_DBG_CQ, "Attempting to allocate pci memory (%u entries, %u bytes) for CQ%u.\n",
1699                                 entries, nescq->cq_mem_size, nescq->hw_cq.cq_number);
1700
1701                 /* allocate the physical buffer space */
1702                 mem = pci_alloc_consistent(nesdev->pcidev, nescq->cq_mem_size,
1703                                 &nescq->hw_cq.cq_pbase);
1704                 if (!mem) {
1705                         printk(KERN_ERR PFX "Unable to allocate pci memory for cq\n");
1706                         nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1707                         kfree(nescq);
1708                         return ERR_PTR(-ENOMEM);
1709                 }
1710
1711                 memset(mem, 0, nescq->cq_mem_size);
1712                 nescq->hw_cq.cq_vbase = mem;
1713                 nescq->hw_cq.cq_head = 0;
1714                 nes_debug(NES_DBG_CQ, "CQ%u virtual address @ %p, phys = 0x%08X\n",
1715                                 nescq->hw_cq.cq_number, nescq->hw_cq.cq_vbase,
1716                                 (u32)nescq->hw_cq.cq_pbase);
1717         }
1718
1719         nescq->hw_cq.ce_handler = nes_iwarp_ce_handler;
1720         spin_lock_init(&nescq->lock);
1721
1722         /* send CreateCQ request to CQP */
1723         cqp_request = nes_get_cqp_request(nesdev);
1724         if (cqp_request == NULL) {
1725                 nes_debug(NES_DBG_CQ, "Failed to get a cqp_request.\n");
1726                 if (!context)
1727                         pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
1728                                         nescq->hw_cq.cq_pbase);
1729                 nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1730                 kfree(nescq);
1731                 return ERR_PTR(-ENOMEM);
1732         }
1733         cqp_request->waiting = 1;
1734         cqp_wqe = &cqp_request->cqp_wqe;
1735
1736         opcode = NES_CQP_CREATE_CQ | NES_CQP_CQ_CEQ_VALID |
1737                         NES_CQP_CQ_CHK_OVERFLOW |
1738                         NES_CQP_CQ_CEQE_MASK | ((u32)nescq->hw_cq.cq_size << 16);
1739
1740         spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1741
1742         if (pbl_entries != 1) {
1743                 if (pbl_entries > 32) {
1744                         /* use 4k pbl */
1745                         nes_debug(NES_DBG_CQ, "pbl_entries=%u, use a 4k PBL\n", pbl_entries);
1746                         if (nesadapter->free_4kpbl == 0) {
1747                                 if (cqp_request->dynamic) {
1748                                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1749                                         kfree(cqp_request);
1750                                 } else {
1751                                         list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
1752                                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1753                                 }
1754                                 if (!context)
1755                                         pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
1756                                                         nescq->hw_cq.cq_pbase);
1757                                 nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1758                                 kfree(nescq);
1759                                 return ERR_PTR(-ENOMEM);
1760                         } else {
1761                                 opcode |= (NES_CQP_CQ_VIRT | NES_CQP_CQ_4KB_CHUNK);
1762                                 nescq->virtual_cq = 2;
1763                                 nesadapter->free_4kpbl--;
1764                         }
1765                 } else {
1766                         /* use 256 byte pbl */
1767                         nes_debug(NES_DBG_CQ, "pbl_entries=%u, use a 256 byte PBL\n", pbl_entries);
1768                         if (nesadapter->free_256pbl == 0) {
1769                                 if (cqp_request->dynamic) {
1770                                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1771                                         kfree(cqp_request);
1772                                 } else {
1773                                         list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
1774                                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1775                                 }
1776                                 if (!context)
1777                                         pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
1778                                                         nescq->hw_cq.cq_pbase);
1779                                 nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1780                                 kfree(nescq);
1781                                 return ERR_PTR(-ENOMEM);
1782                         } else {
1783                                 opcode |= NES_CQP_CQ_VIRT;
1784                                 nescq->virtual_cq = 1;
1785                                 nesadapter->free_256pbl--;
1786                         }
1787                 }
1788         }
1789
1790         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1791
1792         nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1793         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, opcode);
1794         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX,
1795                         (nescq->hw_cq.cq_number | ((u32)nesdev->ceq_index << 16)));
1796
1797         if (context) {
1798                 if (pbl_entries != 1)
1799                         u64temp = (u64)nespbl->pbl_pbase;
1800                 else
1801                         u64temp = le64_to_cpu(nespbl->pbl_vbase[0]);
1802                 set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_CQ_WQE_DOORBELL_INDEX_HIGH_IDX,
1803                                 nes_ucontext->mmap_db_index[0]);
1804         } else {
1805                 u64temp = (u64)nescq->hw_cq.cq_pbase;
1806                 cqp_wqe->wqe_words[NES_CQP_CQ_WQE_DOORBELL_INDEX_HIGH_IDX] = 0;
1807         }
1808         set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_CQ_WQE_PBL_LOW_IDX, u64temp);
1809         cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_HIGH_IDX] = 0;
1810         u64temp = (u64)(unsigned long)&nescq->hw_cq;
1811         cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_LOW_IDX] =
1812                         cpu_to_le32((u32)(u64temp >> 1));
1813         cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_HIGH_IDX] =
1814                         cpu_to_le32(((u32)((u64temp) >> 33)) & 0x7FFFFFFF);
1815
1816         atomic_set(&cqp_request->refcount, 2);
1817         nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
1818
1819         /* Wait for CQP */
1820         nes_debug(NES_DBG_CQ, "Waiting for create iWARP CQ%u to complete.\n",
1821                         nescq->hw_cq.cq_number);
1822         ret = wait_event_timeout(cqp_request->waitq, (0 != cqp_request->request_done),
1823                         NES_EVENT_TIMEOUT * 2);
1824         nes_debug(NES_DBG_CQ, "Create iWARP CQ%u completed, wait_event_timeout ret = %d.\n",
1825                         nescq->hw_cq.cq_number, ret);
1826         if ((!ret) || (cqp_request->major_code)) {
1827                 if (atomic_dec_and_test(&cqp_request->refcount)) {
1828                         if (cqp_request->dynamic) {
1829                                 kfree(cqp_request);
1830                         } else {
1831                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
1832                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
1833                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
1834                         }
1835                 }
1836                 if (!context)
1837                         pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
1838                                         nescq->hw_cq.cq_pbase);
1839                 nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1840                 kfree(nescq);
1841                 return ERR_PTR(-EIO);
1842         } else {
1843                 if (atomic_dec_and_test(&cqp_request->refcount)) {
1844                         if (cqp_request->dynamic) {
1845                                 kfree(cqp_request);
1846                         } else {
1847                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
1848                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
1849                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
1850                         }
1851                 }
1852         }
1853
1854         if (context) {
1855                 /* free the nespbl */
1856                 pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
1857                                 nespbl->pbl_pbase);
1858                 kfree(nespbl);
1859                 resp.cq_id = nescq->hw_cq.cq_number;
1860                 resp.cq_size = nescq->hw_cq.cq_size;
1861                 resp.mmap_db_index = 0;
1862                 if (ib_copy_to_udata(udata, &resp, sizeof resp)) {
1863                         nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1864                         kfree(nescq);
1865                         return ERR_PTR(-EFAULT);
1866                 }
1867         }
1868
1869         return &nescq->ibcq;
1870 }
1871
1872
1873 /**
1874  * nes_destroy_cq
1875  */
1876 static int nes_destroy_cq(struct ib_cq *ib_cq)
1877 {
1878         struct nes_cq *nescq;
1879         struct nes_device *nesdev;
1880         struct nes_vnic *nesvnic;
1881         struct nes_adapter *nesadapter;
1882         struct nes_hw_cqp_wqe *cqp_wqe;
1883         struct nes_cqp_request *cqp_request;
1884         unsigned long flags;
1885         u32 opcode = 0;
1886         int ret;
1887
1888         if (ib_cq == NULL)
1889                 return 0;
1890
1891         nescq = to_nescq(ib_cq);
1892         nesvnic = to_nesvnic(ib_cq->device);
1893         nesdev = nesvnic->nesdev;
1894         nesadapter = nesdev->nesadapter;
1895
1896         nes_debug(NES_DBG_CQ, "Destroy CQ%u\n", nescq->hw_cq.cq_number);
1897
1898         /* Send DestroyCQ request to CQP */
1899         cqp_request = nes_get_cqp_request(nesdev);
1900         if (cqp_request == NULL) {
1901                 nes_debug(NES_DBG_CQ, "Failed to get a cqp_request.\n");
1902                 return -ENOMEM;
1903         }
1904         cqp_request->waiting = 1;
1905         cqp_wqe = &cqp_request->cqp_wqe;
1906         opcode = NES_CQP_DESTROY_CQ | (nescq->hw_cq.cq_size << 16);
1907         spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1908         if (nescq->virtual_cq == 1) {
1909                 nesadapter->free_256pbl++;
1910                 if (nesadapter->free_256pbl > nesadapter->max_256pbl) {
1911                         printk(KERN_ERR PFX "%s: free 256B PBLs(%u) has exceeded the max(%u)\n",
1912                                         __FUNCTION__, nesadapter->free_256pbl, nesadapter->max_256pbl);
1913                 }
1914         } else if (nescq->virtual_cq == 2) {
1915                 nesadapter->free_4kpbl++;
1916                 if (nesadapter->free_4kpbl > nesadapter->max_4kpbl) {
1917                         printk(KERN_ERR PFX "%s: free 4K PBLs(%u) has exceeded the max(%u)\n",
1918                                         __FUNCTION__, nesadapter->free_4kpbl, nesadapter->max_4kpbl);
1919                 }
1920                 opcode |= NES_CQP_CQ_4KB_CHUNK;
1921         }
1922
1923         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1924
1925         nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1926         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, opcode);
1927         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX,
1928                 (nescq->hw_cq.cq_number | ((u32)PCI_FUNC(nesdev->pcidev->devfn) << 16)));
1929         nes_free_resource(nesadapter, nesadapter->allocated_cqs, nescq->hw_cq.cq_number);
1930         atomic_set(&cqp_request->refcount, 2);
1931         nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
1932
1933         /* Wait for CQP */
1934         nes_debug(NES_DBG_CQ, "Waiting for destroy iWARP CQ%u to complete.\n",
1935                         nescq->hw_cq.cq_number);
1936         ret = wait_event_timeout(cqp_request->waitq, (0 != cqp_request->request_done),
1937                         NES_EVENT_TIMEOUT);
1938         nes_debug(NES_DBG_CQ, "Destroy iWARP CQ%u completed, wait_event_timeout ret = %u,"
1939                         " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
1940                         nescq->hw_cq.cq_number, ret, cqp_request->major_code,
1941                         cqp_request->minor_code);
1942         if ((!ret) || (cqp_request->major_code)) {
1943                 if (atomic_dec_and_test(&cqp_request->refcount)) {
1944                         if (cqp_request->dynamic) {
1945                                 kfree(cqp_request);
1946                         } else {
1947                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
1948                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
1949                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
1950                         }
1951                 }
1952                 if (!ret) {
1953                         nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy timeout expired\n",
1954                                         nescq->hw_cq.cq_number);
1955                         ret = -ETIME;
1956                 } else {
1957                         nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy failed\n",
1958                                         nescq->hw_cq.cq_number);
1959                         ret = -EIO;
1960                 }
1961         } else {
1962                 ret = 0;
1963                 if (atomic_dec_and_test(&cqp_request->refcount)) {
1964                         if (cqp_request->dynamic) {
1965                                 kfree(cqp_request);
1966                         } else {
1967                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
1968                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
1969                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
1970                         }
1971                 }
1972         }
1973
1974         if (nescq->cq_mem_size)
1975                 pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size,
1976                                 (void *)nescq->hw_cq.cq_vbase, nescq->hw_cq.cq_pbase);
1977         kfree(nescq);
1978
1979         return ret;
1980 }
1981
1982
1983 /**
1984  * nes_reg_mr
1985  */
1986 static int nes_reg_mr(struct nes_device *nesdev, struct nes_pd *nespd,
1987                 u32 stag, u64 region_length, struct nes_root_vpbl *root_vpbl,
1988                 dma_addr_t single_buffer, u16 pbl_count, u16 residual_page_count,
1989                 int acc, u64 *iova_start)
1990 {
1991         struct nes_hw_cqp_wqe *cqp_wqe;
1992         struct nes_cqp_request *cqp_request;
1993         unsigned long flags;
1994         int ret;
1995         struct nes_adapter *nesadapter = nesdev->nesadapter;
1996         /* int count; */
1997         u32 opcode = 0;
1998         u16 major_code;
1999
2000         /* Register the region with the adapter */
2001         cqp_request = nes_get_cqp_request(nesdev);
2002         if (cqp_request == NULL) {
2003                 nes_debug(NES_DBG_MR, "Failed to get a cqp_request.\n");
2004                 return -ENOMEM;
2005         }
2006         cqp_request->waiting = 1;
2007         cqp_wqe = &cqp_request->cqp_wqe;
2008
2009         spin_lock_irqsave(&nesadapter->pbl_lock, flags);
2010         /* track PBL resources */
2011         if (pbl_count != 0) {
2012                 if (pbl_count > 1) {
2013                         /* Two level PBL */
2014                         if ((pbl_count+1) > nesadapter->free_4kpbl) {
2015                                 nes_debug(NES_DBG_MR, "Out of 4KB Pbls for two level request.\n");
2016                                 if (cqp_request->dynamic) {
2017                                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2018                                         kfree(cqp_request);
2019                                 } else {
2020                                         list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
2021                                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2022                                 }
2023                                 return -ENOMEM;
2024                         } else {
2025                                 nesadapter->free_4kpbl -= pbl_count+1;
2026                         }
2027                 } else if (residual_page_count > 32) {
2028                         if (pbl_count > nesadapter->free_4kpbl) {
2029                                 nes_debug(NES_DBG_MR, "Out of 4KB Pbls.\n");
2030                                 if (cqp_request->dynamic) {
2031                                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2032                                         kfree(cqp_request);
2033                                 } else {
2034                                         list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
2035                                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2036                                 }
2037                                 return -ENOMEM;
2038                         } else {
2039                                 nesadapter->free_4kpbl -= pbl_count;
2040                         }
2041                 } else {
2042                         if (pbl_count > nesadapter->free_256pbl) {
2043                                 nes_debug(NES_DBG_MR, "Out of 256B Pbls.\n");
2044                                 if (cqp_request->dynamic) {
2045                                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2046                                         kfree(cqp_request);
2047                                 } else {
2048                                         list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
2049                                         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2050                                 }
2051                                 return -ENOMEM;
2052                         } else {
2053                                 nesadapter->free_256pbl -= pbl_count;
2054                         }
2055                 }
2056         }
2057
2058         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2059
2060         opcode = NES_CQP_REGISTER_STAG | NES_CQP_STAG_RIGHTS_LOCAL_READ |
2061                                         NES_CQP_STAG_VA_TO | NES_CQP_STAG_MR;
2062         if (acc & IB_ACCESS_LOCAL_WRITE)
2063                 opcode |= NES_CQP_STAG_RIGHTS_LOCAL_WRITE;
2064         if (acc & IB_ACCESS_REMOTE_WRITE)
2065                 opcode |= NES_CQP_STAG_RIGHTS_REMOTE_WRITE | NES_CQP_STAG_REM_ACC_EN;
2066         if (acc & IB_ACCESS_REMOTE_READ)
2067                 opcode |= NES_CQP_STAG_RIGHTS_REMOTE_READ | NES_CQP_STAG_REM_ACC_EN;
2068         if (acc & IB_ACCESS_MW_BIND)
2069                 opcode |= NES_CQP_STAG_RIGHTS_WINDOW_BIND | NES_CQP_STAG_REM_ACC_EN;
2070
2071         nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
2072         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, opcode);
2073         set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_VA_LOW_IDX, *iova_start);
2074         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_LEN_LOW_IDX, region_length);
2075
2076         cqp_wqe->wqe_words[NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX] =
2077                         cpu_to_le32((u32)(region_length >> 8) & 0xff000000);
2078         cqp_wqe->wqe_words[NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX] |=
2079                         cpu_to_le32(nespd->pd_id & 0x00007fff);
2080         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, stag);
2081
2082         if (pbl_count == 0) {
2083                 set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_PA_LOW_IDX, single_buffer);
2084         } else {
2085                 set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_PA_LOW_IDX, root_vpbl->pbl_pbase);
2086                 set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_PBL_BLK_COUNT_IDX, pbl_count);
2087                 set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_PBL_LEN_IDX,
2088                                 (((pbl_count - 1) * 4096) + (residual_page_count*8)));
2089
2090                 if ((pbl_count > 1) || (residual_page_count > 32))
2091                         cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] |= cpu_to_le32(NES_CQP_STAG_PBL_BLK_SIZE);
2092         }
2093         barrier();
2094
2095         atomic_set(&cqp_request->refcount, 2);
2096         nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
2097
2098         /* Wait for CQP */
2099         ret = wait_event_timeout(cqp_request->waitq, (0 != cqp_request->request_done),
2100                         NES_EVENT_TIMEOUT);
2101         nes_debug(NES_DBG_MR, "Register STag 0x%08X completed, wait_event_timeout ret = %u,"
2102                         " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
2103                         stag, ret, cqp_request->major_code, cqp_request->minor_code);
2104         major_code = cqp_request->major_code;
2105         if (atomic_dec_and_test(&cqp_request->refcount)) {
2106                 if (cqp_request->dynamic) {
2107                         kfree(cqp_request);
2108                 } else {
2109                         spin_lock_irqsave(&nesdev->cqp.lock, flags);
2110                         list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
2111                         spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
2112                 }
2113         }
2114         if (!ret)
2115                 return -ETIME;
2116         else if (major_code)
2117                 return -EIO;
2118         else
2119                 return 0;
2120
2121         return 0;
2122 }
2123
2124
2125 /**
2126  * nes_reg_phys_mr
2127  */
2128 static struct ib_mr *nes_reg_phys_mr(struct ib_pd *ib_pd,
2129                 struct ib_phys_buf *buffer_list, int num_phys_buf, int acc,
2130                 u64 * iova_start)
2131 {
2132         u64 region_length;
2133         struct nes_pd *nespd = to_nespd(ib_pd);
2134         struct nes_vnic *nesvnic = to_nesvnic(ib_pd->device);
2135         struct nes_device *nesdev = nesvnic->nesdev;
2136         struct nes_adapter *nesadapter = nesdev->nesadapter;
2137         struct nes_mr *nesmr;
2138         struct ib_mr *ibmr;
2139         struct nes_vpbl vpbl;
2140         struct nes_root_vpbl root_vpbl;
2141         u32 stag;
2142         u32 i;
2143         u32 stag_index = 0;
2144         u32 next_stag_index = 0;
2145         u32 driver_key = 0;
2146         u32 root_pbl_index = 0;
2147         u32 cur_pbl_index = 0;
2148         int err = 0, pbl_depth = 0;
2149         int ret = 0;
2150         u16 pbl_count = 0;
2151         u8 single_page = 1;
2152         u8 stag_key = 0;
2153
2154         pbl_depth = 0;
2155         region_length = 0;
2156         vpbl.pbl_vbase = NULL;
2157         root_vpbl.pbl_vbase = NULL;
2158         root_vpbl.pbl_pbase = 0;
2159
2160         get_random_bytes(&next_stag_index, sizeof(next_stag_index));
2161         stag_key = (u8)next_stag_index;
2162
2163         driver_key = 0;
2164
2165         next_stag_index >>= 8;
2166         next_stag_index %= nesadapter->max_mr;
2167         if (num_phys_buf > (1024*512)) {
2168                 return ERR_PTR(-E2BIG);
2169         }
2170
2171         err = nes_alloc_resource(nesadapter, nesadapter->allocated_mrs, nesadapter->max_mr,
2172                         &stag_index, &next_stag_index);
2173         if (err) {
2174                 return ERR_PTR(err);
2175         }
2176
2177         nesmr = kzalloc(sizeof(*nesmr), GFP_KERNEL);
2178         if (!nesmr) {
2179                 nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2180                 return ERR_PTR(-ENOMEM);
2181         }
2182
2183         for (i = 0; i < num_phys_buf; i++) {
2184
2185                 if ((i & 0x01FF) == 0) {
2186                         if (root_pbl_index == 1) {
2187                                 /* Allocate the root PBL */
2188                                 root_vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 8192,
2189                                                 &root_vpbl.pbl_pbase);
2190                                 nes_debug(NES_DBG_MR, "Allocating root PBL, va = %p, pa = 0x%08X\n",
2191                                                 root_vpbl.pbl_vbase, (unsigned int)root_vpbl.pbl_pbase);
2192                                 if (!root_vpbl.pbl_vbase) {
2193                                         pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2194                                                         vpbl.pbl_pbase);
2195                                         nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2196                                         kfree(nesmr);
2197                                         return ERR_PTR(-ENOMEM);
2198                                 }
2199                                 root_vpbl.leaf_vpbl = kzalloc(sizeof(*root_vpbl.leaf_vpbl)*1024, GFP_KERNEL);
2200                                 if (!root_vpbl.leaf_vpbl) {
2201                                         pci_free_consistent(nesdev->pcidev, 8192, root_vpbl.pbl_vbase,
2202                                                         root_vpbl.pbl_pbase);
2203                                         pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2204                                                         vpbl.pbl_pbase);
2205                                         nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2206                                         kfree(nesmr);
2207                                         return ERR_PTR(-ENOMEM);
2208                                 }
2209                                 root_vpbl.pbl_vbase[0].pa_low = cpu_to_le32((u32)vpbl.pbl_pbase);
2210                                 root_vpbl.pbl_vbase[0].pa_high =
2211                                                 cpu_to_le32((u32)((((u64)vpbl.pbl_pbase) >> 32)));
2212                                 root_vpbl.leaf_vpbl[0] = vpbl;
2213                         }
2214                         /* Allocate a 4K buffer for the PBL */
2215                         vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 4096,
2216                                         &vpbl.pbl_pbase);
2217                         nes_debug(NES_DBG_MR, "Allocating leaf PBL, va = %p, pa = 0x%016lX\n",
2218                                         vpbl.pbl_vbase, (unsigned long)vpbl.pbl_pbase);
2219                         if (!vpbl.pbl_vbase) {
2220                                 nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2221                                 ibmr = ERR_PTR(-ENOMEM);
2222                                 kfree(nesmr);
2223                                 goto reg_phys_err;
2224                         }
2225                         /* Fill in the root table */
2226                         if (1 <= root_pbl_index) {
2227                                 root_vpbl.pbl_vbase[root_pbl_index].pa_low =
2228                                                 cpu_to_le32((u32)vpbl.pbl_pbase);
2229                                 root_vpbl.pbl_vbase[root_pbl_index].pa_high =
2230                                                 cpu_to_le32((u32)((((u64)vpbl.pbl_pbase) >> 32)));
2231                                 root_vpbl.leaf_vpbl[root_pbl_index] = vpbl;
2232                         }
2233                         root_pbl_index++;
2234                         cur_pbl_index = 0;
2235                 }
2236                 if (buffer_list[i].addr & ~PAGE_MASK) {
2237                         /* TODO: Unwind allocated buffers */
2238                         nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2239                         nes_debug(NES_DBG_MR, "Unaligned Memory Buffer: 0x%x\n",
2240                                         (unsigned int) buffer_list[i].addr);
2241                         ibmr = ERR_PTR(-EINVAL);
2242                         kfree(nesmr);
2243                         goto reg_phys_err;
2244                 }
2245
2246                 if (!buffer_list[i].size) {
2247                         nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2248                         nes_debug(NES_DBG_MR, "Invalid Buffer Size\n");
2249                         ibmr = ERR_PTR(-EINVAL);
2250                         kfree(nesmr);
2251                         goto reg_phys_err;
2252                 }
2253
2254                 region_length += buffer_list[i].size;
2255                 if ((i != 0) && (single_page)) {
2256                         if ((buffer_list[i-1].addr+PAGE_SIZE) != buffer_list[i].addr)
2257                                 single_page = 0;
2258                 }
2259                 vpbl.pbl_vbase[cur_pbl_index].pa_low = cpu_to_le32((u32)buffer_list[i].addr);
2260                 vpbl.pbl_vbase[cur_pbl_index++].pa_high =
2261                                 cpu_to_le32((u32)((((u64)buffer_list[i].addr) >> 32)));
2262         }
2263
2264         stag = stag_index << 8;
2265         stag |= driver_key;
2266         stag += (u32)stag_key;
2267
2268         nes_debug(NES_DBG_MR, "Registering STag 0x%08X, VA = 0x%016lX,"
2269                         " length = 0x%016lX, index = 0x%08X\n",
2270                         stag, (unsigned long)*iova_start, (unsigned long)region_length, stag_index);
2271
2272         region_length -= (*iova_start)&PAGE_MASK;
2273
2274         /* Make the leaf PBL the root if only one PBL */
2275         if (root_pbl_index == 1) {
2276                 root_vpbl.pbl_pbase = vpbl.pbl_pbase;
2277         }
2278
2279         if (single_page) {
2280                 pbl_count = 0;
2281         } else {
2282                 pbl_count = root_pbl_index;
2283         }
2284         ret = nes_reg_mr(nesdev, nespd, stag, region_length, &root_vpbl,
2285                         buffer_list[0].addr, pbl_count, (u16)cur_pbl_index, acc, iova_start);
2286
2287         if (ret == 0) {
2288                 nesmr->ibmr.rkey = stag;
2289                 nesmr->ibmr.lkey = stag;
2290                 nesmr->mode = IWNES_MEMREG_TYPE_MEM;
2291                 ibmr = &nesmr->ibmr;
2292                 nesmr->pbl_4k = ((pbl_count > 1) || (cur_pbl_index > 32)) ? 1 : 0;
2293                 nesmr->pbls_used = pbl_count;
2294                 if (pbl_count > 1) {
2295                         nesmr->pbls_used++;
2296                 }
2297         } else {
2298                 kfree(nesmr);
2299                 ibmr = ERR_PTR(-ENOMEM);
2300         }
2301
2302         reg_phys_err:
2303         /* free the resources */
2304         if (root_pbl_index == 1) {
2305                 /* single PBL case */
2306                 pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase, vpbl.pbl_pbase);
2307         } else {
2308                 for (i=0; i<root_pbl_index; i++) {
2309                         pci_free_consistent(nesdev->pcidev, 4096, root_vpbl.leaf_vpbl[i].pbl_vbase,
2310                                         root_vpbl.leaf_vpbl[i].pbl_pbase);
2311                 }
2312                 kfree(root_vpbl.leaf_vpbl);
2313                 pci_free_consistent(nesdev->pcidev, 8192, root_vpbl.pbl_vbase,
2314                                 root_vpbl.pbl_pbase);
2315         }
2316
2317         return ibmr;
2318 }
2319
2320
2321 /**
2322  * nes_get_dma_mr
2323  */
2324 static struct ib_mr *nes_get_dma_mr(struct ib_pd *pd, int acc)
2325 {
2326         struct ib_phys_buf bl;
2327         u64 kva = 0;
2328
2329         nes_debug(NES_DBG_MR, "\n");
2330
2331         bl.size = (u64)0xffffffffffULL;
2332         bl.addr = 0;
2333         return nes_reg_phys_mr(pd, &bl, 1, acc, &kva);
2334 }
2335
2336
2337 /**
2338  * nes_reg_user_mr
2339  */
2340 static struct ib_mr *nes_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
2341                 u64 virt, int acc, struct ib_udata *udata)
2342 {
2343         u64 iova_start;
2344         __le64 *pbl;
2345         u64 region_length;
2346         dma_addr_t last_dma_addr = 0;
2347         dma_addr_t first_dma_addr = 0;
2348         struct nes_pd *nespd = to_nespd(pd);
2349         struct nes_vnic *nesvnic = to_nesvnic(pd->device);
2350         struct nes_device *nesdev = nesvnic->nesdev;
2351         struct nes_adapter *nesadapter = nesdev->nesadapter;
2352         struct ib_mr *ibmr = ERR_PTR(-EINVAL);
2353         struct ib_umem_chunk *chunk;
2354         struct nes_ucontext *nes_ucontext;
2355         struct nes_pbl *nespbl;
2356         struct nes_mr *nesmr;
2357         struct ib_umem *region;
2358         struct nes_mem_reg_req req;
2359         struct nes_vpbl vpbl;
2360         struct nes_root_vpbl root_vpbl;
2361         int nmap_index, page_index;
2362         int page_count = 0;
2363         int err, pbl_depth = 0;
2364         int chunk_pages;
2365         int ret;
2366         u32 stag;
2367         u32 stag_index = 0;
2368         u32 next_stag_index;
2369         u32 driver_key;
2370         u32 root_pbl_index = 0;
2371         u32 cur_pbl_index = 0;
2372         u32 skip_pages;
2373         u16 pbl_count;
2374         u8 single_page = 1;
2375         u8 stag_key;
2376
2377         region = ib_umem_get(pd->uobject->context, start, length, acc);
2378         if (IS_ERR(region)) {
2379                 return (struct ib_mr *)region;
2380         }
2381
2382         nes_debug(NES_DBG_MR, "User base = 0x%lX, Virt base = 0x%lX, length = %u,"
2383                         " offset = %u, page size = %u.\n",
2384                         (unsigned long int)start, (unsigned long int)virt, (u32)length,
2385                         region->offset, region->page_size);
2386
2387         skip_pages = ((u32)region->offset) >> 12;
2388
2389         if (ib_copy_from_udata(&req, udata, sizeof(req)))
2390                 return ERR_PTR(-EFAULT);
2391         nes_debug(NES_DBG_MR, "Memory Registration type = %08X.\n", req.reg_type);
2392
2393         switch (req.reg_type) {
2394                 case IWNES_MEMREG_TYPE_MEM:
2395                         pbl_depth = 0;
2396                         region_length = 0;
2397                         vpbl.pbl_vbase = NULL;
2398                         root_vpbl.pbl_vbase = NULL;
2399                         root_vpbl.pbl_pbase = 0;
2400
2401                         get_random_bytes(&next_stag_index, sizeof(next_stag_index));
2402                         stag_key = (u8)next_stag_index;
2403
2404                         driver_key = next_stag_index & 0x70000000;
2405
2406                         next_stag_index >>= 8;
2407                         next_stag_index %= nesadapter->max_mr;
2408
2409                         err = nes_alloc_resource(nesadapter, nesadapter->allocated_mrs,
2410                                         nesadapter->max_mr, &stag_index, &next_stag_index);
2411                         if (err) {
2412                                 ib_umem_release(region);
2413                                 return ERR_PTR(err);
2414                         }
2415
2416                         nesmr = kzalloc(sizeof(*nesmr), GFP_KERNEL);
2417                         if (!nesmr) {
2418                                 ib_umem_release(region);
2419                                 nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2420                                 return ERR_PTR(-ENOMEM);
2421                         }
2422                         nesmr->region = region;
2423
2424                         list_for_each_entry(chunk, &region->chunk_list, list) {
2425                                 nes_debug(NES_DBG_MR, "Chunk: nents = %u, nmap = %u .\n",
2426                                                 chunk->nents, chunk->nmap);
2427                                 for (nmap_index = 0; nmap_index < chunk->nmap; ++nmap_index) {
2428                                         if (sg_dma_address(&chunk->page_list[nmap_index]) & ~PAGE_MASK) {
2429                                                 ib_umem_release(region);
2430                                                 nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2431                                                 nes_debug(NES_DBG_MR, "Unaligned Memory Buffer: 0x%x\n",
2432                                                                 (unsigned int) sg_dma_address(&chunk->page_list[nmap_index]));
2433                                                 ibmr = ERR_PTR(-EINVAL);
2434                                                 kfree(nesmr);
2435                                                 goto reg_user_mr_err;
2436                                         }
2437
2438                                         if (!sg_dma_len(&chunk->page_list[nmap_index])) {
2439                                                 ib_umem_release(region);
2440                                                 nes_free_resource(nesadapter, nesadapter->allocated_mrs,
2441                                                                 stag_index);
2442                                                 nes_debug(NES_DBG_MR, "Invalid Buffer Size\n");
2443                                                 ibmr = ERR_PTR(-EINVAL);
2444                                                 kfree(nesmr);
2445                                                 goto reg_user_mr_err;
2446                                         }
2447
2448                                         region_length += sg_dma_len(&chunk->page_list[nmap_index]);
2449                                         chunk_pages = sg_dma_len(&chunk->page_list[nmap_index]) >> 12;
2450                                         region_length -= skip_pages << 12;
2451                                         for (page_index=skip_pages; page_index < chunk_pages; page_index++) {
2452                                                 skip_pages = 0;
2453                                                 if ((page_count!=0)&&(page_count<<12)-(region->offset&(4096-1))>=region->length)
2454                                                         goto enough_pages;
2455                                                 if ((page_count&0x01FF) == 0) {
2456                                                         if (page_count>(1024*512)) {
2457                                                                 ib_umem_release(region);
2458                                                                 pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2459                                                                                 vpbl.pbl_pbase);
2460                                                                 nes_free_resource(nesadapter,
2461                                                                                 nesadapter->allocated_mrs, stag_index);
2462                                                                 kfree(nesmr);
2463                                                                 ibmr = ERR_PTR(-E2BIG);
2464                                                                 goto reg_user_mr_err;
2465                                                         }
2466                                                         if (root_pbl_index == 1) {
2467                                                                 root_vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev,
2468                                                                                 8192, &root_vpbl.pbl_pbase);
2469                                                                 nes_debug(NES_DBG_MR, "Allocating root PBL, va = %p, pa = 0x%08X\n",
2470                                                                                 root_vpbl.pbl_vbase, (unsigned int)root_vpbl.pbl_pbase);
2471                                                                 if (!root_vpbl.pbl_vbase) {
2472                                                                         ib_umem_release(region);
2473                                                                         pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2474                                                                                         vpbl.pbl_pbase);
2475                                                                         nes_free_resource(nesadapter, nesadapter->allocated_mrs,
2476                                                                                         stag_index);
2477                                                                         kfree(nesmr);
2478                                                                         ibmr = ERR_PTR(-ENOMEM);
2479                                                                         goto reg_user_mr_err;
2480                                                                 }
2481                                                                 root_vpbl.leaf_vpbl = kzalloc(sizeof(*root_vpbl.leaf_vpbl)*1024,
2482                                                                                 GFP_KERNEL);
2483                                                                 if (!root_vpbl.leaf_vpbl) {
2484                                                                         ib_umem_release(region);
2485                                                                         pci_free_consistent(nesdev->pcidev, 8192, root_vpbl.pbl_vbase,
2486                                                                                         root_vpbl.pbl_pbase);
2487                                                                         pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2488                                                                                         vpbl.pbl_pbase);
2489                                                                         nes_free_resource(nesadapter, nesadapter->allocated_mrs,
2490                                                                                         stag_index);
2491                                                                         kfree(nesmr);
2492                                                                         ibmr = ERR_PTR(-ENOMEM);
2493                                                                         goto reg_user_mr_err;
2494                                                                 }
2495                                                                 root_vpbl.pbl_vbase[0].pa_low =
2496                                                                                 cpu_to_le32((u32)vpbl.pbl_pbase);
2497                                                                 root_vpbl.pbl_vbase[0].pa_high =
2498                                                                                 cpu_to_le32((u32)((((u64)vpbl.pbl_pbase) >> 32)));
2499                                                                 root_vpbl.leaf_vpbl[0] = vpbl;
2500                                                         }
2501                                                         vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 4096,
2502                                                                         &vpbl.pbl_pbase);
2503                                                         nes_debug(NES_DBG_MR, "Allocating leaf PBL, va = %p, pa = 0x%08X\n",
2504                                                                         vpbl.pbl_vbase, (unsigned int)vpbl.pbl_pbase);
2505                                                         if (!vpbl.pbl_vbase) {
2506                                                                 ib_umem_release(region);
2507                                                                 nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2508                                                                 ibmr = ERR_PTR(-ENOMEM);
2509                                                                 kfree(nesmr);
2510                                                                 goto reg_user_mr_err;
2511                                                         }
2512                                                         if (1 <= root_pbl_index) {
2513                                                                 root_vpbl.pbl_vbase[root_pbl_index].pa_low =
2514                                                                                 cpu_to_le32((u32)vpbl.pbl_pbase);
2515                                                                 root_vpbl.pbl_vbase[root_pbl_index].pa_high =
2516                                                                                 cpu_to_le32((u32)((((u64)vpbl.pbl_pbase)>>32)));
2517                                                                 root_vpbl.leaf_vpbl[root_pbl_index] = vpbl;
2518                                                         }
2519                                                         root_pbl_index++;
2520                                                         cur_pbl_index = 0;
2521                                                 }
2522                                                 if (single_page) {
2523                                                         if (page_count != 0) {
2524                                                                 if ((last_dma_addr+4096) !=
2525                                                                                 (sg_dma_address(&chunk->page_list[nmap_index])+
2526                                                                                 (page_index*4096)))
2527                                                                         single_page = 0;
2528                                                                 last_dma_addr = sg_dma_address(&chunk->page_list[nmap_index])+
2529                                                                                 (page_index*4096);
2530                                                         } else {
2531                                                                 first_dma_addr = sg_dma_address(&chunk->page_list[nmap_index])+
2532                                                                                 (page_index*4096);
2533                                                                 last_dma_addr = first_dma_addr;
2534                                                         }
2535                                                 }
2536
2537                                                 vpbl.pbl_vbase[cur_pbl_index].pa_low =
2538                                                                 cpu_to_le32((u32)(sg_dma_address(&chunk->page_list[nmap_index])+
2539                                                                 (page_index*4096)));
2540                                                 vpbl.pbl_vbase[cur_pbl_index].pa_high =
2541                                                                 cpu_to_le32((u32)((((u64)(sg_dma_address(&chunk->page_list[nmap_index])+
2542                                                                 (page_index*4096))) >> 32)));
2543                                                 cur_pbl_index++;
2544                                                 page_count++;
2545                                         }
2546                                 }
2547                         }
2548                         enough_pages:
2549                         nes_debug(NES_DBG_MR, "calculating stag, stag_index=0x%08x, driver_key=0x%08x,"
2550                                         " stag_key=0x%08x\n",
2551                                         stag_index, driver_key, stag_key);
2552                         stag = stag_index << 8;
2553                         stag |= driver_key;
2554                         stag += (u32)stag_key;
2555                         if (stag == 0) {
2556                                 stag = 1;
2557                         }
2558
2559                         iova_start = virt;
2560                         /* Make the leaf PBL the root if only one PBL */
2561                         if (root_pbl_index == 1) {
2562                                 root_vpbl.pbl_pbase = vpbl.pbl_pbase;
2563                         }
2564
2565                         if (single_page) {
2566                                 pbl_count = 0;
2567                         } else {
2568                                 pbl_count = root_pbl_index;
2569                                 first_dma_addr = 0;
2570                         }
2571                         nes_debug(NES_DBG_MR, "Registering STag 0x%08X, VA = 0x%08X, length = 0x%08X,"
2572                                         " index = 0x%08X, region->length=0x%08llx, pbl_count = %u\n",
2573                                         stag, (unsigned int)iova_start,
2574                                         (unsigned int)region_length, stag_index,
2575                                         (unsigned long long)region->length, pbl_count);
2576                         ret = nes_reg_mr( nesdev, nespd, stag, region->length, &root_vpbl,
2577                                         first_dma_addr, pbl_count, (u16)cur_pbl_index, acc, &iova_start);
2578
2579                         nes_debug(NES_DBG_MR, "ret=%d\n", ret);
2580
2581                         if (ret == 0) {
2582                                 nesmr->ibmr.rkey = stag;
2583                                 nesmr->ibmr.lkey = stag;
2584                                 nesmr->mode = IWNES_MEMREG_TYPE_MEM;
2585                                 ibmr = &nesmr->ibmr;
2586                                 nesmr->pbl_4k = ((pbl_count > 1) || (cur_pbl_index > 32)) ? 1 : 0;
2587                                 nesmr->pbls_used = pbl_count;
2588                                 if (pbl_count > 1) {
2589                                         nesmr->pbls_used++;
2590                                 }
2591                         } else {
2592                                 ib_umem_release(region);
2593                                 kfree(nesmr);
2594                                 ibmr = ERR_PTR(-ENOMEM);
2595                         }
2596
2597                         reg_user_mr_err:
2598                         /* free the resources */
2599                         if (root_pbl_index == 1) {
2600                                 pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2601                                                 vpbl.pbl_pbase);
2602                         } else {
2603                                 for (page_index=0; page_index<root_pbl_index; page_index++) {
2604                                         pci_free_consistent(nesdev->pcidev, 4096,
2605                                                         root_vpbl.leaf_vpbl[page_index].pbl_vbase,
2606                                                         root_vpbl.leaf_vpbl[page_index].pbl_pbase);
2607                                 }
2608                                 kfree(root_vpbl.leaf_vpbl);
2609                                 pci_free_consistent(nesdev->pcidev, 8192, root_vpbl.pbl_vbase,
2610                                                 root_vpbl.pbl_pbase);
2611                         }
2612
2613                         nes_debug(NES_DBG_MR, "Leaving, ibmr=%p", ibmr);
2614
2615                         return ibmr;
2616                         break;
2617                 case IWNES_MEMREG_TYPE_QP:
2618                 case IWNES_MEMREG_TYPE_CQ:
2619                         nespbl = kzalloc(sizeof(*nespbl), GFP_KERNEL);
2620                         if (!nespbl) {
2621                                 nes_debug(NES_DBG_MR, "Unable to allocate PBL\n");
2622                                 ib_umem_release(region);
2623                                 return ERR_PTR(-ENOMEM);
2624                         }
2625                         nesmr = kzalloc(sizeof(*nesmr), GFP_KERNEL);
2626                         if (!nesmr) {
2627                                 ib_umem_release(region);
2628                                 kfree(nespbl);
2629                                 nes_debug(NES_DBG_MR, "Unable to allocate nesmr\n");
2630                                 return ERR_PTR(-ENOMEM);
2631                         }
2632                         nesmr->region = region;
2633                         nes_ucontext = to_nesucontext(pd->uobject->context);
2634                         pbl_depth = region->length >> 12;
2635                         pbl_depth += (region->length & (4096-1)) ? 1 : 0;
2636                         nespbl->pbl_size = pbl_depth*sizeof(u64);
2637                         if (req.reg_type == IWNES_MEMREG_TYPE_QP) {
2638                                 nes_debug(NES_DBG_MR, "Attempting to allocate QP PBL memory");
2639                         } else {
2640                                 nes_debug(NES_DBG_MR, "Attempting to allocate CP PBL memory");
2641                         }
2642
2643                         nes_debug(NES_DBG_MR, " %u bytes, %u entries.\n",
2644                                         nespbl->pbl_size, pbl_depth);
2645                         pbl = pci_alloc_consistent(nesdev->pcidev, nespbl->pbl_size,
2646                                         &nespbl->pbl_pbase);
2647                         if (!pbl) {
2648                                 ib_umem_release(region);
2649                                 kfree(nesmr);
2650                                 kfree(nespbl);
2651                                 nes_debug(NES_DBG_MR, "Unable to allocate PBL memory\n");
2652                                 return ERR_PTR(-ENOMEM);
2653                         }
2654
2655                         nespbl->pbl_vbase = (u64 *)pbl;
2656                         nespbl->user_base = start;
2657                         nes_debug(NES_DBG_MR, "Allocated PBL memory, %u bytes, pbl_pbase=%lx,"
2658                                         " pbl_vbase=%p user_base=0x%lx\n",
2659                                   nespbl->pbl_size, (unsigned long) nespbl->pbl_pbase,
2660                                   (void *) nespbl->pbl_vbase, nespbl->user_base);
2661
2662                         list_for_each_entry(chunk, &region->chunk_list, list) {
2663                                 for (nmap_index = 0; nmap_index < chunk->nmap; ++nmap_index) {
2664                                         chunk_pages = sg_dma_len(&chunk->page_list[nmap_index]) >> 12;
2665                                         chunk_pages += (sg_dma_len(&chunk->page_list[nmap_index]) & (4096-1)) ? 1 : 0;
2666                                         nespbl->page = sg_page(&chunk->page_list[0]);
2667                                         for (page_index=0; page_index<chunk_pages; page_index++) {
2668                                                 ((__le32 *)pbl)[0] = cpu_to_le32((u32)
2669                                                                 (sg_dma_address(&chunk->page_list[nmap_index])+
2670                                                                 (page_index*4096)));
2671                                                 ((__le32 *)pbl)[1] = cpu_to_le32(((u64)
2672                                                                 (sg_dma_address(&chunk->page_list[nmap_index])+
2673                                                                 (page_index*4096)))>>32);
2674                                                 nes_debug(NES_DBG_MR, "pbl=%p, *pbl=0x%016llx, 0x%08x%08x\n", pbl,
2675                                                                 (unsigned long long)*pbl,
2676                                                                 le32_to_cpu(((__le32 *)pbl)[1]), le32_to_cpu(((__le32 *)pbl)[0]));
2677                                                 pbl++;
2678                                         }
2679                                 }
2680                         }
2681                         if (req.reg_type == IWNES_MEMREG_TYPE_QP) {
2682                                 list_add_tail(&nespbl->list, &nes_ucontext->qp_reg_mem_list);
2683                         } else {
2684                                 list_add_tail(&nespbl->list, &nes_ucontext->cq_reg_mem_list);
2685                         }
2686                         nesmr->ibmr.rkey = -1;
2687                         nesmr->ibmr.lkey = -1;
2688                         nesmr->mode = req.reg_type;
2689                         return &nesmr->ibmr;
2690                         break;
2691         }
2692
2693         return ERR_PTR(-ENOSYS);
2694 }
2695
2696
2697 /**
2698  * nes_dereg_mr
2699  */
2700 static int nes_dereg_mr(struct ib_mr *ib_mr)
2701 {
2702         struct nes_mr *nesmr = to_nesmr(ib_mr);
2703         struct nes_vnic *nesvnic = to_nesvnic(ib_mr->device);
2704         struct nes_device *nesdev = nesvnic->nesdev;
2705         struct nes_adapter *nesadapter = nesdev->nesadapter;
2706         struct nes_hw_cqp_wqe *cqp_wqe;
2707         struct nes_cqp_request *cqp_request;
2708         unsigned long flags;
2709         int ret;
2710         u16 major_code;
2711         u16 minor_code;
2712
2713         if (nesmr->region) {
2714                 ib_umem_release(nesmr->region);
2715         }
2716         if (nesmr->mode != IWNES_MEMREG_TYPE_MEM) {
2717                 kfree(nesmr);
2718                 return 0;
2719         }
2720
2721         /* Deallocate the region with the adapter */
2722
2723         cqp_request = nes_get_cqp_request(nesdev);
2724         if (cqp_request == NULL) {
2725                 nes_debug(NES_DBG_MR, "Failed to get a cqp_request.\n");
2726                 return -ENOMEM;
2727         }
2728         cqp_request->waiting = 1;
2729         cqp_wqe = &cqp_request->cqp_wqe;
2730
2731         spin_lock_irqsave(&nesadapter->pbl_lock, flags);
2732         if (nesmr->pbls_used != 0) {
2733                 if (nesmr->pbl_4k) {
2734                         nesadapter->free_4kpbl += nesmr->pbls_used;
2735                         if (nesadapter->free_4kpbl > nesadapter->max_4kpbl) {
2736                                 printk(KERN_ERR PFX "free 4KB PBLs(%u) has exceeded the max(%u)\n",
2737                                                 nesadapter->free_4kpbl, nesadapter->max_4kpbl);
2738                         }
2739                 } else {
2740                         nesadapter->free_256pbl += nesmr->pbls_used;
2741                         if (nesadapter->free_256pbl > nesadapter->max_256pbl) {
2742                                 printk(KERN_ERR PFX "free 256B PBLs(%u) has exceeded the max(%u)\n",
2743                                                 nesadapter->free_256pbl, nesadapter->max_256pbl);
2744                         }
2745                 }
2746         }
2747
2748         spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2749         nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
2750         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX,
2751                         NES_CQP_DEALLOCATE_STAG | NES_CQP_STAG_VA_TO |
2752                         NES_CQP_STAG_DEALLOC_PBLS | NES_CQP_STAG_MR);
2753         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, ib_mr->rkey);
2754
2755         atomic_set(&cqp_request->refcount, 2);
2756         nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
2757
2758         /* Wait for CQP */
2759         nes_debug(NES_DBG_MR, "Waiting for deallocate STag 0x%08X completed\n", ib_mr->rkey);
2760         ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
2761                         NES_EVENT_TIMEOUT);
2762         nes_debug(NES_DBG_MR, "Deallocate STag 0x%08X completed, wait_event_timeout ret = %u,"
2763                         " CQP Major:Minor codes = 0x%04X:0x%04X\n",
2764                         ib_mr->rkey, ret, cqp_request->major_code, cqp_request->minor_code);
2765
2766         nes_free_resource(nesadapter, nesadapter->allocated_mrs,
2767                         (ib_mr->rkey & 0x0fffff00) >> 8);
2768
2769         kfree(nesmr);
2770
2771         major_code = cqp_request->major_code;
2772         minor_code = cqp_request->minor_code;
2773         if (atomic_dec_and_test(&cqp_request->refcount)) {
2774                 if (cqp_request->dynamic) {
2775                         kfree(cqp_request);
2776                 } else {
2777                         spin_lock_irqsave(&nesdev->cqp.lock, flags);
2778                         list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
2779                         spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
2780                 }
2781         }
2782         if (!ret) {
2783                 nes_debug(NES_DBG_MR, "Timeout waiting to destroy STag,"
2784                                 " ib_mr=%p, rkey = 0x%08X\n",
2785                                 ib_mr, ib_mr->rkey);
2786                 return -ETIME;
2787         } else if (major_code) {
2788                 nes_debug(NES_DBG_MR, "Error (0x%04X:0x%04X) while attempting"
2789                                 " to destroy STag, ib_mr=%p, rkey = 0x%08X\n",
2790                                 major_code, minor_code, ib_mr, ib_mr->rkey);
2791                 return -EIO;
2792         } else
2793                 return 0;
2794 }
2795
2796
2797 /**
2798  * show_rev
2799  */
2800 static ssize_t show_rev(struct class_device *cdev, char *buf)
2801 {
2802         struct nes_ib_device *nesibdev =
2803                         container_of(cdev, struct nes_ib_device, ibdev.class_dev);
2804         struct nes_vnic *nesvnic = nesibdev->nesvnic;
2805
2806         nes_debug(NES_DBG_INIT, "\n");
2807         return sprintf(buf, "%x\n", nesvnic->nesdev->nesadapter->hw_rev);
2808 }
2809
2810
2811 /**
2812  * show_fw_ver
2813  */
2814 static ssize_t show_fw_ver(struct class_device *cdev, char *buf)
2815 {
2816         struct nes_ib_device *nesibdev =
2817                         container_of(cdev, struct nes_ib_device, ibdev.class_dev);
2818         struct nes_vnic *nesvnic = nesibdev->nesvnic;
2819
2820         nes_debug(NES_DBG_INIT, "\n");
2821         return sprintf(buf, "%x.%x.%x\n",
2822                         (int)(nesvnic->nesdev->nesadapter->fw_ver >> 32),
2823                         (int)(nesvnic->nesdev->nesadapter->fw_ver >> 16) & 0xffff,
2824                         (int)(nesvnic->nesdev->nesadapter->fw_ver & 0xffff));
2825 }
2826
2827
2828 /**
2829  * show_hca
2830  */
2831 static ssize_t show_hca(struct class_device *cdev, char *buf)
2832 {
2833         nes_debug(NES_DBG_INIT, "\n");
2834         return sprintf(buf, "NES020\n");
2835 }
2836
2837
2838 /**
2839  * show_board
2840  */
2841 static ssize_t show_board(struct class_device *cdev, char *buf)
2842 {
2843         nes_debug(NES_DBG_INIT, "\n");
2844         return sprintf(buf, "%.*s\n", 32, "NES020 Board ID");
2845 }
2846
2847
2848 static CLASS_DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
2849 static CLASS_DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL);
2850 static CLASS_DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);
2851 static CLASS_DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL);
2852
2853 static struct class_device_attribute *nes_class_attributes[] = {
2854         &class_device_attr_hw_rev,
2855         &class_device_attr_fw_ver,
2856         &class_device_attr_hca_type,
2857         &class_device_attr_board_id
2858 };
2859
2860
2861 /**
2862  * nes_query_qp
2863  */
2864 static int nes_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
2865                 int attr_mask, struct ib_qp_init_attr *init_attr)
2866 {
2867         struct nes_qp *nesqp = to_nesqp(ibqp);
2868
2869         nes_debug(NES_DBG_QP, "\n");
2870
2871         attr->qp_access_flags = 0;
2872         attr->cap.max_send_wr = nesqp->hwqp.sq_size;
2873         attr->cap.max_recv_wr = nesqp->hwqp.rq_size;
2874         attr->cap.max_recv_sge = 1;
2875         if (nes_drv_opt & NES_DRV_OPT_NO_INLINE_DATA) {
2876                 init_attr->cap.max_inline_data = 0;
2877         } else {
2878                 init_attr->cap.max_inline_data = 64;
2879         }
2880
2881         init_attr->event_handler = nesqp->ibqp.event_handler;
2882         init_attr->qp_context = nesqp->ibqp.qp_context;
2883         init_attr->send_cq = nesqp->ibqp.send_cq;
2884         init_attr->recv_cq = nesqp->ibqp.recv_cq;
2885         init_attr->srq = nesqp->ibqp.srq = nesqp->ibqp.srq;
2886         init_attr->cap = attr->cap;
2887
2888         return 0;
2889 }
2890
2891
2892 /**
2893  * nes_hw_modify_qp
2894  */
2895 int nes_hw_modify_qp(struct nes_device *nesdev, struct nes_qp *nesqp,
2896                 u32 next_iwarp_state, u32 wait_completion)
2897 {
2898         struct nes_hw_cqp_wqe *cqp_wqe;
2899         /* struct iw_cm_id *cm_id = nesqp->cm_id; */
2900         /* struct iw_cm_event cm_event; */
2901         struct nes_cqp_request *cqp_request;
2902         unsigned long flags;
2903         int ret;
2904         u16 major_code;
2905
2906         nes_debug(NES_DBG_MOD_QP, "QP%u, refcount=%d\n",
2907                         nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount));
2908
2909         cqp_request = nes_get_cqp_request(nesdev);
2910         if (cqp_request == NULL) {
2911                 nes_debug(NES_DBG_MOD_QP, "Failed to get a cqp_request.\n");
2912                 return -ENOMEM;
2913         }
2914         if (wait_completion) {
2915                 cqp_request->waiting = 1;
2916         } else {
2917                 cqp_request->waiting = 0;
2918         }
2919         cqp_wqe = &cqp_request->cqp_wqe;
2920
2921         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX,
2922                         NES_CQP_MODIFY_QP | NES_CQP_QP_TYPE_IWARP | next_iwarp_state);
2923         nes_debug(NES_DBG_MOD_QP, "using next_iwarp_state=%08x, wqe_words=%08x\n",
2924                         next_iwarp_state, le32_to_cpu(cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX]));
2925         nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
2926         set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX, nesqp->hwqp.qp_id);
2927         set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_QP_WQE_CONTEXT_LOW_IDX, (u64)nesqp->nesqp_context_pbase);
2928
2929         atomic_set(&cqp_request->refcount, 2);
2930         nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
2931
2932         /* Wait for CQP */
2933         if (wait_completion) {
2934                 /* nes_debug(NES_DBG_MOD_QP, "Waiting for modify iWARP QP%u to complete.\n",
2935                                 nesqp->hwqp.qp_id); */
2936                 ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
2937                                 NES_EVENT_TIMEOUT);
2938                 nes_debug(NES_DBG_MOD_QP, "Modify iwarp QP%u completed, wait_event_timeout ret=%u, "
2939                                 "CQP Major:Minor codes = 0x%04X:0x%04X.\n",
2940                                 nesqp->hwqp.qp_id, ret, cqp_request->major_code, cqp_request->minor_code);
2941                 major_code = cqp_request->major_code;
2942                 if (major_code) {
2943                         nes_debug(NES_DBG_MOD_QP, "Modify iwarp QP%u failed"
2944                                         "CQP Major:Minor codes = 0x%04X:0x%04X, intended next state = 0x%08X.\n",
2945                                         nesqp->hwqp.qp_id, cqp_request->major_code,
2946                                         cqp_request->minor_code, next_iwarp_state);
2947                 }
2948                 if (atomic_dec_and_test(&cqp_request->refcount)) {
2949                         if (cqp_request->dynamic) {
2950                                 kfree(cqp_request);
2951                         } else {
2952                                 spin_lock_irqsave(&nesdev->cqp.lock, flags);
2953                                 list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
2954                                 spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
2955                         }
2956                 }
2957                 if (!ret)
2958                         return -ETIME;
2959                 else if (major_code)
2960                         return -EIO;
2961                 else
2962                         return 0;
2963         } else {
2964                 return 0;
2965         }
2966 }
2967
2968
2969 /**
2970  * nes_modify_qp
2971  */
2972 int nes_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
2973                 int attr_mask, struct ib_udata *udata)
2974 {
2975         struct nes_qp *nesqp = to_nesqp(ibqp);
2976         struct nes_vnic *nesvnic = to_nesvnic(ibqp->device);
2977         struct nes_device *nesdev = nesvnic->nesdev;
2978         /* u32 cqp_head; */
2979         /* u32 counter; */
2980         u32 next_iwarp_state = 0;
2981         int err;
2982         unsigned long qplockflags;
2983         int ret;
2984         u16 original_last_aeq;
2985         u8 issue_modify_qp = 0;
2986         u8 issue_disconnect = 0;
2987         u8 dont_wait = 0;
2988
2989         nes_debug(NES_DBG_MOD_QP, "QP%u: QP State=%u, cur QP State=%u,"
2990                         " iwarp_state=0x%X, refcount=%d\n",
2991                         nesqp->hwqp.qp_id, attr->qp_state, nesqp->ibqp_state,
2992                         nesqp->iwarp_state, atomic_read(&nesqp->refcount));
2993
2994         nes_add_ref(&nesqp->ibqp);
2995         spin_lock_irqsave(&nesqp->lock, qplockflags);
2996
2997         nes_debug(NES_DBG_MOD_QP, "QP%u: hw_iwarp_state=0x%X, hw_tcp_state=0x%X,"
2998                         " QP Access Flags=0x%X, attr_mask = 0x%0x\n",
2999                         nesqp->hwqp.qp_id, nesqp->hw_iwarp_state,
3000                         nesqp->hw_tcp_state, attr->qp_access_flags, attr_mask);
3001
3002         if (attr_mask & IB_QP_STATE) {
3003                 switch (attr->qp_state) {
3004                         case IB_QPS_INIT:
3005                                 nes_debug(NES_DBG_MOD_QP, "QP%u: new state = init\n",
3006                                                 nesqp->hwqp.qp_id);
3007                                 if (nesqp->iwarp_state > (u32)NES_CQP_QP_IWARP_STATE_IDLE) {
3008                                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3009                                         nes_rem_ref(&nesqp->ibqp);
3010                                         return -EINVAL;
3011                                 }
3012                                 next_iwarp_state = NES_CQP_QP_IWARP_STATE_IDLE;
3013                                 issue_modify_qp = 1;
3014                                 break;
3015                         case IB_QPS_RTR:
3016                                 nes_debug(NES_DBG_MOD_QP, "QP%u: new state = rtr\n",
3017                                                 nesqp->hwqp.qp_id);
3018                                 if (nesqp->iwarp_state>(u32)NES_CQP_QP_IWARP_STATE_IDLE) {
3019                                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3020                                         nes_rem_ref(&nesqp->ibqp);
3021                                         return -EINVAL;
3022                                 }
3023                                 next_iwarp_state = NES_CQP_QP_IWARP_STATE_IDLE;
3024                                 issue_modify_qp = 1;
3025                                 break;
3026                         case IB_QPS_RTS:
3027                                 nes_debug(NES_DBG_MOD_QP, "QP%u: new state = rts\n",
3028                                                 nesqp->hwqp.qp_id);
3029                                 if (nesqp->iwarp_state>(u32)NES_CQP_QP_IWARP_STATE_RTS) {
3030                                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3031                                         nes_rem_ref(&nesqp->ibqp);
3032                                         return -EINVAL;
3033                                 }
3034                                 if (nesqp->cm_id == NULL) {
3035                                         nes_debug(NES_DBG_MOD_QP, "QP%u: Failing attempt to move QP to RTS without a CM_ID. \n",
3036                                                         nesqp->hwqp.qp_id );
3037                                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3038                                         nes_rem_ref(&nesqp->ibqp);
3039                                         return -EINVAL;
3040                                 }
3041                                 next_iwarp_state = NES_CQP_QP_IWARP_STATE_RTS;
3042                                 if (nesqp->iwarp_state != NES_CQP_QP_IWARP_STATE_RTS)
3043                                         next_iwarp_state |= NES_CQP_QP_CONTEXT_VALID |
3044                                                         NES_CQP_QP_ARP_VALID | NES_CQP_QP_ORD_VALID;
3045                                 issue_modify_qp = 1;
3046                                 nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_ESTABLISHED;
3047                                 nesqp->hw_iwarp_state = NES_AEQE_IWARP_STATE_RTS;
3048                                 nesqp->hte_added = 1;
3049                                 break;
3050                         case IB_QPS_SQD:
3051                                 issue_modify_qp = 1;
3052                                 nes_debug(NES_DBG_MOD_QP, "QP%u: new state=closing. SQ head=%u, SQ tail=%u\n",
3053                                                 nesqp->hwqp.qp_id, nesqp->hwqp.sq_head, nesqp->hwqp.sq_tail);
3054                                 if (nesqp->iwarp_state == (u32)NES_CQP_QP_IWARP_STATE_CLOSING) {
3055                                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3056                                         nes_rem_ref(&nesqp->ibqp);
3057                                         return 0;
3058                                 } else {
3059                                         if (nesqp->iwarp_state > (u32)NES_CQP_QP_IWARP_STATE_CLOSING) {
3060                                                 nes_debug(NES_DBG_MOD_QP, "QP%u: State change to closing"
3061                                                                 " ignored due to current iWARP state\n",
3062                                                                 nesqp->hwqp.qp_id);
3063                                                 spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3064                                                 nes_rem_ref(&nesqp->ibqp);
3065                                                 return -EINVAL;
3066                                         }
3067                                         if (nesqp->hw_iwarp_state != NES_AEQE_IWARP_STATE_RTS) {
3068                                                 nes_debug(NES_DBG_MOD_QP, "QP%u: State change to closing"
3069                                                                 " already done based on hw state.\n",
3070                                                                 nesqp->hwqp.qp_id);
3071                                                 issue_modify_qp = 0;
3072                                                 nesqp->in_disconnect = 0;
3073                                         }
3074                                         switch (nesqp->hw_iwarp_state) {
3075                                                 case NES_AEQE_IWARP_STATE_CLOSING:
3076                                                         next_iwarp_state = NES_CQP_QP_IWARP_STATE_CLOSING;
3077                                                 case NES_AEQE_IWARP_STATE_TERMINATE:
3078                                                         next_iwarp_state = NES_CQP_QP_IWARP_STATE_TERMINATE;
3079                                                         break;
3080                                                 case NES_AEQE_IWARP_STATE_ERROR:
3081                                                         next_iwarp_state = NES_CQP_QP_IWARP_STATE_ERROR;
3082                                                         break;
3083                                                 default:
3084                                                         next_iwarp_state = NES_CQP_QP_IWARP_STATE_CLOSING;
3085                                                         nesqp->in_disconnect = 1;
3086                                                         nesqp->hw_iwarp_state = NES_AEQE_IWARP_STATE_CLOSING;
3087                                                         break;
3088                                         }
3089                                 }
3090                                 break;
3091                         case IB_QPS_SQE:
3092                                 nes_debug(NES_DBG_MOD_QP, "QP%u: new state = terminate\n",
3093                                                 nesqp->hwqp.qp_id);
3094                                 if (nesqp->iwarp_state>=(u32)NES_CQP_QP_IWARP_STATE_TERMINATE) {
3095                                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3096                                         nes_rem_ref(&nesqp->ibqp);
3097                                         return -EINVAL;
3098                                 }
3099                                 /* next_iwarp_state = (NES_CQP_QP_IWARP_STATE_TERMINATE | 0x02000000); */
3100                                 next_iwarp_state = NES_CQP_QP_IWARP_STATE_TERMINATE;
3101                                 nesqp->hw_iwarp_state = NES_AEQE_IWARP_STATE_TERMINATE;
3102                                 issue_modify_qp = 1;
3103                                 nesqp->in_disconnect = 1;
3104                                 break;
3105                         case IB_QPS_ERR:
3106                         case IB_QPS_RESET:
3107                                 if (nesqp->iwarp_state == (u32)NES_CQP_QP_IWARP_STATE_ERROR) {
3108                                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3109                                         nes_rem_ref(&nesqp->ibqp);
3110                                         return -EINVAL;
3111                                 }
3112                                 nes_debug(NES_DBG_MOD_QP, "QP%u: new state = error\n",
3113                                                 nesqp->hwqp.qp_id);
3114                                 next_iwarp_state = NES_CQP_QP_IWARP_STATE_ERROR;
3115                                 /* next_iwarp_state = (NES_CQP_QP_IWARP_STATE_TERMINATE | 0x02000000); */
3116                                         if (nesqp->hte_added) {
3117                                                 nes_debug(NES_DBG_MOD_QP, "set CQP_QP_DEL_HTE\n");
3118                                                 next_iwarp_state |= NES_CQP_QP_DEL_HTE;
3119                                                 nesqp->hte_added = 0;
3120                                         }
3121                                 if ((nesqp->hw_tcp_state > NES_AEQE_TCP_STATE_CLOSED) &&
3122                                                 (nesqp->hw_tcp_state != NES_AEQE_TCP_STATE_TIME_WAIT)) {
3123                                         next_iwarp_state |= NES_CQP_QP_RESET;
3124                                         nesqp->in_disconnect = 1;
3125                                 } else {
3126                                         nes_debug(NES_DBG_MOD_QP, "QP%u NOT setting NES_CQP_QP_RESET since TCP state = %u\n",
3127                                                         nesqp->hwqp.qp_id, nesqp->hw_tcp_state);
3128                                         dont_wait = 1;
3129                                 }
3130                                 issue_modify_qp = 1;
3131                                 nesqp->hw_iwarp_state = NES_AEQE_IWARP_STATE_ERROR;
3132                                 break;
3133                         default:
3134                                 spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3135                                 nes_rem_ref(&nesqp->ibqp);
3136                                 return -EINVAL;
3137                                 break;
3138                 }
3139
3140                 nesqp->ibqp_state = attr->qp_state;
3141                 if (((nesqp->iwarp_state & NES_CQP_QP_IWARP_STATE_MASK) ==
3142                                 (u32)NES_CQP_QP_IWARP_STATE_RTS) &&
3143                                 ((next_iwarp_state & NES_CQP_QP_IWARP_STATE_MASK) >
3144                                 (u32)NES_CQP_QP_IWARP_STATE_RTS)) {
3145                         nesqp->iwarp_state = next_iwarp_state & NES_CQP_QP_IWARP_STATE_MASK;
3146                         nes_debug(NES_DBG_MOD_QP, "Change nesqp->iwarp_state=%08x\n",
3147                                         nesqp->iwarp_state);
3148                         issue_disconnect = 1;
3149                 } else {
3150                         nesqp->iwarp_state = next_iwarp_state & NES_CQP_QP_IWARP_STATE_MASK;
3151                         nes_debug(NES_DBG_MOD_QP, "Change nesqp->iwarp_state=%08x\n",
3152                                         nesqp->iwarp_state);
3153                 }
3154         }
3155
3156         if (attr_mask & IB_QP_ACCESS_FLAGS) {
3157                 if (attr->qp_access_flags & IB_ACCESS_LOCAL_WRITE) {
3158                         nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_WRITE_EN |
3159                                         NES_QPCONTEXT_MISC_RDMA_READ_EN);
3160                         issue_modify_qp = 1;
3161                 }
3162                 if (attr->qp_access_flags & IB_ACCESS_REMOTE_WRITE) {
3163                         nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_WRITE_EN);
3164                         issue_modify_qp = 1;
3165                 }
3166                 if (attr->qp_access_flags & IB_ACCESS_REMOTE_READ) {
3167                         nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_READ_EN);
3168                         issue_modify_qp = 1;
3169                 }
3170                 if (attr->qp_access_flags & IB_ACCESS_MW_BIND) {
3171                         nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_WBIND_EN);
3172                         issue_modify_qp = 1;
3173                 }
3174
3175                 if (nesqp->user_mode) {
3176                         nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_WRITE_EN |
3177                                         NES_QPCONTEXT_MISC_RDMA_READ_EN);
3178                         issue_modify_qp = 1;
3179                 }
3180         }
3181
3182         original_last_aeq = nesqp->last_aeq;
3183         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3184
3185         nes_debug(NES_DBG_MOD_QP, "issue_modify_qp=%u\n", issue_modify_qp);
3186
3187         ret = 0;
3188
3189
3190         if (issue_modify_qp) {
3191                 nes_debug(NES_DBG_MOD_QP, "call nes_hw_modify_qp\n");
3192                 ret = nes_hw_modify_qp(nesdev, nesqp, next_iwarp_state, 1);
3193                 if (ret)
3194                         nes_debug(NES_DBG_MOD_QP, "nes_hw_modify_qp (next_iwarp_state = 0x%08X)"
3195                                         " failed for QP%u.\n",
3196                                         next_iwarp_state, nesqp->hwqp.qp_id);
3197
3198         }
3199
3200         if ((issue_modify_qp) && (nesqp->ibqp_state > IB_QPS_RTS)) {
3201                 nes_debug(NES_DBG_MOD_QP, "QP%u Issued ModifyQP refcount (%d),"
3202                                 " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
3203                                 nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3204                                 original_last_aeq, nesqp->last_aeq);
3205                 if ((!ret) ||
3206                                 ((original_last_aeq != NES_AEQE_AEID_RDMAP_ROE_BAD_LLP_CLOSE) &&
3207                                 (ret))) {
3208                         if (dont_wait) {
3209                                 if (nesqp->cm_id && nesqp->hw_tcp_state != 0) {
3210                                         nes_debug(NES_DBG_MOD_QP, "QP%u Queuing fake disconnect for QP refcount (%d),"
3211                                                         " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
3212                                                         nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3213                                                         original_last_aeq, nesqp->last_aeq);
3214                                         /* this one is for the cm_disconnect thread */
3215                                         nes_add_ref(&nesqp->ibqp);
3216                                         spin_lock_irqsave(&nesqp->lock, qplockflags);
3217                                         nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_CLOSED;
3218                                         nesqp->last_aeq = NES_AEQE_AEID_RESET_SENT;
3219                                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3220                                         nes_cm_disconn(nesqp);
3221                                 } else {
3222                                         nes_debug(NES_DBG_MOD_QP, "QP%u No fake disconnect, QP refcount=%d\n",
3223                                                         nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount));
3224                                         nes_rem_ref(&nesqp->ibqp);
3225                                 }
3226                         } else {
3227                                 spin_lock_irqsave(&nesqp->lock, qplockflags);
3228                                 if (nesqp->cm_id) {
3229                                         /* These two are for the timer thread */
3230                                         if (atomic_inc_return(&nesqp->close_timer_started) == 1) {
3231                                                 nes_add_ref(&nesqp->ibqp);
3232                                                 nesqp->cm_id->add_ref(nesqp->cm_id);
3233                                                 nes_debug(NES_DBG_MOD_QP, "QP%u Not decrementing QP refcount (%d),"
3234                                                                 " need ae to finish up, original_last_aeq = 0x%04X."
3235                                                                 " last_aeq = 0x%04X, scheduling timer.\n",
3236                                                                 nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3237                                                                 original_last_aeq, nesqp->last_aeq);
3238                                                 schedule_nes_timer(nesqp->cm_node, (struct sk_buff *) nesqp, NES_TIMER_TYPE_CLOSE, 1, 0);
3239                                         }
3240                                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3241                                 } else {
3242                                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3243                                         nes_debug(NES_DBG_MOD_QP, "QP%u Not decrementing QP refcount (%d),"
3244                                                         " need ae to finish up, original_last_aeq = 0x%04X."
3245                                                         " last_aeq = 0x%04X.\n",
3246                                                         nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3247                                                         original_last_aeq, nesqp->last_aeq);
3248                                 }
3249                         }
3250                 } else {
3251                         nes_debug(NES_DBG_MOD_QP, "QP%u Decrementing QP refcount (%d), No ae to finish up,"
3252                                         " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
3253                                         nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3254                                         original_last_aeq, nesqp->last_aeq);
3255                         nes_rem_ref(&nesqp->ibqp);
3256                 }
3257         } else {
3258                 nes_debug(NES_DBG_MOD_QP, "QP%u Decrementing QP refcount (%d), No ae to finish up,"
3259                                 " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
3260                                 nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3261                                 original_last_aeq, nesqp->last_aeq);
3262                 nes_rem_ref(&nesqp->ibqp);
3263         }
3264
3265         err = 0;
3266
3267         nes_debug(NES_DBG_MOD_QP, "QP%u Leaving, refcount=%d\n",
3268                         nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount));
3269
3270         return err;
3271 }
3272
3273
3274 /**
3275  * nes_muticast_attach
3276  */
3277 static int nes_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
3278 {
3279         nes_debug(NES_DBG_INIT, "\n");
3280         return -ENOSYS;
3281 }
3282
3283
3284 /**
3285  * nes_multicast_detach
3286  */
3287 static int nes_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
3288 {
3289         nes_debug(NES_DBG_INIT, "\n");
3290         return -ENOSYS;
3291 }
3292
3293
3294 /**
3295  * nes_process_mad
3296  */
3297 static int nes_process_mad(struct ib_device *ibdev, int mad_flags,
3298                 u8 port_num, struct ib_wc *in_wc, struct ib_grh *in_grh,
3299                 struct ib_mad *in_mad, struct ib_mad *out_mad)
3300 {
3301         nes_debug(NES_DBG_INIT, "\n");
3302         return -ENOSYS;
3303 }
3304
3305 static inline void
3306 fill_wqe_sg_send(struct nes_hw_qp_wqe *wqe, struct ib_send_wr *ib_wr, u32 uselkey)
3307 {
3308         int sge_index;
3309         int total_payload_length = 0;
3310         for (sge_index = 0; sge_index < ib_wr->num_sge; sge_index++) {
3311                 set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_FRAG0_LOW_IDX+(sge_index*4),
3312                         ib_wr->sg_list[sge_index].addr);
3313                 set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_LENGTH0_IDX + (sge_index*4),
3314                         ib_wr->sg_list[sge_index].length);
3315                 if (uselkey)
3316                         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_STAG0_IDX + (sge_index*4),
3317                                                 (ib_wr->sg_list[sge_index].lkey));
3318                 else
3319                         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_STAG0_IDX + (sge_index*4), 0);
3320
3321                 total_payload_length += ib_wr->sg_list[sge_index].length;
3322         }
3323         nes_debug(NES_DBG_IW_TX, "UC UC UC, sending total_payload_length=%u \n",
3324                         total_payload_length);
3325         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX,
3326                                 total_payload_length);
3327 }
3328
3329 /**
3330  * nes_post_send
3331  */
3332 static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
3333                 struct ib_send_wr **bad_wr)
3334 {
3335         u64 u64temp;
3336         unsigned long flags = 0;
3337         struct nes_vnic *nesvnic = to_nesvnic(ibqp->device);
3338         struct nes_device *nesdev = nesvnic->nesdev;
3339         struct nes_qp *nesqp = to_nesqp(ibqp);
3340         struct nes_hw_qp_wqe *wqe;
3341         int err;
3342         u32 qsize = nesqp->hwqp.sq_size;
3343         u32 head;
3344         u32 wqe_misc;
3345         u32 wqe_count;
3346         u32 counter;
3347         u32 total_payload_length;
3348
3349         err = 0;
3350         wqe_misc = 0;
3351         wqe_count = 0;
3352         total_payload_length = 0;
3353
3354         if (nesqp->ibqp_state > IB_QPS_RTS)
3355                 return -EINVAL;
3356
3357                 spin_lock_irqsave(&nesqp->lock, flags);
3358
3359         head = nesqp->hwqp.sq_head;
3360
3361         while (ib_wr) {
3362                 /* Check for SQ overflow */
3363                 if (((head + (2 * qsize) - nesqp->hwqp.sq_tail) % qsize) == (qsize - 1)) {
3364                         err = -EINVAL;
3365                         break;
3366                 }
3367
3368                 wqe = &nesqp->hwqp.sq_vbase[head];
3369                 /* nes_debug(NES_DBG_IW_TX, "processing sq wqe for QP%u at %p, head = %u.\n",
3370                                 nesqp->hwqp.qp_id, wqe, head); */
3371                 nes_fill_init_qp_wqe(wqe, nesqp, head);
3372                 u64temp = (u64)(ib_wr->wr_id);
3373                 set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_COMP_SCRATCH_LOW_IDX,
3374                                         u64temp);
3375                         switch (ib_wr->opcode) {
3376                                 case IB_WR_SEND:
3377                                         if (ib_wr->send_flags & IB_SEND_SOLICITED) {
3378                                                 wqe_misc = NES_IWARP_SQ_OP_SENDSE;
3379                                         } else {
3380                                                 wqe_misc = NES_IWARP_SQ_OP_SEND;
3381                                         }
3382                                         if (ib_wr->num_sge > nesdev->nesadapter->max_sge) {
3383                                                 err = -EINVAL;
3384                                                 break;
3385                                         }
3386                                         if (ib_wr->send_flags & IB_SEND_FENCE) {
3387                                                 wqe_misc |= NES_IWARP_SQ_WQE_LOCAL_FENCE;
3388                                         }
3389                                         if ((ib_wr->send_flags & IB_SEND_INLINE) &&
3390                                                         ((nes_drv_opt & NES_DRV_OPT_NO_INLINE_DATA) == 0) &&
3391                                                         (ib_wr->sg_list[0].length <= 64)) {
3392                                                 memcpy(&wqe->wqe_words[NES_IWARP_SQ_WQE_IMM_DATA_START_IDX],
3393                                                                (void *)(unsigned long)ib_wr->sg_list[0].addr, ib_wr->sg_list[0].length);
3394                                                 set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX,
3395                                                                 ib_wr->sg_list[0].length);
3396                                                 wqe_misc |= NES_IWARP_SQ_WQE_IMM_DATA;
3397                                         } else {
3398                                                 fill_wqe_sg_send(wqe, ib_wr, 1);
3399                                         }
3400
3401                                         break;
3402                                 case IB_WR_RDMA_WRITE:
3403                                         wqe_misc = NES_IWARP_SQ_OP_RDMAW;
3404                                         if (ib_wr->num_sge > nesdev->nesadapter->max_sge) {
3405                                                 nes_debug(NES_DBG_IW_TX, "Exceeded max sge, ib_wr=%u, max=%u\n",
3406                                                                 ib_wr->num_sge,
3407                                                                 nesdev->nesadapter->max_sge);
3408                                                 err = -EINVAL;
3409                                                 break;
3410                                         }
3411                                         if (ib_wr->send_flags & IB_SEND_FENCE) {
3412                                                 wqe_misc |= NES_IWARP_SQ_WQE_LOCAL_FENCE;
3413                                         }
3414
3415                                         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_RDMA_STAG_IDX,
3416                                                         ib_wr->wr.rdma.rkey);
3417                                         set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_RDMA_TO_LOW_IDX,
3418                                                         ib_wr->wr.rdma.remote_addr);
3419
3420                                         if ((ib_wr->send_flags & IB_SEND_INLINE) &&
3421                                                         ((nes_drv_opt & NES_DRV_OPT_NO_INLINE_DATA) == 0) &&
3422                                                         (ib_wr->sg_list[0].length <= 64)) {
3423                                                 memcpy(&wqe->wqe_words[NES_IWARP_SQ_WQE_IMM_DATA_START_IDX],
3424                                                                (void *)(unsigned long)ib_wr->sg_list[0].addr, ib_wr->sg_list[0].length);
3425                                                 set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX,
3426                                                                 ib_wr->sg_list[0].length);
3427                                                 wqe_misc |= NES_IWARP_SQ_WQE_IMM_DATA;
3428                                         } else {
3429                                                 fill_wqe_sg_send(wqe, ib_wr, 1);
3430                                         }
3431                                         wqe->wqe_words[NES_IWARP_SQ_WQE_RDMA_LENGTH_IDX] =
3432                                                         wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX];
3433                                         break;
3434                                 case IB_WR_RDMA_READ:
3435                                         /* iWARP only supports 1 sge for RDMA reads */
3436                                         if (ib_wr->num_sge > 1) {
3437                                                 nes_debug(NES_DBG_IW_TX, "Exceeded max sge, ib_wr=%u, max=1\n",
3438                                                                 ib_wr->num_sge);
3439                                                 err = -EINVAL;
3440                                                 break;
3441                                         }
3442                                         wqe_misc = NES_IWARP_SQ_OP_RDMAR;
3443                                         set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_RDMA_TO_LOW_IDX,
3444                                                         ib_wr->wr.rdma.remote_addr);
3445                                         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_RDMA_STAG_IDX,
3446                                                         ib_wr->wr.rdma.rkey);
3447                                         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_RDMA_LENGTH_IDX,
3448                                                         ib_wr->sg_list->length);
3449                                         set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_FRAG0_LOW_IDX,
3450                                                         ib_wr->sg_list->addr);
3451                                         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_STAG0_IDX,
3452                                                         ib_wr->sg_list->lkey);
3453                                         break;
3454                                 default:
3455                                         /* error */
3456                                         err = -EINVAL;
3457                                         break;
3458                         }
3459
3460                 if (ib_wr->send_flags & IB_SEND_SIGNALED) {
3461                         wqe_misc |= NES_IWARP_SQ_WQE_SIGNALED_COMPL;
3462                 }
3463                 wqe->wqe_words[NES_IWARP_SQ_WQE_MISC_IDX] = cpu_to_le32(wqe_misc);
3464
3465                 ib_wr = ib_wr->next;
3466                 head++;
3467                 wqe_count++;
3468                 if (head >= qsize)
3469                         head = 0;
3470
3471         }
3472
3473         nesqp->hwqp.sq_head = head;
3474         barrier();
3475         while (wqe_count) {
3476                 counter = min(wqe_count, ((u32)255));
3477                 wqe_count -= counter;
3478                 nes_write32(nesdev->regs + NES_WQE_ALLOC,
3479                                 (counter << 24) | 0x00800000 | nesqp->hwqp.qp_id);
3480         }
3481
3482                 spin_unlock_irqrestore(&nesqp->lock, flags);
3483
3484         if (err)
3485                 *bad_wr = ib_wr;
3486         return err;
3487 }
3488
3489
3490 /**
3491  * nes_post_recv
3492  */
3493 static int nes_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *ib_wr,
3494                 struct ib_recv_wr **bad_wr)
3495 {
3496         u64 u64temp;
3497         unsigned long flags = 0;
3498         struct nes_vnic *nesvnic = to_nesvnic(ibqp->device);
3499         struct nes_device *nesdev = nesvnic->nesdev;
3500         struct nes_qp *nesqp = to_nesqp(ibqp);
3501         struct nes_hw_qp_wqe *wqe;
3502         int err = 0;
3503         int sge_index;
3504         u32 qsize = nesqp->hwqp.rq_size;
3505         u32 head;
3506         u32 wqe_count = 0;
3507         u32 counter;
3508         u32 total_payload_length;
3509
3510         if (nesqp->ibqp_state > IB_QPS_RTS)
3511                 return -EINVAL;
3512
3513                 spin_lock_irqsave(&nesqp->lock, flags);
3514
3515         head = nesqp->hwqp.rq_head;
3516
3517         while (ib_wr) {
3518                 if (ib_wr->num_sge > nesdev->nesadapter->max_sge) {
3519                         err = -EINVAL;
3520                         break;
3521                 }
3522                 /* Check for RQ overflow */
3523                 if (((head + (2 * qsize) - nesqp->hwqp.rq_tail) % qsize) == (qsize - 1)) {
3524                         err = -EINVAL;
3525                         break;
3526                 }
3527
3528                 nes_debug(NES_DBG_IW_RX, "ibwr sge count = %u.\n", ib_wr->num_sge);
3529                 wqe = &nesqp->hwqp.rq_vbase[head];
3530
3531                 /* nes_debug(NES_DBG_IW_RX, "QP%u:processing rq wqe at %p, head = %u.\n",
3532                                 nesqp->hwqp.qp_id, wqe, head); */
3533                 nes_fill_init_qp_wqe(wqe, nesqp, head);
3534                 u64temp = (u64)(ib_wr->wr_id);
3535                 set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_COMP_SCRATCH_LOW_IDX,
3536                                         u64temp);
3537                 total_payload_length = 0;
3538                 for (sge_index=0; sge_index < ib_wr->num_sge; sge_index++) {
3539                         set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_RQ_WQE_FRAG0_LOW_IDX+(sge_index*4),
3540                                         ib_wr->sg_list[sge_index].addr);
3541                         set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_RQ_WQE_LENGTH0_IDX+(sge_index*4),
3542                                         ib_wr->sg_list[sge_index].length);
3543                         set_wqe_32bit_value(wqe->wqe_words,NES_IWARP_RQ_WQE_STAG0_IDX+(sge_index*4),
3544                                         ib_wr->sg_list[sge_index].lkey);
3545
3546                         total_payload_length += ib_wr->sg_list[sge_index].length;
3547                 }
3548                 set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_RQ_WQE_TOTAL_PAYLOAD_IDX,
3549                                         total_payload_length);
3550
3551                 ib_wr = ib_wr->next;
3552                 head++;
3553                 wqe_count++;
3554                 if (head >= qsize)
3555                         head = 0;
3556         }
3557
3558         nesqp->hwqp.rq_head = head;
3559         barrier();
3560         while (wqe_count) {
3561                 counter = min(wqe_count, ((u32)255));
3562                 wqe_count -= counter;
3563                 nes_write32(nesdev->regs+NES_WQE_ALLOC, (counter<<24) | nesqp->hwqp.qp_id);
3564         }
3565
3566                 spin_unlock_irqrestore(&nesqp->lock, flags);
3567
3568         if (err)
3569                 *bad_wr = ib_wr;
3570         return err;
3571 }
3572
3573
3574 /**
3575  * nes_poll_cq
3576  */
3577 static int nes_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry)
3578 {
3579         u64 u64temp;
3580         u64 wrid;
3581         /* u64 u64temp; */
3582         unsigned long flags = 0;
3583         struct nes_vnic *nesvnic = to_nesvnic(ibcq->device);
3584         struct nes_device *nesdev = nesvnic->nesdev;
3585         struct nes_cq *nescq = to_nescq(ibcq);
3586         struct nes_qp *nesqp;
3587         struct nes_hw_cqe cqe;
3588         u32 head;
3589         u32 wq_tail;
3590         u32 cq_size;
3591         u32 cqe_count = 0;
3592         u32 wqe_index;
3593         u32 u32temp;
3594         /* u32 counter; */
3595
3596         nes_debug(NES_DBG_CQ, "\n");
3597
3598                 spin_lock_irqsave(&nescq->lock, flags);
3599
3600         head = nescq->hw_cq.cq_head;
3601         cq_size = nescq->hw_cq.cq_size;
3602
3603         while (cqe_count < num_entries) {
3604                 if (le32_to_cpu(nescq->hw_cq.cq_vbase[head].cqe_words[NES_CQE_OPCODE_IDX]) &
3605                                 NES_CQE_VALID) {
3606                         cqe = nescq->hw_cq.cq_vbase[head];
3607                         nescq->hw_cq.cq_vbase[head].cqe_words[NES_CQE_OPCODE_IDX] = 0;
3608                         u32temp = le32_to_cpu(cqe.cqe_words[NES_CQE_COMP_COMP_CTX_LOW_IDX]);
3609                         wqe_index = u32temp &
3610                                         (nesdev->nesadapter->max_qp_wr - 1);
3611                         u32temp &= ~(NES_SW_CONTEXT_ALIGN-1);
3612                         /* parse CQE, get completion context from WQE (either rq or sq */
3613                         u64temp = (((u64)(le32_to_cpu(cqe.cqe_words[NES_CQE_COMP_COMP_CTX_HIGH_IDX])))<<32) |
3614                                         ((u64)u32temp);
3615                         nesqp = *((struct nes_qp **)&u64temp);
3616                         memset(entry, 0, sizeof *entry);
3617                         if (cqe.cqe_words[NES_CQE_ERROR_CODE_IDX] == 0) {
3618                                 entry->status = IB_WC_SUCCESS;
3619                         } else {
3620                                 entry->status = IB_WC_WR_FLUSH_ERR;
3621                         }
3622
3623                         entry->qp = &nesqp->ibqp;
3624                         entry->src_qp = nesqp->hwqp.qp_id;
3625
3626                         if (le32_to_cpu(cqe.cqe_words[NES_CQE_OPCODE_IDX]) & NES_CQE_SQ) {
3627                                 if (nesqp->skip_lsmm) {
3628                                         nesqp->skip_lsmm = 0;
3629                                         wq_tail = nesqp->hwqp.sq_tail++;
3630                                 }
3631
3632                                 /* Working on a SQ Completion*/
3633                                 wq_tail = wqe_index;
3634                                 nesqp->hwqp.sq_tail = (wqe_index+1)&(nesqp->hwqp.sq_size - 1);
3635                                 wrid = (((u64)(cpu_to_le32((u32)nesqp->hwqp.sq_vbase[wq_tail].
3636                                                 wqe_words[NES_IWARP_SQ_WQE_COMP_SCRATCH_HIGH_IDX]))) << 32) |
3637                                                 ((u64)(cpu_to_le32((u32)nesqp->hwqp.sq_vbase[wq_tail].
3638                                                 wqe_words[NES_IWARP_SQ_WQE_COMP_SCRATCH_LOW_IDX])));
3639                                 entry->byte_len = le32_to_cpu(nesqp->hwqp.sq_vbase[wq_tail].
3640                                                 wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX]);
3641
3642                                 switch (le32_to_cpu(nesqp->hwqp.sq_vbase[wq_tail].
3643                                                 wqe_words[NES_IWARP_SQ_WQE_MISC_IDX]) & 0x3f) {
3644                                         case NES_IWARP_SQ_OP_RDMAW:
3645                                                 nes_debug(NES_DBG_CQ, "Operation = RDMA WRITE.\n");
3646                                                 entry->opcode = IB_WC_RDMA_WRITE;
3647                                                 break;
3648                                         case NES_IWARP_SQ_OP_RDMAR:
3649                                                 nes_debug(NES_DBG_CQ, "Operation = RDMA READ.\n");
3650                                                 entry->opcode = IB_WC_RDMA_READ;
3651                                                 entry->byte_len = le32_to_cpu(nesqp->hwqp.sq_vbase[wq_tail].
3652                                                                 wqe_words[NES_IWARP_SQ_WQE_RDMA_LENGTH_IDX]);
3653                                                 break;
3654                                         case NES_IWARP_SQ_OP_SENDINV:
3655                                         case NES_IWARP_SQ_OP_SENDSEINV:
3656                                         case NES_IWARP_SQ_OP_SEND:
3657                                         case NES_IWARP_SQ_OP_SENDSE:
3658                                                 nes_debug(NES_DBG_CQ, "Operation = Send.\n");
3659                                                 entry->opcode = IB_WC_SEND;
3660                                                 break;
3661                                 }
3662                         } else {
3663                                 /* Working on a RQ Completion*/
3664                                 wq_tail = wqe_index;
3665                                         nesqp->hwqp.rq_tail = (wqe_index+1)&(nesqp->hwqp.rq_size - 1);
3666                                 entry->byte_len = le32_to_cpu(cqe.cqe_words[NES_CQE_PAYLOAD_LENGTH_IDX]);
3667                                 wrid = ((u64)(le32_to_cpu(nesqp->hwqp.rq_vbase[wq_tail].wqe_words[NES_IWARP_RQ_WQE_COMP_SCRATCH_LOW_IDX]))) |
3668                                         ((u64)(le32_to_cpu(nesqp->hwqp.rq_vbase[wq_tail].wqe_words[NES_IWARP_RQ_WQE_COMP_SCRATCH_HIGH_IDX]))<<32);
3669                                         entry->opcode = IB_WC_RECV;
3670                         }
3671                         entry->wr_id = wrid;
3672
3673                         if (++head >= cq_size)
3674                                 head = 0;
3675                         cqe_count++;
3676                         nescq->polled_completions++;
3677                         if ((nescq->polled_completions > (cq_size / 2)) ||
3678                                         (nescq->polled_completions == 255)) {
3679                                 nes_debug(NES_DBG_CQ, "CQ%u Issuing CQE Allocate since more than half of cqes"
3680                                                 " are pending %u of %u.\n",
3681                                                 nescq->hw_cq.cq_number, nescq->polled_completions, cq_size);
3682                                 nes_write32(nesdev->regs+NES_CQE_ALLOC,
3683                                                 nescq->hw_cq.cq_number | (nescq->polled_completions << 16));
3684                                 nescq->polled_completions = 0;
3685                         }
3686                         entry++;
3687                 } else
3688                         break;
3689         }
3690
3691         if (nescq->polled_completions) {
3692                 nes_write32(nesdev->regs+NES_CQE_ALLOC,
3693                                 nescq->hw_cq.cq_number | (nescq->polled_completions << 16));
3694                 nescq->polled_completions = 0;
3695         }
3696
3697         nescq->hw_cq.cq_head = head;
3698         nes_debug(NES_DBG_CQ, "Reporting %u completions for CQ%u.\n",
3699                         cqe_count, nescq->hw_cq.cq_number);
3700
3701                 spin_unlock_irqrestore(&nescq->lock, flags);
3702
3703         return cqe_count;
3704 }
3705
3706
3707 /**
3708  * nes_req_notify_cq
3709  */
3710 static int nes_req_notify_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags notify_flags)
3711                 {
3712         struct nes_vnic *nesvnic = to_nesvnic(ibcq->device);
3713         struct nes_device *nesdev = nesvnic->nesdev;
3714         struct nes_cq *nescq = to_nescq(ibcq);
3715         u32 cq_arm;
3716
3717         nes_debug(NES_DBG_CQ, "Requesting notification for CQ%u.\n",
3718                         nescq->hw_cq.cq_number);
3719
3720         cq_arm = nescq->hw_cq.cq_number;
3721         if ((notify_flags & IB_CQ_SOLICITED_MASK) == IB_CQ_NEXT_COMP)
3722                 cq_arm |= NES_CQE_ALLOC_NOTIFY_NEXT;
3723         else if ((notify_flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED)
3724                 cq_arm |= NES_CQE_ALLOC_NOTIFY_SE;
3725         else
3726                 return -EINVAL;
3727
3728         nes_write32(nesdev->regs+NES_CQE_ALLOC, cq_arm);
3729         nes_read32(nesdev->regs+NES_CQE_ALLOC);
3730
3731         return 0;
3732 }
3733
3734
3735 /**
3736  * nes_init_ofa_device
3737  */
3738 struct nes_ib_device *nes_init_ofa_device(struct net_device *netdev)
3739 {
3740         struct nes_ib_device *nesibdev;
3741         struct nes_vnic *nesvnic = netdev_priv(netdev);
3742         struct nes_device *nesdev = nesvnic->nesdev;
3743
3744         nesibdev = (struct nes_ib_device *)ib_alloc_device(sizeof(struct nes_ib_device));
3745         if (nesibdev == NULL) {
3746                 return NULL;
3747         }
3748         strlcpy(nesibdev->ibdev.name, "nes%d", IB_DEVICE_NAME_MAX);
3749         nesibdev->ibdev.owner = THIS_MODULE;
3750
3751         nesibdev->ibdev.node_type = RDMA_NODE_RNIC;
3752         memset(&nesibdev->ibdev.node_guid, 0, sizeof(nesibdev->ibdev.node_guid));
3753         memcpy(&nesibdev->ibdev.node_guid, netdev->dev_addr, 6);
3754
3755         nesibdev->ibdev.uverbs_cmd_mask =
3756                         (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) |
3757                         (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) |
3758                         (1ull << IB_USER_VERBS_CMD_QUERY_PORT) |
3759                         (1ull << IB_USER_VERBS_CMD_ALLOC_PD) |
3760                         (1ull << IB_USER_VERBS_CMD_DEALLOC_PD) |
3761                         (1ull << IB_USER_VERBS_CMD_REG_MR) |
3762                         (1ull << IB_USER_VERBS_CMD_DEREG_MR) |
3763                         (1ull << IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL) |
3764                         (1ull << IB_USER_VERBS_CMD_CREATE_CQ) |
3765                         (1ull << IB_USER_VERBS_CMD_DESTROY_CQ) |
3766                         (1ull << IB_USER_VERBS_CMD_CREATE_AH) |
3767                         (1ull << IB_USER_VERBS_CMD_DESTROY_AH) |
3768                         (1ull << IB_USER_VERBS_CMD_REQ_NOTIFY_CQ) |
3769                         (1ull << IB_USER_VERBS_CMD_CREATE_QP) |
3770                         (1ull << IB_USER_VERBS_CMD_MODIFY_QP) |
3771                         (1ull << IB_USER_VERBS_CMD_POLL_CQ) |
3772                         (1ull << IB_USER_VERBS_CMD_DESTROY_QP) |
3773                         (1ull << IB_USER_VERBS_CMD_ALLOC_MW) |
3774                         (1ull << IB_USER_VERBS_CMD_BIND_MW) |
3775                         (1ull << IB_USER_VERBS_CMD_DEALLOC_MW) |
3776                         (1ull << IB_USER_VERBS_CMD_POST_RECV) |
3777                         (1ull << IB_USER_VERBS_CMD_POST_SEND);
3778
3779         nesibdev->ibdev.phys_port_cnt = 1;
3780         nesibdev->ibdev.num_comp_vectors = 1;
3781         nesibdev->ibdev.dma_device = &nesdev->pcidev->dev;
3782         nesibdev->ibdev.class_dev.dev = &nesdev->pcidev->dev;
3783         nesibdev->ibdev.query_device = nes_query_device;
3784         nesibdev->ibdev.query_port = nes_query_port;
3785         nesibdev->ibdev.modify_port = nes_modify_port;
3786         nesibdev->ibdev.query_pkey = nes_query_pkey;
3787         nesibdev->ibdev.query_gid = nes_query_gid;
3788         nesibdev->ibdev.alloc_ucontext = nes_alloc_ucontext;
3789         nesibdev->ibdev.dealloc_ucontext = nes_dealloc_ucontext;
3790         nesibdev->ibdev.mmap = nes_mmap;
3791         nesibdev->ibdev.alloc_pd = nes_alloc_pd;
3792         nesibdev->ibdev.dealloc_pd = nes_dealloc_pd;
3793         nesibdev->ibdev.create_ah = nes_create_ah;
3794         nesibdev->ibdev.destroy_ah = nes_destroy_ah;
3795         nesibdev->ibdev.create_qp = nes_create_qp;
3796         nesibdev->ibdev.modify_qp = nes_modify_qp;
3797         nesibdev->ibdev.query_qp = nes_query_qp;
3798         nesibdev->ibdev.destroy_qp = nes_destroy_qp;
3799         nesibdev->ibdev.create_cq = nes_create_cq;
3800         nesibdev->ibdev.destroy_cq = nes_destroy_cq;
3801         nesibdev->ibdev.poll_cq = nes_poll_cq;
3802         nesibdev->ibdev.get_dma_mr = nes_get_dma_mr;
3803         nesibdev->ibdev.reg_phys_mr = nes_reg_phys_mr;
3804         nesibdev->ibdev.reg_user_mr = nes_reg_user_mr;
3805         nesibdev->ibdev.dereg_mr = nes_dereg_mr;
3806         nesibdev->ibdev.alloc_mw = nes_alloc_mw;
3807         nesibdev->ibdev.dealloc_mw = nes_dealloc_mw;
3808         nesibdev->ibdev.bind_mw = nes_bind_mw;
3809
3810         nesibdev->ibdev.alloc_fmr = nes_alloc_fmr;
3811         nesibdev->ibdev.unmap_fmr = nes_unmap_fmr;
3812         nesibdev->ibdev.dealloc_fmr = nes_dealloc_fmr;
3813         nesibdev->ibdev.map_phys_fmr = nes_map_phys_fmr;
3814
3815         nesibdev->ibdev.attach_mcast = nes_multicast_attach;
3816         nesibdev->ibdev.detach_mcast = nes_multicast_detach;
3817         nesibdev->ibdev.process_mad = nes_process_mad;
3818
3819         nesibdev->ibdev.req_notify_cq = nes_req_notify_cq;
3820         nesibdev->ibdev.post_send = nes_post_send;
3821         nesibdev->ibdev.post_recv = nes_post_recv;
3822
3823         nesibdev->ibdev.iwcm = kzalloc(sizeof(*nesibdev->ibdev.iwcm), GFP_KERNEL);
3824         if (nesibdev->ibdev.iwcm == NULL) {
3825                 ib_dealloc_device(&nesibdev->ibdev);
3826                 return NULL;
3827         }
3828         nesibdev->ibdev.iwcm->add_ref = nes_add_ref;
3829         nesibdev->ibdev.iwcm->rem_ref = nes_rem_ref;
3830         nesibdev->ibdev.iwcm->get_qp = nes_get_qp;
3831         nesibdev->ibdev.iwcm->connect = nes_connect;
3832         nesibdev->ibdev.iwcm->accept = nes_accept;
3833         nesibdev->ibdev.iwcm->reject = nes_reject;
3834         nesibdev->ibdev.iwcm->create_listen = nes_create_listen;
3835         nesibdev->ibdev.iwcm->destroy_listen = nes_destroy_listen;
3836
3837         return nesibdev;
3838 }
3839
3840
3841 /**
3842  * nes_destroy_ofa_device
3843  */
3844 void nes_destroy_ofa_device(struct nes_ib_device *nesibdev)
3845 {
3846         if (nesibdev == NULL)
3847                 return;
3848
3849         nes_unregister_ofa_device(nesibdev);
3850
3851         kfree(nesibdev->ibdev.iwcm);
3852         ib_dealloc_device(&nesibdev->ibdev);
3853 }
3854
3855
3856 /**
3857  * nes_register_ofa_device
3858  */
3859 int nes_register_ofa_device(struct nes_ib_device *nesibdev)
3860 {
3861         struct nes_vnic *nesvnic = nesibdev->nesvnic;
3862         struct nes_device *nesdev = nesvnic->nesdev;
3863         struct nes_adapter *nesadapter = nesdev->nesadapter;
3864         int i, ret;
3865
3866         ret = ib_register_device(&nesvnic->nesibdev->ibdev);
3867         if (ret) {
3868                 return ret;
3869         }
3870
3871         /* Get the resources allocated to this device */
3872         nesibdev->max_cq = (nesadapter->max_cq-NES_FIRST_QPN) / nesadapter->port_count;
3873         nesibdev->max_mr = nesadapter->max_mr / nesadapter->port_count;
3874         nesibdev->max_qp = (nesadapter->max_qp-NES_FIRST_QPN) / nesadapter->port_count;
3875         nesibdev->max_pd = nesadapter->max_pd / nesadapter->port_count;
3876
3877         for (i = 0; i < ARRAY_SIZE(nes_class_attributes); ++i) {
3878                 ret = class_device_create_file(&nesibdev->ibdev.class_dev, nes_class_attributes[i]);
3879                 if (ret) {
3880                         while (i > 0) {
3881                                 i--;
3882                                 class_device_remove_file(&nesibdev->ibdev.class_dev,
3883                                                 nes_class_attributes[i]);
3884                         }
3885                         ib_unregister_device(&nesibdev->ibdev);
3886                         return ret;
3887                 }
3888         }
3889
3890         nesvnic->of_device_registered = 1;
3891
3892         return 0;
3893 }
3894
3895
3896 /**
3897  * nes_unregister_ofa_device
3898  */
3899 static void nes_unregister_ofa_device(struct nes_ib_device *nesibdev)
3900 {
3901         struct nes_vnic *nesvnic = nesibdev->nesvnic;
3902         int i;
3903
3904         for (i = 0; i < ARRAY_SIZE(nes_class_attributes); ++i) {
3905                 class_device_remove_file(&nesibdev->ibdev.class_dev, nes_class_attributes[i]);
3906         }
3907
3908         if (nesvnic->of_device_registered) {
3909                 ib_unregister_device(&nesibdev->ibdev);
3910         }
3911
3912         nesvnic->of_device_registered = 0;
3913 }