Skip to content

Commit

Permalink
net: hns: add acpi function of xge led control
Browse files Browse the repository at this point in the history
The current code only support DT method to control xge led.
This patch is the implementation of acpi method to control xge led.

Signed-off-by: LiuJian <liujian56@huawei.com>
Reviewed-by: John Garry <john.garry@huawei.com>
Reviewed-by: Yunsheng Lin <linyunsheng@huawei.com>
Reviewed-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
LiuJian authored and David S. Miller committed Jul 14, 2017
1 parent 230cd12 commit 1e4babe
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 3 deletions.
3 changes: 2 additions & 1 deletion drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
Original file line number Diff line number Diff line change
Expand Up @@ -776,8 +776,9 @@ void hns_ae_update_led_status(struct hnae_handle *handle)

assert(handle);
mac_cb = hns_get_mac_cb(handle);
if (!mac_cb->cpld_ctrl)
if (mac_cb->media_type != HNAE_MEDIA_TYPE_FIBER)
return;

hns_set_led_opt(mac_cb);
}

Expand Down
58 changes: 56 additions & 2 deletions drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,34 @@ static u32 dsaf_read_sub(struct dsaf_device *dsaf_dev, u32 reg)
return ret;
}

static void hns_dsaf_acpi_ledctrl_by_port(struct hns_mac_cb *mac_cb, u8 op_type,
u32 link, u32 port, u32 act)
{
union acpi_object *obj;
union acpi_object obj_args[3], argv4;

obj_args[0].integer.type = ACPI_TYPE_INTEGER;
obj_args[0].integer.value = link;
obj_args[1].integer.type = ACPI_TYPE_INTEGER;
obj_args[1].integer.value = port;
obj_args[2].integer.type = ACPI_TYPE_INTEGER;
obj_args[2].integer.value = act;

argv4.type = ACPI_TYPE_PACKAGE;
argv4.package.count = 3;
argv4.package.elements = obj_args;

obj = acpi_evaluate_dsm(ACPI_HANDLE(mac_cb->dev),
&hns_dsaf_acpi_dsm_guid, 0, op_type, &argv4);
if (!obj) {
dev_warn(mac_cb->dev, "ledctrl fail, link:%d port:%d act:%d!\n",
link, port, act);
return;
}

ACPI_FREE(obj);
}

static void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
u16 speed, int data)
{
Expand Down Expand Up @@ -93,6 +121,18 @@ static void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
}
}

static void hns_cpld_set_led_acpi(struct hns_mac_cb *mac_cb, int link_status,
u16 speed, int data)
{
if (!mac_cb) {
pr_err("cpld_led_set mac_cb is null!\n");
return;
}

hns_dsaf_acpi_ledctrl_by_port(mac_cb, HNS_OP_LED_SET_FUNC,
link_status, mac_cb->mac_id, data);
}

static void cpld_led_reset(struct hns_mac_cb *mac_cb)
{
if (!mac_cb || !mac_cb->cpld_ctrl)
Expand All @@ -103,6 +143,20 @@ static void cpld_led_reset(struct hns_mac_cb *mac_cb)
mac_cb->cpld_led_value = CPLD_LED_DEFAULT_VALUE;
}

static void cpld_led_reset_acpi(struct hns_mac_cb *mac_cb)
{
if (!mac_cb) {
pr_err("cpld_led_reset mac_cb is null!\n");
return;
}

if (mac_cb->media_type != HNAE_MEDIA_TYPE_FIBER)
return;

hns_dsaf_acpi_ledctrl_by_port(mac_cb, HNS_OP_LED_SET_FUNC,
0, mac_cb->mac_id, 0);
}

static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
enum hnae_led_state status)
{
Expand Down Expand Up @@ -604,8 +658,8 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)

misc_op->cfg_serdes_loopback = hns_mac_config_sds_loopback;
} else if (is_acpi_node(dsaf_dev->dev->fwnode)) {
misc_op->cpld_set_led = hns_cpld_set_led;
misc_op->cpld_reset_led = cpld_led_reset;
misc_op->cpld_set_led = hns_cpld_set_led_acpi;
misc_op->cpld_reset_led = cpld_led_reset_acpi;
misc_op->cpld_set_led_id = cpld_set_led_id;

misc_op->dsaf_reset = hns_dsaf_rst_acpi;
Expand Down

0 comments on commit 1e4babe

Please sign in to comment.