mirror of https://gitee.com/openkylin/linux.git
dpaa2-eth: export the rx copybreak value as an ethtool tunable
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>
This commit is contained in:
parent
50f826999a
commit
8ed3cefc26
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue