net: consolidate and fix ethtool_ops->get_settings calling
This patch does several things: - introduces __ethtool_get_settings which is called from ethtool code and from drivers as well. Put ASSERT_RTNL there. - dev_ethtool_get_settings() is replaced by __ethtool_get_settings() - changes calling in drivers so rtnl locking is respected. In iboe_get_rate was previously ->get_settings() called unlocked. This fixes it. Also prb_calc_retire_blk_tmo() in af_packet.c had the same problem. Also fixed by calling __dev_get_by_index() instead of dev_get_by_index() and holding rtnl_lock for both calls. - introduces rtnl_lock in bnx2fc_vport_create() and fcoe_vport_create() so bnx2fc_if_create() and fcoe_if_create() are called locked as they are from other places. - use __ethtool_get_settings() in bonding code Signed-off-by: Jiri Pirko <jpirko@redhat.com> v2->v3: -removed dev_ethtool_get_settings() -added ASSERT_RTNL into __ethtool_get_settings() -prb_calc_retire_blk_tmo - use __dev_get_by_index() and lock around it and __ethtool_get_settings() call v1->v2: add missing export_symbol Reviewed-by: Ben Hutchings <bhutchings@solarflare.com> [except FCoE bits] Acked-by: Ralf Baechle <ralf@linux-mips.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committato da
David S. Miller

parent
c5dac7c998
commit
4bc71cb983
@@ -557,7 +557,7 @@ down:
|
||||
static int bond_update_speed_duplex(struct slave *slave)
|
||||
{
|
||||
struct net_device *slave_dev = slave->dev;
|
||||
struct ethtool_cmd etool = { .cmd = ETHTOOL_GSET };
|
||||
struct ethtool_cmd ecmd;
|
||||
u32 slave_speed;
|
||||
int res;
|
||||
|
||||
@@ -565,18 +565,15 @@ static int bond_update_speed_duplex(struct slave *slave)
|
||||
slave->speed = SPEED_100;
|
||||
slave->duplex = DUPLEX_FULL;
|
||||
|
||||
if (!slave_dev->ethtool_ops || !slave_dev->ethtool_ops->get_settings)
|
||||
return -1;
|
||||
|
||||
res = slave_dev->ethtool_ops->get_settings(slave_dev, &etool);
|
||||
res = __ethtool_get_settings(slave_dev, &ecmd);
|
||||
if (res < 0)
|
||||
return -1;
|
||||
|
||||
slave_speed = ethtool_cmd_speed(&etool);
|
||||
slave_speed = ethtool_cmd_speed(&ecmd);
|
||||
if (slave_speed == 0 || slave_speed == ((__u32) -1))
|
||||
return -1;
|
||||
|
||||
switch (etool.duplex) {
|
||||
switch (ecmd.duplex) {
|
||||
case DUPLEX_FULL:
|
||||
case DUPLEX_HALF:
|
||||
break;
|
||||
@@ -585,7 +582,7 @@ static int bond_update_speed_duplex(struct slave *slave)
|
||||
}
|
||||
|
||||
slave->speed = slave_speed;
|
||||
slave->duplex = etool.duplex;
|
||||
slave->duplex = ecmd.duplex;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Fai riferimento in un nuovo problema
Block a user