OSDN Git Service

dpaa2-eth: export the rx copybreak value as an ethtool tunable
authorIoana Ciornei <ioana.ciornei@nxp.com>
Fri, 2 Apr 2021 09:55:32 +0000 (12:55 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 2 Apr 2021 21:25:47 +0000 (14:25 -0700)
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.ciornei@nxp.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h
drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c

index 535b907..e0c3c58 100644 (file)
@@ -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);
index f8d2b47..cdb623d 100644 (file)
@@ -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 {
index bf59708..ad5e374 100644 (file)
@@ -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,
 };