Skip to content

Commit

Permalink
[ETHTOOL]: Internal cleanup of ethtool_value-related handlers
Browse files Browse the repository at this point in the history
Several get/set functions can be handled by a passing the ethtool_op
function pointer directly to a generic function.  This permits deletion
of a fair bit of redundant code.

Signed-off-by: Jeff Garzik <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Jeff Garzik authored and David S. Miller committed Oct 10, 2007
1 parent 339bf02 commit 13c99b2
Showing 1 changed file with 39 additions and 160 deletions.
199 changes: 39 additions & 160 deletions net/core/ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -272,34 +272,6 @@ static int ethtool_set_wol(struct net_device *dev, char __user *useraddr)
return dev->ethtool_ops->set_wol(dev, &wol);
}

static int ethtool_get_msglevel(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata = { ETHTOOL_GMSGLVL };

if (!dev->ethtool_ops->get_msglevel)
return -EOPNOTSUPP;

edata.data = dev->ethtool_ops->get_msglevel(dev);

if (copy_to_user(useraddr, &edata, sizeof(edata)))
return -EFAULT;
return 0;
}

static int ethtool_set_msglevel(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata;

if (!dev->ethtool_ops->set_msglevel)
return -EOPNOTSUPP;

if (copy_from_user(&edata, useraddr, sizeof(edata)))
return -EFAULT;

dev->ethtool_ops->set_msglevel(dev, edata.data);
return 0;
}

static int ethtool_nway_reset(struct net_device *dev)
{
if (!dev->ethtool_ops->nway_reset)
Expand All @@ -308,20 +280,6 @@ static int ethtool_nway_reset(struct net_device *dev)
return dev->ethtool_ops->nway_reset(dev);
}

static int ethtool_get_link(struct net_device *dev, void __user *useraddr)
{
struct ethtool_value edata = { ETHTOOL_GLINK };

if (!dev->ethtool_ops->get_link)
return -EOPNOTSUPP;

edata.data = dev->ethtool_ops->get_link(dev);

if (copy_to_user(useraddr, &edata, sizeof(edata)))
return -EFAULT;
return 0;
}

static int ethtool_get_eeprom(struct net_device *dev, void __user *useraddr)
{
struct ethtool_eeprom eeprom;
Expand Down Expand Up @@ -489,48 +447,6 @@ static int ethtool_set_pauseparam(struct net_device *dev, void __user *useraddr)
return dev->ethtool_ops->set_pauseparam(dev, &pauseparam);
}

static int ethtool_get_rx_csum(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata = { ETHTOOL_GRXCSUM };

if (!dev->ethtool_ops->get_rx_csum)
return -EOPNOTSUPP;

edata.data = dev->ethtool_ops->get_rx_csum(dev);

if (copy_to_user(useraddr, &edata, sizeof(edata)))
return -EFAULT;
return 0;
}

static int ethtool_set_rx_csum(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata;

if (!dev->ethtool_ops->set_rx_csum)
return -EOPNOTSUPP;

if (copy_from_user(&edata, useraddr, sizeof(edata)))
return -EFAULT;

dev->ethtool_ops->set_rx_csum(dev, edata.data);
return 0;
}

static int ethtool_get_tx_csum(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata = { ETHTOOL_GTXCSUM };

if (!dev->ethtool_ops->get_tx_csum)
return -EOPNOTSUPP;

edata.data = dev->ethtool_ops->get_tx_csum(dev);

if (copy_to_user(useraddr, &edata, sizeof(edata)))
return -EFAULT;
return 0;
}

static int __ethtool_set_sg(struct net_device *dev, u32 data)
{
int err;
Expand Down Expand Up @@ -569,20 +485,6 @@ static int ethtool_set_tx_csum(struct net_device *dev, char __user *useraddr)
return dev->ethtool_ops->set_tx_csum(dev, edata.data);
}

static int ethtool_get_sg(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata = { ETHTOOL_GSG };

if (!dev->ethtool_ops->get_sg)
return -EOPNOTSUPP;

edata.data = dev->ethtool_ops->get_sg(dev);

if (copy_to_user(useraddr, &edata, sizeof(edata)))
return -EFAULT;
return 0;
}

static int ethtool_set_sg(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata;
Expand All @@ -600,20 +502,6 @@ static int ethtool_set_sg(struct net_device *dev, char __user *useraddr)
return __ethtool_set_sg(dev, edata.data);
}

static int ethtool_get_tso(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata = { ETHTOOL_GTSO };

if (!dev->ethtool_ops->get_tso)
return -EOPNOTSUPP;

edata.data = dev->ethtool_ops->get_tso(dev);

if (copy_to_user(useraddr, &edata, sizeof(edata)))
return -EFAULT;
return 0;
}

static int ethtool_set_tso(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata;
Expand All @@ -630,18 +518,6 @@ static int ethtool_set_tso(struct net_device *dev, char __user *useraddr)
return dev->ethtool_ops->set_tso(dev, edata.data);
}

static int ethtool_get_ufo(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata = { ETHTOOL_GUFO };

if (!dev->ethtool_ops->get_ufo)
return -EOPNOTSUPP;
edata.data = dev->ethtool_ops->get_ufo(dev);
if (copy_to_user(useraddr, &edata, sizeof(edata)))
return -EFAULT;
return 0;
}

static int ethtool_set_ufo(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata;
Expand Down Expand Up @@ -857,58 +733,48 @@ static int ethtool_get_perm_addr(struct net_device *dev, void __user *useraddr)
return 0;
}

static int ethtool_get_flags(struct net_device *dev, char __user *useraddr)
static int ethtool_get_value(struct net_device *dev, char __user *useraddr,
u32 cmd, u32 (*actor)(struct net_device *))
{
struct ethtool_value edata = { ETHTOOL_GFLAGS };
struct ethtool_value edata = { cmd };

if (!dev->ethtool_ops->get_flags)
if (!actor)
return -EOPNOTSUPP;

edata.data = dev->ethtool_ops->get_flags(dev);
edata.data = actor(dev);

if (copy_to_user(useraddr, &edata, sizeof(edata)))
return -EFAULT;
return 0;
}

static int ethtool_set_flags(struct net_device *dev, char __user *useraddr)
static int ethtool_set_value_void(struct net_device *dev, char __user *useraddr,
void (*actor)(struct net_device *, u32))
{
struct ethtool_value edata;

if (!dev->ethtool_ops->set_flags)
if (!actor)
return -EOPNOTSUPP;

if (copy_from_user(&edata, useraddr, sizeof(edata)))
return -EFAULT;

return dev->ethtool_ops->set_flags(dev, edata.data);
}

static int ethtool_get_priv_flags(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata = { ETHTOOL_GPFLAGS };

if (!dev->ethtool_ops->get_priv_flags)
return -EOPNOTSUPP;

edata.data = dev->ethtool_ops->get_priv_flags(dev);

if (copy_to_user(useraddr, &edata, sizeof(edata)))
return -EFAULT;
actor(dev, edata.data);
return 0;
}

static int ethtool_set_priv_flags(struct net_device *dev, char __user *useraddr)
static int ethtool_set_value(struct net_device *dev, char __user *useraddr,
int (*actor)(struct net_device *, u32))
{
struct ethtool_value edata;

if (!dev->ethtool_ops->set_priv_flags)
if (!actor)
return -EOPNOTSUPP;

if (copy_from_user(&edata, useraddr, sizeof(edata)))
return -EFAULT;

return dev->ethtool_ops->set_priv_flags(dev, edata.data);
return actor(dev, edata.data);
}

