[Bionic,SRU,Artful] net: hns: add ACPI mode support for ethtool -p

Message ID 20180210003342.GA16627@xps13.dannf
State New
Headers show
Series
  • [Bionic,SRU,Artful] net: hns: add ACPI mode support for ethtool -p
Related show

Commit Message

dann frazier Feb. 10, 2018, 12:33 a.m.
From: Jian Shen <shenjian15@huawei.com>

BugLink: https://bugs.launchpad.net/bugs/1748567

The locate operation interface of fiber port can only
work with DT mode. Add a new interface to control the
locate led for ACPI mode.

Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Tested-by: Zhou Wang <wangzhou1@hisilicon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3abbcccc6f318f858ffbd4e3d82839b66ff1b960)
Signed-off-by: dann frazier <dann.frazier@canonical.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  |  2 +-
 drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 57 +++++++++++++++++++++-
 2 files changed, 57 insertions(+), 2 deletions(-)

Comments

Seth Forshee Feb. 12, 2018, 10:02 p.m. | #1
On Fri, Feb 09, 2018 at 05:33:42PM -0700, dann frazier wrote:
> From: Jian Shen <shenjian15@huawei.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1748567
> 
> The locate operation interface of fiber port can only
> work with DT mode. Add a new interface to control the
> locate led for ACPI mode.
> 
> Signed-off-by: Jian Shen <shenjian15@huawei.com>
> Signed-off-by: Peng Li <lipeng321@huawei.com>
> Tested-by: Zhou Wang <wangzhou1@hisilicon.com>
> Signed-off-by: David S. Miller <davem@davemloft.net>
> (cherry picked from commit 3abbcccc6f318f858ffbd4e3d82839b66ff1b960)
> Signed-off-by: dann frazier <dann.frazier@canonical.com>

Clean cherry pick, limited scope.

Acked-by: Seth Forshee <seth.forshee@canonical.com>

Applied to bionic/master-next, thanks!
Stefan Bader Feb. 28, 2018, 10:01 a.m. | #2
On 10.02.2018 01:33, dann frazier wrote:
> From: Jian Shen <shenjian15@huawei.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1748567
> 
> The locate operation interface of fiber port can only
> work with DT mode. Add a new interface to control the
> locate led for ACPI mode.
> 
> Signed-off-by: Jian Shen <shenjian15@huawei.com>
> Signed-off-by: Peng Li <lipeng321@huawei.com>
> Tested-by: Zhou Wang <wangzhou1@hisilicon.com>
> Signed-off-by: David S. Miller <davem@davemloft.net>
> (cherry picked from commit 3abbcccc6f318f858ffbd4e3d82839b66ff1b960)
> Signed-off-by: dann frazier <dann.frazier@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>

