From: Ioana Ciornei <ioana.cior...@nxp.com>

It's useful, especially for debugging purposes, to have the Rx copybreak
value changeable at runtime. Export it as an ethtool tunable.

Signed-off-by: Ioana Ciornei <ioana.cior...@nxp.com>
Reviewed-by: Andrew Lunn <and...@lunn.ch>
---
Changes in v2:
 - none

 .../net/ethernet/freescale/dpaa2/dpaa2-eth.c  |  7 +++-
 .../net/ethernet/freescale/dpaa2/dpaa2-eth.h  |  2 +
 .../ethernet/freescale/dpaa2/dpaa2-ethtool.c  | 40 +++++++++++++++++++
 3 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c 
b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
index 535b9079943c..e0c3c58e2ac7 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
@@ -423,11 +423,12 @@ static struct sk_buff *dpaa2_eth_copybreak(struct 
dpaa2_eth_channel *ch,
                                           void *fd_vaddr)
 {
        u16 fd_offset = dpaa2_fd_get_offset(fd);
+       struct dpaa2_eth_priv *priv = ch->priv;
        u32 fd_length = dpaa2_fd_get_len(fd);
        struct sk_buff *skb = NULL;
        unsigned int skb_len;
 
-       if (fd_length > DPAA2_ETH_DEFAULT_COPYBREAK)
+       if (fd_length > priv->rx_copybreak)
                return NULL;
 
        skb_len = fd_length + dpaa2_eth_needed_headroom(NULL);
@@ -441,7 +442,7 @@ static struct sk_buff *dpaa2_eth_copybreak(struct 
dpaa2_eth_channel *ch,
 
        memcpy(skb->data, fd_vaddr + fd_offset, fd_length);
 
-       dpaa2_eth_recycle_buf(ch->priv, ch, dpaa2_fd_get_addr(fd));
+       dpaa2_eth_recycle_buf(priv, ch, dpaa2_fd_get_addr(fd));
 
        return skb;
 }
@@ -4333,6 +4334,8 @@ static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev)
 
        skb_queue_head_init(&priv->tx_skbs);
 
+       priv->rx_copybreak = DPAA2_ETH_DEFAULT_COPYBREAK;
+
        /* Obtain a MC portal */
        err = fsl_mc_portal_allocate(dpni_dev, FSL_MC_IO_ATOMIC_CONTEXT_PORTAL,
                                     &priv->mc_io);
diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h 
b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h
index f8d2b4769983..cdb623d5f2c1 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h
@@ -571,6 +571,8 @@ struct dpaa2_eth_priv {
        struct devlink *devlink;
        struct dpaa2_eth_trap_data *trap_data;
        struct devlink_port devlink_port;
+
+       u32 rx_copybreak;
 };
 
 struct dpaa2_eth_devlink_priv {
diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c 
b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c
index bf59708b869e..ad5e374eeccf 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c
@@ -782,6 +782,44 @@ static int dpaa2_eth_get_ts_info(struct net_device *dev,
        return 0;
 }
 
+static int dpaa2_eth_get_tunable(struct net_device *net_dev,
+                                const struct ethtool_tunable *tuna,
+                                void *data)
+{
+       struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
+       int err = 0;
+
+       switch (tuna->id) {
+       case ETHTOOL_RX_COPYBREAK:
+               *(u32 *)data = priv->rx_copybreak;
+               break;
+       default:
+               err = -EOPNOTSUPP;
+               break;
+       }
+
+       return err;
+}
+
+static int dpaa2_eth_set_tunable(struct net_device *net_dev,
+                                const struct ethtool_tunable *tuna,
+                                const void *data)
+{
+       struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
+       int err = 0;
+
+       switch (tuna->id) {
+       case ETHTOOL_RX_COPYBREAK:
+               priv->rx_copybreak = *(u32 *)data;
+               break;
+       default:
+               err = -EOPNOTSUPP;
+               break;
+       }
+
+       return err;
+}
+
 const struct ethtool_ops dpaa2_ethtool_ops = {
        .get_drvinfo = dpaa2_eth_get_drvinfo,
        .nway_reset = dpaa2_eth_nway_reset,
@@ -796,4 +834,6 @@ const struct ethtool_ops dpaa2_ethtool_ops = {
        .get_rxnfc = dpaa2_eth_get_rxnfc,
        .set_rxnfc = dpaa2_eth_set_rxnfc,
        .get_ts_info = dpaa2_eth_get_ts_info,
+       .get_tunable = dpaa2_eth_get_tunable,
+       .set_tunable = dpaa2_eth_set_tunable,
 };
-- 
2.30.0

Reply via email to