/* The main entry point in this file. Called from net/core/dev.c */
Expand Down Expand Up @@ -979,16 +845,19 @@ int dev_ethtool(struct ifreq *ifr)
rc = ethtool_set_wol(dev, useraddr);
break;
case ETHTOOL_GMSGLVL:
rc = ethtool_get_msglevel(dev, useraddr);
rc = ethtool_get_value(dev, useraddr, ethcmd,
dev->ethtool_ops->get_msglevel);
break;
case ETHTOOL_SMSGLVL:
rc = ethtool_set_msglevel(dev, useraddr);
rc = ethtool_set_value_void(dev, useraddr,
dev->ethtool_ops->set_msglevel);
break;
case ETHTOOL_NWAY_RST:
rc = ethtool_nway_reset(dev);
break;
case ETHTOOL_GLINK:
rc = ethtool_get_link(dev, useraddr);
rc = ethtool_get_value(dev, useraddr, ethcmd,
dev->ethtool_ops->get_link);
break;
case ETHTOOL_GEEPROM:
rc = ethtool_get_eeprom(dev, useraddr);
Expand All @@ -1015,25 +884,30 @@ int dev_ethtool(struct ifreq *ifr)
rc = ethtool_set_pauseparam(dev, useraddr);
break;
case ETHTOOL_GRXCSUM:
rc = ethtool_get_rx_csum(dev, useraddr);
rc = ethtool_get_value(dev, useraddr, ethcmd,
dev->ethtool_ops->get_rx_csum);
break;
case ETHTOOL_SRXCSUM:
rc = ethtool_set_rx_csum(dev, useraddr);
rc = ethtool_set_value(dev, useraddr,
dev->ethtool_ops->set_rx_csum);
break;
case ETHTOOL_GTXCSUM:
rc = ethtool_get_tx_csum(dev, useraddr);
rc = ethtool_get_value(dev, useraddr, ethcmd,
dev->ethtool_ops->get_tx_csum);
break;
case ETHTOOL_STXCSUM:
rc = ethtool_set_tx_csum(dev, useraddr);
break;
case ETHTOOL_GSG:
rc = ethtool_get_sg(dev, useraddr);
rc = ethtool_get_value(dev, useraddr, ethcmd,
dev->ethtool_ops->get_sg);
break;
case ETHTOOL_SSG:
rc = ethtool_set_sg(dev, useraddr);
break;
case ETHTOOL_GTSO:
rc = ethtool_get_tso(dev, useraddr);
rc = ethtool_get_value(dev, useraddr, ethcmd,
dev->ethtool_ops->get_tso);
break;
case ETHTOOL_STSO:
rc = ethtool_set_tso(dev, useraddr);
Expand All @@ -1054,7 +928,8 @@ int dev_ethtool(struct ifreq *ifr)
rc = ethtool_get_perm_addr(dev, useraddr);
break;
case ETHTOOL_GUFO:
rc = ethtool_get_ufo(dev, useraddr);
rc = ethtool_get_value(dev, useraddr, ethcmd,
dev->ethtool_ops->get_ufo);
break;
case ETHTOOL_SUFO:
rc = ethtool_set_ufo(dev, useraddr);
Expand All @@ -1066,16 +941,20 @@ int dev_ethtool(struct ifreq *ifr)
rc = ethtool_set_gso(dev, useraddr);
break;
case ETHTOOL_GFLAGS:
rc = ethtool_get_flags(dev, useraddr);
rc = ethtool_get_value(dev, useraddr, ethcmd,
dev->ethtool_ops->get_flags);
break;
case ETHTOOL_SFLAGS:
rc = ethtool_set_flags(dev, useraddr);
rc = ethtool_set_value(dev, useraddr,
dev->ethtool_ops->set_flags);
break;
case ETHTOOL_GPFLAGS:
rc = ethtool_get_priv_flags(dev, useraddr);
rc = ethtool_get_value(dev, useraddr, ethcmd,
dev->ethtool_ops->get_priv_flags);
break;
case ETHTOOL_SPFLAGS:
rc = ethtool_set_priv_flags(dev, useraddr);
rc = ethtool_set_value(dev, useraddr,
dev->ethtool_ops->set_priv_flags);
break;
default:
rc = -EOPNOTSUPP;
Expand Down

0 comments on commit 13c99b2

Please sign in to comment.