[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:
Jeff Garzik 2007-08-15 16:01:08 -07:00 коммит произвёл David S. Miller
Родитель 3ae7c0b2e3
Коммит ff03d49f0c
2 изменённых файлов: 75 добавлений и 27 удалений

Просмотреть файл

@ -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;