Message ID | 20170731222925.lb7qhcxmlot5lts4@xps13.dannf |
---|---|
State | New |
Headers | show |
On 01.08.2017 00:29, dann frazier wrote: > From: LiuJian <liujian56@huawei.com> > > BugLink: https://bugs.launchpad.net/bugs/1704903 > > 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> > (backported from commit 1e4babee70a2e2d8f9e0da06f013563b0e26f654) > [ dannf: modified to work with acpi_evaluate_dsm() before it switched to > using a generic guid_t in 94116f8126de9762751fd92731581b73b56292e5 ] > Signed-off-by: dann frazier <dann.frazier@canonical.com> Acked-by: Stefan Bader <stefan.bader@canonical.com> > --- At least isolated to specific hw. > drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c | 3 +- > drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 58 +++++++++++++++++++++- > 2 files changed, 58 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c > index ff864a187d5a..a37166ee577b 100644 > --- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c > +++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c > @@ -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); > } > > diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c > index e13aa064a8e9..6cca9c1f4aad 100644 > --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c > +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c > @@ -54,6 +54,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_uuid, 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) > { > @@ -94,6 +122,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) > @@ -104,6 +144,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) > { > @@ -605,8 +659,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; >
On Mon, Jul 31, 2017 at 04:29:25PM -0600, dann frazier wrote: > From: LiuJian <liujian56@huawei.com> > > BugLink: https://bugs.launchpad.net/bugs/1704903 > > 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> > (backported from commit 1e4babee70a2e2d8f9e0da06f013563b0e26f654) > [ dannf: modified to work with acpi_evaluate_dsm() before it switched to > using a generic guid_t in 94116f8126de9762751fd92731581b73b56292e5 ] > Signed-off-by: dann frazier <dann.frazier@canonical.com> Only affects a single driver for HiSilicon platforms. Acked-by: Seth Forshee <seth.forshee@canonical.com> Applied to artful/master-next and unstable/master, thanks.
Applied on zesty/master-next branch. Thanks.
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c index ff864a187d5a..a37166ee577b 100644 --- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c +++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c @@ -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); } diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c index e13aa064a8e9..6cca9c1f4aad 100644 --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c @@ -54,6 +54,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_uuid, 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) { @@ -94,6 +122,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) @@ -104,6 +144,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) { @@ -605,8 +659,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;