[PATCH net-next v2 4/6] bnxt_en: Create an aux device for fwctl
From: Pavan Chebbi <pavan.chebbi@broadcom.com>
Date: 2025-09-23 09:50:05
Subsystem:
broadcom bnxt_en 50 gigabit ethernet driver, networking drivers, the rest · Maintainers:
Michael Chan, Pavan Chebbi, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Create an additional auxiliary device to support fwctl. The next patch will create bnxt_fwctl and bind to this device. Reviewed-by: Andy Gospodarek <redacted> Signed-off-by: Pavan Chebbi <pavan.chebbi@broadcom.com> --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 ++ drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 + drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 79 +++++++++++++++++-- include/linux/bnxt/ulp.h | 1 + 4 files changed, 82 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index feb11b9ea4dd..58a7c0af89a7 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c@@ -16189,11 +16189,13 @@ static void bnxt_remove_one(struct pci_dev *pdev) __bnxt_sriov_disable(bp); bnxt_aux_device_del(bp, BNXT_AUXDEV_RDMA); + bnxt_aux_device_del(bp, BNXT_AUXDEV_FWCTL); unregister_netdev(dev); bnxt_ptp_clear(bp); bnxt_aux_device_uninit(bp, BNXT_AUXDEV_RDMA); + bnxt_aux_device_uninit(bp, BNXT_AUXDEV_FWCTL); bnxt_free_l2_filters(bp, true); bnxt_free_ntp_fltrs(bp, true);
@@ -16780,6 +16782,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) bnxt_init_ring_params(bp); bnxt_set_ring_params(bp); bnxt_aux_device_init(bp, BNXT_AUXDEV_RDMA); + bnxt_aux_device_init(bp, BNXT_AUXDEV_FWCTL); rc = bnxt_set_dflt_rings(bp, true); if (rc) { if (BNXT_VF(bp) && rc == -ENODEV) {
@@ -16844,6 +16847,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) bnxt_dl_fw_reporters_create(bp); bnxt_aux_device_add(bp, BNXT_AUXDEV_RDMA); + bnxt_aux_device_add(bp, BNXT_AUXDEV_FWCTL); bnxt_print_device_info(bp);
@@ -16852,6 +16856,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) return 0; init_err_cleanup: bnxt_aux_device_uninit(bp, BNXT_AUXDEV_RDMA); + bnxt_aux_device_uninit(bp, BNXT_AUXDEV_FWCTL); bnxt_dl_unregister(bp); init_err_dl: bnxt_shutdown_tc(bp);
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index b2f139eddfec..1eeea0884e09 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h@@ -2340,6 +2340,8 @@ struct bnxt { struct bnxt_napi **bnapi; + struct bnxt_en_dev *edev_fwctl; + struct bnxt_aux_priv *aux_priv_fwctl; struct bnxt_rx_ring_info *rx_ring; struct bnxt_tx_ring_info *tx_ring; u16 *tx_ring_map;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
index ecad1947ccb5..c06a9503b551 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c@@ -28,6 +28,7 @@ #include "bnxt_hwrm.h" static DEFINE_IDA(bnxt_rdma_aux_dev_ids); +static DEFINE_IDA(bnxt_fwctl_aux_dev_ids); struct bnxt_aux_device { const char *name;
@@ -43,6 +44,7 @@ struct bnxt_aux_device { }; static void bnxt_rdma_aux_dev_release(struct device *dev); +static void bnxt_fwctl_aux_dev_release(struct device *dev); static void bnxt_rdma_aux_dev_set_priv(struct bnxt *bp, struct bnxt_aux_priv *priv)
@@ -81,6 +83,43 @@ static void bnxt_rdma_aux_dev_free_ida(struct bnxt_aux_priv *aux_priv) ida_free(&bnxt_rdma_aux_dev_ids, aux_priv->id); } +static void bnxt_fwctl_aux_dev_set_priv(struct bnxt *bp, + struct bnxt_aux_priv *priv) +{ + bp->aux_priv_fwctl = priv; +} + +static struct bnxt_aux_priv *bnxt_fwctl_aux_dev_get_priv(struct bnxt *bp) +{ + return bp->aux_priv_fwctl; +} + +static struct auxiliary_device *bnxt_fwctl_aux_dev_get_auxdev(struct bnxt *bp) +{ + return &bp->aux_priv_fwctl->aux_dev; +} + +static void bnxt_fwctl_aux_dev_set_edev(struct bnxt *bp, + struct bnxt_en_dev *edev) +{ + bp->edev_fwctl = edev; +} + +static struct bnxt_en_dev *bnxt_fwctl_aux_dev_get_edev(struct bnxt *bp) +{ + return bp->edev_fwctl; +} + +static u32 bnxt_fwctl_aux_dev_alloc_ida(void) +{ + return ida_alloc(&bnxt_fwctl_aux_dev_ids, GFP_KERNEL); +} + +static void bnxt_fwctl_aux_dev_free_ida(struct bnxt_aux_priv *aux_priv) +{ + ida_free(&bnxt_fwctl_aux_dev_ids, aux_priv->id); +} + static struct bnxt_aux_device bnxt_aux_devices[__BNXT_AUXDEV_MAX] = {{ .name = "rdma", .alloc_ida = bnxt_rdma_aux_dev_alloc_ida,
@@ -91,6 +130,16 @@ static struct bnxt_aux_device bnxt_aux_devices[__BNXT_AUXDEV_MAX] = {{ .set_edev = bnxt_rdma_aux_dev_set_edev, .get_edev = bnxt_rdma_aux_dev_get_edev, .get_auxdev = bnxt_rdma_aux_dev_get_auxdev, +}, { + .name = "fwctl", + .alloc_ida = bnxt_fwctl_aux_dev_alloc_ida, + .free_ida = bnxt_fwctl_aux_dev_free_ida, + .release = bnxt_fwctl_aux_dev_release, + .set_priv = bnxt_fwctl_aux_dev_set_priv, + .get_priv = bnxt_fwctl_aux_dev_get_priv, + .set_edev = bnxt_fwctl_aux_dev_set_edev, + .get_edev = bnxt_fwctl_aux_dev_get_edev, + .get_auxdev = bnxt_fwctl_aux_dev_get_auxdev, }}; static void bnxt_fill_msix_vecs(struct bnxt *bp, struct bnxt_msix_entry *ent)
@@ -314,6 +363,8 @@ void bnxt_ulp_stop(struct bnxt *bp) } } ulp_stop_exit: + if (bp->edev_fwctl) + bp->edev_fwctl->flags |= BNXT_EN_FLAG_ULP_STOPPED; mutex_unlock(&edev->en_dev_lock); }
@@ -347,6 +398,8 @@ void bnxt_ulp_start(struct bnxt *bp, int err) } ulp_start_exit: edev->flags &= ~BNXT_EN_FLAG_ULP_STOPPED; + if (bp->edev_fwctl) + bp->edev_fwctl->flags &= ~BNXT_EN_FLAG_ULP_STOPPED; mutex_unlock(&edev->en_dev_lock); }
@@ -536,12 +589,27 @@ void bnxt_aux_device_add(struct bnxt *bp, enum bnxt_ulp_auxdev_type auxdev_type) aux_dev = bnxt_aux_devices[auxdev_type].get_auxdev(bp); rc = auxiliary_device_add(aux_dev); if (rc) { - netdev_warn(bp->dev, "Failed to add auxiliary device for ROCE\n"); + netdev_warn(bp->dev, "Failed to add auxiliary device for auxdev type %d\n", + auxdev_type); auxiliary_device_uninit(aux_dev); - bp->flags &= ~BNXT_FLAG_ROCE_CAP; + if (auxdev_type == BNXT_AUXDEV_RDMA) + bp->flags &= ~BNXT_FLAG_ROCE_CAP; } } +static void bnxt_fwctl_aux_dev_release(struct device *dev) +{ + struct bnxt_aux_priv *aux_priv = + container_of(dev, struct bnxt_aux_priv, aux_dev.dev); + struct bnxt *bp = netdev_priv(aux_priv->edev->net); + + ida_free(&bnxt_fwctl_aux_dev_ids, aux_priv->id); + kfree(aux_priv->edev); + bp->edev_fwctl = NULL; + kfree(bp->aux_priv_fwctl); + bp->aux_priv_fwctl = NULL; +} + void bnxt_aux_device_init(struct bnxt *bp, enum bnxt_ulp_auxdev_type auxdev_type) {
@@ -566,8 +634,8 @@ void bnxt_aux_device_init(struct bnxt *bp, aux_priv->id = bnxt_aux_devices[auxdev_type].alloc_ida(); if (aux_priv->id < 0) { - netdev_warn(bp->dev, - "ida alloc failed for ROCE auxiliary device\n"); + netdev_warn(bp->dev, "ida alloc failed for %d auxiliary device\n", + auxdev_type); kfree(aux_priv); goto exit; }
@@ -611,5 +679,6 @@ void bnxt_aux_device_init(struct bnxt *bp, aux_dev_uninit: auxiliary_device_uninit(aux_dev); exit: - bp->flags &= ~BNXT_FLAG_ROCE_CAP; + if (auxdev_type == BNXT_AUXDEV_RDMA) + bp->flags &= ~BNXT_FLAG_ROCE_CAP; }
diff --git a/include/linux/bnxt/ulp.h b/include/linux/bnxt/ulp.h
index baac0dd44078..5a580bc37a06 100644
--- a/include/linux/bnxt/ulp.h
+++ b/include/linux/bnxt/ulp.h@@ -22,6 +22,7 @@ struct bnxt; enum bnxt_ulp_auxdev_type { BNXT_AUXDEV_RDMA = 0, + BNXT_AUXDEV_FWCTL, __BNXT_AUXDEV_MAX, };
--
2.39.1