summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThéo Lebrun <theo.lebrun@bootlin.com>2026-10-13 15:16:45 +0200
committerPaolo Abeni <pabeni@redhat.com>2026-10-20 09:30:24 +0200
commit88e99640fcd05a0ff5f9694e5c4b2f00c2edeb55 (patch)
tree10af6eaf04184a399b8b0dd62ba0bd9083a854fd
parented16494c2c50efc4666bd3618f6644062e44a1fd (diff)
downloadlinux-88e99640fcd05a0ff5f9694e5c4b2f00c2edeb55.tar.gz
linux-88e99640fcd05a0ff5f9694e5c4b2f00c2edeb55.zip
net: macb: introduce macb_context_alloc() helper
Move the context allocation sequence from inline macb_open() to its own helper function called macb_context_alloc(). All ops doing context swapping (set_ringparam, change_mtu, etc) will use this helper. Reviewed-by: Nicolai Buchwitz <nb@tipi-net.de> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Link: https://patch.msgid.link/20261013-macb-context-v11-7-b27785167566@bootlin.com Tested-by: Nicolai Buchwitz <nb@tipi-net.de> # RPi CM5 with RP1 GEM Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-rw-r--r--drivers/net/ethernet/cadence/macb_main.c68
1 files changed, 46 insertions, 22 deletions
diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
index 05169bbe2efc..32a24c91c045 100644
--- a/drivers/net/ethernet/cadence/macb_main.c
+++ b/drivers/net/ethernet/cadence/macb_main.c
@@ -3006,6 +3006,43 @@ out_err:
return -ENOMEM;
}
+static struct macb_context *macb_context_alloc(struct macb *bp,
+ unsigned int mtu,
+ unsigned int rx_ring_size,
+ unsigned int tx_ring_size)
+{
+ struct macb_context *ctx;
+ int err;
+
+ ctx = kzalloc_obj(*ctx);
+ if (!ctx)
+ return ERR_PTR(-ENOMEM);
+
+ ctx->info = &bp->info;
+ ctx->rx_buffer_size = macb_rx_buffer_size(bp, mtu);
+ ctx->rx_ring_size = rx_ring_size;
+ ctx->tx_ring_size = tx_ring_size;
+
+ err = macb_alloc(ctx);
+ if (err) {
+ netdev_err(bp->netdev,
+ "Unable to allocate DMA memory (error %d)\n", err);
+ goto free_ctx;
+ }
+
+ err = bp->macbgem_ops.mog_init_rings(ctx);
+ if (err)
+ goto free_rings;
+
+ return ctx;
+
+free_rings:
+ macb_free(ctx);
+free_ctx:
+ kfree(ctx);
+ return ERR_PTR(err);
+}
+
static int gem_init_rx_ring(struct macb_context *ctx, unsigned int q)
{
struct macb_rxq *rxq = &ctx->rxq[q];
@@ -3376,6 +3413,7 @@ static void macb_set_rx_mode(struct net_device *netdev)
static int macb_open(struct net_device *netdev)
{
struct macb *bp = netdev_priv(netdev);
+ struct macb_context *ctx;
int err;
netdev_dbg(bp->netdev, "open\n");
@@ -3384,30 +3422,18 @@ static int macb_open(struct net_device *netdev)
if (err < 0)
return err;
- WRITE_ONCE(bp->ctx, kzalloc_obj(*bp->ctx));
- wmb(); /* ensure IRQ enabled at quiesce end read the new context */
- if (!bp->ctx) {
- err = -ENOMEM;
+ ctx = macb_context_alloc(bp, netdev->mtu,
+ bp->configured_rx_ring_size,
+ bp->configured_tx_ring_size);
+ if (IS_ERR(ctx)) {
+ err = PTR_ERR(ctx);
+ bp->ctx = NULL;
goto pm_exit;
}
- bp->ctx->info = &bp->info;
-
- /* RX buffers initialization */
- bp->ctx->rx_buffer_size = macb_rx_buffer_size(bp, netdev->mtu);
- bp->ctx->rx_ring_size = bp->configured_rx_ring_size;
- bp->ctx->tx_ring_size = bp->configured_tx_ring_size;
-
- err = macb_alloc(bp->ctx);
- if (err) {
- netdev_err(netdev, "Unable to allocate DMA memory (error %d)\n",
- err);
- goto free_ctx;
- }
+ WRITE_ONCE(bp->ctx, ctx);
+ wmb(); /* ensure IRQ enabled at quiesce end read the new context */
- err = bp->macbgem_ops.mog_init_rings(bp->ctx);
- if (err)
- goto free_rings;
macb_init_buffers(bp);
macb_quiesce_end(bp);
@@ -3441,9 +3467,7 @@ reset_hw:
macb_quiesce_start(bp);
macb_reset_hw(bp);
-free_rings:
macb_free(bp->ctx);
-free_ctx:
kfree(bp->ctx);
bp->ctx = NULL;
pm_exit: