Commit 38000a94 authored by Brandon Philips's avatar Brandon Philips Committed by David S. Miller

sky2: enable rx/tx in sky2_phy_reinit()

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: default avatarBrandon Philips <bphilips@suse.de>
Tested-by: default avatarBrandon Philips <bphilips@suse.de>
Cc: stable@kernel.org
Tested-by: default avatarMike McCormack <mikem@ring3k.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6b2a541d
...@@ -717,11 +717,24 @@ static void sky2_phy_power_down(struct sky2_hw *hw, unsigned port) ...@@ -717,11 +717,24 @@ static void sky2_phy_power_down(struct sky2_hw *hw, unsigned port)
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); 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 */ /* Force a renegotiation */
static void sky2_phy_reinit(struct sky2_port *sky2) static void sky2_phy_reinit(struct sky2_port *sky2)
{ {
spin_lock_bh(&sky2->phy_lock); spin_lock_bh(&sky2->phy_lock);
sky2_phy_init(sky2->hw, sky2->port); sky2_phy_init(sky2->hw, sky2->port);
sky2_enable_rx_tx(sky2);
spin_unlock_bh(&sky2->phy_lock); spin_unlock_bh(&sky2->phy_lock);
} }
...@@ -2040,7 +2053,6 @@ static void sky2_link_up(struct sky2_port *sky2) ...@@ -2040,7 +2053,6 @@ static void sky2_link_up(struct sky2_port *sky2)
{ {
struct sky2_hw *hw = sky2->hw; struct sky2_hw *hw = sky2->hw;
unsigned port = sky2->port; unsigned port = sky2->port;
u16 reg;
static const char *fc_name[] = { static const char *fc_name[] = {
[FC_NONE] = "none", [FC_NONE] = "none",
[FC_TX] = "tx", [FC_TX] = "tx",
...@@ -2048,10 +2060,7 @@ static void sky2_link_up(struct sky2_port *sky2) ...@@ -2048,10 +2060,7 @@ static void sky2_link_up(struct sky2_port *sky2)
[FC_BOTH] = "both", [FC_BOTH] = "both",
}; };
/* enable Rx/Tx */ sky2_enable_rx_tx(sky2);
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);
gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK); gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment