sky2: B0_Y2LED controls the LEDs for both ports
Subsystems (2)
PATCH 2/2 sky2: B0_Y2LED controls the LEDs for both ports
Only disable LED status control when both ports are disabled. The previous code disabled LED status control unconditionally
in sky2_down.
Tested with the limitation that my sky2 interface has no LEDs
and a single port.
Signed-off-by Mike McCormack <[email protected]>
--- drivers/net/sky2.c | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-)
drivers/net/sky2.c +20 -3
@@ -213,6 +213,22 @@ static inline u16 gm_phy_read(struct sky2_hw *hw, unsigned port, u16 reg)return v; } +static void sky2_disable_status_led (struct sky2_port *sky2) +{ +struct sky2_hw *hw = sky2->hw; +struct net_device *otherdev = hw->dev[sky2->port^1 ]; + +if (!(otherdev &&netif_running (otherdev))) { +sky2_write8 (hw,B0_Y2LED ,LED_STAT_OFF ); + } +} + +static void sky2_enable_status_led (struct sky2_port *sky2) +{ +struct sky2_hw *hw = sky2->hw; + +sky2_write8 (hw,B0_Y2LED ,LED_STAT_ON ); +}static void sky2_power_on (struct sky2_hw *hw) {
@@ -1530,6 +1546,8 @@ static int sky2_up(struct net_device *dev)if (err) goto err_out; +sky2_enable_status_led (sky2); +/* Enable interrupts from phy/mac for port */ imask =sky2_read32 (hw,B0_IMSK ); imask |= portirq_msk[port];
@@ -1886,8 +1904,7 @@ static int sky2_down(struct net_device *dev)sky2_phy_power_down (hw, port);spin_unlock_bh (&sky2->phy_lock); -/* turn off LED's */ -sky2_write16 (hw,B0_Y2LED ,LED_STAT_OFF ); +sky2_disable_status_led (sky2);sky2_tx_reset (hw, port);
@@ -2989,7 +3006,7 @@ static void sky2_reset(struct sky2_hw *hw)sky2_write8 (hw,B2_TI_CTRL ,TIM_STOP );sky2_write8 (hw,B2_TI_CTRL ,TIM_CLR_IRQ ); -sky2_write8 (hw,B0_Y2LED ,LED_STAT_ON ); +sky2_write8 (hw,B0_Y2LED ,LED_STAT_OFF );/* Turn off descriptor polling */ sky2_write32 (hw,B28_DPT_CTRL ,DPT_STOP );
Signature · 1 line
1.5.6.5
Quoted 59 lines · On Sun, 30 Aug 2009 12:58:46 +0900 Mike McCormack <[email protected]> wrote:
Only disable LED status control when both ports are disabled. The previous code disabled LED status control unconditionally
insky2_down.Tested with the limitation that my sky2 interface has no LEDs
and a single port.Signed-off-by Mike McCormack <[email protected]>--- drivers/net/sky2.c | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-)drivers/net/sky2.c +19
-2@@ -213,6 +213,22 @@ static inline u16 gm_phy_read(struct sky2_hw *hw, unsigned port, u16 reg)return v; } +static void sky2_disable_status_led (struct sky2_port *sky2) +{ +struct sky2_hw *hw = sky2->hw; +struct net_device *otherdev = hw->dev[sky2->port^1 ]; + +if (!(otherdev &&netif_running (otherdev))) { +sky2_write8 (hw,B0_Y2LED ,LED_STAT_OFF ); + } +} + +static void sky2_enable_status_led (struct sky2_port *sky2) +{ +struct sky2_hw *hw = sky2->hw; + +sky2_write8 (hw,B0_Y2LED ,LED_STAT_ON ); +}static void sky2_power_on (struct sky2_hw *hw) {@@ -1530,6 +1546,8 @@ static int sky2_up(struct net_device *dev)if (err) goto err_out; +sky2_enable_status_led (sky2); +/* Enable interrupts from phy/mac for port */ imask =sky2_read32 (hw,B0_IMSK ); imask |= portirq_msk[port];@@ -1886,8 +1904,7 @@ static int sky2_down(struct net_device *dev)sky2_phy_power_down (hw, port);spin_unlock_bh (&sky2->phy_lock); -/* turn off LED's */ -sky2_write16 (hw,B0_Y2LED ,LED_STAT_OFF ); +sky2_disable_status_led (sky2);sky2_tx_reset (hw, port);
drivers/net/sky2.c static void sky2_reset(struct sky2_hw *hw) · line 3012
Quoted 8 lines
drivers/net/sky2.c +1
-1@@ -2989,7 +3006,7 @@ static void sky2_reset(struct sky2_hw *hw)sky2_write8 (hw,B2_TI_CTRL ,TIM_STOP );sky2_write8 (hw,B2_TI_CTRL ,TIM_CLR_IRQ ); -sky2_write8 (hw,B0_Y2LED ,LED_STAT_ON ); +sky2_write8 (hw,B0_Y2LED ,LED_STAT_OFF );/* Turn off descriptor polling */ sky2_write32 (hw,B28_DPT_CTRL ,DPT_STOP );
NAK. I have simpler version of this coming.