Page MenuHomeFreeBSD

D38170.diff
No OneTemporary

D38170.diff

diff --git a/contrib/ofed/libirdma/osdep.h b/contrib/ofed/libirdma/osdep.h
--- a/contrib/ofed/libirdma/osdep.h
+++ b/contrib/ofed/libirdma/osdep.h
@@ -102,6 +102,9 @@
#define __aligned_u64 uint64_t __aligned(8)
#define VLAN_PRIO_SHIFT 13
+#if __FreeBSD_version < 1400000
+#define IB_USER_VERBS_EX_CMD_MODIFY_QP IB_USER_VERBS_CMD_MODIFY_QP
+#endif
/*
* debug definition section
diff --git a/sys/dev/irdma/fbsd_kcompat.h b/sys/dev/irdma/fbsd_kcompat.h
--- a/sys/dev/irdma/fbsd_kcompat.h
+++ b/sys/dev/irdma/fbsd_kcompat.h
@@ -49,12 +49,14 @@
container_of(callback_tasklet, typeof(*var), tasklet_fieldname)
#endif
+#if __FreeBSD_version >= 1400000
#define IRDMA_SET_RDMA_OBJ_SIZE(ib_struct, drv_struct, member) \
(sizeof(struct drv_struct) + \
BUILD_BUG_ON_ZERO(offsetof(struct drv_struct, member)) + \
BUILD_BUG_ON_ZERO( \
!__same_type(((struct drv_struct *)NULL)->member, \
struct ib_struct)))
+#endif /* __FreeBSD_version > 1400000 */
#define set_ibdev_dma_device(ibdev, dev) \
ibdev.dma_device = (dev)
@@ -68,11 +70,20 @@
#define kmap_local_page(pg) page_address(pg)
#define kunmap(pg)
#define kunmap_local(pg)
+#if __FreeBSD_version >= 1400026
#define kc_free_lsmm_dereg_mr(iwdev, iwqp) \
((iwdev)->ibdev.dereg_mr((iwqp)->lsmm_mr, NULL))
+#else
+#define kc_free_lsmm_dereg_mr(iwdev, iwqp) \
+ ((iwdev)->ibdev.dereg_mr((iwqp)->lsmm_mr))
+#endif
#define IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION IB_CQ_FLAGS_TIMESTAMP_COMPLETION
+#if __FreeBSD_version < 1400026
+#define kc_irdma_destroy_qp(ibqp, udata) irdma_destroy_qp(ibqp)
+#else
#define kc_irdma_destroy_qp(ibqp, udata) irdma_destroy_qp(ibqp, udata)
+#endif
#ifndef IB_QP_ATTR_STANDARD_BITS
#define IB_QP_ATTR_STANDARD_BITS GENMASK(20, 0)
#endif
@@ -118,24 +129,53 @@
return (*pinfo)->addr;
}
+#if __FreeBSD_version < 1400026
+struct ib_cq *irdma_create_cq(struct ib_device *ibdev,
+ const struct ib_cq_init_attr *attr,
+ struct ib_ucontext *context,
+ struct ib_udata *udata);
+#else
int irdma_create_cq(struct ib_cq *ibcq,
const struct ib_cq_init_attr *attr,
struct ib_udata *udata);
+#endif
struct ib_qp *irdma_create_qp(struct ib_pd *ibpd,
struct ib_qp_init_attr *init_attr,
struct ib_udata *udata);
+#if __FreeBSD_version >= 1400026
int irdma_create_ah(struct ib_ah *ib_ah,
struct ib_ah_attr *attr, u32 flags,
struct ib_udata *udata);
int irdma_create_ah_stub(struct ib_ah *ib_ah,
struct ib_ah_attr *attr, u32 flags,
struct ib_udata *udata);
+#else
+struct ib_ah *irdma_create_ah(struct ib_pd *ibpd,
+ struct ib_ah_attr *attr,
+ struct ib_udata *udata);
+struct ib_ah *irdma_create_ah_stub(struct ib_pd *ibpd,
+ struct ib_ah_attr *attr,
+ struct ib_udata *udata);
+#endif
void irdma_ether_copy(u8 *dmac, struct ib_ah_attr *attr);
+#if __FreeBSD_version >= 1400026
void irdma_destroy_ah(struct ib_ah *ibah, u32 flags);
void irdma_destroy_ah_stub(struct ib_ah *ibah, u32 flags);
+#else
+int irdma_destroy_ah(struct ib_ah *ibah);
+int irdma_destroy_ah_stub(struct ib_ah *ibah);
+#endif
+#if __FreeBSD_version < 1400026
+int irdma_destroy_qp(struct ib_qp *ibqp);
+#else
int irdma_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata);
+#endif
+#if __FreeBSD_version < 1400026
+int irdma_dereg_mr(struct ib_mr *ib_mr);
+#else
int irdma_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata);
+#endif
void irdma_get_eth_speed_and_width(u32 link_speed, u8 *active_speed,
u8 *active_width);
enum rdma_link_layer irdma_get_link_layer(struct ib_device *ibdev,
@@ -162,6 +202,10 @@
void irdma_unregister_qset(struct irdma_sc_vsi *vsi,
struct irdma_ws_node *tc_node);
void ib_unregister_device(struct ib_device *ibdev);
+#if __FreeBSD_version < 1400026
+int rdma_user_mmap_io(struct ib_ucontext *ucontext, struct vm_area_struct *vma,
+ unsigned long pfn, unsigned long size, pgprot_t prot);
+#endif
void irdma_disassociate_ucontext(struct ib_ucontext *context);
int kc_irdma_set_roce_cm_info(struct irdma_qp *iwqp,
struct ib_qp_attr *attr,
@@ -195,8 +239,13 @@
struct irdma_mr;
struct irdma_cq;
struct irdma_cq_buf;
+#if __FreeBSD_version < 1400026
+struct ib_mr *irdma_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
+ u32 max_num_sg);
+#else
struct ib_mr *irdma_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
u32 max_num_sg, struct ib_udata *udata);
+#endif
int irdma_hwreg_mr(struct irdma_device *iwdev, struct irdma_mr *iwmr,
u16 access);
struct ib_mr *irdma_rereg_mr_trans(struct irdma_mr *iwmr, u64 start, u64 len,
@@ -229,11 +278,32 @@
struct irdma_sc_qp *qp);
int irdma_process_resize_list(struct irdma_cq *iwcq, struct irdma_device *iwdev,
struct irdma_cq_buf *lcqe_buf);
+#if __FreeBSD_version < 1400026
+int irdma_destroy_cq(struct ib_cq *ib_cq);
+#else
void irdma_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata);
+#endif
+#if __FreeBSD_version < 1400026
+struct ib_ucontext *irdma_alloc_ucontext(struct ib_device *, struct ib_udata *);
+#else
int irdma_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata);
+#endif
+#if __FreeBSD_version < 1400026
+int irdma_dealloc_ucontext(struct ib_ucontext *);
+#else
void irdma_dealloc_ucontext(struct ib_ucontext *context);
+#endif
+#if __FreeBSD_version < 1400026
+struct ib_pd *irdma_alloc_pd(struct ib_device *, struct ib_ucontext *,
+ struct ib_udata *);
+#else
int irdma_alloc_pd(struct ib_pd *pd, struct ib_udata *udata);
+#endif
+#if __FreeBSD_version < 1400026
+int irdma_dealloc_pd(struct ib_pd *);
+#else
void irdma_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
+#endif
int irdma_add_gid(struct ib_device *, u8, unsigned int, const union ib_gid *,
const struct ib_gid_attr *, void **);
int irdma_del_gid(struct ib_device *, u8, unsigned int, void **);
diff --git a/sys/dev/irdma/irdma_kcompat.c b/sys/dev/irdma/irdma_kcompat.c
--- a/sys/dev/irdma/irdma_kcompat.c
+++ b/sys/dev/irdma/irdma_kcompat.c
@@ -97,6 +97,7 @@
return 0;
}
+#if __FreeBSD_version >= 1400026
/**
* irdma_alloc_mr - register stag for fast memory registration
* @pd: ibpd pointer
@@ -108,6 +109,18 @@
irdma_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
u32 max_num_sg, struct ib_udata *udata)
{
+#else
+/**
+ * irdma_alloc_mr - register stag for fast memory registration
+ * @pd: ibpd pointer
+ * @mr_type: memory for stag registrion
+ * @max_num_sg: man number of pages
+ */
+struct ib_mr *
+irdma_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
+ u32 max_num_sg)
+{
+#endif
struct irdma_device *iwdev = to_iwdev(pd->device);
struct irdma_pble_alloc *palloc;
struct irdma_pbl *iwpbl;
@@ -162,6 +175,7 @@
#define IRDMA_ALLOC_UCTX_MIN_REQ_LEN offsetofend(struct irdma_alloc_ucontext_req, rsvd8)
#define IRDMA_ALLOC_UCTX_MIN_RESP_LEN offsetofend(struct irdma_alloc_ucontext_resp, rsvd)
+#if __FreeBSD_version >= 1400026
/**
* irdma_alloc_ucontext - Allocate the user context data structure
* @uctx: context
@@ -253,7 +267,116 @@
req.userspace_ver, IRDMA_ABI_VER);
return -EINVAL;
}
+#endif
+#if __FreeBSD_version < 1400026
+/**
+ * irdma_alloc_ucontext - Allocate the user context data structure
+ * @ibdev: ib device pointer
+ * @udata: user data
+ *
+ * This keeps track of all objects associated with a particular
+ * user-mode client.
+ */
+struct ib_ucontext *
+irdma_alloc_ucontext(struct ib_device *ibdev, struct ib_udata *udata)
+{
+ struct irdma_device *iwdev = to_iwdev(ibdev);
+ struct irdma_alloc_ucontext_req req = {0};
+ struct irdma_alloc_ucontext_resp uresp = {0};
+ struct irdma_ucontext *ucontext;
+ struct irdma_uk_attrs *uk_attrs;
+
+ if (udata->inlen < IRDMA_ALLOC_UCTX_MIN_REQ_LEN ||
+ udata->outlen < IRDMA_ALLOC_UCTX_MIN_RESP_LEN)
+ return ERR_PTR(-EINVAL);
+
+ if (ib_copy_from_udata(&req, udata, min(sizeof(req), udata->inlen)))
+ return ERR_PTR(-EINVAL);
+
+ if (req.userspace_ver < 4 || req.userspace_ver > IRDMA_ABI_VER)
+ goto ver_error;
+
+ ucontext = kzalloc(sizeof(*ucontext), GFP_KERNEL);
+ if (!ucontext)
+ return ERR_PTR(-ENOMEM);
+
+ ucontext->iwdev = iwdev;
+ ucontext->abi_ver = req.userspace_ver;
+
+ uk_attrs = &iwdev->rf->sc_dev.hw_attrs.uk_attrs;
+ /* GEN_1 legacy support with libi40iw */
+ if (udata->outlen == IRDMA_ALLOC_UCTX_MIN_RESP_LEN) {
+ if (uk_attrs->hw_rev != IRDMA_GEN_1) {
+ kfree(ucontext);
+ return ERR_PTR(-EOPNOTSUPP);
+ }
+
+ ucontext->legacy_mode = true;
+ uresp.max_qps = iwdev->rf->max_qp;
+ uresp.max_pds = iwdev->rf->sc_dev.hw_attrs.max_hw_pds;
+ uresp.wq_size = iwdev->rf->sc_dev.hw_attrs.max_qp_wr * 2;
+ uresp.kernel_ver = req.userspace_ver;
+ if (ib_copy_to_udata(udata, &uresp, min(sizeof(uresp), udata->outlen))) {
+ kfree(ucontext);
+ return ERR_PTR(-EFAULT);
+ }
+ } else {
+ u64 bar_off;
+
+ uresp.kernel_ver = IRDMA_ABI_VER;
+ uresp.feature_flags = uk_attrs->feature_flags;
+ uresp.max_hw_wq_frags = uk_attrs->max_hw_wq_frags;
+ uresp.max_hw_read_sges = uk_attrs->max_hw_read_sges;
+ uresp.max_hw_inline = uk_attrs->max_hw_inline;
+ uresp.max_hw_rq_quanta = uk_attrs->max_hw_rq_quanta;
+ uresp.max_hw_wq_quanta = uk_attrs->max_hw_wq_quanta;
+ uresp.max_hw_sq_chunk = uk_attrs->max_hw_sq_chunk;
+ uresp.max_hw_cq_size = uk_attrs->max_hw_cq_size;
+ uresp.min_hw_cq_size = uk_attrs->min_hw_cq_size;
+ uresp.hw_rev = uk_attrs->hw_rev;
+
+ bar_off =
+ (uintptr_t)iwdev->rf->sc_dev.hw_regs[IRDMA_DB_ADDR_OFFSET];
+
+ spin_lock_init(&ucontext->mmap_tbl_lock);
+ ucontext->db_mmap_entry =
+ irdma_user_mmap_entry_add_hash(ucontext, bar_off,
+ IRDMA_MMAP_IO_NC,
+ &uresp.db_mmap_key);
+ if (!ucontext->db_mmap_entry) {
+ spin_lock_destroy(&ucontext->mmap_tbl_lock);
+ kfree(ucontext);
+ return ERR_PTR(-ENOMEM);
+ }
+
+ if (ib_copy_to_udata(udata, &uresp,
+ min(sizeof(uresp), udata->outlen))) {
+ irdma_user_mmap_entry_del_hash(ucontext->db_mmap_entry);
+ spin_lock_destroy(&ucontext->mmap_tbl_lock);
+ kfree(ucontext);
+ return ERR_PTR(-EFAULT);
+ }
+ }
+
+ INIT_LIST_HEAD(&ucontext->cq_reg_mem_list);
+ spin_lock_init(&ucontext->cq_reg_mem_list_lock);
+ INIT_LIST_HEAD(&ucontext->qp_reg_mem_list);
+ spin_lock_init(&ucontext->qp_reg_mem_list_lock);
+ INIT_LIST_HEAD(&ucontext->vma_list);
+ mutex_init(&ucontext->vma_list_mutex);
+
+ return &ucontext->ibucontext;
+
+ver_error:
+ ibdev_err(&iwdev->ibdev,
+ "Invalid userspace driver version detected. Detected version %d, should be %d\n",
+ req.userspace_ver, IRDMA_ABI_VER);
+ return ERR_PTR(-EINVAL);
+}
+#endif
+
+#if __FreeBSD_version >= 1400026
/**
* irdma_dealloc_ucontext - deallocate the user context data structure
* @context: user context created during alloc
@@ -267,8 +390,28 @@
return;
}
+#endif
+
+#if __FreeBSD_version < 1400026
+/**
+ * irdma_dealloc_ucontext - deallocate the user context data structure
+ * @context: user context created during alloc
+ */
+int
+irdma_dealloc_ucontext(struct ib_ucontext *context)
+{
+ struct irdma_ucontext *ucontext = to_ucontext(context);
+
+ irdma_user_mmap_entry_del_hash(ucontext->db_mmap_entry);
+ spin_lock_destroy(&ucontext->mmap_tbl_lock);
+ kfree(ucontext);
+
+ return 0;
+}
+#endif
#define IRDMA_ALLOC_PD_MIN_RESP_LEN offsetofend(struct irdma_alloc_pd_resp, rsvd)
+#if __FreeBSD_version >= 1400026
/**
* irdma_alloc_pd - allocate protection domain
* @pd: protection domain
@@ -319,7 +462,67 @@
return err;
}
+#endif
+
+#if __FreeBSD_version < 1400026
+/**
+ * irdma_alloc_pd - allocate protection domain
+ * @ibdev: IB device
+ * @context: user context
+ * @udata: user data
+ */
+struct ib_pd *
+irdma_alloc_pd(struct ib_device *ibdev, struct ib_ucontext *context, struct ib_udata *udata)
+{
+ struct irdma_pd *iwpd;
+ struct irdma_device *iwdev = to_iwdev(ibdev);
+ struct irdma_sc_dev *dev = &iwdev->rf->sc_dev;
+ struct irdma_pci_f *rf = iwdev->rf;
+ struct irdma_alloc_pd_resp uresp = {0};
+ struct irdma_sc_pd *sc_pd;
+ u32 pd_id = 0;
+ int err;
+
+ err = irdma_alloc_rsrc(rf, rf->allocated_pds, rf->max_pd, &pd_id,
+ &rf->next_pd);
+ if (err)
+ return ERR_PTR(err);
+
+ iwpd = kzalloc(sizeof(*iwpd), GFP_KERNEL);
+ if (!iwpd) {
+ err = -ENOMEM;
+ goto free_res;
+ }
+
+ sc_pd = &iwpd->sc_pd;
+ if (udata) {
+ struct irdma_ucontext *ucontext = to_ucontext(context);
+
+ irdma_sc_pd_init(dev, sc_pd, pd_id, ucontext->abi_ver);
+ uresp.pd_id = pd_id;
+ if (ib_copy_to_udata(udata, &uresp,
+ min(sizeof(uresp), udata->outlen))) {
+ err = -EFAULT;
+ goto error;
+ }
+ } else {
+ irdma_sc_pd_init(dev, sc_pd, pd_id, IRDMA_ABI_VER);
+ }
+
+ return &iwpd->ibpd;
+
+error:
+ kfree(iwpd);
+free_res:
+
+ irdma_free_rsrc(rf, rf->allocated_pds, pd_id);
+ return ERR_PTR(err);
+}
+
+#endif
+
+#if __FreeBSD_version >= 1400026
void
irdma_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
{
@@ -329,6 +532,21 @@
irdma_free_rsrc(iwdev->rf, iwdev->rf->allocated_pds, iwpd->sc_pd.pd_id);
}
+#endif
+
+#if __FreeBSD_version < 1400026
+int
+irdma_dealloc_pd(struct ib_pd *ibpd)
+{
+ struct irdma_pd *iwpd = to_iwpd(ibpd);
+ struct irdma_device *iwdev = to_iwdev(ibpd->device);
+
+ irdma_free_rsrc(iwdev->rf, iwdev->rf->allocated_pds, iwpd->sc_pd.pd_id);
+ kfree(iwpd);
+ return 0;
+}
+#endif
+
static void
irdma_fill_ah_info(struct vnet *vnet, struct irdma_ah_info *ah_info,
const struct ib_gid_attr *sgid_attr,
@@ -416,6 +634,7 @@
#define IRDMA_CREATE_AH_MIN_RESP_LEN offsetofend(struct irdma_create_ah_resp, rsvd)
+#if __FreeBSD_version >= 1400026
/**
* irdma_create_ah - create address handle
* @ib_ah: ptr to AH
@@ -539,6 +758,7 @@
return err;
}
+#endif
void
irdma_ether_copy(u8 *dmac, struct ib_ah_attr *attr)
@@ -546,19 +766,172 @@
ether_addr_copy(dmac, attr->dmac);
}
+#if __FreeBSD_version < 1400026
+struct ib_ah *
+irdma_create_ah_stub(struct ib_pd *ibpd,
+ struct ib_ah_attr *attr,
+ struct ib_udata *udata)
+#else
int
irdma_create_ah_stub(struct ib_ah *ib_ah,
struct ib_ah_attr *attr, u32 flags,
struct ib_udata *udata)
+#endif
{
+#if __FreeBSD_version >= 1400026
return -ENOSYS;
+#else
+ return ERR_PTR(-ENOSYS);
+#endif
}
+#if __FreeBSD_version >= 1400026
void
irdma_destroy_ah_stub(struct ib_ah *ibah, u32 flags)
{
return;
}
+#else
+int
+irdma_destroy_ah_stub(struct ib_ah *ibah)
+{
+ return -ENOSYS;
+}
+#endif
+
+#if __FreeBSD_version < 1400026
+/**
+ * irdma_create_ah - create address handle
+ * @ibpd: ptr to pd
+ * @attr: address handle attributes
+ * @udata: user data
+ *
+ * returns a pointer to an address handle
+ */
+struct ib_ah *
+irdma_create_ah(struct ib_pd *ibpd,
+ struct ib_ah_attr *attr,
+ struct ib_udata *udata)
+{
+ struct irdma_pd *pd = to_iwpd(ibpd);
+ struct irdma_device *iwdev = to_iwdev(ibpd->device);
+ struct irdma_ah *ah;
+ union ib_gid sgid;
+ struct ib_gid_attr sgid_attr;
+ struct irdma_pci_f *rf = iwdev->rf;
+ struct irdma_sc_ah *sc_ah;
+ u32 ah_id = 0;
+ struct irdma_ah_info *ah_info;
+ struct irdma_create_ah_resp uresp;
+ union {
+ struct sockaddr saddr;
+ struct sockaddr_in saddr_in;
+ struct sockaddr_in6 saddr_in6;
+ } sgid_addr, dgid_addr;
+ int err;
+ u8 dmac[ETH_ALEN];
+ bool sleep = udata ? true : false;
+
+ if (udata && udata->outlen < IRDMA_CREATE_AH_MIN_RESP_LEN)
+ return ERR_PTR(-EINVAL);
+
+ err = irdma_alloc_rsrc(rf, rf->allocated_ahs,
+ rf->max_ah, &ah_id, &rf->next_ah);
+
+ if (err)
+ return ERR_PTR(err);
+
+ ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
+ if (!ah) {
+ irdma_free_rsrc(rf, rf->allocated_ahs, ah_id);
+ return ERR_PTR(-ENOMEM);
+ }
+
+ ah->pd = pd;
+ sc_ah = &ah->sc_ah;
+ sc_ah->ah_info.ah_idx = ah_id;
+ sc_ah->ah_info.vsi = &iwdev->vsi;
+ irdma_sc_init_ah(&rf->sc_dev, sc_ah);
+ ah->sgid_index = attr->grh.sgid_index;
+ memcpy(&ah->dgid, &attr->grh.dgid, sizeof(ah->dgid));
+ rcu_read_lock();
+ err = ib_get_cached_gid(&iwdev->ibdev, attr->port_num,
+ attr->grh.sgid_index, &sgid, &sgid_attr);
+ rcu_read_unlock();
+ if (err) {
+ irdma_debug(iwdev_to_idev(iwdev), IRDMA_DEBUG_VERBS,
+ "GID lookup at idx=%d with port=%d failed\n",
+ attr->grh.sgid_index, attr->port_num);
+ err = -EINVAL;
+ goto err_gid_l2;
+ }
+ rdma_gid2ip((struct sockaddr *)&sgid_addr, &sgid);
+ rdma_gid2ip((struct sockaddr *)&dgid_addr, &attr->grh.dgid);
+ ah->av.attrs = *attr;
+ ah->av.net_type = kc_rdma_gid_attr_network_type(sgid_attr,
+ sgid_attr.gid_type,
+ &sgid);
+
+ if (sgid_attr.ndev)
+ dev_put(sgid_attr.ndev);
+
+ ah->av.sgid_addr.saddr = sgid_addr.saddr;
+ ah->av.dgid_addr.saddr = dgid_addr.saddr;
+ ah_info = &sc_ah->ah_info;
+ ah_info->ah_idx = ah_id;
+ ah_info->pd_idx = pd->sc_pd.pd_id;
+
+ ether_addr_copy(ah_info->mac_addr, IF_LLADDR(iwdev->netdev));
+ if (attr->ah_flags & IB_AH_GRH) {
+ ah_info->flow_label = attr->grh.flow_label;
+ ah_info->hop_ttl = attr->grh.hop_limit;
+ ah_info->tc_tos = attr->grh.traffic_class;
+ }
+
+ if (udata)
+ ib_resolve_eth_dmac(ibpd->device, attr);
+ irdma_ether_copy(dmac, attr);
+
+ irdma_fill_ah_info(iwdev->netdev->if_vnet, ah_info, &sgid_attr, &sgid_addr.saddr, &dgid_addr.saddr,
+ dmac, ah->av.net_type);
+
+ err = irdma_create_ah_vlan_tag(iwdev, ah_info, &sgid_attr, dmac);
+ if (err)
+ goto err_gid_l2;
+
+ err = irdma_ah_cqp_op(iwdev->rf, sc_ah, IRDMA_OP_AH_CREATE,
+ sleep, irdma_gsi_ud_qp_ah_cb, sc_ah);
+ if (err) {
+ irdma_debug(iwdev_to_idev(iwdev), IRDMA_DEBUG_VERBS,
+ "CQP-OP Create AH fail");
+ goto err_gid_l2;
+ }
+
+ err = irdma_create_ah_wait(rf, sc_ah, sleep);
+ if (err) {
+ irdma_debug(iwdev_to_idev(iwdev), IRDMA_DEBUG_VERBS,
+ "CQP create AH timed out");
+ goto err_gid_l2;
+ }
+
+ if (udata) {
+ uresp.ah_id = ah->sc_ah.ah_info.ah_idx;
+ err = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
+ if (err) {
+ irdma_ah_cqp_op(iwdev->rf, &ah->sc_ah,
+ IRDMA_OP_AH_DESTROY, false, NULL, ah);
+ goto err_gid_l2;
+ }
+ }
+
+ return &ah->ibah;
+err_gid_l2:
+ kfree(ah);
+ irdma_free_rsrc(iwdev->rf, iwdev->rf->allocated_ahs, ah_id);
+
+ return ERR_PTR(err);
+}
+#endif
/**
* irdma_free_qp_rsrc - free up memory resources for qp
@@ -797,8 +1170,13 @@
* @ibqp: qp's ib pointer also to get to device's qp address
* @udata: user data
*/
+#if __FreeBSD_version >= 1400026
int
irdma_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
+#else
+int
+irdma_destroy_qp(struct ib_qp *ibqp)
+#endif
{
struct irdma_qp *iwqp = to_iwqp(ibqp);
struct irdma_device *iwdev = iwqp->iwdev;
@@ -835,17 +1213,31 @@
* @attr: attributes for cq
* @udata: user data
*/
+#if __FreeBSD_version >= 1400026
int
irdma_create_cq(struct ib_cq *ibcq,
const struct ib_cq_init_attr *attr,
struct ib_udata *udata)
+#else
+struct ib_cq *
+irdma_create_cq(struct ib_device *ibdev,
+ const struct ib_cq_init_attr *attr,
+ struct ib_ucontext *context,
+ struct ib_udata *udata)
+#endif
{
#define IRDMA_CREATE_CQ_MIN_REQ_LEN offsetofend(struct irdma_create_cq_req, user_cq_buf)
#define IRDMA_CREATE_CQ_MIN_RESP_LEN offsetofend(struct irdma_create_cq_resp, cq_size)
+#if __FreeBSD_version >= 1400026
struct ib_device *ibdev = ibcq->device;
+#endif
struct irdma_device *iwdev = to_iwdev(ibdev);
struct irdma_pci_f *rf = iwdev->rf;
+#if __FreeBSD_version >= 1400026
struct irdma_cq *iwcq = to_iwcq(ibcq);
+#else
+ struct irdma_cq *iwcq;
+#endif
u32 cq_num = 0;
struct irdma_sc_cq *cq;
struct irdma_sc_dev *dev = &rf->sc_dev;
@@ -859,6 +1251,7 @@
int entries = attr->cqe;
bool cqe_64byte_ena;
+#if __FreeBSD_version >= 1400026
err_code = cq_validate_flags(attr->flags, dev->hw_attrs.uk_attrs.hw_rev);
if (err_code)
return err_code;
@@ -866,10 +1259,27 @@
if (udata && (udata->inlen < IRDMA_CREATE_CQ_MIN_REQ_LEN ||
udata->outlen < IRDMA_CREATE_CQ_MIN_RESP_LEN))
return -EINVAL;
+#else
+ err_code = cq_validate_flags(attr->flags, dev->hw_attrs.uk_attrs.hw_rev);
+ if (err_code)
+ return ERR_PTR(err_code);
+
+ if (udata && (udata->inlen < IRDMA_CREATE_CQ_MIN_REQ_LEN ||
+ udata->outlen < IRDMA_CREATE_CQ_MIN_RESP_LEN))
+ return ERR_PTR(-EINVAL);
+
+ iwcq = kzalloc(sizeof(*iwcq), GFP_KERNEL);
+ if (!iwcq)
+ return ERR_PTR(-ENOMEM);
+#endif
err_code = irdma_alloc_rsrc(rf, rf->allocated_cqs, rf->max_cq, &cq_num,
&rf->next_cq);
if (err_code)
+#if __FreeBSD_version >= 1400026
return err_code;
+#else
+ goto error;
+#endif
cq = &iwcq->sc_cq;
cq->back_cq = iwcq;
atomic_set(&iwcq->refcnt, 1);
@@ -898,7 +1308,11 @@
struct irdma_cq_mr *cqmr_shadow;
iwcq->user_mode = true;
+#if __FreeBSD_version >= 1400026
ucontext = rdma_udata_to_drv_context(udata, struct irdma_ucontext, ibucontext);
+#else
+ ucontext = to_ucontext(context);
+#endif
if (ib_copy_from_udata(&req, udata,
min(sizeof(req), udata->inlen))) {
@@ -1030,12 +1444,22 @@
rf->cq_table[cq_num] = iwcq;
init_completion(&iwcq->free_cq);
+#if __FreeBSD_version >= 1400026
return 0;
+#else
+ return &iwcq->ibcq;
+#endif
cq_destroy:
irdma_cq_wq_destroy(rf, cq);
cq_free_rsrc:
irdma_cq_free_rsrc(rf, iwcq);
+#if __FreeBSD_version >= 1400026
return err_code;
+#else
+error:
+ kfree(iwcq);
+ return ERR_PTR(err_code);
+#endif
}
/**
@@ -1085,6 +1509,7 @@
* @ah_flags: destroy flags
*/
+#if __FreeBSD_version >= 1400026
void
irdma_destroy_ah(struct ib_ah *ibah, u32 ah_flags)
{
@@ -1097,9 +1522,33 @@
irdma_free_rsrc(iwdev->rf, iwdev->rf->allocated_ahs,
ah->sc_ah.ah_info.ah_idx);
}
+#endif
+#if __FreeBSD_version < 1400026
+int
+irdma_destroy_ah(struct ib_ah *ibah)
+{
+ struct irdma_device *iwdev = to_iwdev(ibah->device);
+ struct irdma_ah *ah = to_iwah(ibah);
+
+ irdma_ah_cqp_op(iwdev->rf, &ah->sc_ah, IRDMA_OP_AH_DESTROY,
+ false, NULL, ah);
+
+ irdma_free_rsrc(iwdev->rf, iwdev->rf->allocated_ahs,
+ ah->sc_ah.ah_info.ah_idx);
+
+ kfree(ah);
+ return 0;
+}
+#endif
+
+#if __FreeBSD_version >= 1400026
int
irdma_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
+#else
+int
+irdma_dereg_mr(struct ib_mr *ib_mr)
+#endif
{
struct irdma_mr *iwmr = to_iwmr(ib_mr);
struct irdma_device *iwdev = to_iwdev(ib_mr->device);
@@ -1109,10 +1558,15 @@
if (iwmr->type != IRDMA_MEMREG_TYPE_MEM) {
if (iwmr->region) {
struct irdma_ucontext *ucontext;
+#if __FreeBSD_version >= 1400026
+
+ ucontext = rdma_udata_to_drv_context(udata, struct irdma_ucontext, ibucontext);
+
+#else
+ struct ib_pd *ibpd = ib_mr->pd;
- ucontext = rdma_udata_to_drv_context(udata,
- struct irdma_ucontext,
- ibucontext);
+ ucontext = to_ucontext(ibpd->uobject->context);
+#endif
irdma_del_memlist(iwmr, ucontext);
}
goto done;
@@ -1219,6 +1673,7 @@
return 0;
}
+#if __FreeBSD_version >= 1400026
/**
* irdma_destroy_cq - destroy cq
* @ib_cq: cq pointer
@@ -1253,6 +1708,46 @@
irdma_cq_free_rsrc(iwdev->rf, iwcq);
}
+#endif
+#if __FreeBSD_version < 1400026
+/**
+ * irdma_destroy_cq - destroy cq
+ * @ib_cq: cq pointer
+ */
+int
+irdma_destroy_cq(struct ib_cq *ib_cq)
+{
+ struct irdma_device *iwdev = to_iwdev(ib_cq->device);
+ struct irdma_cq *iwcq = to_iwcq(ib_cq);
+ struct irdma_sc_cq *cq = &iwcq->sc_cq;
+ struct irdma_sc_dev *dev = cq->dev;
+ struct irdma_sc_ceq *ceq = dev->ceq[cq->ceq_id];
+ struct irdma_ceq *iwceq = container_of(ceq, struct irdma_ceq, sc_ceq);
+ unsigned long flags;
+
+ spin_lock_irqsave(&iwcq->lock, flags);
+ if (!list_empty(&iwcq->cmpl_generated))
+ irdma_remove_cmpls_list(iwcq);
+ if (!list_empty(&iwcq->resize_list))
+ irdma_process_resize_list(iwcq, iwdev, NULL);
+ spin_unlock_irqrestore(&iwcq->lock, flags);
+
+ irdma_cq_rem_ref(ib_cq);
+ wait_for_completion(&iwcq->free_cq);
+
+ irdma_cq_wq_destroy(iwdev->rf, cq);
+
+ spin_lock_irqsave(&iwceq->ce_lock, flags);
+ irdma_sc_cleanup_ceqes(cq, ceq);
+ spin_unlock_irqrestore(&iwceq->ce_lock, flags);
+
+ irdma_cq_free_rsrc(iwdev->rf, iwcq);
+ kfree(iwcq);
+
+ return 0;
+}
+
+#endif
/**
* irdma_alloc_mw - Allocate memory window
* @pd: Protection domain
@@ -1316,6 +1811,75 @@
(cm_node->iwdev->vsi.mtu - IRDMA_MTU_TO_MSS_IPV6);
}
+#if __FreeBSD_version < 1400026
+struct irdma_vma_data {
+ struct list_head list;
+ struct vm_area_struct *vma;
+ struct mutex *vma_list_mutex; /* protect the vma_list */
+};
+
+/**
+ * irdma_vma_open -
+ * @vma: User VMA
+ */
+static void
+irdma_vma_open(struct vm_area_struct *vma)
+{
+ vma->vm_ops = NULL;
+}
+
+/**
+ * irdma_vma_close - Remove vma data from vma list
+ * @vma: User VMA
+ */
+static void
+irdma_vma_close(struct vm_area_struct *vma)
+{
+ struct irdma_vma_data *vma_data;
+
+ vma_data = vma->vm_private_data;
+ vma->vm_private_data = NULL;
+ vma_data->vma = NULL;
+ mutex_lock(vma_data->vma_list_mutex);
+ list_del(&vma_data->list);
+ mutex_unlock(vma_data->vma_list_mutex);
+ kfree(vma_data);
+}
+
+static const struct vm_operations_struct irdma_vm_ops = {
+ .open = irdma_vma_open,
+ .close = irdma_vma_close
+};
+
+/**
+ * irdma_set_vma_data - Save vma data in context list
+ * @vma: User VMA
+ * @context: ib user context
+ */
+static int
+irdma_set_vma_data(struct vm_area_struct *vma,
+ struct irdma_ucontext *context)
+{
+ struct list_head *vma_head = &context->vma_list;
+ struct irdma_vma_data *vma_entry;
+
+ vma_entry = kzalloc(sizeof(*vma_entry), GFP_KERNEL);
+ if (!vma_entry)
+ return -ENOMEM;
+
+ vma->vm_private_data = vma_entry;
+ vma->vm_ops = &irdma_vm_ops;
+
+ vma_entry->vma = vma;
+ vma_entry->vma_list_mutex = &context->vma_list_mutex;
+
+ mutex_lock(&context->vma_list_mutex);
+ list_add(&vma_entry->list, vma_head);
+ mutex_unlock(&context->vma_list_mutex);
+
+ return 0;
+}
+
/**
* irdma_disassociate_ucontext - Disassociate user context
* @context: ib user context
@@ -1323,8 +1887,47 @@
void
irdma_disassociate_ucontext(struct ib_ucontext *context)
{
+ struct irdma_ucontext *ucontext = to_ucontext(context);
+
+ struct irdma_vma_data *vma_data, *n;
+ struct vm_area_struct *vma;
+
+ mutex_lock(&ucontext->vma_list_mutex);
+ list_for_each_entry_safe(vma_data, n, &ucontext->vma_list, list) {
+ vma = vma_data->vma;
+ zap_vma_ptes(vma, vma->vm_start, PAGE_SIZE);
+
+ vma->vm_ops = NULL;
+ list_del(&vma_data->list);
+ kfree(vma_data);
+ }
+ mutex_unlock(&ucontext->vma_list_mutex);
}
+int
+rdma_user_mmap_io(struct ib_ucontext *context, struct vm_area_struct *vma,
+ unsigned long pfn, unsigned long size, pgprot_t prot)
+{
+ if (io_remap_pfn_range(vma,
+ vma->vm_start,
+ pfn,
+ size,
+ prot))
+ return -EAGAIN;
+
+ return irdma_set_vma_data(vma, to_ucontext(context));
+}
+#else
+/**
+ * irdma_disassociate_ucontext - Disassociate user context
+ * @context: ib user context
+ */
+void
+irdma_disassociate_ucontext(struct ib_ucontext *context)
+{
+}
+#endif
+
struct ib_device *
ib_device_get_by_netdev(struct ifnet *netdev, int driver_id)
{
diff --git a/sys/dev/irdma/irdma_main.h b/sys/dev/irdma/irdma_main.h
--- a/sys/dev/irdma/irdma_main.h
+++ b/sys/dev/irdma/irdma_main.h
@@ -44,7 +44,9 @@
#include <netinet/if_ether.h>
#include <linux/slab.h>
#include <linux/rculist.h>
+#if __FreeBSD_version >= 1400000
#include <rdma/uverbs_ioctl.h>
+#endif
#include <rdma/ib_smi.h>
#include <rdma/ib_verbs.h>
#include <rdma/ib_pack.h>
@@ -408,6 +410,7 @@
return container_of(ibucontext, struct irdma_ucontext, ibucontext);
}
+#if __FreeBSD_version >= 1400026
static inline struct irdma_user_mmap_entry *
to_irdma_mmap_entry(struct rdma_user_mmap_entry *rdma_entry)
{
@@ -415,6 +418,7 @@
rdma_entry);
}
+#endif
static inline struct irdma_pd *to_iwpd(struct ib_pd *ibpd)
{
return container_of(ibpd, struct irdma_pd, ibpd);
diff --git a/sys/dev/irdma/irdma_verbs.h b/sys/dev/irdma/irdma_verbs.h
--- a/sys/dev/irdma/irdma_verbs.h
+++ b/sys/dev/irdma/irdma_verbs.h
@@ -47,7 +47,13 @@
struct irdma_ucontext {
struct ib_ucontext ibucontext;
struct irdma_device *iwdev;
+#if __FreeBSD_version >= 1400026
struct rdma_user_mmap_entry *db_mmap_entry;
+#else
+ struct irdma_user_mmap_entry *db_mmap_entry;
+ DECLARE_HASHTABLE(mmap_hash_tbl, 6);
+ spinlock_t mmap_tbl_lock; /* protect mmap hash table entries */
+#endif
struct list_head cq_reg_mem_list;
spinlock_t cq_reg_mem_list_lock; /* protect CQ memory list */
struct list_head qp_reg_mem_list;
@@ -194,8 +200,13 @@
struct irdma_cq *iwscq;
struct irdma_cq *iwrcq;
struct irdma_pd *iwpd;
+#if __FreeBSD_version >= 1400026
struct rdma_user_mmap_entry *push_wqe_mmap_entry;
struct rdma_user_mmap_entry *push_db_mmap_entry;
+#else
+ struct irdma_user_mmap_entry *push_wqe_mmap_entry;
+ struct irdma_user_mmap_entry *push_db_mmap_entry;
+#endif
struct irdma_qp_host_ctx_info ctx_info;
union {
struct irdma_iwarp_offload_info iwarp_info;
@@ -256,7 +267,13 @@
};
struct irdma_user_mmap_entry {
+#if __FreeBSD_version >= 1400026
struct rdma_user_mmap_entry rdma_entry;
+#else
+ struct irdma_ucontext *ucontext;
+ struct hlist_node hlist;
+ u64 pgoff_key; /* Used to compute offset (in bytes) returned to user libc's mmap */
+#endif
u64 bar_offset;
u8 mmap_flag;
};
@@ -300,9 +317,16 @@
ether_addr_copy(mac, mac6);
}
+#if __FreeBSD_version >= 1400026
struct rdma_user_mmap_entry*
irdma_user_mmap_entry_insert(struct irdma_ucontext *ucontext, u64 bar_offset,
enum irdma_mmap_flag mmap_flag, u64 *mmap_offset);
+#else
+struct irdma_user_mmap_entry *
+irdma_user_mmap_entry_add_hash(struct irdma_ucontext *ucontext, u64 bar_offset,
+ enum irdma_mmap_flag mmap_flag, u64 *mmap_offset);
+void irdma_user_mmap_entry_del_hash(struct irdma_user_mmap_entry *entry);
+#endif
int irdma_ib_register_device(struct irdma_device *iwdev);
void irdma_ib_unregister_device(struct irdma_device *iwdev);
void irdma_ib_qp_event(struct irdma_qp *iwqp, enum irdma_qp_event_type event);
diff --git a/sys/dev/irdma/irdma_verbs.c b/sys/dev/irdma/irdma_verbs.c
--- a/sys/dev/irdma/irdma_verbs.c
+++ b/sys/dev/irdma/irdma_verbs.c
@@ -107,10 +107,16 @@
pfn = ((uintptr_t)ucontext->iwdev->rf->sc_dev.hw_regs[IRDMA_DB_ADDR_OFFSET] +
pci_resource_start(ucontext->iwdev->rf->pcidev, 0)) >> PAGE_SHIFT;
+#if __FreeBSD_version >= 1400026
return rdma_user_mmap_io(&ucontext->ibucontext, vma, pfn, PAGE_SIZE,
pgprot_noncached(vma->vm_page_prot), NULL);
+#else
+ return rdma_user_mmap_io(&ucontext->ibucontext, vma, pfn, PAGE_SIZE,
+ pgprot_noncached(vma->vm_page_prot));
+#endif
}
+#if __FreeBSD_version >= 1400026
static void
irdma_mmap_free(struct rdma_user_mmap_entry *rdma_entry)
{
@@ -143,6 +149,103 @@
return &entry->rdma_entry;
}
+#else
+static inline bool
+find_key_in_mmap_tbl(struct irdma_ucontext *ucontext, u64 key)
+{
+ struct irdma_user_mmap_entry *entry;
+
+ HASH_FOR_EACH_POSSIBLE(ucontext->mmap_hash_tbl, entry, hlist, key) {
+ if (entry->pgoff_key == key)
+ return true;
+ }
+
+ return false;
+}
+
+struct irdma_user_mmap_entry *
+irdma_user_mmap_entry_add_hash(struct irdma_ucontext *ucontext, u64 bar_offset,
+ enum irdma_mmap_flag mmap_flag, u64 *mmap_offset)
+{
+ struct irdma_user_mmap_entry *entry = kzalloc(sizeof(*entry), GFP_KERNEL);
+ unsigned long flags;
+ int retry_cnt = 0;
+
+ if (!entry)
+ return NULL;
+
+ entry->bar_offset = bar_offset;
+ entry->mmap_flag = mmap_flag;
+ entry->ucontext = ucontext;
+ do {
+ get_random_bytes(&entry->pgoff_key, sizeof(entry->pgoff_key));
+
+ /* The key is a page offset */
+ entry->pgoff_key >>= PAGE_SHIFT;
+
+ /* In the event of a collision in the hash table, retry a new key */
+ spin_lock_irqsave(&ucontext->mmap_tbl_lock, flags);
+ if (!find_key_in_mmap_tbl(ucontext, entry->pgoff_key)) {
+ HASH_ADD(ucontext->mmap_hash_tbl, &entry->hlist, entry->pgoff_key);
+ spin_unlock_irqrestore(&ucontext->mmap_tbl_lock, flags);
+ goto hash_add_done;
+ }
+ spin_unlock_irqrestore(&ucontext->mmap_tbl_lock, flags);
+ } while (retry_cnt++ < 10);
+
+ irdma_debug(iwdev_to_idev(ucontext->iwdev), IRDMA_DEBUG_VERBS, "mmap table add failed: Cannot find a unique key\n");
+ kfree(entry);
+ return NULL;
+
+hash_add_done:
+ /* libc mmap uses a byte offset */
+ *mmap_offset = entry->pgoff_key << PAGE_SHIFT;
+
+ return entry;
+}
+
+static struct irdma_user_mmap_entry *
+irdma_find_user_mmap_entry(struct irdma_ucontext *ucontext,
+ struct vm_area_struct *vma)
+{
+ struct irdma_user_mmap_entry *entry;
+ unsigned long flags;
+
+ if (vma->vm_end - vma->vm_start != PAGE_SIZE)
+ return NULL;
+
+ spin_lock_irqsave(&ucontext->mmap_tbl_lock, flags);
+ HASH_FOR_EACH_POSSIBLE(ucontext->mmap_hash_tbl, entry, hlist, vma->vm_pgoff) {
+ if (entry->pgoff_key == vma->vm_pgoff) {
+ spin_unlock_irqrestore(&ucontext->mmap_tbl_lock, flags);
+ return entry;
+ }
+ }
+
+ spin_unlock_irqrestore(&ucontext->mmap_tbl_lock, flags);
+
+ return NULL;
+}
+
+void
+irdma_user_mmap_entry_del_hash(struct irdma_user_mmap_entry *entry)
+{
+ struct irdma_ucontext *ucontext;
+ unsigned long flags;
+
+ if (!entry)
+ return;
+
+ ucontext = entry->ucontext;
+
+ spin_lock_irqsave(&ucontext->mmap_tbl_lock, flags);
+ HASH_DEL(ucontext->mmap_hash_tbl, &entry->hlist);
+ spin_unlock_irqrestore(&ucontext->mmap_tbl_lock, flags);
+
+ kfree(entry);
+}
+
+#endif
/**
* irdma_mmap - user memory map
* @context: context created during alloc
@@ -151,7 +254,9 @@
static int
irdma_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
{
+#if __FreeBSD_version >= 1400026
struct rdma_user_mmap_entry *rdma_entry;
+#endif
struct irdma_user_mmap_entry *entry;
struct irdma_ucontext *ucontext;
u64 pfn;
@@ -163,6 +268,7 @@
if (ucontext->legacy_mode)
return irdma_mmap_legacy(ucontext, vma);
+#if __FreeBSD_version >= 1400026
rdma_entry = rdma_user_mmap_entry_get(&ucontext->ibucontext, vma);
if (!rdma_entry) {
irdma_debug(iwdev_to_idev(ucontext->iwdev), IRDMA_DEBUG_VERBS,
@@ -172,6 +278,15 @@
}
entry = to_irdma_mmap_entry(rdma_entry);
+#else
+ entry = irdma_find_user_mmap_entry(ucontext, vma);
+ if (!entry) {
+ irdma_debug(iwdev_to_idev(ucontext->iwdev), IRDMA_DEBUG_VERBS,
+ "pgoff[0x%lx] does not have valid entry\n",
+ vma->vm_pgoff);
+ return -EINVAL;
+ }
+#endif
irdma_debug(iwdev_to_idev(ucontext->iwdev), IRDMA_DEBUG_VERBS,
"bar_offset [0x%lx] mmap_flag [%d]\n", entry->bar_offset,
entry->mmap_flag);
@@ -181,14 +296,24 @@
switch (entry->mmap_flag) {
case IRDMA_MMAP_IO_NC:
+#if __FreeBSD_version >= 1400026
ret = rdma_user_mmap_io(context, vma, pfn, PAGE_SIZE,
pgprot_noncached(vma->vm_page_prot),
rdma_entry);
+#else
+ ret = rdma_user_mmap_io(context, vma, pfn, PAGE_SIZE,
+ pgprot_noncached(vma->vm_page_prot));
+#endif
break;
case IRDMA_MMAP_IO_WC:
+#if __FreeBSD_version >= 1400026
ret = rdma_user_mmap_io(context, vma, pfn, PAGE_SIZE,
pgprot_writecombine(vma->vm_page_prot),
rdma_entry);
+#else
+ ret = rdma_user_mmap_io(context, vma, pfn, PAGE_SIZE,
+ pgprot_writecombine(vma->vm_page_prot));
+#endif
break;
default:
ret = -EINVAL;
@@ -198,7 +323,9 @@
irdma_debug(iwdev_to_idev(ucontext->iwdev), IRDMA_DEBUG_VERBS,
"bar_offset [0x%lx] mmap_flag[%d] err[%d]\n",
entry->bar_offset, entry->mmap_flag, ret);
+#if __FreeBSD_version >= 1400026
rdma_user_mmap_entry_put(rdma_entry);
+#endif
return ret;
}
@@ -300,11 +427,19 @@
irdma_remove_push_mmap_entries(struct irdma_qp *iwqp)
{
if (iwqp->push_db_mmap_entry) {
+#if __FreeBSD_version >= 1400026
rdma_user_mmap_entry_remove(iwqp->push_db_mmap_entry);
+#else
+ irdma_user_mmap_entry_del_hash(iwqp->push_db_mmap_entry);
+#endif
iwqp->push_db_mmap_entry = NULL;
}
if (iwqp->push_wqe_mmap_entry) {
+#if __FreeBSD_version >= 1400026
rdma_user_mmap_entry_remove(iwqp->push_wqe_mmap_entry);
+#else
+ irdma_user_mmap_entry_del_hash(iwqp->push_wqe_mmap_entry);
+#endif
iwqp->push_wqe_mmap_entry = NULL;
}
}
@@ -322,19 +457,34 @@
bar_off = irdma_compute_push_wqe_offset(iwdev, iwqp->sc_qp.push_idx);
+#if __FreeBSD_version >= 1400026
iwqp->push_wqe_mmap_entry = irdma_user_mmap_entry_insert(ucontext,
bar_off, IRDMA_MMAP_IO_WC,
push_wqe_mmap_key);
+#else
+ iwqp->push_wqe_mmap_entry = irdma_user_mmap_entry_add_hash(ucontext, bar_off,
+ IRDMA_MMAP_IO_WC, push_wqe_mmap_key);
+#endif
if (!iwqp->push_wqe_mmap_entry)
return -ENOMEM;
/* push doorbell page */
bar_off += IRDMA_HW_PAGE_SIZE;
+#if __FreeBSD_version >= 1400026
iwqp->push_db_mmap_entry = irdma_user_mmap_entry_insert(ucontext,
bar_off, IRDMA_MMAP_IO_NC,
push_db_mmap_key);
+#else
+
+ iwqp->push_db_mmap_entry = irdma_user_mmap_entry_add_hash(ucontext, bar_off,
+ IRDMA_MMAP_IO_NC, push_db_mmap_key);
+#endif
if (!iwqp->push_db_mmap_entry) {
+#if __FreeBSD_version >= 1400026
rdma_user_mmap_entry_remove(iwqp->push_wqe_mmap_entry);
+#else
+ irdma_user_mmap_entry_del_hash(iwqp->push_wqe_mmap_entry);
+#endif
return -ENOMEM;
}
@@ -398,8 +548,11 @@
iwqp->ctx_info.qp_compl_ctx = req.user_compl_ctx;
iwqp->user_mode = 1;
if (req.user_wqe_bufs) {
+#if __FreeBSD_version >= 1400026
struct irdma_ucontext *ucontext = rdma_udata_to_drv_context(udata, struct irdma_ucontext, ibucontext);
-
+#else
+ struct irdma_ucontext *ucontext = to_ucontext(iwqp->iwpd->ibpd.uobject->context);
+#endif
info->qp_uk_init_info.legacy_mode = ucontext->legacy_mode;
spin_lock_irqsave(&ucontext->qp_reg_mem_list_lock, flags);
iwqp->iwpbl = irdma_get_pbl((unsigned long)req.user_wqe_bufs,
@@ -1089,8 +1242,11 @@
if (udata && udata->outlen && dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2) {
struct irdma_ucontext *ucontext;
- ucontext = rdma_udata_to_drv_context(udata,
- struct irdma_ucontext, ibucontext);
+#if __FreeBSD_version >= 1400026
+ ucontext = rdma_udata_to_drv_context(udata, struct irdma_ucontext, ibucontext);
+#else
+ ucontext = to_ucontext(ibqp->uobject->context);
+#endif
if (iwqp->sc_qp.push_idx != IRDMA_INVALID_PUSH_PAGE_INDEX &&
!iwqp->push_wqe_mmap_entry &&
!irdma_setup_push_mmap_entries(ucontext, iwqp,
@@ -1336,8 +1492,11 @@
dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2) {
struct irdma_ucontext *ucontext;
- ucontext = rdma_udata_to_drv_context(udata,
- struct irdma_ucontext, ibucontext);
+#if __FreeBSD_version >= 1400026
+ ucontext = rdma_udata_to_drv_context(udata, struct irdma_ucontext, ibucontext);
+#else
+ ucontext = to_ucontext(ibqp->uobject->context);
+#endif
if (iwqp->sc_qp.push_idx != IRDMA_INVALID_PUSH_PAGE_INDEX &&
!iwqp->push_wqe_mmap_entry &&
!irdma_setup_push_mmap_entries(ucontext, iwqp,
@@ -1476,8 +1635,11 @@
if (udata) {
struct irdma_resize_cq_req req = {};
struct irdma_ucontext *ucontext =
- rdma_udata_to_drv_context(udata, struct irdma_ucontext,
- ibucontext);
+#if __FreeBSD_version >= 1400026
+ rdma_udata_to_drv_context(udata, struct irdma_ucontext, ibucontext);
+#else
+ to_ucontext(ibcq->uobject->context);
+#endif
/* CQ resize not supported with legacy GEN_1 libi40iw */
if (ucontext->legacy_mode)
@@ -2129,8 +2291,11 @@
if (err)
goto error;
- ucontext = rdma_udata_to_drv_context(udata, struct irdma_ucontext,
- ibucontext);
+#if __FreeBSD_version >= 1400026
+ ucontext = rdma_udata_to_drv_context(udata, struct irdma_ucontext, ibucontext);
+#else
+ ucontext = to_ucontext(pd->uobject->context);
+#endif
spin_lock_irqsave(&ucontext->qp_reg_mem_list_lock, flags);
list_add_tail(&iwpbl->list, &ucontext->qp_reg_mem_list);
iwpbl->on_list = true;
@@ -2150,8 +2315,11 @@
if (err)
goto error;
- ucontext = rdma_udata_to_drv_context(udata, struct irdma_ucontext,
- ibucontext);
+#if __FreeBSD_version >= 1400026
+ ucontext = rdma_udata_to_drv_context(udata, struct irdma_ucontext, ibucontext);
+#else
+ ucontext = to_ucontext(pd->uobject->context);
+#endif
spin_lock_irqsave(&ucontext->cq_reg_mem_list_lock, flags);
list_add_tail(&iwpbl->list, &ucontext->cq_reg_mem_list);
iwpbl->on_list = true;
@@ -3363,6 +3531,7 @@
{
struct ib_device *dev_ops = ibdev;
+#if __FreeBSD_version >= 1400000
dev_ops->ops.driver_id = RDMA_DRIVER_I40IW;
dev_ops->ops.size_ib_ah = IRDMA_SET_RDMA_OBJ_SIZE(ib_ah, irdma_ah, ibah);
dev_ops->ops.size_ib_cq = IRDMA_SET_RDMA_OBJ_SIZE(ib_cq, irdma_cq, ibcq);
@@ -3371,6 +3540,7 @@
irdma_ucontext,
ibucontext);
+#endif /* __FreeBSD_version >= 1400000 */
dev_ops->alloc_hw_stats = irdma_alloc_hw_stats;
dev_ops->alloc_mr = irdma_alloc_mr;
dev_ops->alloc_mw = irdma_alloc_mw;
@@ -3391,7 +3561,9 @@
dev_ops->get_netdev = irdma_get_netdev;
dev_ops->map_mr_sg = irdma_map_mr_sg;
dev_ops->mmap = irdma_mmap;
+#if __FreeBSD_version >= 1400026
dev_ops->mmap_free = irdma_mmap_free;
+#endif
dev_ops->poll_cq = irdma_poll_cq;
dev_ops->post_recv = irdma_post_recv;
dev_ops->post_send = irdma_post_send;
diff --git a/sys/dev/irdma/osdep.h b/sys/dev/irdma/osdep.h
--- a/sys/dev/irdma/osdep.h
+++ b/sys/dev/irdma/osdep.h
@@ -101,6 +101,9 @@
#define __aligned_u64 uint64_t __aligned(8)
#define VLAN_PRIO_SHIFT 13
+#if __FreeBSD_version < 1400000
+#define IB_USER_VERBS_EX_CMD_MODIFY_QP IB_USER_VERBS_CMD_MODIFY_QP
+#endif
/*
* debug definition section

File Metadata

Mime Type
text/plain
Expires
Thu, Sep 26, 1:29 PM (22 h, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
12837068
Default Alt Text
D38170.diff (40 KB)

Event Timeline