aboutsummaryrefslogtreecommitdiff
path: root/drivers/net/sky2.c
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@osdl.org>2005-09-27 15:28:42 -0700
committerJeff Garzik <jgarzik@pobox.com>2005-09-28 11:52:58 -0400
commit9a7ae0a978263adb7d6b630f0c3c37c0133325e0 (patch)
tree2f6052964a9f1fe0e8d358911ce663903f388d31 /drivers/net/sky2.c
parent724bca3ca4d2126b67dd62e64d3f97805f9672de (diff)
[PATCH] sky2: nway reset (BONUS FEATURE)
Here is support for ethtool controlled renegotiation. Signed-off-by: Stephen Hemminger <shemminger@osdl.org> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/net/sky2.c')
-rw-r--r--drivers/net/sky2.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index a6c7bb9cea0..57583fa86a9 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -2300,6 +2300,24 @@ static u32 sky2_get_msglevel(struct net_device *netdev)
return sky2->msg_enable;
}
+static int sky2_nway_reset(struct net_device *dev)
+{
+ struct sky2_port *sky2 = netdev_priv(dev);
+ struct sky2_hw *hw = sky2->hw;
+
+ if (sky2->autoneg != AUTONEG_ENABLE)
+ return -EINVAL;
+
+ netif_stop_queue(dev);
+
+ spin_lock_irq(&hw->phy_lock);
+ sky2_phy_reset(hw, sky2->port);
+ sky2_phy_init(hw, sky2->port);
+ spin_unlock_irq(&hw->phy_lock);
+
+ return 0;
+}
+
static void sky2_phy_stats(struct sky2_port *sky2, u64 * data, unsigned count)
{
struct sky2_hw *hw = sky2->hw;
@@ -2656,6 +2674,7 @@ static struct ethtool_ops sky2_ethtool_ops = {
.get_drvinfo = sky2_get_drvinfo,
.get_msglevel = sky2_get_msglevel,
.set_msglevel = sky2_set_msglevel,
+ .nway_reset = sky2_nway_reset,
.get_regs_len = sky2_get_regs_len,
.get_regs = sky2_get_regs,
.get_link = ethtool_op_get_link,