aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bonding/bond_main.c
diff options
context:
space:
mode:
authorJiri Pirko <jpirko@redhat.com>2011-09-02 23:34:30 -0400
committerDavid S. Miller <davem@davemloft.net>2011-09-15 17:32:26 -0400
commit4bc71cb983fd2844e603bf633df2bb53385182d2 (patch)
tree067b6df32fda6c554b2b9263a94a585c2e5a832d /drivers/net/bonding/bond_main.c
parentc5dac7c9984d8a034eb7ae149cedf23ec9259f98 (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.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 8cb75a6efec..1dcb07ce526 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -557,7 +557,7 @@ down:
557static int bond_update_speed_duplex(struct slave *slave) 557static 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}