From: "Leif Lindholm" <leif.lindholm@linaro.org>
To: Masahisa Kojima <masahisa.kojima@linaro.org>
Cc: devel@edk2.groups.io, ard.biesheuvel@linaro.org,
okamoto.satoru@socionext.com
Subject: Re: [edk2-platforms PATCH v1 2/3] NetsecDxe: put phy in loopback mode in order to guarantee stable RXCLK input
Date: Tue, 23 Jul 2019 16:49:53 +0100 [thread overview]
Message-ID: <20190723154953.GK11541@bivouac.eciton.net> (raw)
In-Reply-To: <20190722115636.3413-3-masahisa.kojima@linaro.org>
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@linaro.org>
> Signed-off-by: Satoru Okamoto <okamoto.satoru@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
>
next prev parent reply other threads:[~2019-07-23 15:49 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-22 11:56 [edk2-platforms PATCH v1 0/3] Robust Netsec Initialiation Masahisa Kojima
2019-07-22 11:56 ` [edk2-platforms PATCH v1 1/3] NetsecDxe: embed phy address into NETSEC SDK internal structure Masahisa Kojima
2019-07-23 15:41 ` Leif Lindholm
2019-07-22 11:56 ` [edk2-platforms PATCH v1 2/3] NetsecDxe: put phy in loopback mode in order to guarantee stable RXCLK input Masahisa Kojima
2019-07-23 15:49 ` Leif Lindholm [this message]
2019-07-22 11:56 ` [edk2-platforms PATCH v1 3/3] NetsecDxe: SnpInitialize() waits for media linking up Masahisa Kojima
2019-07-23 16:14 ` Leif Lindholm
2019-07-24 6:42 ` Masahisa Kojima
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190723154953.GK11541@bivouac.eciton.net \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox