]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: enetc: align v1 CBDR API with v4 for VF driver sharing
authorWei Fang <wei.fang@nxp.com>
Fri, 22 May 2026 09:24:34 +0000 (17:24 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 26 May 2026 11:20:13 +0000 (13:20 +0200)
The upcoming ENETC v4 VF will share the enetc-vf driver with the v1 VF.
However, ENETC v4 introduces different CBDR (command BD ring) setup and
teardown semantics that are incompatible with v1.

To support both versions in the same driver, the .setup_cbdr() and
.teardown_cbdr() hooks will be added to struct enetc_si_ops, allowing
the driver to register version-specific implementations. So refactor the
v1 CBDR functions to match the v4-style interface (taking struct enetc_si*
instead of individual parameters), enabling them to be registered via
si_ops in the subsequent patch.

Changes:
- Update enetc_setup_cbdr() and enetc_teardown_cbdr() prototypes to
  take 'struct enetc_si *' as the sole parameter
- Extract parameters (dev, hw) from the enetc_si structure within the
  function implementations
- ENETC_CBDR_DEFAULT_SIZE has always been used as the number of command
  BDs, and there is no need to adjust the size of the command BD ring.
  Therefore, ENETC_CBDR_DEFAULT_SIZE is moved into the enetc_setup_cbdr()
- Update all call sites in enetc_pf.c and enetc_vf.c

No functional changes. This prepares for adding v4-specific CBDR handling
in subsequent patches.

Signed-off-by: Wei Fang <wei.fang@nxp.com>
Link: https://patch.msgid.link/20260522092438.1264020-9-wei.fang@nxp.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/freescale/enetc/enetc.h
drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
drivers/net/ethernet/freescale/enetc/enetc_pf.c
drivers/net/ethernet/freescale/enetc/enetc_vf.c

index b70b625328eafef6179c0e536d54b9a14cd99eee..772f0ab2f8c196d6bcce9e1913eaeff8eaab12b9 100644 (file)
@@ -537,9 +537,8 @@ void enetc_mm_link_state_update(struct enetc_ndev_priv *priv, bool link);
 void enetc_mm_commit_preemptible_tcs(struct enetc_ndev_priv *priv);
 
 /* control buffer descriptor ring (CBDR) */
-int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw, int bd_count,
-                    struct enetc_cbdr *cbdr);
-void enetc_teardown_cbdr(struct enetc_cbdr *cbdr);
+int enetc_setup_cbdr(struct enetc_si *si);
+void enetc_teardown_cbdr(struct enetc_si *si);
 int enetc4_setup_cbdr(struct enetc_si *si);
 void enetc4_teardown_cbdr(struct enetc_si *si);
 int enetc_set_mac_flt_entry(struct enetc_si *si, int index,
index a635bfdc30afc295d5b4592c23b96ebe43a19dbc..e4a393a8a58e8f7c1d30d3c320c44e10f4e2f38d 100644 (file)
@@ -3,10 +3,12 @@
 
 #include "enetc.h"
 
-int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw, int bd_count,
-                    struct enetc_cbdr *cbdr)
+int enetc_setup_cbdr(struct enetc_si *si)
 {
-       int size = bd_count * sizeof(struct enetc_cbd);
+       int size = ENETC_CBDR_DEFAULT_SIZE * sizeof(struct enetc_cbd);
+       struct enetc_cbdr *cbdr = &si->cbd_ring;
+       struct device *dev = &si->pdev->dev;
+       struct enetc_hw *hw = &si->hw;
 
        cbdr->bd_base = dma_alloc_coherent(dev, size, &cbdr->bd_dma_base,
                                           GFP_KERNEL);
@@ -23,7 +25,7 @@ int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw, int bd_count,
        cbdr->next_to_clean = 0;
        cbdr->next_to_use = 0;
        cbdr->dma_dev = dev;
-       cbdr->bd_count = bd_count;
+       cbdr->bd_count = ENETC_CBDR_DEFAULT_SIZE;
 
        cbdr->pir = hw->reg + ENETC_SICBDRPIR;
        cbdr->cir = hw->reg + ENETC_SICBDRCIR;
@@ -46,13 +48,15 @@ int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw, int bd_count,
 }
 EXPORT_SYMBOL_GPL(enetc_setup_cbdr);
 
-void enetc_teardown_cbdr(struct enetc_cbdr *cbdr)
+void enetc_teardown_cbdr(struct enetc_si *si)
 {
-       int size = cbdr->bd_count * sizeof(struct enetc_cbd);
+       struct enetc_cbdr *cbdr = &si->cbd_ring;
+       int size;
 
        /* disable ring */
        enetc_wr_reg(cbdr->mr, 0);
 
+       size = cbdr->bd_count * sizeof(struct enetc_cbd);
        dma_free_coherent(cbdr->dma_dev, size, cbdr->bd_base,
                          cbdr->bd_dma_base);
        cbdr->bd_base = NULL;
index fbe2c126082e92d0ee849b80b30dd62ed14d10b7..7a5dcbfeb69363314da388e43affa5251f3ba41d 100644 (file)
@@ -802,8 +802,7 @@ static struct enetc_si *enetc_psi_create(struct pci_dev *pdev)
                goto out_pci_remove;
        }
 
-       err = enetc_setup_cbdr(&pdev->dev, &si->hw, ENETC_CBDR_DEFAULT_SIZE,
-                              &si->cbd_ring);
+       err = enetc_setup_cbdr(si);
        if (err)
                goto out_pci_remove;
 
@@ -822,7 +821,7 @@ static struct enetc_si *enetc_psi_create(struct pci_dev *pdev)
        return si;
 
 out_teardown_cbdr:
-       enetc_teardown_cbdr(&si->cbd_ring);
+       enetc_teardown_cbdr(si);
 out_pci_remove:
        enetc_pci_remove(pdev);
 out:
@@ -833,7 +832,7 @@ static void enetc_psi_destroy(struct pci_dev *pdev)
 {
        struct enetc_si *si = pci_get_drvdata(pdev);
 
-       enetc_teardown_cbdr(&si->cbd_ring);
+       enetc_teardown_cbdr(si);
        enetc_pci_remove(pdev);
 }
 
index 7d022b9c12d7e4c2d05957a996107c0502904e16..e8ad5ad5aba48cea6bc5f0467af2d324ddfc888e 100644 (file)
@@ -328,8 +328,7 @@ static int enetc_vf_probe(struct pci_dev *pdev,
 
        enetc_init_si_rings_params(priv);
 
-       err = enetc_setup_cbdr(priv->dev, &si->hw, ENETC_CBDR_DEFAULT_SIZE,
-                              &si->cbd_ring);
+       err = enetc_setup_cbdr(si);
        if (err)
                goto err_setup_cbdr;
 
@@ -365,7 +364,7 @@ err_config_si:
 err_alloc_msix:
        enetc_free_si_resources(priv);
 err_alloc_si_res:
-       enetc_teardown_cbdr(&si->cbd_ring);
+       enetc_teardown_cbdr(si);
 err_setup_cbdr:
        si->ndev = NULL;
        free_netdev(ndev);
@@ -390,7 +389,7 @@ static void enetc_vf_remove(struct pci_dev *pdev)
        enetc_free_msix(priv);
 
        enetc_free_si_resources(priv);
-       enetc_teardown_cbdr(&si->cbd_ring);
+       enetc_teardown_cbdr(si);
 
        free_netdev(si->ndev);