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