Re: [PATCH net 2/6] net: stmmac: selftests: Validate EEE based on the actual LPI timer value
From: Maxime Chevallier
Date: Wed Sep 09 2026 - 09:10:33 EST
Hi,
On 9/9/26 13:32, Nicolai Buchwitz wrote:
> Hi Maxime
>
> On 9.9.2026 09:47, Maxime Chevallier wrote:
>> The EEE selftest is a 2-step test :
>> - It validates that we enter in LPI mode with the
>> irq_tx_path_in_lpi_mode_n counter
>> - It then validates that we exit LPI when sending a frame, with the
>> irq_tx_path_exit_lpi_mode_n counter.
>>
>> The current state of the test lacks 2 main things :
>>
>> - We don't know exactly when was the previous frame sent (it's from the
>> previous selftest)
>>
>> - The timeout is hardcoded, while the LPI is entered after a
>> user-configurable delay. On top of that, the timeout loop uses a
>> pre-decrement iterator (--retries) that actually only iterate nine
>> times, so 900ms while the default LPI value is 1 second.
>>
>> Let's therefore make it more deterministic :
>>
>> - Send a frame at the beginning of the test
>> - Wait for more than the lpi timer value, we timeout after about twice
>> the value,
>> - Then send another frame, and verify that we do go out of LPI, also
>> with a timeout.
>>
>> Note that the test's goal isn't to validate the LPI timer value itself,
>> only that we enter/leave LPI mode.
>>
>> Fixes: 091810dbded9 ("net: stmmac: Introduce selftests support")
>> Signed-off-by: Maxime Chevallier <maxime.chevallier@xxxxxxxxxxx>
>> ---
>> .../stmicro/stmmac/stmmac_selftests.c | 33 ++++++++++++++-----
>> 1 file changed, 25 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c
>> index 6503678b646e..4564b9f29194 100644
>> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c
>> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c
>
>> [...]
>
>> - memcpy(initial, &priv->xstats, sizeof(*initial));
>> -
>> + /* Send a frame, then wait to enter LPI */
>> ret = stmmac_test_mac_loopback(priv);
>> if (ret)
>> goto out_free_final;
>>
>> + max_duration = usecs_to_jiffies(2 * priv->tx_lpi_timer);
>> +
>> + memcpy(initial, &priv->xstats, sizeof(*initial));
>
> Is the LPI entry already counted here? AFAIU with tx-lpi-timer=0 on dwmac4 the
> MAC goes directly into LPI after the frame, before stmmac_test_mac_loopback()
> returns. The loop below would time out although LPI is working.
hmmm this is a good point ! I'll test and send a V2 :)
>
> Snapshot before the first frame, and take a second snapshot right before
> the second loopback for the exit check?
>
>> [...]
>
>> + memcpy(final, &priv->xstats, sizeof(*final));
>> if (final->irq_tx_path_exit_lpi_mode_n <=
>> initial->irq_tx_path_exit_lpi_mode_n) {
>> ret = -EINVAL;
>
> nit: -ETIMEDOUT here as well, to match the entry check?
This is the old behaviour, if we don't entry we timeout, if we did enter but
don't record an exit event this is an error, it kinda makes sense to me no ?
Thanks for looking at this,
Maxime