[ETHTOOL]: Introduce get_sset_count. Obsolete get_stats_count, self_test_count
Signed-off-by: Jeff Garzik <jeff@garzik.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
3ae7c0b2e3
Коммит
ff03d49f0c
|
@ -376,11 +376,9 @@ struct ethtool_ops {
|
||||||
int (*set_sg)(struct net_device *, u32);
|
int (*set_sg)(struct net_device *, u32);
|
||||||
u32 (*get_tso)(struct net_device *);
|
u32 (*get_tso)(struct net_device *);
|
||||||
int (*set_tso)(struct net_device *, u32);
|
int (*set_tso)(struct net_device *, u32);
|
||||||
int (*self_test_count)(struct net_device *);
|
|
||||||
void (*self_test)(struct net_device *, struct ethtool_test *, u64 *);
|
void (*self_test)(struct net_device *, struct ethtool_test *, u64 *);
|
||||||
void (*get_strings)(struct net_device *, u32 stringset, u8 *);
|
void (*get_strings)(struct net_device *, u32 stringset, u8 *);
|
||||||
int (*phys_id)(struct net_device *, u32);
|
int (*phys_id)(struct net_device *, u32);
|
||||||
int (*get_stats_count)(struct net_device *);
|
|
||||||
void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *);
|
void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *);
|
||||||
int (*begin)(struct net_device *);
|
int (*begin)(struct net_device *);
|
||||||
void (*complete)(struct net_device *);
|
void (*complete)(struct net_device *);
|
||||||
|
@ -388,6 +386,11 @@ struct ethtool_ops {
|
||||||
int (*set_ufo)(struct net_device *, u32);
|
int (*set_ufo)(struct net_device *, u32);
|
||||||
u32 (*get_flags)(struct net_device *);
|
u32 (*get_flags)(struct net_device *);
|
||||||
int (*set_flags)(struct net_device *, u32);
|
int (*set_flags)(struct net_device *, u32);
|
||||||
|
int (*get_sset_count)(struct net_device *, int);
|
||||||
|
|
||||||
|
/* the following hooks are obsolete */
|
||||||
|
int (*self_test_count)(struct net_device *);/* use get_sset_count */
|
||||||
|
int (*get_stats_count)(struct net_device *);/* use get_sset_count */
|
||||||
};
|
};
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
|
|
|
@ -179,10 +179,23 @@ static int ethtool_get_drvinfo(struct net_device *dev, void __user *useraddr)
|
||||||
info.cmd = ETHTOOL_GDRVINFO;
|
info.cmd = ETHTOOL_GDRVINFO;
|
||||||
ops->get_drvinfo(dev, &info);
|
ops->get_drvinfo(dev, &info);
|
||||||
|
|
||||||
if (ops->self_test_count)
|
if (ops->get_sset_count) {
|
||||||
info.testinfo_len = ops->self_test_count(dev);
|
int rc;
|
||||||
if (ops->get_stats_count)
|
|
||||||
info.n_stats = ops->get_stats_count(dev);
|
rc = ops->get_sset_count(dev, ETH_SS_TEST);
|
||||||
|
if (rc >= 0)
|
||||||
|
info.testinfo_len = rc;
|
||||||
|
rc = ops->get_sset_count(dev, ETH_SS_STATS);
|
||||||
|
if (rc >= 0)
|
||||||
|
info.n_stats = rc;
|
||||||
|
} else {
|
||||||
|
/* code path for obsolete hooks */
|
||||||
|
|
||||||
|
if (ops->self_test_count)
|
||||||
|
info.testinfo_len = ops->self_test_count(dev);
|
||||||
|
if (ops->get_stats_count)
|
||||||
|
info.n_stats = ops->get_stats_count(dev);
|
||||||
|
}
|
||||||
if (ops->get_regs_len)
|
if (ops->get_regs_len)
|
||||||
info.regdump_len = ops->get_regs_len(dev);
|
info.regdump_len = ops->get_regs_len(dev);
|
||||||
if (ops->get_eeprom_len)
|
if (ops->get_eeprom_len)
|
||||||
|
@ -669,16 +682,27 @@ static int ethtool_self_test(struct net_device *dev, char __user *useraddr)
|
||||||
struct ethtool_test test;
|
struct ethtool_test test;
|
||||||
const struct ethtool_ops *ops = dev->ethtool_ops;
|
const struct ethtool_ops *ops = dev->ethtool_ops;
|
||||||
u64 *data;
|
u64 *data;
|
||||||
int ret;
|
int ret, test_len;
|
||||||
|
|
||||||
if (!ops->self_test || !ops->self_test_count)
|
if (!ops->self_test)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
if (!ops->get_sset_count && !ops->self_test_count)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
if (ops->get_sset_count)
|
||||||
|
test_len = ops->get_sset_count(dev, ETH_SS_TEST);
|
||||||
|
else
|
||||||
|
/* code path for obsolete hook */
|
||||||
|
test_len = ops->self_test_count(dev);
|
||||||
|
if (test_len < 0)
|
||||||
|
return test_len;
|
||||||
|
WARN_ON(test_len == 0);
|
||||||
|
|
||||||
if (copy_from_user(&test, useraddr, sizeof(test)))
|
if (copy_from_user(&test, useraddr, sizeof(test)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
test.len = ops->self_test_count(dev);
|
test.len = test_len;
|
||||||
data = kmalloc(test.len * sizeof(u64), GFP_USER);
|
data = kmalloc(test_len * sizeof(u64), GFP_USER);
|
||||||
if (!data)
|
if (!data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -710,19 +734,29 @@ static int ethtool_get_strings(struct net_device *dev, void __user *useraddr)
|
||||||
if (copy_from_user(&gstrings, useraddr, sizeof(gstrings)))
|
if (copy_from_user(&gstrings, useraddr, sizeof(gstrings)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
switch (gstrings.string_set) {
|
if (ops->get_sset_count) {
|
||||||
case ETH_SS_TEST:
|
ret = ops->get_sset_count(dev, gstrings.string_set);
|
||||||
if (!ops->self_test_count)
|
if (ret < 0)
|
||||||
return -EOPNOTSUPP;
|
return ret;
|
||||||
gstrings.len = ops->self_test_count(dev);
|
|
||||||
break;
|
gstrings.len = ret;
|
||||||
case ETH_SS_STATS:
|
} else {
|
||||||
if (!ops->get_stats_count)
|
/* code path for obsolete hooks */
|
||||||
return -EOPNOTSUPP;
|
|
||||||
gstrings.len = ops->get_stats_count(dev);
|
switch (gstrings.string_set) {
|
||||||
break;
|
case ETH_SS_TEST:
|
||||||
default:
|
if (!ops->self_test_count)
|
||||||
return -EINVAL;
|
return -EOPNOTSUPP;
|
||||||
|
gstrings.len = ops->self_test_count(dev);
|
||||||
|
break;
|
||||||
|
case ETH_SS_STATS:
|
||||||
|
if (!ops->get_stats_count)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
gstrings.len = ops->get_stats_count(dev);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER);
|
data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER);
|
||||||
|
@ -762,16 +796,27 @@ static int ethtool_get_stats(struct net_device *dev, void __user *useraddr)
|
||||||
struct ethtool_stats stats;
|
struct ethtool_stats stats;
|
||||||
const struct ethtool_ops *ops = dev->ethtool_ops;
|
const struct ethtool_ops *ops = dev->ethtool_ops;
|
||||||
u64 *data;
|
u64 *data;
|
||||||
int ret;
|
int ret, n_stats;
|
||||||
|
|
||||||
if (!ops->get_ethtool_stats || !ops->get_stats_count)
|
if (!ops->get_ethtool_stats)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
if (!ops->get_sset_count && !ops->get_stats_count)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
if (ops->get_sset_count)
|
||||||
|
n_stats = ops->get_sset_count(dev, ETH_SS_STATS);
|
||||||
|
else
|
||||||
|
/* code path for obsolete hook */
|
||||||
|
n_stats = ops->get_stats_count(dev);
|
||||||
|
if (n_stats < 0)
|
||||||
|
return n_stats;
|
||||||
|
WARN_ON(n_stats == 0);
|
||||||
|
|
||||||
if (copy_from_user(&stats, useraddr, sizeof(stats)))
|
if (copy_from_user(&stats, useraddr, sizeof(stats)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
stats.n_stats = ops->get_stats_count(dev);
|
stats.n_stats = n_stats;
|
||||||
data = kmalloc(stats.n_stats * sizeof(u64), GFP_USER);
|
data = kmalloc(n_stats * sizeof(u64), GFP_USER);
|
||||||
if (!data)
|
if (!data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче