[PATCH 15/15] RDMA/bng_re: Register with ib-core
From: Siva Reddy Kallam <siva.kallam@broadcom.com>
Date: 2026-09-04 10:53:03
Also in:
linux-rdma, lkml
Subsystem:
broadcom 800 gigabit roce driver, infiniband subsystem, the rest · Maintainers:
Siva Reddy Kallam, Jason Gunthorpe, Leon Romanovsky, Linus Torvalds
This patch registers with ib-core Signed-off-by: Siva Reddy Kallam <siva.kallam@broadcom.com> --- 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 <linux/pci.h> #include <linux/auxiliary_bus.h> +#include <net/addrconf.h> + #include <rdma/ib_verbs.h> #include <rdma/bng_re-abi.h>
@@ -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