diff options
author | Jiri Pirko <jpirko@redhat.com> | 2011-09-02 23:34:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-09-15 17:32:26 -0400 |
commit | 4bc71cb983fd2844e603bf633df2bb53385182d2 (patch) | |
tree | 067b6df32fda6c554b2b9263a94a585c2e5a832d /drivers/net/bonding/bond_main.c | |
parent | c5dac7c9984d8a034eb7ae149cedf23ec9259f98 (diff) |
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>
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 8cb75a6efec3..1dcb07ce5263 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -557,7 +557,7 @@ down: | |||
557 | static int bond_update_speed_duplex(struct slave *slave) | 557 | static int bond_update_speed_duplex(struct slave *slave) |
558 | { | 558 | { |
559 | struct net_device *slave_dev = slave->dev; | 559 | struct net_device *slave_dev = slave->dev; |
560 | struct ethtool_cmd etool = { .cmd = ETHTOOL_GSET }; | 560 | struct ethtool_cmd ecmd; |
561 | u32 slave_speed; | 561 | u32 slave_speed; |
562 | int res; | 562 | int res; |
563 | 563 | ||
@@ -565,18 +565,15 @@ static int bond_update_speed_duplex(struct slave *slave) | |||
565 | slave->speed = SPEED_100; | 565 | slave->speed = SPEED_100; |
566 | slave->duplex = DUPLEX_FULL; | 566 | slave->duplex = DUPLEX_FULL; |
567 | 567 | ||
568 | if (!slave_dev->ethtool_ops || !slave_dev->ethtool_ops->get_settings) | 568 | res = __ethtool_get_settings(slave_dev, &ecmd); |
569 | return -1; | ||
570 | |||
571 | res = slave_dev->ethtool_ops->get_settings(slave_dev, &etool); | ||
572 | if (res < 0) | 569 | if (res < 0) |
573 | return -1; | 570 | return -1; |
574 | 571 | ||
575 | slave_speed = ethtool_cmd_speed(&etool); | 572 | slave_speed = ethtool_cmd_speed(&ecmd); |
576 | if (slave_speed == 0 || slave_speed == ((__u32) -1)) | 573 | if (slave_speed == 0 || slave_speed == ((__u32) -1)) |
577 | return -1; | 574 | return -1; |
578 | 575 | ||
579 | switch (etool.duplex) { | 576 | switch (ecmd.duplex) { |
580 | case DUPLEX_FULL: | 577 | case DUPLEX_FULL: |
581 | case DUPLEX_HALF: | 578 | case DUPLEX_HALF: |
582 | break; | 579 | break; |
@@ -585,7 +582,7 @@ static int bond_update_speed_duplex(struct slave *slave) | |||
585 | } | 582 | } |
586 | 583 | ||
587 | slave->speed = slave_speed; | 584 | slave->speed = slave_speed; |
588 | slave->duplex = etool.duplex; | 585 | slave->duplex = ecmd.duplex; |
589 | 586 | ||
590 | return 0; | 587 | return 0; |
591 | } | 588 | } |