GIT: unionfs2-2.6.27.y: sky2: enable rx/tx in sky2_phy_reinit()

Erez Zadok ezk at fsl.cs.sunysb.edu
Thu Aug 12 23:15:35 EDT 2010


commit 2339fdd79dfe5f17b0b44d89a9475aa8f912be2a
Author: Brandon Philips <brandon at ifup.org>
Date:   Wed Jun 16 16:21:58 2010 +0000

    sky2: enable rx/tx in sky2_phy_reinit()
    
    commit 38000a94a902e94ca8b5498f7871c6316de8957a upstream.
    
    sky2_phy_reinit is called by the ethtool helpers sky2_set_settings,
    sky2_nway_reset and sky2_set_pauseparam when netif_running.
    
    However, at the end of sky2_phy_init GM_GP_CTRL has GM_GPCR_RX_ENA and
    GM_GPCR_TX_ENA cleared. So, doing these commands causes the device to
    stop working:
    
    $ ethtool -r eth0
    $ ethtool -A eth0 autoneg off
    
    Fix this issue by enabling Rx/Tx after running sky2_phy_init in
    sky2_phy_reinit.
    
    Signed-off-by: Brandon Philips <bphilips at suse.de>
    Tested-by: Brandon Philips <bphilips at suse.de>
    Cc: stable at kernel.org
    Tested-by: Mike McCormack <mikem at ring3k.org>
    Signed-off-by: David S. Miller <davem at davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh at suse.de>

diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index aa9ff46..50e32df 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -688,11 +688,24 @@ static void sky2_phy_power_down(struct sky2_hw *hw, unsigned port)
 	sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
 }
 
+/* Enable Rx/Tx */
+static void sky2_enable_rx_tx(struct sky2_port *sky2)
+{
+	struct sky2_hw *hw = sky2->hw;
+	unsigned port = sky2->port;
+	u16 reg;
+
+	reg = gma_read16(hw, port, GM_GP_CTRL);
+	reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA;
+	gma_write16(hw, port, GM_GP_CTRL, reg);
+}
+
 /* Force a renegotiation */
 static void sky2_phy_reinit(struct sky2_port *sky2)
 {
 	spin_lock_bh(&sky2->phy_lock);
 	sky2_phy_init(sky2->hw, sky2->port);
+	sky2_enable_rx_tx(sky2);
 	spin_unlock_bh(&sky2->phy_lock);
 }
 
@@ -1862,7 +1875,6 @@ static void sky2_link_up(struct sky2_port *sky2)
 {
 	struct sky2_hw *hw = sky2->hw;
 	unsigned port = sky2->port;
-	u16 reg;
 	static const char *fc_name[] = {
 		[FC_NONE]	= "none",
 		[FC_TX]		= "tx",
@@ -1870,10 +1882,7 @@ static void sky2_link_up(struct sky2_port *sky2)
 		[FC_BOTH]	= "both",
 	};
 
-	/* enable Rx/Tx */
-	reg = gma_read16(hw, port, GM_GP_CTRL);
-	reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA;
-	gma_write16(hw, port, GM_GP_CTRL, reg);
+	sky2_enable_rx_tx(sky2);
 
 	gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK);
 


More information about the unionfs-cvs mailing list