diff options
Diffstat (limited to 'sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c')
-rw-r--r-- | sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c | 94 |
1 files changed, 64 insertions, 30 deletions
diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c index c052aa6b2f09..0ccb70fcac8b 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c @@ -29,11 +29,13 @@ POSSIBILITY OF SUCH DAMAGE. #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#include "opt_inet.h" + +#ifdef TCP_OFFLOAD #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> #include <sys/bus.h> -#include <sys/module.h> #include <sys/pciio.h> #include <sys/conf.h> #include <machine/bus.h> @@ -59,9 +61,11 @@ __FBSDID("$FreeBSD$"); #include <netinet/in.h> -#include <contrib/rdma/ib_verbs.h> -#include <contrib/rdma/ib_umem.h> -#include <contrib/rdma/ib_user_verbs.h> +#include <rdma/ib_verbs.h> +#include <rdma/ib_umem.h> +#include <rdma/ib_user_verbs.h> +#include <linux/idr.h> +#include <ulp/iw_cxgb/iw_cxgb_ib_intfc.h> #include <cxgb_include.h> #include <ulp/iw_cxgb/iw_cxgb_wr.h> @@ -72,14 +76,24 @@ __FBSDID("$FreeBSD$"); #include <ulp/iw_cxgb/iw_cxgb_resource.h> #include <ulp/iw_cxgb/iw_cxgb_user.h> +static int iwch_finish_mem_reg(struct iwch_mr *mhp, u32 stag) +{ + u32 mmid; + + mhp->attr.state = 1; + mhp->attr.stag = stag; + mmid = stag >> 8; + mhp->ibmr.rkey = mhp->ibmr.lkey = stag; + CTR3(KTR_IW_CXGB, "%s mmid 0x%x mhp %p", __func__, mmid, mhp); + return insert_handle(mhp->rhp, &mhp->rhp->mmidr, mhp, mmid); +} + int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php, struct iwch_mr *mhp, - int shift, - __be64 *page_list) + int shift) { u32 stag; - u32 mmid; - + int ret; if (cxio_register_phys_mem(&rhp->rdev, &stag, mhp->attr.pdid, @@ -87,28 +101,24 @@ int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php, mhp->attr.zbva, mhp->attr.va_fbo, mhp->attr.len, - shift-12, - page_list, - &mhp->attr.pbl_size, &mhp->attr.pbl_addr)) + shift - 12, + mhp->attr.pbl_size, mhp->attr.pbl_addr)) return (-ENOMEM); - mhp->attr.state = 1; - mhp->attr.stag = stag; - mmid = stag >> 8; - mhp->ibmr.rkey = mhp->ibmr.lkey = stag; - insert_handle(rhp, &rhp->mmidr, mhp, mmid); - CTR3(KTR_IW_CXGB, "%s mmid 0x%x mhp %p", __FUNCTION__, mmid, mhp); - return 0; + + ret = iwch_finish_mem_reg(mhp, stag); + if (ret) + cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, + mhp->attr.pbl_addr); + return ret; } int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php, struct iwch_mr *mhp, int shift, - __be64 *page_list, int npages) { u32 stag; - u32 mmid; - + int ret; /* We could support this... */ if (npages > mhp->attr.pbl_size) @@ -121,17 +131,40 @@ int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php, mhp->attr.zbva, mhp->attr.va_fbo, mhp->attr.len, - shift-12, - page_list, - &mhp->attr.pbl_size, &mhp->attr.pbl_addr)) + shift - 12, + mhp->attr.pbl_size, mhp->attr.pbl_addr)) return (-ENOMEM); - mhp->attr.state = 1; - mhp->attr.stag = stag; - mmid = stag >> 8; - mhp->ibmr.rkey = mhp->ibmr.lkey = stag; - insert_handle(rhp, &rhp->mmidr, mhp, mmid); - CTR3(KTR_IW_CXGB, "%s mmid 0x%x mhp %p", __FUNCTION__, mmid, mhp); + + ret = iwch_finish_mem_reg(mhp, stag); + if (ret) + cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, + mhp->attr.pbl_addr); + return ret; +} + +int iwch_alloc_pbl(struct iwch_mr *mhp, int npages) +{ + mhp->attr.pbl_addr = cxio_hal_pblpool_alloc(&mhp->rhp->rdev, + npages << 3); + + if (!mhp->attr.pbl_addr) + return -ENOMEM; + + mhp->attr.pbl_size = npages; + return 0; + } + +void iwch_free_pbl(struct iwch_mr *mhp) +{ + cxio_hal_pblpool_free(&mhp->rhp->rdev, mhp->attr.pbl_addr, + mhp->attr.pbl_size << 3); +} + +int iwch_write_pbl(struct iwch_mr *mhp, __be64 *pages, int npages, int offset) +{ + return cxio_write_pbl(&mhp->rhp->rdev, pages, + mhp->attr.pbl_addr + (offset << 3), npages); } int build_phys_page_list(struct ib_phys_buf *buffer_list, @@ -204,3 +237,4 @@ int build_phys_page_list(struct ib_phys_buf *buffer_list, return 0; } +#endif |