diff options
| author | Jakub Kicinski <kuba@kernel.org> | 2026-10-06 18:35:28 -0700 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2026-10-06 18:35:28 -0700 |
| commit | 81d705e38978656f7f2d643faef4faf3d90af770 (patch) | |
| tree | d4f9bc24c1f827d2830d41979c24ddef41fae452 | |
| parent | 9fee8dce4398679dbc9492f0a78a1ed9f4dce557 (diff) | |
| parent | 21162b65d468eef20f5c5eca54188d44fbe53d8c (diff) | |
Merge branch 'bnge-fix-error-path-and-irq-setup-bugs-in-probe-open'
Bhargava Marreddy says:
====================
bnge: Fix error-path and IRQ setup bugs in probe/open
Four independent fixes for existing bugs in the bnge driver's probe/open
path.
====================
Link: https://patch.msgid.link/20261005121704.227866-1-bhargava.marreddy@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
| -rw-r--r-- | drivers/net/ethernet/broadcom/bnge/bnge_netdev.c | 51 | ||||
| -rw-r--r-- | drivers/net/ethernet/broadcom/bnge/bnge_resc.c | 2 |
2 files changed, 37 insertions, 16 deletions
diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c index a4288f0258f8..7dbe853a5a47 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -1243,7 +1243,7 @@ static int bnge_alloc_core(struct bnge_net *bn) bn->rx_ring = kzalloc_objs(struct bnge_rx_ring_info, bd->rx_nr_rings); if (!bn->rx_ring) - goto err_free_core; + goto err_free_bnapi; for (i = 0; i < bd->rx_nr_rings; i++) { struct bnge_rx_ring_info *rxr = &bn->rx_ring[i]; @@ -1258,12 +1258,12 @@ static int bnge_alloc_core(struct bnge_net *bn) bn->tx_ring = kzalloc_objs(struct bnge_tx_ring_info, bd->tx_nr_rings); if (!bn->tx_ring) - goto err_free_core; + goto err_free_rx_ring; bn->tx_ring_map = kcalloc(bd->tx_nr_rings, sizeof(u16), GFP_KERNEL); if (!bn->tx_ring_map) - goto err_free_core; + goto err_free_tx_ring; if (bd->flags & BNGE_EN_SHARED_CHNL) j = 0; @@ -1289,42 +1289,64 @@ static int bnge_alloc_core(struct bnge_net *bn) rc = bnge_alloc_ring_stats(bn); if (rc) - goto err_free_core; + goto err_free_tx_ring_map; bnge_init_stats(bn); rc = bnge_alloc_vnics(bn); if (rc) - goto err_free_core; + goto err_free_ring_stats; rc = bnge_alloc_nq_arrays(bn); if (rc) - goto err_free_core; + goto err_free_vnics; bnge_init_ring_struct(bn); rc = bnge_alloc_rx_rings(bn); if (rc) - goto err_free_core; + goto err_free_nq_arrays; rc = bnge_alloc_tx_rings(bn); if (rc) - goto err_free_core; + goto err_free_rx_rings; rc = bnge_alloc_nq_tree(bn); if (rc) - goto err_free_core; + goto err_free_tx_rings; bn->vnic_info[BNGE_VNIC_DEFAULT].flags |= BNGE_VNIC_RSS_FLAG | BNGE_VNIC_MCAST_FLAG | BNGE_VNIC_UCAST_FLAG; rc = bnge_alloc_vnic_attributes(bn); if (rc) - goto err_free_core; + goto err_free_nq_tree; return 0; -err_free_core: - bnge_free_core(bn); +err_free_nq_tree: + bnge_free_nq_tree(bn); +err_free_tx_rings: + bnge_free_tx_rings(bn); +err_free_rx_rings: + bnge_free_rx_rings(bn); +err_free_nq_arrays: + bnge_free_nq_arrays(bn); +err_free_vnics: + bnge_free_vnics(bn); +err_free_ring_stats: + bnge_free_ring_stats(bn); +err_free_tx_ring_map: + kfree(bn->tx_ring_map); + bn->tx_ring_map = NULL; +err_free_tx_ring: + kfree(bn->tx_ring); + bn->tx_ring = NULL; +err_free_rx_ring: + kfree(bn->rx_ring); + bn->rx_ring = NULL; +err_free_bnapi: + kfree(bn->bnapi); + bn->bnapi = NULL; return rc; } @@ -2644,12 +2666,10 @@ static int bnge_request_irq(struct bnge_net *bn) irq->have_cpumask = 1; cpumask_set_cpu(cpumask_local_spread(i, numa_node), irq->cpu_mask); - rc = irq_set_affinity_hint(irq->vector, irq->cpu_mask); - if (rc) { + if (irq_set_affinity_hint(irq->vector, irq->cpu_mask)) { netdev_warn(bn->netdev, "Set affinity failed, IRQ = %d\n", irq->vector); - goto err_free_irq; } } } @@ -3531,6 +3551,7 @@ err_free_workq: destroy_workqueue(bn->bnge_pf_wq); err_netdev: free_netdev(netdev); + bd->netdev = NULL; return rc; } diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c b/drivers/net/ethernet/broadcom/bnge/bnge_resc.c index 4711dd4945ff..7c26943c5cb3 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_resc.c @@ -382,7 +382,7 @@ int bnge_alloc_irqs(struct bnge_dev *bd) irqs_demand = pci_alloc_irq_vectors(bd->pdev, min, irqs_demand, PCI_IRQ_MSIX); aux_msix = bnge_aux_get_msix(bd); - if (irqs_demand < 0 || irqs_demand < aux_msix) { + if (irqs_demand < 0 || irqs_demand < aux_msix + min) { rc = -ENODEV; goto err_free_irqs; } |
