* [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC
@ 2021-03-10 12:03 Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 01/12] net: enetc: move the CBDR API to enetc_cbdr.c Vladimir Oltean
` (13 more replies)
0 siblings, 14 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
This series performs the following:
- makes the API for Control Buffer Descriptor Rings in enetc_cbdr.c a
bit more tightly knit.
- moves more logic into enetc_rxbd_next to make the callers simpler
- moves more logic into enetc_refill_rx_ring to make the callers simpler
- removes forward declarations
- simplifies the probe path to unify probing for used and unused PFs.
Nothing radical.
Vladimir Oltean (12):
net: enetc: move the CBDR API to enetc_cbdr.c
net: enetc: save the DMA device for enetc_free_cbdr
net: enetc: squash enetc_alloc_cbdr and enetc_setup_cbdr
net: enetc: save the mode register address inside struct enetc_cbdr
net: enetc: squash clear_cbdr and free_cbdr into teardown_cbdr
net: enetc: pass bd_count as an argument to enetc_setup_cbdr
net: enetc: don't initialize unused ports from a separate code path
net: enetc: simplify callers of enetc_rxbd_next
net: enetc: use enum enetc_active_offloads
net: enetc: remove forward-declarations of enetc_clean_{rx,tx}_ring
net: enetc: remove forward declaration for enetc_map_tx_buffs
net: enetc: make enetc_refill_rx_ring update the consumer index
drivers/net/ethernet/freescale/enetc/enetc.c | 284 ++++++------------
drivers/net/ethernet/freescale/enetc/enetc.h | 34 ++-
.../net/ethernet/freescale/enetc/enetc_cbdr.c | 82 ++++-
.../net/ethernet/freescale/enetc/enetc_pf.c | 56 ++--
.../net/ethernet/freescale/enetc/enetc_vf.c | 7 +
5 files changed, 212 insertions(+), 251 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH net-next 01/12] net: enetc: move the CBDR API to enetc_cbdr.c
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 02/12] net: enetc: save the DMA device for enetc_free_cbdr Vladimir Oltean
` (12 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
Since there is a dedicated file in this driver for interacting with
control BD rings, it makes sense to move these functions there.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 54 -------------------
.../net/ethernet/freescale/enetc/enetc_cbdr.c | 54 +++++++++++++++++++
2 files changed, 54 insertions(+), 54 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index 09471329f3a3..a6ae4ebaee7d 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -995,60 +995,6 @@ static void enetc_free_rxtx_rings(struct enetc_ndev_priv *priv)
enetc_free_tx_ring(priv->tx_ring[i]);
}
-int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr)
-{
- int size = cbdr->bd_count * sizeof(struct enetc_cbd);
-
- cbdr->bd_base = dma_alloc_coherent(dev, size, &cbdr->bd_dma_base,
- GFP_KERNEL);
- if (!cbdr->bd_base)
- return -ENOMEM;
-
- /* h/w requires 128B alignment */
- if (!IS_ALIGNED(cbdr->bd_dma_base, 128)) {
- dma_free_coherent(dev, size, cbdr->bd_base, cbdr->bd_dma_base);
- return -EINVAL;
- }
-
- cbdr->next_to_clean = 0;
- cbdr->next_to_use = 0;
-
- return 0;
-}
-
-void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr)
-{
- int size = cbdr->bd_count * sizeof(struct enetc_cbd);
-
- dma_free_coherent(dev, size, cbdr->bd_base, cbdr->bd_dma_base);
- cbdr->bd_base = NULL;
-}
-
-void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr)
-{
- /* set CBDR cache attributes */
- enetc_wr(hw, ENETC_SICAR2,
- ENETC_SICAR_RD_COHERENT | ENETC_SICAR_WR_COHERENT);
-
- enetc_wr(hw, ENETC_SICBDRBAR0, lower_32_bits(cbdr->bd_dma_base));
- enetc_wr(hw, ENETC_SICBDRBAR1, upper_32_bits(cbdr->bd_dma_base));
- enetc_wr(hw, ENETC_SICBDRLENR, ENETC_RTBLENR_LEN(cbdr->bd_count));
-
- enetc_wr(hw, ENETC_SICBDRPIR, 0);
- enetc_wr(hw, ENETC_SICBDRCIR, 0);
-
- /* enable ring */
- enetc_wr(hw, ENETC_SICBDRMR, BIT(31));
-
- cbdr->pir = hw->reg + ENETC_SICBDRPIR;
- cbdr->cir = hw->reg + ENETC_SICBDRCIR;
-}
-
-void enetc_clear_cbdr(struct enetc_hw *hw)
-{
- enetc_wr(hw, ENETC_SICBDRMR, 0);
-}
-
static int enetc_setup_default_rss_table(struct enetc_si *si, int num_groups)
{
int *rss_table;
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
index 201cbc362e33..ad6aecda6b47 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
@@ -3,6 +3,60 @@
#include "enetc.h"
+int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr)
+{
+ int size = cbdr->bd_count * sizeof(struct enetc_cbd);
+
+ cbdr->bd_base = dma_alloc_coherent(dev, size, &cbdr->bd_dma_base,
+ GFP_KERNEL);
+ if (!cbdr->bd_base)
+ return -ENOMEM;
+
+ /* h/w requires 128B alignment */
+ if (!IS_ALIGNED(cbdr->bd_dma_base, 128)) {
+ dma_free_coherent(dev, size, cbdr->bd_base, cbdr->bd_dma_base);
+ return -EINVAL;
+ }
+
+ cbdr->next_to_clean = 0;
+ cbdr->next_to_use = 0;
+
+ return 0;
+}
+
+void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr)
+{
+ int size = cbdr->bd_count * sizeof(struct enetc_cbd);
+
+ dma_free_coherent(dev, size, cbdr->bd_base, cbdr->bd_dma_base);
+ cbdr->bd_base = NULL;
+}
+
+void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr)
+{
+ /* set CBDR cache attributes */
+ enetc_wr(hw, ENETC_SICAR2,
+ ENETC_SICAR_RD_COHERENT | ENETC_SICAR_WR_COHERENT);
+
+ enetc_wr(hw, ENETC_SICBDRBAR0, lower_32_bits(cbdr->bd_dma_base));
+ enetc_wr(hw, ENETC_SICBDRBAR1, upper_32_bits(cbdr->bd_dma_base));
+ enetc_wr(hw, ENETC_SICBDRLENR, ENETC_RTBLENR_LEN(cbdr->bd_count));
+
+ enetc_wr(hw, ENETC_SICBDRPIR, 0);
+ enetc_wr(hw, ENETC_SICBDRCIR, 0);
+
+ /* enable ring */
+ enetc_wr(hw, ENETC_SICBDRMR, BIT(31));
+
+ cbdr->pir = hw->reg + ENETC_SICBDRPIR;
+ cbdr->cir = hw->reg + ENETC_SICBDRCIR;
+}
+
+void enetc_clear_cbdr(struct enetc_hw *hw)
+{
+ enetc_wr(hw, ENETC_SICBDRMR, 0);
+}
+
static void enetc_clean_cbdr(struct enetc_si *si)
{
struct enetc_cbdr *ring = &si->cbd_ring;
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 02/12] net: enetc: save the DMA device for enetc_free_cbdr
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 01/12] net: enetc: move the CBDR API to enetc_cbdr.c Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 03/12] net: enetc: squash enetc_alloc_cbdr and enetc_setup_cbdr Vladimir Oltean
` (11 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
We shouldn't need to pass the struct device *dev to enetc CBDR APIs over
and over again, so save this inside struct enetc_cbdr::dma_dev and avoid
calling it from the enetc_free_cbdr functions.
This breaks the dependency of the cbdr API from struct enetc_si (the
station interface).
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 4 +-
drivers/net/ethernet/freescale/enetc/enetc.h | 3 +-
.../net/ethernet/freescale/enetc/enetc_cbdr.c | 37 +++++++++++--------
.../net/ethernet/freescale/enetc/enetc_pf.c | 2 +-
4 files changed, 26 insertions(+), 20 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index a6ae4ebaee7d..ceecee42f0f1 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -1081,7 +1081,7 @@ int enetc_alloc_si_resources(struct enetc_ndev_priv *priv)
err_alloc_cls:
enetc_clear_cbdr(&si->hw);
- enetc_free_cbdr(priv->dev, &si->cbd_ring);
+ enetc_free_cbdr(&si->cbd_ring);
return err;
}
@@ -1091,7 +1091,7 @@ void enetc_free_si_resources(struct enetc_ndev_priv *priv)
struct enetc_si *si = priv->si;
enetc_clear_cbdr(&si->hw);
- enetc_free_cbdr(priv->dev, &si->cbd_ring);
+ enetc_free_cbdr(&si->cbd_ring);
kfree(priv->cls_rules);
}
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h
index 8b380fc13314..b343d1002bb7 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc.h
@@ -104,6 +104,7 @@ struct enetc_cbdr {
int next_to_clean;
dma_addr_t bd_dma_base;
+ struct device *dma_dev;
};
#define ENETC_TXBD(BDR, i) (&(((union enetc_tx_bd *)((BDR).bd_base))[i]))
@@ -311,7 +312,7 @@ void enetc_set_ethtool_ops(struct net_device *ndev);
/* control buffer descriptor ring (CBDR) */
int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr);
-void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr);
+void enetc_free_cbdr(struct enetc_cbdr *cbdr);
void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr);
void enetc_clear_cbdr(struct enetc_hw *hw);
int enetc_set_mac_flt_entry(struct enetc_si *si, int index,
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
index ad6aecda6b47..7e84eb665ecd 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
@@ -14,22 +14,26 @@ int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr)
/* h/w requires 128B alignment */
if (!IS_ALIGNED(cbdr->bd_dma_base, 128)) {
- dma_free_coherent(dev, size, cbdr->bd_base, cbdr->bd_dma_base);
+ dma_free_coherent(dev, size, cbdr->bd_base,
+ cbdr->bd_dma_base);
return -EINVAL;
}
cbdr->next_to_clean = 0;
cbdr->next_to_use = 0;
+ cbdr->dma_dev = dev;
return 0;
}
-void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr)
+void enetc_free_cbdr(struct enetc_cbdr *cbdr)
{
int size = cbdr->bd_count * sizeof(struct enetc_cbd);
- dma_free_coherent(dev, size, cbdr->bd_base, cbdr->bd_dma_base);
+ dma_free_coherent(cbdr->dma_dev, size, cbdr->bd_base,
+ cbdr->bd_dma_base);
cbdr->bd_base = NULL;
+ cbdr->dma_dev = NULL;
}
void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr)
@@ -57,9 +61,8 @@ void enetc_clear_cbdr(struct enetc_hw *hw)
enetc_wr(hw, ENETC_SICBDRMR, 0);
}
-static void enetc_clean_cbdr(struct enetc_si *si)
+static void enetc_clean_cbdr(struct enetc_cbdr *ring)
{
- struct enetc_cbdr *ring = &si->cbd_ring;
struct enetc_cbd *dest_cbd;
int i, status;
@@ -69,7 +72,7 @@ static void enetc_clean_cbdr(struct enetc_si *si)
dest_cbd = ENETC_CBD(*ring, i);
status = dest_cbd->status_flags & ENETC_CBD_STATUS_MASK;
if (status)
- dev_warn(&si->pdev->dev, "CMD err %04x for cmd %04x\n",
+ dev_warn(ring->dma_dev, "CMD err %04x for cmd %04x\n",
status, dest_cbd->cmd);
memset(dest_cbd, 0, sizeof(*dest_cbd));
@@ -97,7 +100,7 @@ int enetc_send_cmd(struct enetc_si *si, struct enetc_cbd *cbd)
return -EIO;
if (unlikely(!enetc_cbd_unused(ring)))
- enetc_clean_cbdr(si);
+ enetc_clean_cbdr(ring);
i = ring->next_to_use;
dest_cbd = ENETC_CBD(*ring, i);
@@ -123,7 +126,7 @@ int enetc_send_cmd(struct enetc_si *si, struct enetc_cbd *cbd)
/* CBD may writeback data, feedback up level */
*cbd = *dest_cbd;
- enetc_clean_cbdr(si);
+ enetc_clean_cbdr(ring);
return 0;
}
@@ -171,6 +174,7 @@ int enetc_set_mac_flt_entry(struct enetc_si *si, int index,
int enetc_set_fs_entry(struct enetc_si *si, struct enetc_cmd_rfse *rfse,
int index)
{
+ struct enetc_cbdr *ring = &si->cbd_ring;
struct enetc_cbd cbd = {.cmd = 0};
dma_addr_t dma, dma_align;
void *tmp, *tmp_align;
@@ -183,10 +187,10 @@ int enetc_set_fs_entry(struct enetc_si *si, struct enetc_cmd_rfse *rfse,
cbd.length = cpu_to_le16(sizeof(*rfse));
cbd.opt[3] = cpu_to_le32(0); /* SI */
- tmp = dma_alloc_coherent(&si->pdev->dev, sizeof(*rfse) + RFSE_ALIGN,
+ tmp = dma_alloc_coherent(ring->dma_dev, sizeof(*rfse) + RFSE_ALIGN,
&dma, GFP_KERNEL);
if (!tmp) {
- dev_err(&si->pdev->dev, "DMA mapping of RFS entry failed!\n");
+ dev_err(ring->dma_dev, "DMA mapping of RFS entry failed!\n");
return -ENOMEM;
}
@@ -199,9 +203,9 @@ int enetc_set_fs_entry(struct enetc_si *si, struct enetc_cmd_rfse *rfse,
err = enetc_send_cmd(si, &cbd);
if (err)
- dev_err(&si->pdev->dev, "FS entry add failed (%d)!", err);
+ dev_err(ring->dma_dev, "FS entry add failed (%d)!", err);
- dma_free_coherent(&si->pdev->dev, sizeof(*rfse) + RFSE_ALIGN,
+ dma_free_coherent(ring->dma_dev, sizeof(*rfse) + RFSE_ALIGN,
tmp, dma);
return err;
@@ -211,6 +215,7 @@ int enetc_set_fs_entry(struct enetc_si *si, struct enetc_cmd_rfse *rfse,
static int enetc_cmd_rss_table(struct enetc_si *si, u32 *table, int count,
bool read)
{
+ struct enetc_cbdr *ring = &si->cbd_ring;
struct enetc_cbd cbd = {.cmd = 0};
dma_addr_t dma, dma_align;
u8 *tmp, *tmp_align;
@@ -220,10 +225,10 @@ static int enetc_cmd_rss_table(struct enetc_si *si, u32 *table, int count,
/* HW only takes in a full 64 entry table */
return -EINVAL;
- tmp = dma_alloc_coherent(&si->pdev->dev, count + RSSE_ALIGN,
+ tmp = dma_alloc_coherent(ring->dma_dev, count + RSSE_ALIGN,
&dma, GFP_KERNEL);
if (!tmp) {
- dev_err(&si->pdev->dev, "DMA mapping of RSS table failed!\n");
+ dev_err(ring->dma_dev, "DMA mapping of RSS table failed!\n");
return -ENOMEM;
}
dma_align = ALIGN(dma, RSSE_ALIGN);
@@ -243,13 +248,13 @@ static int enetc_cmd_rss_table(struct enetc_si *si, u32 *table, int count,
err = enetc_send_cmd(si, &cbd);
if (err)
- dev_err(&si->pdev->dev, "RSS cmd failed (%d)!", err);
+ dev_err(ring->dma_dev, "RSS cmd failed (%d)!", err);
if (read)
for (i = 0; i < count; i++)
table[i] = tmp_align[i];
- dma_free_coherent(&si->pdev->dev, count + RSSE_ALIGN, tmp, dma);
+ dma_free_coherent(ring->dma_dev, count + RSSE_ALIGN, tmp, dma);
return err;
}
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
index 224fc37a6757..a7195ec736f3 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
@@ -1098,7 +1098,7 @@ static void enetc_init_unused_port(struct enetc_si *si)
enetc_init_port_rss_memory(si);
enetc_clear_cbdr(hw);
- enetc_free_cbdr(dev, &si->cbd_ring);
+ enetc_free_cbdr(&si->cbd_ring);
}
static int enetc_pf_probe(struct pci_dev *pdev,
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 03/12] net: enetc: squash enetc_alloc_cbdr and enetc_setup_cbdr
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 01/12] net: enetc: move the CBDR API to enetc_cbdr.c Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 02/12] net: enetc: save the DMA device for enetc_free_cbdr Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 04/12] net: enetc: save the mode register address inside struct enetc_cbdr Vladimir Oltean
` (10 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
enetc_alloc_cbdr and enetc_setup_cbdr are always called one after
another, so we can simplify the callers and make enetc_setup_cbdr do
everything that's needed.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 4 +--
drivers/net/ethernet/freescale/enetc/enetc.h | 4 +--
.../net/ethernet/freescale/enetc/enetc_cbdr.c | 30 +++++++++----------
.../net/ethernet/freescale/enetc/enetc_pf.c | 4 +--
4 files changed, 18 insertions(+), 24 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index ceecee42f0f1..57073c3c679e 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -1064,12 +1064,10 @@ int enetc_alloc_si_resources(struct enetc_ndev_priv *priv)
struct enetc_si *si = priv->si;
int err;
- err = enetc_alloc_cbdr(priv->dev, &si->cbd_ring);
+ err = enetc_setup_cbdr(priv->dev, &si->hw, &si->cbd_ring);
if (err)
return err;
- enetc_setup_cbdr(&si->hw, &si->cbd_ring);
-
priv->cls_rules = kcalloc(si->num_fs_entries, sizeof(*priv->cls_rules),
GFP_KERNEL);
if (!priv->cls_rules) {
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h
index b343d1002bb7..1f2e9bec1b30 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc.h
@@ -311,9 +311,9 @@ int enetc_setup_tc(struct net_device *ndev, enum tc_setup_type type,
void enetc_set_ethtool_ops(struct net_device *ndev);
/* control buffer descriptor ring (CBDR) */
-int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr);
+int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw,
+ struct enetc_cbdr *cbdr);
void enetc_free_cbdr(struct enetc_cbdr *cbdr);
-void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr);
void enetc_clear_cbdr(struct enetc_hw *hw);
int enetc_set_mac_flt_entry(struct enetc_si *si, int index,
char *mac_addr, int si_map);
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
index 7e84eb665ecd..4de31b283319 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
@@ -3,7 +3,8 @@
#include "enetc.h"
-int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr)
+int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw,
+ struct enetc_cbdr *cbdr)
{
int size = cbdr->bd_count * sizeof(struct enetc_cbd);
@@ -23,21 +24,6 @@ int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr)
cbdr->next_to_use = 0;
cbdr->dma_dev = dev;
- return 0;
-}
-
-void enetc_free_cbdr(struct enetc_cbdr *cbdr)
-{
- int 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;
- cbdr->dma_dev = NULL;
-}
-
-void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr)
-{
/* set CBDR cache attributes */
enetc_wr(hw, ENETC_SICAR2,
ENETC_SICAR_RD_COHERENT | ENETC_SICAR_WR_COHERENT);
@@ -54,6 +40,18 @@ void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr)
cbdr->pir = hw->reg + ENETC_SICBDRPIR;
cbdr->cir = hw->reg + ENETC_SICBDRCIR;
+
+ return 0;
+}
+
+void enetc_free_cbdr(struct enetc_cbdr *cbdr)
+{
+ int 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;
+ cbdr->dma_dev = NULL;
}
void enetc_clear_cbdr(struct enetc_hw *hw)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
index a7195ec736f3..31d229e0912a 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
@@ -1088,12 +1088,10 @@ static void enetc_init_unused_port(struct enetc_si *si)
int err;
si->cbd_ring.bd_count = ENETC_CBDR_DEFAULT_SIZE;
- err = enetc_alloc_cbdr(dev, &si->cbd_ring);
+ err = enetc_setup_cbdr(dev, hw, &si->cbd_ring);
if (err)
return;
- enetc_setup_cbdr(hw, &si->cbd_ring);
-
enetc_init_port_rfs_memory(si);
enetc_init_port_rss_memory(si);
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 04/12] net: enetc: save the mode register address inside struct enetc_cbdr
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
` (2 preceding siblings ...)
2021-03-10 12:03 ` [PATCH net-next 03/12] net: enetc: squash enetc_alloc_cbdr and enetc_setup_cbdr Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 05/12] net: enetc: squash clear_cbdr and free_cbdr into teardown_cbdr Vladimir Oltean
` (9 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
enetc_clear_cbdr depends on struct enetc_hw because it must disable the
ring through a register write. We'd like to remove that dependency, so
let's do what's already done with the producer and consumer indices,
which is to save the iomem address in a variable kept in struct enetc_cbdr.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 4 ++--
drivers/net/ethernet/freescale/enetc/enetc.h | 3 ++-
.../net/ethernet/freescale/enetc/enetc_cbdr.c | 19 ++++++++++---------
.../net/ethernet/freescale/enetc/enetc_pf.c | 2 +-
4 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index 57073c3c679e..b1077a6e2b2b 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -1078,7 +1078,7 @@ int enetc_alloc_si_resources(struct enetc_ndev_priv *priv)
return 0;
err_alloc_cls:
- enetc_clear_cbdr(&si->hw);
+ enetc_clear_cbdr(&si->cbd_ring);
enetc_free_cbdr(&si->cbd_ring);
return err;
@@ -1088,7 +1088,7 @@ void enetc_free_si_resources(struct enetc_ndev_priv *priv)
{
struct enetc_si *si = priv->si;
- enetc_clear_cbdr(&si->hw);
+ enetc_clear_cbdr(&si->cbd_ring);
enetc_free_cbdr(&si->cbd_ring);
kfree(priv->cls_rules);
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h
index 1f2e9bec1b30..9d4dbeef61ac 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc.h
@@ -98,6 +98,7 @@ struct enetc_cbdr {
void *bd_base; /* points to Rx or Tx BD ring */
void __iomem *pir;
void __iomem *cir;
+ void __iomem *mr; /* mode register */
int bd_count; /* # of BDs */
int next_to_use;
@@ -314,7 +315,7 @@ void enetc_set_ethtool_ops(struct net_device *ndev);
int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw,
struct enetc_cbdr *cbdr);
void enetc_free_cbdr(struct enetc_cbdr *cbdr);
-void enetc_clear_cbdr(struct enetc_hw *hw);
+void enetc_clear_cbdr(struct enetc_cbdr *cbdr);
int enetc_set_mac_flt_entry(struct enetc_si *si, int index,
char *mac_addr, int si_map);
int enetc_clear_mac_flt_entry(struct enetc_si *si, int index);
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
index 4de31b283319..bb20a58e8830 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
@@ -24,6 +24,10 @@ int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw,
cbdr->next_to_use = 0;
cbdr->dma_dev = dev;
+ cbdr->pir = hw->reg + ENETC_SICBDRPIR;
+ cbdr->cir = hw->reg + ENETC_SICBDRCIR;
+ cbdr->mr = hw->reg + ENETC_SICBDRMR;
+
/* set CBDR cache attributes */
enetc_wr(hw, ENETC_SICAR2,
ENETC_SICAR_RD_COHERENT | ENETC_SICAR_WR_COHERENT);
@@ -32,14 +36,10 @@ int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw,
enetc_wr(hw, ENETC_SICBDRBAR1, upper_32_bits(cbdr->bd_dma_base));
enetc_wr(hw, ENETC_SICBDRLENR, ENETC_RTBLENR_LEN(cbdr->bd_count));
- enetc_wr(hw, ENETC_SICBDRPIR, 0);
- enetc_wr(hw, ENETC_SICBDRCIR, 0);
-
+ enetc_wr_reg(cbdr->pir, cbdr->next_to_clean);
+ enetc_wr_reg(cbdr->cir, cbdr->next_to_use);
/* enable ring */
- enetc_wr(hw, ENETC_SICBDRMR, BIT(31));
-
- cbdr->pir = hw->reg + ENETC_SICBDRPIR;
- cbdr->cir = hw->reg + ENETC_SICBDRCIR;
+ enetc_wr_reg(cbdr->mr, BIT(31));
return 0;
}
@@ -54,9 +54,10 @@ void enetc_free_cbdr(struct enetc_cbdr *cbdr)
cbdr->dma_dev = NULL;
}
-void enetc_clear_cbdr(struct enetc_hw *hw)
+void enetc_clear_cbdr(struct enetc_cbdr *cbdr)
{
- enetc_wr(hw, ENETC_SICBDRMR, 0);
+ /* disable ring */
+ enetc_wr_reg(cbdr->mr, 0);
}
static void enetc_clean_cbdr(struct enetc_cbdr *ring)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
index 31d229e0912a..f083d49d7772 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
@@ -1095,7 +1095,7 @@ static void enetc_init_unused_port(struct enetc_si *si)
enetc_init_port_rfs_memory(si);
enetc_init_port_rss_memory(si);
- enetc_clear_cbdr(hw);
+ enetc_clear_cbdr(&si->cbd_ring);
enetc_free_cbdr(&si->cbd_ring);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 05/12] net: enetc: squash clear_cbdr and free_cbdr into teardown_cbdr
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
` (3 preceding siblings ...)
2021-03-10 12:03 ` [PATCH net-next 04/12] net: enetc: save the mode register address inside struct enetc_cbdr Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 06/12] net: enetc: pass bd_count as an argument to enetc_setup_cbdr Vladimir Oltean
` (8 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
All call sites call enetc_clear_cbdr and enetc_free_cbdr one after
another, so let's combine the two functions into a single method named
enetc_teardown_cbdr which does both, and in the same order.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 6 ++----
drivers/net/ethernet/freescale/enetc/enetc.h | 3 +--
drivers/net/ethernet/freescale/enetc/enetc_cbdr.c | 11 ++++-------
drivers/net/ethernet/freescale/enetc/enetc_pf.c | 3 +--
4 files changed, 8 insertions(+), 15 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index b1077a6e2b2b..a32283533408 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -1078,8 +1078,7 @@ int enetc_alloc_si_resources(struct enetc_ndev_priv *priv)
return 0;
err_alloc_cls:
- enetc_clear_cbdr(&si->cbd_ring);
- enetc_free_cbdr(&si->cbd_ring);
+ enetc_teardown_cbdr(&si->cbd_ring);
return err;
}
@@ -1088,8 +1087,7 @@ void enetc_free_si_resources(struct enetc_ndev_priv *priv)
{
struct enetc_si *si = priv->si;
- enetc_clear_cbdr(&si->cbd_ring);
- enetc_free_cbdr(&si->cbd_ring);
+ enetc_teardown_cbdr(&si->cbd_ring);
kfree(priv->cls_rules);
}
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h
index 9d4dbeef61ac..19772be63a2c 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc.h
@@ -314,8 +314,7 @@ void enetc_set_ethtool_ops(struct net_device *ndev);
/* control buffer descriptor ring (CBDR) */
int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw,
struct enetc_cbdr *cbdr);
-void enetc_free_cbdr(struct enetc_cbdr *cbdr);
-void enetc_clear_cbdr(struct enetc_cbdr *cbdr);
+void enetc_teardown_cbdr(struct enetc_cbdr *cbdr);
int enetc_set_mac_flt_entry(struct enetc_si *si, int index,
char *mac_addr, int si_map);
int enetc_clear_mac_flt_entry(struct enetc_si *si, int index);
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
index bb20a58e8830..bee453be2240 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
@@ -44,22 +44,19 @@ int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw,
return 0;
}
-void enetc_free_cbdr(struct enetc_cbdr *cbdr)
+void enetc_teardown_cbdr(struct enetc_cbdr *cbdr)
{
int size = cbdr->bd_count * sizeof(struct enetc_cbd);
+ /* disable ring */
+ enetc_wr_reg(cbdr->mr, 0);
+
dma_free_coherent(cbdr->dma_dev, size, cbdr->bd_base,
cbdr->bd_dma_base);
cbdr->bd_base = NULL;
cbdr->dma_dev = NULL;
}
-void enetc_clear_cbdr(struct enetc_cbdr *cbdr)
-{
- /* disable ring */
- enetc_wr_reg(cbdr->mr, 0);
-}
-
static void enetc_clean_cbdr(struct enetc_cbdr *ring)
{
struct enetc_cbd *dest_cbd;
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
index f083d49d7772..4dd7199d5007 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
@@ -1095,8 +1095,7 @@ static void enetc_init_unused_port(struct enetc_si *si)
enetc_init_port_rfs_memory(si);
enetc_init_port_rss_memory(si);
- enetc_clear_cbdr(&si->cbd_ring);
- enetc_free_cbdr(&si->cbd_ring);
+ enetc_teardown_cbdr(&si->cbd_ring);
}
static int enetc_pf_probe(struct pci_dev *pdev,
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 06/12] net: enetc: pass bd_count as an argument to enetc_setup_cbdr
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
` (4 preceding siblings ...)
2021-03-10 12:03 ` [PATCH net-next 05/12] net: enetc: squash clear_cbdr and free_cbdr into teardown_cbdr Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 07/12] net: enetc: don't initialize unused ports from a separate code path Vladimir Oltean
` (7 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
It makes no sense from an API perspective to first initialize some
portion of struct enetc_cbdr outside enetc_setup_cbdr, then leave that
function to initialize the rest. enetc_setup_cbdr should be able to
perform all initialization given a zero-initialized struct enetc_cbdr.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 6 ++----
drivers/net/ethernet/freescale/enetc/enetc.h | 2 +-
drivers/net/ethernet/freescale/enetc/enetc_cbdr.c | 5 +++--
drivers/net/ethernet/freescale/enetc/enetc_pf.c | 3 +--
4 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index a32283533408..06fcab53c471 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -1054,9 +1054,6 @@ void enetc_init_si_rings_params(struct enetc_ndev_priv *priv)
priv->bdr_int_num = cpus;
priv->ic_mode = ENETC_IC_RX_ADAPTIVE | ENETC_IC_TX_MANUAL;
priv->tx_ictt = ENETC_TXIC_TIMETHR;
-
- /* SI specific */
- si->cbd_ring.bd_count = ENETC_CBDR_DEFAULT_SIZE;
}
int enetc_alloc_si_resources(struct enetc_ndev_priv *priv)
@@ -1064,7 +1061,8 @@ int enetc_alloc_si_resources(struct enetc_ndev_priv *priv)
struct enetc_si *si = priv->si;
int err;
- err = enetc_setup_cbdr(priv->dev, &si->hw, &si->cbd_ring);
+ err = enetc_setup_cbdr(priv->dev, &si->hw, ENETC_CBDR_DEFAULT_SIZE,
+ &si->cbd_ring);
if (err)
return err;
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h
index 19772be63a2c..af8b8be114bd 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc.h
@@ -312,7 +312,7 @@ int enetc_setup_tc(struct net_device *ndev, enum tc_setup_type type,
void enetc_set_ethtool_ops(struct net_device *ndev);
/* control buffer descriptor ring (CBDR) */
-int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw,
+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_set_mac_flt_entry(struct enetc_si *si, int index,
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
index bee453be2240..073e56dcca4e 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_cbdr.c
@@ -3,10 +3,10 @@
#include "enetc.h"
-int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw,
+int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw, int bd_count,
struct enetc_cbdr *cbdr)
{
- int size = cbdr->bd_count * sizeof(struct enetc_cbd);
+ int size = bd_count * sizeof(struct enetc_cbd);
cbdr->bd_base = dma_alloc_coherent(dev, size, &cbdr->bd_dma_base,
GFP_KERNEL);
@@ -23,6 +23,7 @@ int enetc_setup_cbdr(struct device *dev, struct enetc_hw *hw,
cbdr->next_to_clean = 0;
cbdr->next_to_use = 0;
cbdr->dma_dev = dev;
+ cbdr->bd_count = bd_count;
cbdr->pir = hw->reg + ENETC_SICBDRPIR;
cbdr->cir = hw->reg + ENETC_SICBDRCIR;
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
index 4dd7199d5007..bf70b8f9943f 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
@@ -1087,8 +1087,7 @@ static void enetc_init_unused_port(struct enetc_si *si)
struct enetc_hw *hw = &si->hw;
int err;
- si->cbd_ring.bd_count = ENETC_CBDR_DEFAULT_SIZE;
- err = enetc_setup_cbdr(dev, hw, &si->cbd_ring);
+ err = enetc_setup_cbdr(dev, hw, ENETC_CBDR_DEFAULT_SIZE, &si->cbd_ring);
if (err)
return;
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 07/12] net: enetc: don't initialize unused ports from a separate code path
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
` (5 preceding siblings ...)
2021-03-10 12:03 ` [PATCH net-next 06/12] net: enetc: pass bd_count as an argument to enetc_setup_cbdr Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 08/12] net: enetc: simplify callers of enetc_rxbd_next Vladimir Oltean
` (6 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
Since commit 3222b5b613db ("net: enetc: initialize RFS/RSS memories for
unused ports too") there is a requirement to initialize the memories of
unused PFs too, which has left the probe path in a bit of a rough shape,
because we basically have a minimal initialization path for unused PFs
which is separate from the main initialization path.
Now that initializing a control BD ring is as simple as calling
enetc_setup_cbdr, let's move that outside of enetc_alloc_si_resources
(unused PFs don't need classification rules, so no point in allocating
them just to free them later).
But enetc_alloc_si_resources is called both for PFs and for VFs, so now
that enetc_setup_cbdr is no longer called from this common function, it
means that the VF probe path needs to explicitly call enetc_setup_cbdr
too.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 21 +-------
.../net/ethernet/freescale/enetc/enetc_pf.c | 52 ++++++++-----------
.../net/ethernet/freescale/enetc/enetc_vf.c | 7 +++
3 files changed, 30 insertions(+), 50 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index 06fcab53c471..f92d29b62bae 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -1059,34 +1059,17 @@ void enetc_init_si_rings_params(struct enetc_ndev_priv *priv)
int enetc_alloc_si_resources(struct enetc_ndev_priv *priv)
{
struct enetc_si *si = priv->si;
- int err;
-
- err = enetc_setup_cbdr(priv->dev, &si->hw, ENETC_CBDR_DEFAULT_SIZE,
- &si->cbd_ring);
- if (err)
- return err;
priv->cls_rules = kcalloc(si->num_fs_entries, sizeof(*priv->cls_rules),
GFP_KERNEL);
- if (!priv->cls_rules) {
- err = -ENOMEM;
- goto err_alloc_cls;
- }
+ if (!priv->cls_rules)
+ return -ENOMEM;
return 0;
-
-err_alloc_cls:
- enetc_teardown_cbdr(&si->cbd_ring);
-
- return err;
}
void enetc_free_si_resources(struct enetc_ndev_priv *priv)
{
- struct enetc_si *si = priv->si;
-
- enetc_teardown_cbdr(&si->cbd_ring);
-
kfree(priv->cls_rules);
}
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
index bf70b8f9943f..c8b6110448d4 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
@@ -1081,22 +1081,6 @@ static int enetc_init_port_rss_memory(struct enetc_si *si)
return err;
}
-static void enetc_init_unused_port(struct enetc_si *si)
-{
- struct device *dev = &si->pdev->dev;
- struct enetc_hw *hw = &si->hw;
- int err;
-
- err = enetc_setup_cbdr(dev, hw, ENETC_CBDR_DEFAULT_SIZE, &si->cbd_ring);
- if (err)
- return;
-
- enetc_init_port_rfs_memory(si);
- enetc_init_port_rss_memory(si);
-
- enetc_teardown_cbdr(&si->cbd_ring);
-}
-
static int enetc_pf_probe(struct pci_dev *pdev,
const struct pci_device_id *ent)
{
@@ -1120,8 +1104,24 @@ static int enetc_pf_probe(struct pci_dev *pdev,
goto err_map_pf_space;
}
+ err = enetc_setup_cbdr(&pdev->dev, &si->hw, ENETC_CBDR_DEFAULT_SIZE,
+ &si->cbd_ring);
+ if (err)
+ goto err_setup_cbdr;
+
+ err = enetc_init_port_rfs_memory(si);
+ if (err) {
+ dev_err(&pdev->dev, "Failed to initialize RFS memory\n");
+ goto err_init_port_rfs;
+ }
+
+ err = enetc_init_port_rss_memory(si);
+ if (err) {
+ dev_err(&pdev->dev, "Failed to initialize RSS memory\n");
+ goto err_init_port_rss;
+ }
+
if (node && !of_device_is_available(node)) {
- enetc_init_unused_port(si);
dev_info(&pdev->dev, "device is disabled, skipping\n");
err = -ENODEV;
goto err_device_disabled;
@@ -1154,18 +1154,6 @@ static int enetc_pf_probe(struct pci_dev *pdev,
goto err_alloc_si_res;
}
- err = enetc_init_port_rfs_memory(si);
- if (err) {
- dev_err(&pdev->dev, "Failed to initialize RFS memory\n");
- goto err_init_port_rfs;
- }
-
- err = enetc_init_port_rss_memory(si);
- if (err) {
- dev_err(&pdev->dev, "Failed to initialize RSS memory\n");
- goto err_init_port_rss;
- }
-
err = enetc_configure_si(priv);
if (err) {
dev_err(&pdev->dev, "Failed to configure SI\n");
@@ -1201,15 +1189,17 @@ static int enetc_pf_probe(struct pci_dev *pdev,
err_mdiobus_create:
enetc_free_msix(priv);
err_config_si:
-err_init_port_rss:
-err_init_port_rfs:
err_alloc_msix:
enetc_free_si_resources(priv);
err_alloc_si_res:
si->ndev = NULL;
free_netdev(ndev);
err_alloc_netdev:
+err_init_port_rss:
+err_init_port_rfs:
err_device_disabled:
+ enetc_teardown_cbdr(&si->cbd_ring);
+err_setup_cbdr:
err_map_pf_space:
enetc_pci_remove(pdev);
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_vf.c b/drivers/net/ethernet/freescale/enetc/enetc_vf.c
index 9b755a84c2d6..371a34d3c6b4 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_vf.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_vf.c
@@ -165,6 +165,11 @@ 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);
+ if (err)
+ goto err_setup_cbdr;
+
err = enetc_alloc_si_resources(priv);
if (err) {
dev_err(&pdev->dev, "SI resource alloc failed\n");
@@ -197,6 +202,8 @@ static int enetc_vf_probe(struct pci_dev *pdev,
err_alloc_msix:
enetc_free_si_resources(priv);
err_alloc_si_res:
+ enetc_teardown_cbdr(&si->cbd_ring);
+err_setup_cbdr:
si->ndev = NULL;
free_netdev(ndev);
err_alloc_netdev:
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 08/12] net: enetc: simplify callers of enetc_rxbd_next
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
` (6 preceding siblings ...)
2021-03-10 12:03 ` [PATCH net-next 07/12] net: enetc: don't initialize unused ports from a separate code path Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 09/12] net: enetc: use enum enetc_active_offloads Vladimir Oltean
` (5 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
When we iterate through the BDs in the RX ring, the software producer
index (which is already passed by value to enetc_rxbd_next) lags behind,
and we end up with this funny looking "++i == rx_ring->bd_count" check
so that we drag it after us.
Let's pass the software producer index "i" by reference, so that
enetc_rxbd_next can increment it by itself (mod rx_ring->bd_count),
especially since enetc_rxbd_next has to increment the index anyway.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 21 +++++-------------
drivers/net/ethernet/freescale/enetc/enetc.h | 23 +++++++++++++-------
2 files changed, 20 insertions(+), 24 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index f92d29b62bae..3b04d7596d80 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -483,13 +483,8 @@ static int enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int buff_cnt)
/* clear 'R" as well */
rxbd->r.lstatus = 0;
- rxbd = enetc_rxbd_next(rx_ring, rxbd, i);
- rx_swbd++;
- i++;
- if (unlikely(i == rx_ring->bd_count)) {
- i = 0;
- rx_swbd = rx_ring->rx_swbd;
- }
+ enetc_rxbd_next(rx_ring, &rxbd, &i);
+ rx_swbd = &rx_ring->rx_swbd[i];
}
if (likely(j)) {
@@ -704,9 +699,7 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
cleaned_cnt++;
- rxbd = enetc_rxbd_next(rx_ring, rxbd, i);
- if (unlikely(++i == rx_ring->bd_count))
- i = 0;
+ enetc_rxbd_next(rx_ring, &rxbd, &i);
if (unlikely(bd_status &
ENETC_RXBD_LSTATUS(ENETC_RXBD_ERR_MASK))) {
@@ -715,9 +708,7 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
dma_rmb();
bd_status = le32_to_cpu(rxbd->r.lstatus);
- rxbd = enetc_rxbd_next(rx_ring, rxbd, i);
- if (unlikely(++i == rx_ring->bd_count))
- i = 0;
+ enetc_rxbd_next(rx_ring, &rxbd, &i);
}
rx_ring->ndev->stats.rx_dropped++;
@@ -740,9 +731,7 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
cleaned_cnt++;
- rxbd = enetc_rxbd_next(rx_ring, rxbd, i);
- if (unlikely(++i == rx_ring->bd_count))
- i = 0;
+ enetc_rxbd_next(rx_ring, &rxbd, &i);
}
rx_byte_cnt += skb->len;
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h
index af8b8be114bd..30b9ad550d7b 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc.h
@@ -121,19 +121,26 @@ static inline union enetc_rx_bd *enetc_rxbd(struct enetc_bdr *rx_ring, int i)
return &(((union enetc_rx_bd *)rx_ring->bd_base)[hw_idx]);
}
-static inline union enetc_rx_bd *enetc_rxbd_next(struct enetc_bdr *rx_ring,
- union enetc_rx_bd *rxbd,
- int i)
+static inline void enetc_rxbd_next(struct enetc_bdr *rx_ring,
+ union enetc_rx_bd **old_rxbd, int *old_index)
{
- rxbd++;
+ union enetc_rx_bd *new_rxbd = *old_rxbd;
+ int new_index = *old_index;
+
+ new_rxbd++;
+
#ifdef CONFIG_FSL_ENETC_PTP_CLOCK
if (rx_ring->ext_en)
- rxbd++;
+ new_rxbd++;
#endif
- if (unlikely(++i == rx_ring->bd_count))
- rxbd = rx_ring->bd_base;
- return rxbd;
+ if (unlikely(++new_index == rx_ring->bd_count)) {
+ new_rxbd = rx_ring->bd_base;
+ new_index = 0;
+ }
+
+ *old_rxbd = new_rxbd;
+ *old_index = new_index;
}
static inline union enetc_rx_bd *enetc_rxbd_ext(union enetc_rx_bd *rxbd)
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 09/12] net: enetc: use enum enetc_active_offloads
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
` (7 preceding siblings ...)
2021-03-10 12:03 ` [PATCH net-next 08/12] net: enetc: simplify callers of enetc_rxbd_next Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 10/12] net: enetc: remove forward-declarations of enetc_clean_{rx,tx}_ring Vladimir Oltean
` (4 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
The active_offloads variable of enetc_ndev_priv has an enum type, use it.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h
index 30b9ad550d7b..773e412b9f4e 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc.h
@@ -261,7 +261,7 @@ struct enetc_ndev_priv {
u16 rx_bd_count, tx_bd_count;
u16 msg_enable;
- int active_offloads;
+ enum enetc_active_offloads active_offloads;
u32 speed; /* store speed for compare update pspeed */
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 10/12] net: enetc: remove forward-declarations of enetc_clean_{rx,tx}_ring
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
` (8 preceding siblings ...)
2021-03-10 12:03 ` [PATCH net-next 09/12] net: enetc: use enum enetc_active_offloads Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 11/12] net: enetc: remove forward declaration for enetc_map_tx_buffs Vladimir Oltean
` (3 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
This patch moves the NAPI enetc_poll after enetc_clean_rx_ring such that
we can delete the forward declarations.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 92 ++++++++++----------
1 file changed, 44 insertions(+), 48 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index 3b04d7596d80..ddda16f60df9 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -241,10 +241,6 @@ static irqreturn_t enetc_msix(int irq, void *data)
return IRQ_HANDLED;
}
-static bool enetc_clean_tx_ring(struct enetc_bdr *tx_ring, int napi_budget);
-static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
- struct napi_struct *napi, int work_limit);
-
static void enetc_rx_dim_work(struct work_struct *w)
{
struct dim *dim = container_of(w, struct dim, work);
@@ -273,50 +269,6 @@ static void enetc_rx_net_dim(struct enetc_int_vector *v)
net_dim(&v->rx_dim, dim_sample);
}
-static int enetc_poll(struct napi_struct *napi, int budget)
-{
- struct enetc_int_vector
- *v = container_of(napi, struct enetc_int_vector, napi);
- bool complete = true;
- int work_done;
- int i;
-
- enetc_lock_mdio();
-
- for (i = 0; i < v->count_tx_rings; i++)
- if (!enetc_clean_tx_ring(&v->tx_ring[i], budget))
- complete = false;
-
- work_done = enetc_clean_rx_ring(&v->rx_ring, napi, budget);
- if (work_done == budget)
- complete = false;
- if (work_done)
- v->rx_napi_work = true;
-
- if (!complete) {
- enetc_unlock_mdio();
- return budget;
- }
-
- napi_complete_done(napi, work_done);
-
- if (likely(v->rx_dim_en))
- enetc_rx_net_dim(v);
-
- v->rx_napi_work = false;
-
- /* enable interrupts */
- enetc_wr_reg_hot(v->rbier, ENETC_RBIER_RXTIE);
-
- for_each_set_bit(i, &v->tx_rings_map, ENETC_MAX_NUM_TXQS)
- enetc_wr_reg_hot(v->tbier_base + ENETC_BDR_OFF(i),
- ENETC_TBIER_TXTIE);
-
- enetc_unlock_mdio();
-
- return work_done;
-}
-
static int enetc_bd_ready_count(struct enetc_bdr *tx_ring, int ci)
{
int pi = enetc_rd_reg_hot(tx_ring->tcir) & ENETC_TBCIR_IDX_MASK;
@@ -751,6 +703,50 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
return rx_frm_cnt;
}
+static int enetc_poll(struct napi_struct *napi, int budget)
+{
+ struct enetc_int_vector
+ *v = container_of(napi, struct enetc_int_vector, napi);
+ bool complete = true;
+ int work_done;
+ int i;
+
+ enetc_lock_mdio();
+
+ for (i = 0; i < v->count_tx_rings; i++)
+ if (!enetc_clean_tx_ring(&v->tx_ring[i], budget))
+ complete = false;
+
+ work_done = enetc_clean_rx_ring(&v->rx_ring, napi, budget);
+ if (work_done == budget)
+ complete = false;
+ if (work_done)
+ v->rx_napi_work = true;
+
+ if (!complete) {
+ enetc_unlock_mdio();
+ return budget;
+ }
+
+ napi_complete_done(napi, work_done);
+
+ if (likely(v->rx_dim_en))
+ enetc_rx_net_dim(v);
+
+ v->rx_napi_work = false;
+
+ /* enable interrupts */
+ enetc_wr_reg_hot(v->rbier, ENETC_RBIER_RXTIE);
+
+ for_each_set_bit(i, &v->tx_rings_map, ENETC_MAX_NUM_TXQS)
+ enetc_wr_reg_hot(v->tbier_base + ENETC_BDR_OFF(i),
+ ENETC_TBIER_TXTIE);
+
+ enetc_unlock_mdio();
+
+ return work_done;
+}
+
/* Probing and Init */
#define ENETC_MAX_RFS_SIZE 64
void enetc_get_si_caps(struct enetc_si *si)
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 11/12] net: enetc: remove forward declaration for enetc_map_tx_buffs
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
` (9 preceding siblings ...)
2021-03-10 12:03 ` [PATCH net-next 10/12] net: enetc: remove forward-declarations of enetc_clean_{rx,tx}_ring Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 12/12] net: enetc: make enetc_refill_rx_ring update the consumer index Vladimir Oltean
` (2 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
There is no other reason why this forward declaration exists rather than
poor ordering of the functions.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 73 ++++++++++----------
1 file changed, 35 insertions(+), 38 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index ddda16f60df9..c8b0b03f5ee7 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -12,44 +12,6 @@
#define ENETC_MAX_SKB_FRAGS 13
#define ENETC_TXBDS_MAX_NEEDED ENETC_TXBDS_NEEDED(ENETC_MAX_SKB_FRAGS + 1)
-static int enetc_map_tx_buffs(struct enetc_bdr *tx_ring, struct sk_buff *skb,
- int active_offloads);
-
-netdev_tx_t enetc_xmit(struct sk_buff *skb, struct net_device *ndev)
-{
- struct enetc_ndev_priv *priv = netdev_priv(ndev);
- struct enetc_bdr *tx_ring;
- int count;
-
- tx_ring = priv->tx_ring[skb->queue_mapping];
-
- if (unlikely(skb_shinfo(skb)->nr_frags > ENETC_MAX_SKB_FRAGS))
- if (unlikely(skb_linearize(skb)))
- goto drop_packet_err;
-
- count = skb_shinfo(skb)->nr_frags + 1; /* fragments + head */
- if (enetc_bd_unused(tx_ring) < ENETC_TXBDS_NEEDED(count)) {
- netif_stop_subqueue(ndev, tx_ring->index);
- return NETDEV_TX_BUSY;
- }
-
- enetc_lock_mdio();
- count = enetc_map_tx_buffs(tx_ring, skb, priv->active_offloads);
- enetc_unlock_mdio();
-
- if (unlikely(!count))
- goto drop_packet_err;
-
- if (enetc_bd_unused(tx_ring) < ENETC_TXBDS_MAX_NEEDED)
- netif_stop_subqueue(ndev, tx_ring->index);
-
- return NETDEV_TX_OK;
-
-drop_packet_err:
- dev_kfree_skb_any(skb);
- return NETDEV_TX_OK;
-}
-
static void enetc_unmap_tx_buff(struct enetc_bdr *tx_ring,
struct enetc_tx_swbd *tx_swbd)
{
@@ -220,6 +182,41 @@ static int enetc_map_tx_buffs(struct enetc_bdr *tx_ring, struct sk_buff *skb,
return 0;
}
+netdev_tx_t enetc_xmit(struct sk_buff *skb, struct net_device *ndev)
+{
+ struct enetc_ndev_priv *priv = netdev_priv(ndev);
+ struct enetc_bdr *tx_ring;
+ int count;
+
+ tx_ring = priv->tx_ring[skb->queue_mapping];
+
+ if (unlikely(skb_shinfo(skb)->nr_frags > ENETC_MAX_SKB_FRAGS))
+ if (unlikely(skb_linearize(skb)))
+ goto drop_packet_err;
+
+ count = skb_shinfo(skb)->nr_frags + 1; /* fragments + head */
+ if (enetc_bd_unused(tx_ring) < ENETC_TXBDS_NEEDED(count)) {
+ netif_stop_subqueue(ndev, tx_ring->index);
+ return NETDEV_TX_BUSY;
+ }
+
+ enetc_lock_mdio();
+ count = enetc_map_tx_buffs(tx_ring, skb, priv->active_offloads);
+ enetc_unlock_mdio();
+
+ if (unlikely(!count))
+ goto drop_packet_err;
+
+ if (enetc_bd_unused(tx_ring) < ENETC_TXBDS_MAX_NEEDED)
+ netif_stop_subqueue(ndev, tx_ring->index);
+
+ return NETDEV_TX_OK;
+
+drop_packet_err:
+ dev_kfree_skb_any(skb);
+ return NETDEV_TX_OK;
+}
+
static irqreturn_t enetc_msix(int irq, void *data)
{
struct enetc_int_vector *v = data;
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 12/12] net: enetc: make enetc_refill_rx_ring update the consumer index
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
` (10 preceding siblings ...)
2021-03-10 12:03 ` [PATCH net-next 11/12] net: enetc: remove forward declaration for enetc_map_tx_buffs Vladimir Oltean
@ 2021-03-10 12:03 ` Vladimir Oltean
2021-03-10 13:33 ` [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Claudiu Manoil
2021-03-10 21:30 ` patchwork-bot+netdevbpf
13 siblings, 0 replies; 15+ messages in thread
From: Vladimir Oltean @ 2021-03-10 12:03 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, netdev; +Cc: Alex Marginean, Claudiu Manoil
Since commit fd5736bf9f23 ("enetc: Workaround for MDIO register access
issue"), enetc_refill_rx_ring no longer updates the RX BD ring's
consumer index, that is left to be done by the caller. This has led to
bugs such as the ones found in 96a5223b918c ("net: enetc: remove bogus
write to SIRXIDR from enetc_setup_rxbdr") and 3a5d12c9be6f ("net: enetc:
keep RX ring consumer index in sync with hardware"), so it is desirable
that we move back the update of the consumer index into enetc_refill_rx_ring.
The trouble with that is the different MDIO locking context for the two
callers of enetc_refill_rx_ring:
- enetc_clean_rx_ring runs under enetc_lock_mdio()
- enetc_setup_rxbdr runs outside enetc_lock_mdio()
Simplify the callers of enetc_refill_rx_ring by making enetc_setup_rxbdr
explicitly take enetc_lock_mdio() around the call. It will be the only
place in need of ensuring the hot accessors can be used.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/ethernet/freescale/enetc/enetc.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index c8b0b03f5ee7..e85dfccb9ed1 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -439,6 +439,9 @@ static int enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int buff_cnt)
if (likely(j)) {
rx_ring->next_to_alloc = i; /* keep track from page reuse */
rx_ring->next_to_use = i;
+
+ /* update ENETC's consumer index */
+ enetc_wr_reg_hot(rx_ring->rcir, rx_ring->next_to_use);
}
return j;
@@ -624,13 +627,9 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
u32 bd_status;
u16 size;
- if (cleaned_cnt >= ENETC_RXBD_BUNDLE) {
- int count = enetc_refill_rx_ring(rx_ring, cleaned_cnt);
-
- /* update ENETC's consumer index */
- enetc_wr_reg_hot(rx_ring->rcir, rx_ring->next_to_use);
- cleaned_cnt -= count;
- }
+ if (cleaned_cnt >= ENETC_RXBD_BUNDLE)
+ cleaned_cnt -= enetc_refill_rx_ring(rx_ring,
+ cleaned_cnt);
rxbd = enetc_rxbd(rx_ring, i);
bd_status = le32_to_cpu(rxbd->r.lstatus);
@@ -1122,9 +1121,9 @@ static void enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring)
rx_ring->rcir = hw->reg + ENETC_BDR(RX, idx, ENETC_RBCIR);
rx_ring->idr = hw->reg + ENETC_SIRXIDR;
+ enetc_lock_mdio();
enetc_refill_rx_ring(rx_ring, enetc_bd_unused(rx_ring));
- /* update ENETC's consumer index */
- enetc_rxbdr_wr(hw, idx, ENETC_RBCIR, rx_ring->next_to_use);
+ enetc_unlock_mdio();
/* enable ring */
enetc_rxbdr_wr(hw, idx, ENETC_RBMR, rbmr);
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* RE: [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
` (11 preceding siblings ...)
2021-03-10 12:03 ` [PATCH net-next 12/12] net: enetc: make enetc_refill_rx_ring update the consumer index Vladimir Oltean
@ 2021-03-10 13:33 ` Claudiu Manoil
2021-03-10 21:30 ` patchwork-bot+netdevbpf
13 siblings, 0 replies; 15+ messages in thread
From: Claudiu Manoil @ 2021-03-10 13:33 UTC (permalink / raw)
To: Vladimir Oltean, David S . Miller, Jakub Kicinski,
netdev@vger.kernel.org
Cc: Alexandru Marginean
>-----Original Message-----
>From: Vladimir Oltean <olteanv@gmail.com>
>Sent: Wednesday, March 10, 2021 2:04 PM
>To: David S . Miller <davem@davemloft.net>; Jakub Kicinski
><kuba@kernel.org>; netdev@vger.kernel.org
>Cc: Alexandru Marginean <alexandru.marginean@nxp.com>; Claudiu Manoil
><claudiu.manoil@nxp.com>
>Subject: [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC
>
>This series performs the following:
>- makes the API for Control Buffer Descriptor Rings in enetc_cbdr.c a
> bit more tightly knit.
>- moves more logic into enetc_rxbd_next to make the callers simpler
>- moves more logic into enetc_refill_rx_ring to make the callers simpler
>- removes forward declarations
>- simplifies the probe path to unify probing for used and unused PFs.
>
>Nothing radical.
>
For the series -
Reviewed-by: Claudiu Manoil <claudiu.manoil@nxp.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
` (12 preceding siblings ...)
2021-03-10 13:33 ` [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Claudiu Manoil
@ 2021-03-10 21:30 ` patchwork-bot+netdevbpf
13 siblings, 0 replies; 15+ messages in thread
From: patchwork-bot+netdevbpf @ 2021-03-10 21:30 UTC (permalink / raw)
To: Vladimir Oltean; +Cc: davem, kuba, netdev, alexandru.marginean, claudiu.manoil
Hello:
This series was applied to netdev/net-next.git (refs/heads/master):
On Wed, 10 Mar 2021 14:03:39 +0200 you wrote:
> This series performs the following:
> - makes the API for Control Buffer Descriptor Rings in enetc_cbdr.c a
> bit more tightly knit.
> - moves more logic into enetc_rxbd_next to make the callers simpler
> - moves more logic into enetc_refill_rx_ring to make the callers simpler
> - removes forward declarations
> - simplifies the probe path to unify probing for used and unused PFs.
>
> [...]
Here is the summary with links:
- [net-next,01/12] net: enetc: move the CBDR API to enetc_cbdr.c
https://git.kernel.org/netdev/net-next/c/176769d10f96
- [net-next,02/12] net: enetc: save the DMA device for enetc_free_cbdr
https://git.kernel.org/netdev/net-next/c/01121ab73924
- [net-next,03/12] net: enetc: squash enetc_alloc_cbdr and enetc_setup_cbdr
https://git.kernel.org/netdev/net-next/c/24be14e3260a
- [net-next,04/12] net: enetc: save the mode register address inside struct enetc_cbdr
https://git.kernel.org/netdev/net-next/c/27f9025d4941
- [net-next,05/12] net: enetc: squash clear_cbdr and free_cbdr into teardown_cbdr
https://git.kernel.org/netdev/net-next/c/0bfde022b345
- [net-next,06/12] net: enetc: pass bd_count as an argument to enetc_setup_cbdr
https://git.kernel.org/netdev/net-next/c/5b4daa7f1256
- [net-next,07/12] net: enetc: don't initialize unused ports from a separate code path
https://git.kernel.org/netdev/net-next/c/4b47c0b81ffd
- [net-next,08/12] net: enetc: simplify callers of enetc_rxbd_next
https://git.kernel.org/netdev/net-next/c/c027aa9201eb
- [net-next,09/12] net: enetc: use enum enetc_active_offloads
https://git.kernel.org/netdev/net-next/c/7f071a450b08
- [net-next,10/12] net: enetc: remove forward-declarations of enetc_clean_{rx,tx}_ring
https://git.kernel.org/netdev/net-next/c/8580b3c3d786
- [net-next,11/12] net: enetc: remove forward declaration for enetc_map_tx_buffs
https://git.kernel.org/netdev/net-next/c/0486185ee244
- [net-next,12/12] net: enetc: make enetc_refill_rx_ring update the consumer index
https://git.kernel.org/netdev/net-next/c/7a5222cb7a56
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2021-03-10 21:31 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-03-10 12:03 [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 01/12] net: enetc: move the CBDR API to enetc_cbdr.c Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 02/12] net: enetc: save the DMA device for enetc_free_cbdr Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 03/12] net: enetc: squash enetc_alloc_cbdr and enetc_setup_cbdr Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 04/12] net: enetc: save the mode register address inside struct enetc_cbdr Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 05/12] net: enetc: squash clear_cbdr and free_cbdr into teardown_cbdr Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 06/12] net: enetc: pass bd_count as an argument to enetc_setup_cbdr Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 07/12] net: enetc: don't initialize unused ports from a separate code path Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 08/12] net: enetc: simplify callers of enetc_rxbd_next Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 09/12] net: enetc: use enum enetc_active_offloads Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 10/12] net: enetc: remove forward-declarations of enetc_clean_{rx,tx}_ring Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 11/12] net: enetc: remove forward declaration for enetc_map_tx_buffs Vladimir Oltean
2021-03-10 12:03 ` [PATCH net-next 12/12] net: enetc: make enetc_refill_rx_ring update the consumer index Vladimir Oltean
2021-03-10 13:33 ` [PATCH net-next 00/12] Refactoring/cleanup for NXP ENETC Claudiu Manoil
2021-03-10 21:30 ` patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).