APPLIED[Artful/backlog]: [PATCH][Bionic][SRU Artful] net: hns: add ACPI mode support for ethtool -p

Kleber Souza kleber.souza at canonical.com
Thu Mar 1 14:18:57 UTC 2018


On 02/10/18 01:33, dann frazier wrote:
> From: Jian Shen <shenjian15 at 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 at huawei.com>
> Signed-off-by: Peng Li <lipeng321 at huawei.com>
> Tested-by: Zhou Wang <wangzhou1 at hisilicon.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (cherry picked from commit 3abbcccc6f318f858ffbd4e3d82839b66ff1b960)
> Signed-off-by: dann frazier <dann.frazier at 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




More information about the kernel-team mailing list