2481 (unsigned long long)region->length, pbl_count);
2482 ret = nes_reg_mr( nesdev, nespd, stag, region->length, &root_vpbl,
2483 first_dma_addr, pbl_count, (u16)cur_pbl_index, acc, &iova_start);
2484
2485 nes_debug(NES_DBG_MR, "ret=%d\n", ret);
2486
2487 if (ret == 0) {
2488 nesmr->ibmr.rkey = stag;
2489 nesmr->ibmr.lkey = stag;
2490 nesmr->mode = IWNES_MEMREG_TYPE_MEM;
2491 ibmr = &nesmr->ibmr;
2492 nesmr->pbl_4k = ((pbl_count > 1) || (cur_pbl_index > 32)) ? 1 : 0;
2493 nesmr->pbls_used = pbl_count;
2494 if (pbl_count > 1) {
2495 nesmr->pbls_used++;
2496 }
2497 } else {
2498 ib_umem_release(region);
2499 kfree(nesmr);
2500 ibmr = ERR_PTR(-ENOMEM);
2501 }
2502
2503 reg_user_mr_err:
2504
2505 if (root_pbl_index == 1) {
2506 pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2507 vpbl.pbl_pbase);
2508 } else {
2509 for (page_index=0; page_index<root_pbl_index; page_index++) {
2510 pci_free_consistent(nesdev->pcidev, 4096,
2511 root_vpbl.leaf_vpbl[page_index].pbl_vbase,
2512 root_vpbl.leaf_vpbl[page_index].pbl_pbase);
2513 }
2514 kfree(root_vpbl.leaf_vpbl);
2515 pci_free_consistent(nesdev->pcidev, 8192, root_vpbl.pbl_vbase,
2516 root_vpbl.pbl_pbase);
2517 }
2518
2519 nes_debug(NES_DBG_MR, "Leaving, ibmr=%p", ibmr);
2520
2521 return ibmr;