From 6194d9dcd6cdb2ca97e53fa7a6acb2e14d6844b6 Mon Sep 17 00:00:00 2001 From: Andrew Rybchenko Date: Tue, 13 Oct 2020 14:45:21 +0100 Subject: [PATCH] common/sfc_efx/base: factor out MCDI wrapper to set LEDs For consistency it is better to have separate MCDI wrappers. Make efx_phy_led_mode_t visible even if EFSYS_OPT_PHY_LED_CONTROL is disabled to be able to use it in the added wrapper arguments. Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/ef10_phy.c | 92 ++++++++++++++++---------- drivers/common/sfc_efx/base/efx.h | 4 +- 2 files changed, 59 insertions(+), 37 deletions(-) diff --git a/drivers/common/sfc_efx/base/ef10_phy.c b/drivers/common/sfc_efx/base/ef10_phy.c index 0005870736..3d07c254bf 100644 --- a/drivers/common/sfc_efx/base/ef10_phy.c +++ b/drivers/common/sfc_efx/base/ef10_phy.c @@ -430,6 +430,56 @@ efx_mcdi_phy_set_link( return (0); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + + return (rc); +} + +static __checkReturn efx_rc_t +efx_mcdi_phy_set_led( + __in efx_nic_t *enp, + __in efx_phy_led_mode_t phy_led_mode) +{ + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, MC_CMD_SET_ID_LED_IN_LEN, + MC_CMD_SET_ID_LED_OUT_LEN); + unsigned int led_mode; + efx_rc_t rc; + + req.emr_cmd = MC_CMD_SET_ID_LED; + req.emr_in_buf = payload; + req.emr_in_length = MC_CMD_SET_ID_LED_IN_LEN; + req.emr_out_buf = payload; + req.emr_out_length = MC_CMD_SET_ID_LED_OUT_LEN; + + switch (phy_led_mode) { + case EFX_PHY_LED_DEFAULT: + led_mode = MC_CMD_LED_DEFAULT; + break; + case EFX_PHY_LED_OFF: + led_mode = MC_CMD_LED_OFF; + break; + case EFX_PHY_LED_ON: + led_mode = MC_CMD_LED_ON; + break; + default: + EFSYS_ASSERT(0); + led_mode = MC_CMD_LED_DEFAULT; + break; + } + + MCDI_IN_SET_DWORD(req, SET_ID_LED_IN_STATE, led_mode); + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail1; + } + + return (0); + fail1: EFSYS_PROBE1(fail1, efx_rc_t, rc); @@ -441,15 +491,10 @@ ef10_phy_reconfigure( __in efx_nic_t *enp) { efx_port_t *epp = &(enp->en_port); - efx_mcdi_req_t req; - EFX_MCDI_DECLARE_BUF(payload, MC_CMD_SET_ID_LED_IN_LEN, - MC_CMD_SET_ID_LED_OUT_LEN); efx_loopback_type_t loopback_type; efx_link_mode_t loopback_link_mode; uint32_t phy_flags; -#if EFSYS_OPT_PHY_LED_CONTROL - unsigned int led_mode; -#endif + efx_phy_led_mode_t phy_led_mode; boolean_t supported; efx_rc_t rc; @@ -477,40 +522,17 @@ ef10_phy_reconfigure( goto fail2; /* And set the blink mode */ - (void) memset(payload, 0, sizeof (payload)); - req.emr_cmd = MC_CMD_SET_ID_LED; - req.emr_in_buf = payload; - req.emr_in_length = MC_CMD_SET_ID_LED_IN_LEN; - req.emr_out_buf = payload; - req.emr_out_length = MC_CMD_SET_ID_LED_OUT_LEN; #if EFSYS_OPT_PHY_LED_CONTROL - switch (epp->ep_phy_led_mode) { - case EFX_PHY_LED_DEFAULT: - led_mode = MC_CMD_LED_DEFAULT; - break; - case EFX_PHY_LED_OFF: - led_mode = MC_CMD_LED_OFF; - break; - case EFX_PHY_LED_ON: - led_mode = MC_CMD_LED_ON; - break; - default: - EFSYS_ASSERT(0); - led_mode = MC_CMD_LED_DEFAULT; - } - - MCDI_IN_SET_DWORD(req, SET_ID_LED_IN_STATE, led_mode); + phy_led_mode = epp->ep_phy_led_mode; #else - MCDI_IN_SET_DWORD(req, SET_ID_LED_IN_STATE, MC_CMD_LED_DEFAULT); -#endif /* EFSYS_OPT_PHY_LED_CONTROL */ - - efx_mcdi_execute(enp, &req); + phy_led_mode = EFX_PHY_LED_DEFAULT; +#endif - if (req.emr_rc != 0) { - rc = req.emr_rc; + rc = efx_mcdi_phy_set_led(enp, phy_led_mode); + if (rc != 0) goto fail3; - } + out: return (0); diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 07a7e3c952..a245acfe0f 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -1004,8 +1004,6 @@ extern __checkReturn efx_rc_t efx_phy_verify( __in efx_nic_t *enp); -#if EFSYS_OPT_PHY_LED_CONTROL - typedef enum efx_phy_led_mode_e { EFX_PHY_LED_DEFAULT = 0, EFX_PHY_LED_OFF, @@ -1014,6 +1012,8 @@ typedef enum efx_phy_led_mode_e { EFX_PHY_LED_NMODES } efx_phy_led_mode_t; +#if EFSYS_OPT_PHY_LED_CONTROL + LIBEFX_API extern __checkReturn efx_rc_t efx_phy_led_set( -- 2.20.1