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>
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,
#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);
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;
}
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;
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;
return si;
out_teardown_cbdr:
- enetc_teardown_cbdr(&si->cbd_ring);
+ enetc_teardown_cbdr(si);
out_pci_remove:
enetc_pci_remove(pdev);
out:
{
struct enetc_si *si = pci_get_drvdata(pdev);
- enetc_teardown_cbdr(&si->cbd_ring);
+ enetc_teardown_cbdr(si);
enetc_pci_remove(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;
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);
enetc_free_msix(priv);
enetc_free_si_resources(priv);
- enetc_teardown_cbdr(&si->cbd_ring);
+ enetc_teardown_cbdr(si);
free_netdev(si->ndev);