[edk2-devel] [edk2-platforms PATCH v1 2/3] NetsecDxe: put phy in loopback mode in order to guarantee stable RXCLK input

Leif Lindholm leif.lindholm at linaro.org
Tue Jul 23 15:49:53 UTC 2019


On Mon, Jul 22, 2019 at 08:56:35PM +0900, Masahisa Kojima wrote:
> NETSEC hardware requires stable RXCLK input upon initialization
> triggered with DISCORE = 0.
> However, RXCLK input could be unstable depending on phy chipset
> and deployed network environment, which could cause NETSEC to
> hang up during initialization.
> 
> We solve this platform/environment dependent issue by temporarily
> putting phy in loopback mode, then we can expect the stable RXCLK input.
> 
> Signed-off-by: Masahisa Kojima <masahisa.kojima at linaro.org>
> Signed-off-by: Satoru Okamoto <okamoto.satoru at socionext.com>
> ---
>  .../netsec_sdk/src/ogma_misc.c                | 72 ++++++++++++++++++-
>  .../netsec_for_uefi/netsec_sdk/src/ogma_reg.h |  4 ++
>  2 files changed, 75 insertions(+), 1 deletion(-)
> 
> diff --git a/Silicon/Socionext/SynQuacer/Drivers/Net/NetsecDxe/netsec_for_uefi/netsec_sdk/src/ogma_misc.c b/Silicon/Socionext/SynQuacer/Drivers/Net/NetsecDxe/netsec_for_uefi/netsec_sdk/src/ogma_misc.c
> index 7481d2da2d24..07308d38a5c2 100644
> --- a/Silicon/Socionext/SynQuacer/Drivers/Net/NetsecDxe/netsec_for_uefi/netsec_sdk/src/ogma_misc.c
> +++ b/Silicon/Socionext/SynQuacer/Drivers/Net/NetsecDxe/netsec_for_uefi/netsec_sdk/src/ogma_misc.c
> @@ -35,7 +35,6 @@ static const ogma_uint32 desc_ring_config_reg_addr[OGMA_DESC_RING_ID_MAX + 1] =
>  
>  };
>  
> -

Please, no unrelated whitespace changes.

