From 9bc9783ce84145b4c94bee1e90b665fec36d9fdd Mon Sep 17 00:00:00 2001 From: Andy Gospodarek Date: Tue, 16 Apr 2013 14:46:00 +0000 Subject: [PATCH] --- yaml --- r: 369343 b: refs/heads/master c: bb5b052f751b309b5181686741c724a66c5cb15a h: refs/heads/master i: 369341: bf2103682dc15b25c4cccab4c1a1844cabd67032 369339: 8e7afff858804f3087b5a0bd20bd16eb0c4b6507 369335: 7e1540aef0d605243ad904ab2f443e5c45d47bc2 369327: 654f908de00a671bc31b367e14ce553e6ea47292 369311: 929a7ef1c293e0aae614165bcc3737eb2c52e26a 369279: 1341c7183428973ea5007aaef11806ee0ebcdf80 v: v3 --- [refs] | 2 +- trunk/drivers/net/bonding/bond_main.c | 32 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 2af9a2384129..3184e5ee958f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4b457bdf1dbc961b62252034b05d47ec3e5b85d2 +refs/heads/master: bb5b052f751b309b5181686741c724a66c5cb15a diff --git a/trunk/drivers/net/bonding/bond_main.c b/trunk/drivers/net/bonding/bond_main.c index 1e79a7643f08..5e22126c7a26 100644 --- a/trunk/drivers/net/bonding/bond_main.c +++ b/trunk/drivers/net/bonding/bond_main.c @@ -4226,6 +4226,37 @@ void bond_set_mode_ops(struct bonding *bond, int mode) } } +static int bond_ethtool_get_settings(struct net_device *bond_dev, + struct ethtool_cmd *ecmd) +{ + struct bonding *bond = netdev_priv(bond_dev); + struct slave *slave; + int i; + unsigned long speed = 0; + + ecmd->duplex = DUPLEX_UNKNOWN; + ecmd->port = PORT_OTHER; + + /* Since SLAVE_IS_OK returns false for all inactive or down slaves, we + * do not need to check mode. Though link speed might not represent + * the true receive or transmit bandwidth (not all modes are symmetric) + * this is an accurate maximum. + */ + read_lock(&bond->lock); + bond_for_each_slave(bond, slave, i) { + if (SLAVE_IS_OK(slave)) { + if (slave->speed != SPEED_UNKNOWN) + speed += slave->speed; + if (ecmd->duplex == DUPLEX_UNKNOWN && + slave->duplex != DUPLEX_UNKNOWN) + ecmd->duplex = slave->duplex; + } + } + ethtool_cmd_speed_set(ecmd, speed ? : SPEED_UNKNOWN); + read_unlock(&bond->lock); + return 0; +} + static void bond_ethtool_get_drvinfo(struct net_device *bond_dev, struct ethtool_drvinfo *drvinfo) { @@ -4237,6 +4268,7 @@ static void bond_ethtool_get_drvinfo(struct net_device *bond_dev, static const struct ethtool_ops bond_ethtool_ops = { .get_drvinfo = bond_ethtool_get_drvinfo, + .get_settings = bond_ethtool_get_settings, .get_link = ethtool_op_get_link, };