net: hns: bug fix about led control logic when link down
authorDaode Huang <huangdaode@hisilicon.com>
Tue, 21 Jun 2016 03:56:35 +0000 (11:56 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 21 Jun 2016 08:51:55 +0000 (04:51 -0400)
The default driver sets anchor led bit to 0 when link down,
actually, the anchor bit should be set to 1, so fixes it when
link status is down.
Secondly, change the return value of cpld_set_led_id to 0, which
means leave the cpld to control led blink frequece other than the
driver itself.

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c

index aff9d779156d08b62437fca197697e986e6bc939..8473287d4c8b976bc0fb3a404d810b9eba772ed9 100644 (file)
@@ -86,9 +86,10 @@ static void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
                        mac_cb->cpld_led_value = value;
                }
        } else {
-               dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg,
-                                 CPLD_LED_DEFAULT_VALUE);
-               mac_cb->cpld_led_value = CPLD_LED_DEFAULT_VALUE;
+               value = (mac_cb->cpld_led_value) & (0x1 << DSAF_LED_ANCHOR_B);
+               dsaf_write_syscon(mac_cb->cpld_ctrl,
+                                 mac_cb->cpld_ctrl_reg, value);
+               mac_cb->cpld_led_value = value;
        }
 }
 
@@ -114,7 +115,7 @@ static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
                             CPLD_LED_ON_VALUE);
                dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg,
                                  mac_cb->cpld_led_value);
-               return 2;
+               break;
        case HNAE_LED_INACTIVE:
                dsaf_set_bit(mac_cb->cpld_led_value, DSAF_LED_ANCHOR_B,
                             CPLD_LED_DEFAULT_VALUE);
@@ -122,7 +123,8 @@ static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
                                  mac_cb->cpld_led_value);
                break;
        default:
-               break;
+               dev_err(mac_cb->dev, "invalid led state: %d!", status);
+               return -EINVAL;
        }
 
        return 0;