>  /* Internal function definition*/
>  #ifndef OGMA_CONFIG_DISABLE_CLK_CTRL
>  STATIC void ogma_set_clk_en_reg (
> @@ -327,6 +326,60 @@ STATIC ogma_uint32 ogma_calc_pkt_ctrl_reg_param (
>      return param;
>  }
>  
> +STATIC
> +void
> +ogma_pre_init_microengine (
> +  ogma_handle_t ogma_handle
> +  )
> +{
> +  UINT16 Data;
> +
> +  /* Remove dormant settings */
> +  Data = ogma_get_phy_reg (ogma_handle, OGMA_PHY_REG_ADDR_CONTROL) &
> +    ~((1U << OGMA_PHY_CONTROL_REG_POWER_DOWN) |
> +      (1U << OGMA_PHY_CONTROL_REG_ISOLATE));

I am unsure of how much we should try to adhere to TianoCore coding
style in this imported module, but the above does not look correct
regardless. Should not the second/third lines should be aligned
relative to the ogma_get_phy_reg call rather than the variable name...

> +
> +  ogma_set_phy_reg (ogma_handle, OGMA_PHY_REG_ADDR_CONTROL, Data);
> +
> +  while ((ogma_get_phy_reg (ogma_handle, OGMA_PHY_REG_ADDR_CONTROL) &
> +          ((1U << OGMA_PHY_CONTROL_REG_POWER_DOWN) |
> +           (1U << OGMA_PHY_CONTROL_REG_ISOLATE))) != 0);

...like it is here.

> +
> +  /* Put phy in loopback mode to guarantee RXCLK input */
> +  Data |= (1U << OGMA_PHY_CONTROL_REG_LOOPBACK);
> +  
> +  ogma_set_phy_reg (ogma_handle, OGMA_PHY_REG_ADDR_CONTROL, Data);
> +
> +  while ((ogma_get_phy_reg (ogma_handle, OGMA_PHY_REG_ADDR_CONTROL) &
> +          (1U << OGMA_PHY_CONTROL_REG_LOOPBACK)) == 0);
> +}
> +
> +STATIC
> +void
> +ogma_post_init_microengine (
> +  IN ogma_handle_t ogma_handle
> +  )
> +{
> +  UINT16 Data;
> +
> +  /* Get phy back to normal operation */
> +  Data = ogma_get_phy_reg (ogma_handle, OGMA_PHY_REG_ADDR_CONTROL) &
> +    ~(1U << OGMA_PHY_CONTROL_REG_LOOPBACK);

Same indentation comment as above.

> +
> +  ogma_set_phy_reg (ogma_handle, OGMA_PHY_REG_ADDR_CONTROL, Data);
> +
> +  while ((ogma_get_phy_reg (ogma_handle, OGMA_PHY_REG_ADDR_CONTROL) &
> +          (1U << OGMA_PHY_CONTROL_REG_LOOPBACK)) != 0);
> +
> +  Data |= (1U << OGMA_PHY_CONTROL_REG_RESET);
> +  
> +  /* Apply software reset */
> +  ogma_set_phy_reg (ogma_handle, OGMA_PHY_REG_ADDR_CONTROL, Data);
> +
> +  while ((ogma_get_phy_reg (ogma_handle, OGMA_PHY_REG_ADDR_CONTROL) &
> +          (1U << OGMA_PHY_CONTROL_REG_RESET)) != 0);
> +}
> +
>  ogma_err_t ogma_init (
>      void *base_addr,
>      pfdep_dev_handle_t dev_handle,
> @@ -551,6 +604,16 @@ ogma_err_t ogma_init (
>      ogma_write_reg( ctrl_p, OGMA_REG_ADDR_DMA_TMR_CTRL,
>                      ( ogma_uint32)( ( OGMA_CONFIG_CLK_HZ / OGMA_CLK_MHZ) - 1) );
>  
> +    /*
> +     * Do pre-initialization tasks for microengine
> +     *
> +     * In particular, we put phy in loopback mode
> +     * in order to make sure RXCLK keeps provided to mac
> +     * irrespective of phy link status,
> +     * which is required for microengine intialization.
> +     */

Good use of comment here, and below.
*But*, if the next thing was not the bit taking the PHY back out of
loopback mode, I would have had to spend time searching for whether
that was done. Could you add a line saying "this will be disabled once
initialization complete"?

/
    Leif

> +    ogma_pre_init_microengine (ctrl_p);
> +
>      /* start microengines */
>      ogma_write_reg( ctrl_p, OGMA_REG_ADDR_DIS_CORE, 0);
>  
> @@ -573,6 +636,13 @@ ogma_err_t ogma_init (
>          goto err;
>      }
>  
> +    /*
> +     * Do post-initialization tasks for microengine
> +     *
> +     * We put phy in normal mode and apply reset.
> +     */
> +    ogma_post_init_microengine (ctrl_p);
> +
>      /* clear microcode load end status */
>      ogma_write_reg( ctrl_p, OGMA_REG_ADDR_TOP_STATUS,
>                      OGMA_TOP_IRQ_REG_ME_START);
> diff --git a/Silicon/Socionext/SynQuacer/Drivers/Net/NetsecDxe/netsec_for_uefi/netsec_sdk/src/ogma_reg.h b/Silicon/Socionext/SynQuacer/Drivers/Net/NetsecDxe/netsec_for_uefi/netsec_sdk/src/ogma_reg.h
> index 30c716352b37..ca769084cb31 100644
> --- a/Silicon/Socionext/SynQuacer/Drivers/Net/NetsecDxe/netsec_for_uefi/netsec_sdk/src/ogma_reg.h
> +++ b/Silicon/Socionext/SynQuacer/Drivers/Net/NetsecDxe/netsec_for_uefi/netsec_sdk/src/ogma_reg.h
> @@ -138,8 +138,12 @@
>  /* bit fields for PHY CONTROL Register */
>  #define OGMA_PHY_CONTROL_REG_SPEED_SELECTION_MSB (6)
>  #define OGMA_PHY_CONTROL_REG_DUPLEX_MODE         (8)
> +#define OGMA_PHY_CONTROL_REG_ISOLATE             (10)
> +#define OGMA_PHY_CONTROL_REG_POWER_DOWN          (11)
>  #define OGMA_PHY_CONTROL_REG_AUTO_NEGO_ENABLE    (12)
>  #define OGMA_PHY_CONTROL_REG_SPEED_SELECTION_LSB (13)
> +#define OGMA_PHY_CONTROL_REG_LOOPBACK            (14)
> +#define OGMA_PHY_CONTROL_REG_RESET               (15)
>  
>  /* bit fields for PHY STATUS Register */
>  #define OGMA_PHY_STATUS_REG_LINK_STATUS       (2)
> -- 
> 2.17.1
> 

-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#44262): https://edk2.groups.io/g/devel/message/44262
Mute This Topic: https://groups.io/mt/32557832/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list