This patch registers with ib-core Signed-off-by: Siva Reddy Kallam --- drivers/infiniband/hw/bng_re/bng_dev.c | 79 ++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/drivers/infiniband/hw/bng_re/bng_dev.c b/drivers/infiniband/hw/bng_re/bng_dev.c index 6e9df737c751..2633bb289f09 100644 --- a/drivers/infiniband/hw/bng_re/bng_dev.c +++ b/drivers/infiniband/hw/bng_re/bng_dev.c @@ -5,6 +5,8 @@ #include #include +#include + #include #include @@ -553,6 +555,73 @@ static int bng_re_dev_init(struct bng_re_dev *rdev) return rc; } +static void bng_re_dispatch_event(struct ib_device *ibdev, struct ib_qp *qp, + u8 port_num, enum ib_event_type event) +{ + struct ib_event ib_event; + + ib_event.device = ibdev; + if (qp) { + ib_event.element.qp = qp; + ib_event.event = event; + if (qp->event_handler) + qp->event_handler(&ib_event, qp->qp_context); + + } else { + ib_event.element.port_num = port_num; + ib_event.event = event; + ib_dispatch_event(&ib_event); + } +} + +static int bng_re_register_ib(struct bng_re_dev *rdev) +{ + struct ib_device *ibdev = &rdev->ibdev; + int ret; + + /* ib device init */ + ibdev->node_type = RDMA_NODE_IB_CA; + strscpy(ibdev->node_desc, BNG_RE_DESC " HCA"); + ibdev->phys_port_cnt = 1; + + addrconf_addr_eui48((u8 *)&ibdev->node_guid, rdev->netdev->dev_addr); + + ibdev->num_comp_vectors = rdev->nqr->num_msix - BNG_RE_MAX_RSVD_IRQ; + ibdev->dev.parent = &rdev->aux_dev->pdev->dev; + ibdev->local_dma_lkey = BNG_RE_RSVD_LKEY; + + ib_set_device_ops(ibdev, &bng_re_dev_ops); + ret = ib_device_set_netdev(&rdev->ibdev, rdev->netdev, 1); + if (ret) + return ret; + + dma_set_max_seg_size(&rdev->aux_dev->pdev->dev, UINT_MAX); + ibdev->uverbs_cmd_mask |= BIT_ULL(IB_USER_VERBS_CMD_POLL_CQ); + return ib_register_device(ibdev, "bng_re%d", &rdev->aux_dev->pdev->dev); +} + +static int bng_re_ib_init(struct bng_re_dev *rdev) +{ + int rc; + u32 event; + + /* Register ib dev */ + rc = bng_re_register_ib(rdev); + if (rc) { + pr_err("Failed to register with IB: %#x\n", rc); + return rc; + } + dev_info(rdev_to_dev(rdev), "Device registered with IB successfully"); + set_bit(BNG_RE_FLAG_ISSUE_ROCE_STATS, &rdev->flags); + + event = netif_running(rdev->netdev) && netif_carrier_ok(rdev->netdev) ? + IB_EVENT_PORT_ACTIVE : IB_EVENT_PORT_ERR; + + bng_re_dispatch_event(&rdev->ibdev, NULL, 1, event); + + return rc; +} + static int bng_re_add_device(struct auxiliary_device *adev) { struct bnge_auxr_priv *auxr_priv = @@ -575,8 +644,17 @@ static int bng_re_add_device(struct auxiliary_device *adev) if (rc) goto re_dev_dealloc; + rc = bng_re_ib_init(rdev); + if (rc) { + pr_err("Failed to register with IB: %s", + auxr_priv->aux_dev.name); + goto re_dev_uninit; + } + return 0; +re_dev_uninit: + bng_re_dev_uninit(rdev); re_dev_dealloc: ib_dealloc_device(&rdev->ibdev); exit: @@ -586,6 +664,7 @@ static int bng_re_add_device(struct auxiliary_device *adev) static void bng_re_remove_device(struct bng_re_dev *rdev, struct auxiliary_device *aux_dev) { + ib_unregister_device(&rdev->ibdev); bng_re_dev_uninit(rdev); ib_dealloc_device(&rdev->ibdev); } -- 2.43.5