> ---
>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  |  2 +-
>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 57 +++++++++++++++++++++-
>  2 files changed, 57 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
> index 8b5cdf490850..cac86e9ae0dd 100644
> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
> @@ -1168,7 +1168,7 @@ void hns_set_led_opt(struct hns_mac_cb *mac_cb)
>  int hns_cpld_led_set_id(struct hns_mac_cb *mac_cb,
>  			enum hnae_led_state status)
>  {
> -	if (!mac_cb || !mac_cb->cpld_ctrl)
> +	if (!mac_cb)
>  		return 0;
>  
>  	return mac_cb->dsaf_dev->misc_op->cpld_set_led_id(mac_cb, status);
> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> index 408b63faf9a8..ca247c2cc238 100644
> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> @@ -18,6 +18,7 @@ enum _dsm_op_index {
>  	HNS_OP_LED_SET_FUNC             = 0x3,
>  	HNS_OP_GET_PORT_TYPE_FUNC       = 0x4,
>  	HNS_OP_GET_SFP_STAT_FUNC        = 0x5,
> +	HNS_OP_LOCATE_LED_SET_FUNC      = 0x6,
>  };
>  
>  enum _dsm_rst_type {
> @@ -81,6 +82,33 @@ static void hns_dsaf_acpi_ledctrl_by_port(struct hns_mac_cb *mac_cb, u8 op_type,
>         ACPI_FREE(obj);
>  }
>  
> +static void hns_dsaf_acpi_locate_ledctrl_by_port(struct hns_mac_cb *mac_cb,
> +						 u8 op_type, u32 locate,
> +						 u32 port)
> +{
> +	union acpi_object obj_args[2], argv4;
> +	union acpi_object *obj;
> +
> +	obj_args[0].integer.type = ACPI_TYPE_INTEGER;
> +	obj_args[0].integer.value = locate;
> +	obj_args[1].integer.type = ACPI_TYPE_INTEGER;
> +	obj_args[1].integer.value = port;
> +
> +	argv4.type = ACPI_TYPE_PACKAGE;
> +	argv4.package.count = 2;
> +	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_err(mac_cb->dev, "ledctrl fail, locate:%d port:%d!\n",
> +			locate, port);
> +		return;
> +	}
> +
> +	ACPI_FREE(obj);
> +}
> +
>  static void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
>  			     u16 speed, int data)
>  {
> @@ -160,6 +188,9 @@ static void cpld_led_reset_acpi(struct hns_mac_cb *mac_cb)
>  static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
>  			   enum hnae_led_state status)
>  {
> +	if (!mac_cb->cpld_ctrl)
> +		return 0;
> +
>  	switch (status) {
>  	case HNAE_LED_ACTIVE:
>  		mac_cb->cpld_led_value =
> @@ -184,6 +215,30 @@ static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
>  	return 0;
>  }
>  
> +static int cpld_set_led_id_acpi(struct hns_mac_cb *mac_cb,
> +				enum hnae_led_state status)
> +{
> +	switch (status) {
> +	case HNAE_LED_ACTIVE:
> +		hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
> +						     HNS_OP_LOCATE_LED_SET_FUNC,
> +						     CPLD_LED_ON_VALUE,
> +						     mac_cb->mac_id);
> +		break;
> +	case HNAE_LED_INACTIVE:
> +		hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
> +						     HNS_OP_LOCATE_LED_SET_FUNC,
> +						     CPLD_LED_DEFAULT_VALUE,
> +						     mac_cb->mac_id);
> +		break;
> +	default:
> +		dev_err(mac_cb->dev, "invalid led state: %d!", status);
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
>  #define RESET_REQ_OR_DREQ 1
>  
>  static void hns_dsaf_acpi_srst_by_port(struct dsaf_device *dsaf_dev, u8 op_type,
> @@ -660,7 +715,7 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
>  	} else if (is_acpi_node(dsaf_dev->dev->fwnode)) {
>  		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->cpld_set_led_id = cpld_set_led_id_acpi;
>  
>  		misc_op->dsaf_reset = hns_dsaf_rst_acpi;
>  		misc_op->xge_srst = hns_dsaf_xge_srst_by_port_acpi;
>
Kleber Souza Feb. 28, 2018, 10:04 a.m. | #3
On 02/10/18 01:33, dann frazier wrote:
> From: Jian Shen <shenjian15@huawei.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1748567
> 
> The locate operation interface of fiber port can only
> work with DT mode. Add a new interface to control the
> locate led for ACPI mode.
> 
> Signed-off-by: Jian Shen <shenjian15@huawei.com>
> Signed-off-by: Peng Li <lipeng321@huawei.com>
> Tested-by: Zhou Wang <wangzhou1@hisilicon.com>
> Signed-off-by: David S. Miller <davem@davemloft.net>
> (cherry picked from commit 3abbcccc6f318f858ffbd4e3d82839b66ff1b960)
> Signed-off-by: dann frazier <dann.frazier@canonical.com>
> ---
>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  |  2 +-
>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 57 +++++++++++++++++++++-
>  2 files changed, 57 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
> index 8b5cdf490850..cac86e9ae0dd 100644
> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
> @@ -1168,7 +1168,7 @@ void hns_set_led_opt(struct hns_mac_cb *mac_cb)
>  int hns_cpld_led_set_id(struct hns_mac_cb *mac_cb,
>  			enum hnae_led_state status)
>  {
> -	if (!mac_cb || !mac_cb->cpld_ctrl)
> +	if (!mac_cb)
>  		return 0;
>  
>  	return mac_cb->dsaf_dev->misc_op->cpld_set_led_id(mac_cb, status);
> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> index 408b63faf9a8..ca247c2cc238 100644
> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> @@ -18,6 +18,7 @@ enum _dsm_op_index {
>  	HNS_OP_LED_SET_FUNC             = 0x3,
>  	HNS_OP_GET_PORT_TYPE_FUNC       = 0x4,
>  	HNS_OP_GET_SFP_STAT_FUNC        = 0x5,
> +	HNS_OP_LOCATE_LED_SET_FUNC      = 0x6,
>  };
>  
>  enum _dsm_rst_type {
> @@ -81,6 +82,33 @@ static void hns_dsaf_acpi_ledctrl_by_port(struct hns_mac_cb *mac_cb, u8 op_type,
>         ACPI_FREE(obj);
>  }
>  
> +static void hns_dsaf_acpi_locate_ledctrl_by_port(struct hns_mac_cb *mac_cb,
> +						 u8 op_type, u32 locate,
> +						 u32 port)
> +{
> +	union acpi_object obj_args[2], argv4;
> +	union acpi_object *obj;
> +
> +	obj_args[0].integer.type = ACPI_TYPE_INTEGER;
> +	obj_args[0].integer.value = locate;
> +	obj_args[1].integer.type = ACPI_TYPE_INTEGER;
> +	obj_args[1].integer.value = port;
> +
> +	argv4.type = ACPI_TYPE_PACKAGE;
> +	argv4.package.count = 2;
> +	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_err(mac_cb->dev, "ledctrl fail, locate:%d port:%d!\n",
> +			locate, port);
> +		return;
> +	}
> +
> +	ACPI_FREE(obj);
> +}
> +
>  static void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
>  			     u16 speed, int data)
>  {
> @@ -160,6 +188,9 @@ static void cpld_led_reset_acpi(struct hns_mac_cb *mac_cb)
>  static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
>  			   enum hnae_led_state status)
>  {
> +	if (!mac_cb->cpld_ctrl)
> +		return 0;
> +
>  	switch (status) {
>  	case HNAE_LED_ACTIVE:
>  		mac_cb->cpld_led_value =
> @@ -184,6 +215,30 @@ static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
>  	return 0;
>  }
>  
> +static int cpld_set_led_id_acpi(struct hns_mac_cb *mac_cb,
> +				enum hnae_led_state status)
> +{
> +	switch (status) {
> +	case HNAE_LED_ACTIVE:
> +		hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
> +						     HNS_OP_LOCATE_LED_SET_FUNC,
> +						     CPLD_LED_ON_VALUE,
> +						     mac_cb->mac_id);
> +		break;
> +	case HNAE_LED_INACTIVE:
> +		hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
> +						     HNS_OP_LOCATE_LED_SET_FUNC,
> +						     CPLD_LED_DEFAULT_VALUE,
> +						     mac_cb->mac_id);
> +		break;
> +	default:
> +		dev_err(mac_cb->dev, "invalid led state: %d!", status);
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
>  #define RESET_REQ_OR_DREQ 1
>  
>  static void hns_dsaf_acpi_srst_by_port(struct dsaf_device *dsaf_dev, u8 op_type,
> @@ -660,7 +715,7 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
>  	} else if (is_acpi_node(dsaf_dev->dev->fwnode)) {
>  		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->cpld_set_led_id = cpld_set_led_id_acpi;
>  
>  		misc_op->dsaf_reset = hns_dsaf_rst_acpi;
>  		misc_op->xge_srst = hns_dsaf_xge_srst_by_port_acpi;
> 

Scope limited to specific driver, clean cherry-pick.

Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Kleber Souza March 1, 2018, 2:18 p.m. | #4
On 02/10/18 01:33, dann frazier wrote:
> From: Jian Shen <shenjian15@huawei.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1748567
> 
> The locate operation interface of fiber port can only
> work with DT mode. Add a new interface to control the
> locate led for ACPI mode.
> 
> Signed-off-by: Jian Shen <shenjian15@huawei.com>
> Signed-off-by: Peng Li <lipeng321@huawei.com>
> Tested-by: Zhou Wang <wangzhou1@hisilicon.com>
> Signed-off-by: David S. Miller <davem@davemloft.net>
> (cherry picked from commit 3abbcccc6f318f858ffbd4e3d82839b66ff1b960)
> Signed-off-by: dann frazier <dann.frazier@canonical.com>
> ---
>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  |  2 +-
>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 57 +++++++++++++++++++++-
>  2 files changed, 57 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
> index 8b5cdf490850..cac86e9ae0dd 100644
> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
> @@ -1168,7 +1168,7 @@ void hns_set_led_opt(struct hns_mac_cb *mac_cb)
>  int hns_cpld_led_set_id(struct hns_mac_cb *mac_cb,
>  			enum hnae_led_state status)
>  {
> -	if (!mac_cb || !mac_cb->cpld_ctrl)
> +	if (!mac_cb)
>  		return 0;
>  
>  	return mac_cb->dsaf_dev->misc_op->cpld_set_led_id(mac_cb, status);
> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> index 408b63faf9a8..ca247c2cc238 100644
> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
> @@ -18,6 +18,7 @@ enum _dsm_op_index {
>  	HNS_OP_LED_SET_FUNC             = 0x3,
>  	HNS_OP_GET_PORT_TYPE_FUNC       = 0x4,
>  	HNS_OP_GET_SFP_STAT_FUNC        = 0x5,
> +	HNS_OP_LOCATE_LED_SET_FUNC      = 0x6,
>  };
>  
>  enum _dsm_rst_type {
> @@ -81,6 +82,33 @@ static void hns_dsaf_acpi_ledctrl_by_port(struct hns_mac_cb *mac_cb, u8 op_type,
>         ACPI_FREE(obj);
>  }
>  
> +static void hns_dsaf_acpi_locate_ledctrl_by_port(struct hns_mac_cb *mac_cb,
> +						 u8 op_type, u32 locate,
> +						 u32 port)
> +{
> +	union acpi_object obj_args[2], argv4;
> +	union acpi_object *obj;
> +
> +	obj_args[0].integer.type = ACPI_TYPE_INTEGER;
> +	obj_args[0].integer.value = locate;
> +	obj_args[1].integer.type = ACPI_TYPE_INTEGER;
> +	obj_args[1].integer.value = port;
> +
> +	argv4.type = ACPI_TYPE_PACKAGE;
> +	argv4.package.count = 2;
> +	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_err(mac_cb->dev, "ledctrl fail, locate:%d port:%d!\n",
> +			locate, port);
> +		return;
> +	}
> +
> +	ACPI_FREE(obj);
> +}
> +
>  static void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
>  			     u16 speed, int data)
>  {
> @@ -160,6 +188,9 @@ static void cpld_led_reset_acpi(struct hns_mac_cb *mac_cb)
>  static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
>  			   enum hnae_led_state status)
>  {
> +	if (!mac_cb->cpld_ctrl)
> +		return 0;
> +
>  	switch (status) {
>  	case HNAE_LED_ACTIVE:
>  		mac_cb->cpld_led_value =
> @@ -184,6 +215,30 @@ static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
>  	return 0;
>  }
>  
> +static int cpld_set_led_id_acpi(struct hns_mac_cb *mac_cb,
> +				enum hnae_led_state status)
> +{
> +	switch (status) {
> +	case HNAE_LED_ACTIVE:
> +		hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
> +						     HNS_OP_LOCATE_LED_SET_FUNC,
> +						     CPLD_LED_ON_VALUE,
> +						     mac_cb->mac_id);
> +		break;
> +	case HNAE_LED_INACTIVE:
> +		hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
> +						     HNS_OP_LOCATE_LED_SET_FUNC,
> +						     CPLD_LED_DEFAULT_VALUE,
> +						     mac_cb->mac_id);
> +		break;
> +	default:
> +		dev_err(mac_cb->dev, "invalid led state: %d!", status);
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
>  #define RESET_REQ_OR_DREQ 1
>  
>  static void hns_dsaf_acpi_srst_by_port(struct dsaf_device *dsaf_dev, u8 op_type,
> @@ -660,7 +715,7 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
>  	} else if (is_acpi_node(dsaf_dev->dev->fwnode)) {
>  		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->cpld_set_led_id = cpld_set_led_id_acpi;
>  
>  		misc_op->dsaf_reset = hns_dsaf_rst_acpi;
>  		misc_op->xge_srst = hns_dsaf_xge_srst_by_port_acpi;
> 

Applied to artful/master-next-backlog branch.

Thanks,
Kleber
dann frazier March 1, 2018, 7:57 p.m. | #5
On Thu, Mar 1, 2018 at 7:18 AM, Kleber Souza <kleber.souza@canonical.com> wrote:
> On 02/10/18 01:33, dann frazier wrote:
>> From: Jian Shen <shenjian15@huawei.com>
>>
>> BugLink: https://bugs.launchpad.net/bugs/1748567
>>
>> The locate operation interface of fiber port can only
>> work with DT mode. Add a new interface to control the
>> locate led for ACPI mode.
>>
>> Signed-off-by: Jian Shen <shenjian15@huawei.com>
>> Signed-off-by: Peng Li <lipeng321@huawei.com>
>> Tested-by: Zhou Wang <wangzhou1@hisilicon.com>
>> Signed-off-by: David S. Miller <davem@davemloft.net>
>> (cherry picked from commit 3abbcccc6f318f858ffbd4e3d82839b66ff1b960)
>> Signed-off-by: dann frazier <dann.frazier@canonical.com>
>> ---
>>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  |  2 +-
>>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 57 +++++++++++++++++++++-
>>  2 files changed, 57 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
>> index 8b5cdf490850..cac86e9ae0dd 100644
>> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
>> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
>> @@ -1168,7 +1168,7 @@ void hns_set_led_opt(struct hns_mac_cb *mac_cb)
>>  int hns_cpld_led_set_id(struct hns_mac_cb *mac_cb,
>>                       enum hnae_led_state status)
>>  {
>> -     if (!mac_cb || !mac_cb->cpld_ctrl)
>> +     if (!mac_cb)
>>               return 0;
>>
>>       return mac_cb->dsaf_dev->misc_op->cpld_set_led_id(mac_cb, status);
>> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
>> index 408b63faf9a8..ca247c2cc238 100644
>> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
>> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
>> @@ -18,6 +18,7 @@ enum _dsm_op_index {
>>       HNS_OP_LED_SET_FUNC             = 0x3,
>>       HNS_OP_GET_PORT_TYPE_FUNC       = 0x4,
>>       HNS_OP_GET_SFP_STAT_FUNC        = 0x5,
>> +     HNS_OP_LOCATE_LED_SET_FUNC      = 0x6,
>>  };
>>
>>  enum _dsm_rst_type {
>> @@ -81,6 +82,33 @@ static void hns_dsaf_acpi_ledctrl_by_port(struct hns_mac_cb *mac_cb, u8 op_type,
>>         ACPI_FREE(obj);
>>  }
>>
>> +static void hns_dsaf_acpi_locate_ledctrl_by_port(struct hns_mac_cb *mac_cb,
>> +                                              u8 op_type, u32 locate,
>> +                                              u32 port)
>> +{
>> +     union acpi_object obj_args[2], argv4;
>> +     union acpi_object *obj;
>> +
>> +     obj_args[0].integer.type = ACPI_TYPE_INTEGER;
>> +     obj_args[0].integer.value = locate;
>> +     obj_args[1].integer.type = ACPI_TYPE_INTEGER;
>> +     obj_args[1].integer.value = port;
>> +
>> +     argv4.type = ACPI_TYPE_PACKAGE;
>> +     argv4.package.count = 2;
>> +     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_err(mac_cb->dev, "ledctrl fail, locate:%d port:%d!\n",
>> +                     locate, port);
>> +             return;
>> +     }
>> +
>> +     ACPI_FREE(obj);
>> +}
>> +
>>  static void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
>>                            u16 speed, int data)
>>  {
>> @@ -160,6 +188,9 @@ static void cpld_led_reset_acpi(struct hns_mac_cb *mac_cb)
>>  static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
>>                          enum hnae_led_state status)
>>  {
>> +     if (!mac_cb->cpld_ctrl)
>> +             return 0;
>> +
>>       switch (status) {
>>       case HNAE_LED_ACTIVE:
>>               mac_cb->cpld_led_value =
>> @@ -184,6 +215,30 @@ static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
>>       return 0;
>>  }
>>
>> +static int cpld_set_led_id_acpi(struct hns_mac_cb *mac_cb,
>> +                             enum hnae_led_state status)
>> +{
>> +     switch (status) {
>> +     case HNAE_LED_ACTIVE:
>> +             hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
>> +                                                  HNS_OP_LOCATE_LED_SET_FUNC,
>> +                                                  CPLD_LED_ON_VALUE,
>> +                                                  mac_cb->mac_id);
>> +             break;
>> +     case HNAE_LED_INACTIVE:
>> +             hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
>> +                                                  HNS_OP_LOCATE_LED_SET_FUNC,
>> +                                                  CPLD_LED_DEFAULT_VALUE,
>> +                                                  mac_cb->mac_id);
>> +             break;
>> +     default:
>> +             dev_err(mac_cb->dev, "invalid led state: %d!", status);
>> +             return -EINVAL;
>> +     }
>> +
>> +     return 0;
>> +}
>> +
>>  #define RESET_REQ_OR_DREQ 1
>>
>>  static void hns_dsaf_acpi_srst_by_port(struct dsaf_device *dsaf_dev, u8 op_type,
>> @@ -660,7 +715,7 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
>>       } else if (is_acpi_node(dsaf_dev->dev->fwnode)) {
>>               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->cpld_set_led_id = cpld_set_led_id_acpi;
>>
>>               misc_op->dsaf_reset = hns_dsaf_rst_acpi;
>>               misc_op->xge_srst = hns_dsaf_xge_srst_by_port_acpi;
>>
>
> Applied to artful/master-next-backlog branch.

Thanks Kleber!

Would you mind clarifying what it means to be on the
master-next-backlog branch vs. the master-next branch - specifically
wrt release timeframe?
Stefan Bader March 2, 2018, 8:56 a.m. | #6
On 01.03.2018 20:57, dann frazier wrote:
> On Thu, Mar 1, 2018 at 7:18 AM, Kleber Souza <kleber.souza@canonical.com> wrote:
>> On 02/10/18 01:33, dann frazier wrote:
>>> From: Jian Shen <shenjian15@huawei.com>
>>>
>>> BugLink: https://bugs.launchpad.net/bugs/1748567
>>>
>>> The locate operation interface of fiber port can only
>>> work with DT mode. Add a new interface to control the
>>> locate led for ACPI mode.
>>>
>>> Signed-off-by: Jian Shen <shenjian15@huawei.com>
>>> Signed-off-by: Peng Li <lipeng321@huawei.com>
>>> Tested-by: Zhou Wang <wangzhou1@hisilicon.com>
>>> Signed-off-by: David S. Miller <davem@davemloft.net>
>>> (cherry picked from commit 3abbcccc6f318f858ffbd4e3d82839b66ff1b960)
>>> Signed-off-by: dann frazier <dann.frazier@canonical.com>
>>> ---
>>>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c  |  2 +-
>>>  drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c | 57 +++++++++++++++++++++-
>>>  2 files changed, 57 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
>>> index 8b5cdf490850..cac86e9ae0dd 100644
>>> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
>>> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
>>> @@ -1168,7 +1168,7 @@ void hns_set_led_opt(struct hns_mac_cb *mac_cb)
>>>  int hns_cpld_led_set_id(struct hns_mac_cb *mac_cb,
>>>                       enum hnae_led_state status)
>>>  {
>>> -     if (!mac_cb || !mac_cb->cpld_ctrl)
>>> +     if (!mac_cb)
>>>               return 0;
>>>
>>>       return mac_cb->dsaf_dev->misc_op->cpld_set_led_id(mac_cb, status);
>>> diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
>>> index 408b63faf9a8..ca247c2cc238 100644
>>> --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
>>> +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
>>> @@ -18,6 +18,7 @@ enum _dsm_op_index {
>>>       HNS_OP_LED_SET_FUNC             = 0x3,
>>>       HNS_OP_GET_PORT_TYPE_FUNC       = 0x4,
>>>       HNS_OP_GET_SFP_STAT_FUNC        = 0x5,
>>> +     HNS_OP_LOCATE_LED_SET_FUNC      = 0x6,
>>>  };
>>>
>>>  enum _dsm_rst_type {
>>> @@ -81,6 +82,33 @@ static void hns_dsaf_acpi_ledctrl_by_port(struct hns_mac_cb *mac_cb, u8 op_type,
>>>         ACPI_FREE(obj);
>>>  }
>>>
>>> +static void hns_dsaf_acpi_locate_ledctrl_by_port(struct hns_mac_cb *mac_cb,
>>> +                                              u8 op_type, u32 locate,
>>> +                                              u32 port)
>>> +{
>>> +     union acpi_object obj_args[2], argv4;
>>> +     union acpi_object *obj;
>>> +
>>> +     obj_args[0].integer.type = ACPI_TYPE_INTEGER;
>>> +     obj_args[0].integer.value = locate;
>>> +     obj_args[1].integer.type = ACPI_TYPE_INTEGER;
>>> +     obj_args[1].integer.value = port;
>>> +
>>> +     argv4.type = ACPI_TYPE_PACKAGE;
>>> +     argv4.package.count = 2;
>>> +     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_err(mac_cb->dev, "ledctrl fail, locate:%d port:%d!\n",
>>> +                     locate, port);
>>> +             return;
>>> +     }
>>> +
>>> +     ACPI_FREE(obj);
>>> +}
>>> +
>>>  static void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
>>>                            u16 speed, int data)
>>>  {
>>> @@ -160,6 +188,9 @@ static void cpld_led_reset_acpi(struct hns_mac_cb *mac_cb)
>>>  static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
>>>                          enum hnae_led_state status)
>>>  {
>>> +     if (!mac_cb->cpld_ctrl)
>>> +             return 0;
>>> +
>>>       switch (status) {
>>>       case HNAE_LED_ACTIVE:
>>>               mac_cb->cpld_led_value =
>>> @@ -184,6 +215,30 @@ static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
>>>       return 0;
>>>  }
>>>
>>> +static int cpld_set_led_id_acpi(struct hns_mac_cb *mac_cb,
>>> +                             enum hnae_led_state status)
>>> +{
>>> +     switch (status) {
>>> +     case HNAE_LED_ACTIVE:
>>> +             hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
>>> +                                                  HNS_OP_LOCATE_LED_SET_FUNC,
>>> +                                                  CPLD_LED_ON_VALUE,
>>> +                                                  mac_cb->mac_id);
>>> +             break;
>>> +     case HNAE_LED_INACTIVE:
>>> +             hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
>>> +                                                  HNS_OP_LOCATE_LED_SET_FUNC,
>>> +                                                  CPLD_LED_DEFAULT_VALUE,
>>> +                                                  mac_cb->mac_id);
>>> +             break;
>>> +     default:
>>> +             dev_err(mac_cb->dev, "invalid led state: %d!", status);
>>> +             return -EINVAL;
>>> +     }
>>> +
>>> +     return 0;
>>> +}
>>> +
>>>  #define RESET_REQ_OR_DREQ 1
>>>
>>>  static void hns_dsaf_acpi_srst_by_port(struct dsaf_device *dsaf_dev, u8 op_type,
>>> @@ -660,7 +715,7 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
>>>       } else if (is_acpi_node(dsaf_dev->dev->fwnode)) {
>>>               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->cpld_set_led_id = cpld_set_led_id_acpi;
>>>
>>>               misc_op->dsaf_reset = hns_dsaf_rst_acpi;
>>>               misc_op->xge_srst = hns_dsaf_xge_srst_by_port_acpi;
>>>
>>
>> Applied to artful/master-next-backlog branch.
> 
> Thanks Kleber!
> 
> Would you mind clarifying what it means to be on the
> master-next-backlog branch vs. the master-next branch - specifically
> wrt release timeframe?
> 

That was a temporary stashing place to put all those requests while we still
expected to re-spin more often for spectre/meltdown and then point release
kernels. Expect all those backlog branches to move back to normal next when the
next normal cycle starts (Mar-12 so the bitgods allow)

-Stefan

Patch

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
index 8b5cdf490850..cac86e9ae0dd 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
@@ -1168,7 +1168,7 @@  void hns_set_led_opt(struct hns_mac_cb *mac_cb)
 int hns_cpld_led_set_id(struct hns_mac_cb *mac_cb,
 			enum hnae_led_state status)
 {
-	if (!mac_cb || !mac_cb->cpld_ctrl)
+	if (!mac_cb)
 		return 0;
 
 	return mac_cb->dsaf_dev->misc_op->cpld_set_led_id(mac_cb, status);
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
index 408b63faf9a8..ca247c2cc238 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
@@ -18,6 +18,7 @@  enum _dsm_op_index {
 	HNS_OP_LED_SET_FUNC             = 0x3,
 	HNS_OP_GET_PORT_TYPE_FUNC       = 0x4,
 	HNS_OP_GET_SFP_STAT_FUNC        = 0x5,
+	HNS_OP_LOCATE_LED_SET_FUNC      = 0x6,
 };
 
 enum _dsm_rst_type {
@@ -81,6 +82,33 @@  static void hns_dsaf_acpi_ledctrl_by_port(struct hns_mac_cb *mac_cb, u8 op_type,
        ACPI_FREE(obj);
 }
 
+static void hns_dsaf_acpi_locate_ledctrl_by_port(struct hns_mac_cb *mac_cb,
+						 u8 op_type, u32 locate,
+						 u32 port)
+{
+	union acpi_object obj_args[2], argv4;
+	union acpi_object *obj;
+
+	obj_args[0].integer.type = ACPI_TYPE_INTEGER;
+	obj_args[0].integer.value = locate;
+	obj_args[1].integer.type = ACPI_TYPE_INTEGER;
+	obj_args[1].integer.value = port;
+
+	argv4.type = ACPI_TYPE_PACKAGE;
+	argv4.package.count = 2;
+	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_err(mac_cb->dev, "ledctrl fail, locate:%d port:%d!\n",
+			locate, port);
+		return;
+	}
+
+	ACPI_FREE(obj);
+}
+
 static void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
 			     u16 speed, int data)
 {
@@ -160,6 +188,9 @@  static void cpld_led_reset_acpi(struct hns_mac_cb *mac_cb)
 static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
 			   enum hnae_led_state status)
 {
+	if (!mac_cb->cpld_ctrl)
+		return 0;
+
 	switch (status) {
 	case HNAE_LED_ACTIVE:
 		mac_cb->cpld_led_value =
@@ -184,6 +215,30 @@  static int cpld_set_led_id(struct hns_mac_cb *mac_cb,
 	return 0;
 }
 
+static int cpld_set_led_id_acpi(struct hns_mac_cb *mac_cb,
+				enum hnae_led_state status)
+{
+	switch (status) {
+	case HNAE_LED_ACTIVE:
+		hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
+						     HNS_OP_LOCATE_LED_SET_FUNC,
+						     CPLD_LED_ON_VALUE,
+						     mac_cb->mac_id);
+		break;
+	case HNAE_LED_INACTIVE:
+		hns_dsaf_acpi_locate_ledctrl_by_port(mac_cb,
+						     HNS_OP_LOCATE_LED_SET_FUNC,
+						     CPLD_LED_DEFAULT_VALUE,
+						     mac_cb->mac_id);
+		break;
+	default:
+		dev_err(mac_cb->dev, "invalid led state: %d!", status);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 #define RESET_REQ_OR_DREQ 1
 
 static void hns_dsaf_acpi_srst_by_port(struct dsaf_device *dsaf_dev, u8 op_type,
@@ -660,7 +715,7 @@  struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
 	} else if (is_acpi_node(dsaf_dev->dev->fwnode)) {
 		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->cpld_set_led_id = cpld_set_led_id_acpi;
 
 		misc_op->dsaf_reset = hns_dsaf_rst_acpi;
 		misc_op->xge_srst = hns_dsaf_xge_srst_by_port_acpi;