diff mbox

[unstable,Artful,SRU,Zesty] net: hns: add acpi function of xge led control

Message ID 20170731222925.lb7qhcxmlot5lts4@xps13.dannf
State New
Headers show

Commit Message

dann frazier July 31, 2017, 10:29 p.m. UTC
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>
---
 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(-)

Comments

Stefan Bader Aug. 1, 2017, 8:35 a.m. UTC | #1
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;
>
Seth Forshee Aug. 2, 2017, 12:20 p.m. UTC | #2
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.
Kleber Sacilotto de Souza Aug. 7, 2017, 4:39 p.m. UTC | #3
Applied on zesty/master-next branch. Thanks.
diff mbox

Patch

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;