mem.c (0ea8a56de21be24cb79abb03dee79aabcd60a316) mem.c (d18bb3e15201918b8d07e85a6e010ca5ed28dad5)
1/*
2 * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:

--- 496 unchanged lines hidden (view full) ---

505}
506
507struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
508 u64 virt, int acc, struct ib_udata *udata)
509{
510 __be64 *pages;
511 int shift, n, i;
512 int err = -ENOMEM;
1/*
2 * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:

--- 496 unchanged lines hidden (view full) ---

505}
506
507struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
508 u64 virt, int acc, struct ib_udata *udata)
509{
510 __be64 *pages;
511 int shift, n, i;
512 int err = -ENOMEM;
513 struct sg_dma_page_iter sg_iter;
513 struct ib_block_iter biter;
514 struct c4iw_dev *rhp;
515 struct c4iw_pd *php;
516 struct c4iw_mr *mhp;
517
518 pr_debug("ib_pd %p\n", pd);
519
520 if (length == ~0ULL)
521 return ERR_PTR(-EINVAL);

--- 21 unchanged lines hidden (view full) ---

543 mhp->rhp = rhp;
544
545 mhp->umem = ib_umem_get(pd->device, start, length, acc);
546 if (IS_ERR(mhp->umem))
547 goto err_free_skb;
548
549 shift = PAGE_SHIFT;
550
514 struct c4iw_dev *rhp;
515 struct c4iw_pd *php;
516 struct c4iw_mr *mhp;
517
518 pr_debug("ib_pd %p\n", pd);
519
520 if (length == ~0ULL)
521 return ERR_PTR(-EINVAL);

--- 21 unchanged lines hidden (view full) ---

543 mhp->rhp = rhp;
544
545 mhp->umem = ib_umem_get(pd->device, start, length, acc);
546 if (IS_ERR(mhp->umem))
547 goto err_free_skb;
548
549 shift = PAGE_SHIFT;
550
551 n = ib_umem_num_pages(mhp->umem);
551 n = ib_umem_num_dma_blocks(mhp->umem, 1 << shift);
552 err = alloc_pbl(mhp, n);
553 if (err)
554 goto err_umem_release;
555
556 pages = (__be64 *) __get_free_page(GFP_KERNEL);
557 if (!pages) {
558 err = -ENOMEM;
559 goto err_pbl_free;
560 }
561
562 i = n = 0;
563
552 err = alloc_pbl(mhp, n);
553 if (err)
554 goto err_umem_release;
555
556 pages = (__be64 *) __get_free_page(GFP_KERNEL);
557 if (!pages) {
558 err = -ENOMEM;
559 goto err_pbl_free;
560 }
561
562 i = n = 0;
563
564 for_each_sg_dma_page(mhp->umem->sg_head.sgl, &sg_iter, mhp->umem->nmap, 0) {
565 pages[i++] = cpu_to_be64(sg_page_iter_dma_address(&sg_iter));
564 rdma_umem_for_each_dma_block(mhp->umem, &biter, 1 << shift) {
565 pages[i++] = cpu_to_be64(rdma_block_iter_dma_address(&biter));
566 if (i == PAGE_SIZE / sizeof(*pages)) {
567 err = write_pbl(&mhp->rhp->rdev, pages,
568 mhp->attr.pbl_addr + (n << 3), i,
569 mhp->wr_waitp);
570 if (err)
571 goto pbl_done;
572 n += i;
573 i = 0;

--- 32 unchanged lines hidden (view full) ---

606 kfree_skb(mhp->dereg_skb);
607err_free_wr_wait:
608 c4iw_put_wr_wait(mhp->wr_waitp);
609err_free_mhp:
610 kfree(mhp);
611 return ERR_PTR(err);
612}
613
566 if (i == PAGE_SIZE / sizeof(*pages)) {
567 err = write_pbl(&mhp->rhp->rdev, pages,
568 mhp->attr.pbl_addr + (n << 3), i,
569 mhp->wr_waitp);
570 if (err)
571 goto pbl_done;
572 n += i;
573 i = 0;

--- 32 unchanged lines hidden (view full) ---

606 kfree_skb(mhp->dereg_skb);
607err_free_wr_wait:
608 c4iw_put_wr_wait(mhp->wr_waitp);
609err_free_mhp:
610 kfree(mhp);
611 return ERR_PTR(err);
612}
613
614struct ib_mw *c4iw_alloc_mw(struct ib_pd *pd, enum ib_mw_type type,
615 struct ib_udata *udata)
614int c4iw_alloc_mw(struct ib_mw *ibmw, struct ib_udata *udata)
616{
615{
616 struct c4iw_mw *mhp = to_c4iw_mw(ibmw);
617 struct c4iw_dev *rhp;
618 struct c4iw_pd *php;
617 struct c4iw_dev *rhp;
618 struct c4iw_pd *php;
619 struct c4iw_mw *mhp;
620 u32 mmid;
621 u32 stag = 0;
622 int ret;
623
619 u32 mmid;
620 u32 stag = 0;
621 int ret;
622
624 if (type != IB_MW_TYPE_1)
625 return ERR_PTR(-EINVAL);
623 if (ibmw->type != IB_MW_TYPE_1)
624 return -EINVAL;
626
625
627 php = to_c4iw_pd(pd);
626 php = to_c4iw_pd(ibmw->pd);
628 rhp = php->rhp;
627 rhp = php->rhp;
629 mhp = kzalloc(sizeof(*mhp), GFP_KERNEL);
630 if (!mhp)
631 return ERR_PTR(-ENOMEM);
632
633 mhp->wr_waitp = c4iw_alloc_wr_wait(GFP_KERNEL);
628 mhp->wr_waitp = c4iw_alloc_wr_wait(GFP_KERNEL);
634 if (!mhp->wr_waitp) {
635 ret = -ENOMEM;
636 goto free_mhp;
637 }
629 if (!mhp->wr_waitp)
630 return -ENOMEM;
638
639 mhp->dereg_skb = alloc_skb(SGE_MAX_WR_LEN, GFP_KERNEL);
640 if (!mhp->dereg_skb) {
641 ret = -ENOMEM;
642 goto free_wr_wait;
643 }
644
645 ret = allocate_window(&rhp->rdev, &stag, php->pdid, mhp->wr_waitp);
646 if (ret)
647 goto free_skb;
631
632 mhp->dereg_skb = alloc_skb(SGE_MAX_WR_LEN, GFP_KERNEL);
633 if (!mhp->dereg_skb) {
634 ret = -ENOMEM;
635 goto free_wr_wait;
636 }
637
638 ret = allocate_window(&rhp->rdev, &stag, php->pdid, mhp->wr_waitp);
639 if (ret)
640 goto free_skb;
641
648 mhp->rhp = rhp;
649 mhp->attr.pdid = php->pdid;
650 mhp->attr.type = FW_RI_STAG_MW;
651 mhp->attr.stag = stag;
652 mmid = (stag) >> 8;
642 mhp->rhp = rhp;
643 mhp->attr.pdid = php->pdid;
644 mhp->attr.type = FW_RI_STAG_MW;
645 mhp->attr.stag = stag;
646 mmid = (stag) >> 8;
653 mhp->ibmw.rkey = stag;
647 ibmw->rkey = stag;
654 if (xa_insert_irq(&rhp->mrs, mmid, mhp, GFP_KERNEL)) {
655 ret = -ENOMEM;
656 goto dealloc_win;
657 }
658 pr_debug("mmid 0x%x mhp %p stag 0x%x\n", mmid, mhp, stag);
648 if (xa_insert_irq(&rhp->mrs, mmid, mhp, GFP_KERNEL)) {
649 ret = -ENOMEM;
650 goto dealloc_win;
651 }
652 pr_debug("mmid 0x%x mhp %p stag 0x%x\n", mmid, mhp, stag);
659 return &(mhp->ibmw);
653 return 0;
660
661dealloc_win:
662 deallocate_window(&rhp->rdev, mhp->attr.stag, mhp->dereg_skb,
663 mhp->wr_waitp);
664free_skb:
665 kfree_skb(mhp->dereg_skb);
666free_wr_wait:
667 c4iw_put_wr_wait(mhp->wr_waitp);
654
655dealloc_win:
656 deallocate_window(&rhp->rdev, mhp->attr.stag, mhp->dereg_skb,
657 mhp->wr_waitp);
658free_skb:
659 kfree_skb(mhp->dereg_skb);
660free_wr_wait:
661 c4iw_put_wr_wait(mhp->wr_waitp);
668free_mhp:
669 kfree(mhp);
670 return ERR_PTR(ret);
662 return ret;
671}
672
673int c4iw_dealloc_mw(struct ib_mw *mw)
674{
675 struct c4iw_dev *rhp;
676 struct c4iw_mw *mhp;
677 u32 mmid;
678
679 mhp = to_c4iw_mw(mw);
680 rhp = mhp->rhp;
681 mmid = (mw->rkey) >> 8;
682 xa_erase_irq(&rhp->mrs, mmid);
683 deallocate_window(&rhp->rdev, mhp->attr.stag, mhp->dereg_skb,
684 mhp->wr_waitp);
685 kfree_skb(mhp->dereg_skb);
686 c4iw_put_wr_wait(mhp->wr_waitp);
663}
664
665int c4iw_dealloc_mw(struct ib_mw *mw)
666{
667 struct c4iw_dev *rhp;
668 struct c4iw_mw *mhp;
669 u32 mmid;
670
671 mhp = to_c4iw_mw(mw);
672 rhp = mhp->rhp;
673 mmid = (mw->rkey) >> 8;
674 xa_erase_irq(&rhp->mrs, mmid);
675 deallocate_window(&rhp->rdev, mhp->attr.stag, mhp->dereg_skb,
676 mhp->wr_waitp);
677 kfree_skb(mhp->dereg_skb);
678 c4iw_put_wr_wait(mhp->wr_waitp);
687 pr_debug("ib_mw %p mmid 0x%x ptr %p\n", mw, mmid, mhp);
688 kfree(mhp);
689 return 0;
690}
691
692struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
693 u32 max_num_sg)
694{
695 struct c4iw_dev *rhp;
696 struct c4iw_pd *php;

--- 137 unchanged lines hidden ---
679 return 0;
680}
681
682struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
683 u32 max_num_sg)
684{
685 struct c4iw_dev *rhp;
686 struct c4iw_pd *php;

--- 137 unchanged lines hidden ---