Initialize ib_device_ops with the supported operations. Signed-off-by: Kamal Heib <kamalheib1@xxxxxxxxx> --- drivers/infiniband/hw/mthca/mthca_provider.c | 97 ++++++++++++++++++++++++++-- 1 file changed, 93 insertions(+), 4 deletions(-) diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c index 7bd7e2ad17e4..540d55dd75bc 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c @@ -1189,6 +1189,81 @@ static void get_dev_fw_str(struct ib_device *device, char *str) (int) dev->fw_ver & 0xffff); } +static struct ib_device_ops mthca_dev_ops = { + .query_device = mthca_query_device, + .query_port = mthca_query_port, + .modify_device = mthca_modify_device, + .modify_port = mthca_modify_port, + .query_pkey = mthca_query_pkey, + .query_gid = mthca_query_gid, + .alloc_ucontext = mthca_alloc_ucontext, + .dealloc_ucontext = mthca_dealloc_ucontext, + .mmap = mthca_mmap_uar, + .alloc_pd = mthca_alloc_pd, + .dealloc_pd = mthca_dealloc_pd, + .create_ah = mthca_ah_create, + .query_ah = mthca_ah_query, + .destroy_ah = mthca_ah_destroy, + .create_qp = mthca_create_qp, + .modify_qp = mthca_modify_qp, + .query_qp = mthca_query_qp, + .destroy_qp = mthca_destroy_qp, + .create_cq = mthca_create_cq, + .resize_cq = mthca_resize_cq, + .destroy_cq = mthca_destroy_cq, + .poll_cq = mthca_poll_cq, + .get_dma_mr = mthca_get_dma_mr, + .reg_user_mr = mthca_reg_user_mr, + .dereg_mr = mthca_dereg_mr, + .get_port_immutable = mthca_port_immutable, + .get_dev_fw_str = get_dev_fw_str, + .attach_mcast = mthca_multicast_attach, + .detach_mcast = mthca_multicast_detach, + .process_mad = mthca_process_mad, +}; + +static struct ib_device_ops mthca_dev_arbel_srq_ops = { + .create_srq = mthca_create_srq, + .modify_srq = mthca_modify_srq, + .query_srq = mthca_query_srq, + .destroy_srq = mthca_destroy_srq, + .post_srq_recv = mthca_arbel_post_srq_recv, +}; + +static struct ib_device_ops mthca_dev_tavor_srq_ops = { + .create_srq = mthca_create_srq, + .modify_srq = mthca_modify_srq, + .query_srq = mthca_query_srq, + .destroy_srq = mthca_destroy_srq, + .post_srq_recv = mthca_tavor_post_srq_recv, +}; + +static struct ib_device_ops mthca_dev_arbel_fmr_ops = { + .alloc_fmr = mthca_alloc_fmr, + .unmap_fmr = mthca_unmap_fmr, + .dealloc_fmr = mthca_dealloc_fmr, + .map_phys_fmr = mthca_arbel_map_phys_fmr, +}; + +static struct ib_device_ops mthca_dev_tavor_fmr_ops = { + .alloc_fmr = mthca_alloc_fmr, + .unmap_fmr = mthca_unmap_fmr, + .dealloc_fmr = mthca_dealloc_fmr, + .map_phys_fmr = mthca_tavor_map_phys_fmr, +}; + +static struct ib_device_ops mthca_dev_arbel_ops = { + .req_notify_cq = mthca_arbel_arm_cq, + .post_send = mthca_arbel_post_send, + .post_recv = mthca_arbel_post_receive, +}; + +static struct ib_device_ops mthca_dev_tavor_ops = { + .req_notify_cq = mthca_tavor_arm_cq, + .post_send = mthca_tavor_post_send, + .post_recv = mthca_tavor_post_receive, +}; + int mthca_register_device(struct mthca_dev *dev) { int ret; @@ -1249,10 +1324,15 @@ int mthca_register_device(struct mthca_dev *dev) (1ull << IB_USER_VERBS_CMD_QUERY_SRQ) | (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ); - if (mthca_is_memfree(dev)) + if (mthca_is_memfree(dev)) { dev->ib_dev.post_srq_recv = mthca_arbel_post_srq_recv; - else + ib_set_device_ops(&dev->ib_dev, + &mthca_dev_arbel_srq_ops); + } else { dev->ib_dev.post_srq_recv = mthca_tavor_post_srq_recv; + ib_set_device_ops(&dev->ib_dev, + &mthca_dev_tavor_srq_ops); + } } dev->ib_dev.create_qp = mthca_create_qp; @@ -1273,24 +1353,33 @@ int mthca_register_device(struct mthca_dev *dev) dev->ib_dev.alloc_fmr = mthca_alloc_fmr; dev->ib_dev.unmap_fmr = mthca_unmap_fmr; dev->ib_dev.dealloc_fmr = mthca_dealloc_fmr; - if (mthca_is_memfree(dev)) + if (mthca_is_memfree(dev)) { dev->ib_dev.map_phys_fmr = mthca_arbel_map_phys_fmr; - else + ib_set_device_ops(&dev->ib_dev, + &mthca_dev_arbel_fmr_ops); + } else { dev->ib_dev.map_phys_fmr = mthca_tavor_map_phys_fmr; + ib_set_device_ops(&dev->ib_dev, + &mthca_dev_tavor_fmr_ops); + } } dev->ib_dev.attach_mcast = mthca_multicast_attach; dev->ib_dev.detach_mcast = mthca_multicast_detach; dev->ib_dev.process_mad = mthca_process_mad; + ib_set_device_ops(&dev->ib_dev, &mthca_dev_ops); + if (mthca_is_memfree(dev)) { dev->ib_dev.req_notify_cq = mthca_arbel_arm_cq; dev->ib_dev.post_send = mthca_arbel_post_send; dev->ib_dev.post_recv = mthca_arbel_post_receive; + ib_set_device_ops(&dev->ib_dev, &mthca_dev_arbel_ops); } else { dev->ib_dev.req_notify_cq = mthca_tavor_arm_cq; dev->ib_dev.post_send = mthca_tavor_post_send; dev->ib_dev.post_recv = mthca_tavor_post_receive; + ib_set_device_ops(&dev->ib_dev, &mthca_dev_tavor_ops); } mutex_init(&dev->cap_mask_mutex); -- 2.14.4