Commit 0c3b091b authored by Mirko Lindner's avatar Mirko Lindner Committed by David S. Miller

[NIU]: Fix link LED handling.

The LED in the current driver will not be controlled correctly. During
a link change the carrier of the link is not available and the LED
will never turn on.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f194d132
...@@ -1045,6 +1045,7 @@ static int niu_serdes_init(struct niu *np) ...@@ -1045,6 +1045,7 @@ static int niu_serdes_init(struct niu *np)
} }
static void niu_init_xif(struct niu *); static void niu_init_xif(struct niu *);
static void niu_handle_led(struct niu *, int status);
static int niu_link_status_common(struct niu *np, int link_up) static int niu_link_status_common(struct niu *np, int link_up)
{ {
...@@ -1066,11 +1067,15 @@ static int niu_link_status_common(struct niu *np, int link_up) ...@@ -1066,11 +1067,15 @@ static int niu_link_status_common(struct niu *np, int link_up)
spin_lock_irqsave(&np->lock, flags); spin_lock_irqsave(&np->lock, flags);
niu_init_xif(np); niu_init_xif(np);
niu_handle_led(np, 1);
spin_unlock_irqrestore(&np->lock, flags); spin_unlock_irqrestore(&np->lock, flags);
netif_carrier_on(dev); netif_carrier_on(dev);
} else if (netif_carrier_ok(dev) && !link_up) { } else if (netif_carrier_ok(dev) && !link_up) {
niuwarn(LINK, "%s: Link is down\n", dev->name); niuwarn(LINK, "%s: Link is down\n", dev->name);
spin_lock_irqsave(&np->lock, flags);
niu_handle_led(np, 0);
spin_unlock_irqrestore(&np->lock, flags);
netif_carrier_off(dev); netif_carrier_off(dev);
} }
...@@ -3915,16 +3920,14 @@ static int niu_init_ipp(struct niu *np) ...@@ -3915,16 +3920,14 @@ static int niu_init_ipp(struct niu *np)
return 0; return 0;
} }
static void niu_init_xif_xmac(struct niu *np) static void niu_handle_led(struct niu *np, int status)
{ {
struct niu_link_config *lp = &np->link_config;
u64 val; u64 val;
val = nr64_mac(XMAC_CONFIG); val = nr64_mac(XMAC_CONFIG);
if ((np->flags & NIU_FLAGS_10G) != 0 && if ((np->flags & NIU_FLAGS_10G) != 0 &&
(np->flags & NIU_FLAGS_FIBER) != 0) { (np->flags & NIU_FLAGS_FIBER) != 0) {
if (netif_carrier_ok(np->dev)) { if (status) {
val |= XMAC_CONFIG_LED_POLARITY; val |= XMAC_CONFIG_LED_POLARITY;
val &= ~XMAC_CONFIG_FORCE_LED_ON; val &= ~XMAC_CONFIG_FORCE_LED_ON;
} else { } else {
...@@ -3933,6 +3936,15 @@ static void niu_init_xif_xmac(struct niu *np) ...@@ -3933,6 +3936,15 @@ static void niu_init_xif_xmac(struct niu *np)
} }
} }
nw64_mac(XMAC_CONFIG, val);
}
static void niu_init_xif_xmac(struct niu *np)
{
struct niu_link_config *lp = &np->link_config;
u64 val;
val = nr64_mac(XMAC_CONFIG);
val &= ~XMAC_CONFIG_SEL_POR_CLK_SRC; val &= ~XMAC_CONFIG_SEL_POR_CLK_SRC;
val |= XMAC_CONFIG_TX_OUTPUT_EN; val |= XMAC_CONFIG_TX_OUTPUT_EN;
...@@ -4776,6 +4788,8 @@ static int niu_close(struct net_device *dev) ...@@ -4776,6 +4788,8 @@ static int niu_close(struct net_device *dev)
niu_free_channels(np); niu_free_channels(np);
niu_handle_led(np, 0);
return 0; return 0;
} }
......
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