Skip to content

Add STM32H7 Ethernet support with lwIP - #1373

Open
WasabiFan wants to merge 39 commits into
modm-io:developfrom
WasabiFan:h7-lwip-ethernet
Open

Add STM32H7 Ethernet support with lwIP#1373
WasabiFan wants to merge 39 commits into
modm-io:developfrom
WasabiFan:h7-lwip-ethernet

Conversation

@WasabiFan

Copy link
Copy Markdown
Contributor

This PR adds STM32H7 Ethernet support. The approach taken here is:

  • Refactor the LAN8720a PHY driver/register definitions into a generic LAN87xx base with initialization/basic operations implemented. Add the LAN8742a PHY, which is the one on the H7 boards I've tested with. They are functionally identical as far as I can tell aside from the device ID. I structured the base so it calls into a MAC-specific MDIO implementation.
  • Add an H7 MAC driver. This implements rings of RX/TX DMA descriptors with the usual management/orchestration/error handling. I took some creative license to define an API here for zero-copy TX/RX that minimizes the chances of mis-use with an RAII guard in addition to a copying API, happy to take feedback on it. I thought this would matter more, but lwIP's buffer structure wasn't flexible enough to get much of a perf benefit from it.
  • Import the partial lwIP repo as a submodule, add a corresponding lbuild module, and add the basic config headers/system API thunks to make it happy. I only enabled/implemented IPv4, ICMP, UDP, and TCP, and only enabled the raw API.
  • Add a LwipEthernet class which glues lwIP to the MAC driver and PHY driver. The caller still directly invokes lwIP for sending/receiving data but this handles the initialization and periodic servicing. The servicing poll routines are intended to be called from a fiber.

For the moment, I left the F4/F7 driver intact aside from some renames and a bugfix per reading the PHY datasheet. It's not tested/validated and no new functionality was added. I just got an F7 Nucleo so if I have some time I might implement the MAC driver layer required to use lwIP with the older STM32s. I also didn't implement support for FreeRTOS to use the H7 Ethernet MAC. So FreeRTOS only supports F4/F7 and lwIP only supports H7.

The PR is intended to be reviewed in individual commits and merged without squashing.

Notes:

  • I used LLMs during this development. The initial implementation was by hand, but there was a huge amount of tightly curated refactoring and expansion that I did more recently with LLM assistance. The functional implementation is very closely reviewed. The test suite is less rigorously reviewed and probably a bit verbose/over-done. I'll see if I can find some time to go through it closer.
  • I included the recommended workarounds for all documented errata. Some of this added implementation complexity. I don't know how prevalent the impacted revisions are in the wild. If we'd prefer I drop some of the workarounds, let me know.
  • Each of the layers have error/drop counts, tx counts, rx counts, and similar tracked as statistics counters. I was using this for bandwidth testing and confirming no drops. Happy to remove it if it seems gratuitous.
  • This is the first time I've worked with Ethernet. I think I've figured it out pretty well but I don't have much external reference.

All verification was done on an H753 Nucleo. I validated ~94Mbps TCP throughput bidirectional which I think is the right ceiling with framing and such, no packet drops or retransmissions over an extended run. The Ethernet fibers collectively used ~25% of the theoretical CPU time when doing a full bandwidth TCP echo (or 40% if using Newlib Nano, hence the new lbuild option). The error conditions were lightly tested to the extent convenient. Error conditions which are straightforward to emulate in unit/loopback tests do so, but some aren't validated. I haven't physically tested plugging into a link partner that is limited to 10Mbit so that mode is just covered by loopback tests.

Comment thread examples/generic/ethernet_lwip_raw/ethernet_echo.py
Comment thread src/modm/platform/id/stm32/id.hpp.in Outdated
Comment thread ext/lwip/port/single_thread_guard.cpp Outdated
@WasabiFan

Copy link
Copy Markdown
Contributor Author

Note: the loopback HW tests are intermittently failing with a dribble error. It looks similar to the errata 2.26.20 but the CRC failure bit isn't set. Ignoring the error still gives the correct full packet sequence without any drops so I don't know what is going on. Need to investigate more.

@salkinium salkinium left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm very impressed with the structure and cleanliness of this code. Everything is very well committed and easy to understand except for the STM32H7 driver itself. I tried to follow along with the RM, but got bored in the middle. So I will just try and reproduce this on my boards. I also have a custom STM32H5 board from work with the LAN8742A and I think the peripheral is the exact same.

Excellent work!

Comment thread ext/lwip/port/platform.cpp Outdated
Comment thread ext/lwip/port/single_thread_guard.cpp Outdated
Comment thread ext/gcc/module_c.lb Outdated
modm_assert(result, "eth.tx.commit", "Acquired Ethernet transmit commit failed",
static_cast<uintptr_t>(result.error));
MODM_LOG_INFO << "TX acquired sequence=" << sequence << modm::endl;
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isn't modm_assert a bit heavy here? How severe are these failures? Does it warrant abandoning executing entirely?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In a real app I would recommend handling these more gracefully. These calls would fail if the link went down, for example, which is probably not a good reason to crash. I figured it was easier to understand the logic flow if the example used asserts. Is the convention for examples that it should implement recommended error handling patterns instead?

Comment thread src/modm/communication/lwip_ethernet/module.lb Outdated
@WasabiFan

Copy link
Copy Markdown
Contributor Author

Thank you! Is there any high level feedback or guidance you can give on the structure of the H7 driver I might be able to iterate on? I feel the same that it's very dense and the sequences are difficult to follow. There's a mix of different levels of detail (mixing high level re-usable sequences with bit twiddling regs) which I spent a while trying to rearrange. I'm thinking maybe splitting out the DMA descriptor management from MAC state/configuration.

@salkinium

Copy link
Copy Markdown
Member

I think it's just fine, my criticism was more of the general complexity of this peripheral and the futility of trying to review it expertly, but that's to be expected.

Tbh I would wait a little for refactorings until we can add/verify more families. This peripheral is Synopsis IP, so it'll likely show up in several STM32 families, either identically (H5 seems to have no changes at a glance) or with minor changes. Then we can still figure out what the commonalities are.

@salkinium

Copy link
Copy Markdown
Member

Was able to reproduce nucleo_h753zi/ethernet with a (old) NUCLEO-H743ZI board.

I did notice that just leaving the board running without Ethernet plugged in periodically abandons. Is this a bug?

TX copied sequence=38
TX acquired sequence=39
TX copied sequence=40
TX acquired sequence=41
TX copied sequence=42
Assertion 'eth.link' @ 0x00000002 (2) failed!
Abandoning...


Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000002 (2) failed!
Abandoning...

Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000002 (2) failed!
Abandoning...

Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down

@salkinium

Copy link
Copy Markdown
Member

Both examples work on NUCLEO-H743ZI and NUCLEO-H723ZG.

 $ python3 ../../host/ethernet_echo.py 10.66.0.42 --throughput
Ping: ok
UDP echo (1 bytes): ok
UDP echo (64 bytes): ok
UDP echo (512 bytes): ok
UDP echo (1472 bytes): ok
TCP echo (64 KiB): ok
TCP throughput: 94.9 Mbit/s (11.3 MiB/s)
TCP throughput: ok

@salkinium

salkinium commented Aug 9, 2026

Copy link
Copy Markdown
Member

With small fixes the code also works as is on the NUCLEO-H563ZI !

 $ python3 ../../host/ethernet_echo.py 10.66.0.42 --throughput
Ping: ok
UDP echo (1 bytes): ok
UDP echo (64 bytes): ok
UDP echo (512 bytes): ok
UDP echo (1472 bytes): ok
TCP echo (64 KiB): ok
TCP throughput: 94.2 Mbit/s (11.2 MiB/s)
TCP throughput: ok

@salkinium

Copy link
Copy Markdown
Member

I pushed some small fixups to enable Ethernet on NUCLEO-H563ZI, NUCLEO-H743ZI, NUCLEO-H723ZG.

I would move the examples to the generic folder and add these boards to the xml like in the usb example. Then you can also put the Python code in the same folder. I didn't do this to not make your refactorings more annoying.

@WasabiFan

Copy link
Copy Markdown
Contributor Author

Thank you for testing!

Was able to reproduce nucleo_h753zi/ethernet with a (old) NUCLEO-H743ZI board.
[...]
I did notice that just leaving the board running without Ethernet plugged in periodically abandons. Is this a bug?
[...]

To make sure I understand -- at the start of that trace, Ethernet was connected, and then you disconnected it and left it disconnected? Which silicon revision is the chip?

I am not seeing this on my Nucleo-H753. I left it for 10mins unplugged and tried plugging/unplugging and it seemed to handle the link state transitions OK.

"Assertion 'eth.link' @ 0x00000002 (2) failed!" is a MacStopTimeout error (this is my own error type, not an ST error) and it lumps together a bunch of different possible failing checks. It means it detected the link state change from the PHY, began teardown of the MAC DMA, and got stuck somewhere. The Ethernet MAC is buggy as hell, but it's especially bad for revisions Y/W. Circled below are the relevant errata that can cause a hang when you do this procedure. In principle, all the recommended workarounds are implemented in this PR. There's a fair amount of complexity in the driver implementation (including 9 of 10 possible MacStopTimeout origins) attempting to work around these deadlock conditions during the stop sequence.

image

My H753 is revision V, so doesn't have this errata. I have validated the sequence doesn't cause misbehavior in the "happy path" but have no way to validate that the errata workaround actually does what it's designed to do on the affected revisions. Your finding might be telling us that I have a bug in the errata workaround.

There are two efficiency features I have in the driver which expose us to those errata. As a test we can try disabling them and see if the issue goes away.

  1. The OSP mode pipelines packets so the DMA starts for a subsequent packet while the current one is still being processed. This is just for perf. Most of the errata are specific to OSP so we can try disabling it.
  2. I do a TX queue flush on every stop, but strictly speaking it's only required for full duplex -> half duplex transitions. Flushes are also implicated in a few of the errata so we can try disabling those.

I pushed some commits to test here: https://github.com/WasabiFan/modm/commits/h7-ethernet-timeout-debug/ . Try just fff3135 first and see what the logs say, then try adding the following ones.

Tangentially, I am inclined to remove the flush from the stop sequence for real as well. The RM says it gives some perf improvement on stop and the ST implementation does do the flush but it seems like unnecessary complexity, I think I didn't get the perf benefit because I wait for MAC idle anyway, and stop perf is pretty meaningless.

The "Assertion 'eth.phy.link' @ 0x00000002 (2) failed!" is definitely a bug somewhere. That's an MDIO timeout error from Phy::readLinkStatus. I am under the impression that the PHY should always be accessible via MDIO. Printing "link down" means it was able to read from the PHY at least once, but then it failed the next time. I don't see any relevant errata about this. I'd wonder whether the Ethernet clock was miscomputed on this board and is inadvertently glitching. I don't see anything about a minimum time between transactions that we could be violating. Evidently the PHY or the MAC's MDIO interface is in a bad state but I don't have a good guess about why.

Can you check to confirm what frequency the Ethernet clocks are configured for on your board and what the CPU core clock is? Is it in VOS0 or VOS1 scaling mode? I see an errata mentioning VOS0 is broken on H743 revision Y and the max frequency is 400MHz as a result. I wouldn't expect that to exclusively affect Ethernet though.

@WasabiFan

Copy link
Copy Markdown
Contributor Author

Currently the new driver is in platform/eth/stm32h7/, vs. the f4/f7 driver in platform/eth/stm32/. Given this new driver is now validated for H5, should I rename the driver to something else? Linux seems to call the older version of the IP GMAC3 and the newer one is GMAC4. So could perhaps call it stm32gmac4 or something like that.

Apparently the H5 series has some chips using the 4.20 revision (same as H7) and some chips using a 5.40 revision. At a glance I don't see any disruptive differences between those. It seems like it just adds optional features.

@WasabiFan

WasabiFan commented Aug 10, 2026

Copy link
Copy Markdown
Contributor Author

Commits added up until now are fixups covering all the feedback except relocating the examples and lwip API to make it easier to review the incremental changes.

(edited to add) Note that I also added some lwip hosted tests to CI and made a change to the assert module to try to fix a macOS build failure on an earlier push.

WasabiFan and others added 21 commits August 10, 2026 02:30
The assertion struct fields were already aligned but the struct itself was given alignment=1. macOS linker errored because unaligned pointers might break relocation:

    ld: warning: alignment (1) of atom 'lC12' (/Users/runner/work/modm/modm/build/generated-unittest/hosted/scons-release/modm/libmodm.a[39](single_thread_guard.o)) is too small and may result in unaligned pointers
    ld: warning: alignment (1) of atom 'lC13' (/Users/runner/work/modm/modm/build/generated-unittest/hosted/scons-release/modm/libmodm.a[39](single_thread_guard.o)) is too small and may result in unaligned pointers
    ld: pointer not aligned in 'lC13'+0x8 (/Users/runner/work/modm/modm/build/generated-unittest/hosted/scons-release/modm/libmodm.a[39](single_thread_guard.o))
    collect2: error: ld returned 1 exit status
@WasabiFan

WasabiFan commented Aug 10, 2026

Copy link
Copy Markdown
Contributor Author

All feedback should be addressed. I rebased on latest develop but didn't autosquash so the fixups are all still there and can be reviewed incrementally. The code re-orgs are in new fixups next to the old ones.

Open items:

  • Occasional dribble error on H753 for the HW tests
  • Diagnose the periodic abandon on H743 mentioned above
  • Evaluate if there is a refactoring opportunity to improve organization in the MAC driver itself
  • Review asserts in examples, improve error handling if/as requested

@salkinium

Copy link
Copy Markdown
Member

Yes, correct I have rev Y of the STM32H743. It happens sporadically even after a reboot without connecting the cable. But connecting and disconnecting it definitely provokes it faster. Doesn't happen with the other two (H723ZG is rev Z, H563 is rev X).

I switched to VOS1, since the BSP used VOS0, just in case.

On fff3135:

Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Ethernet link update: down -> up 100M full
Link up
TX copied sequence=0
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
TX acquired sequence=1
Ethernet link update: up 100M full -> down
Ethernet MAC stop timeout at static modm::platform::EthernetMac::LinkUpdateError modm::platform::EthernetMac::stop():348: DMACTCR=0x00200010 DMACRCR=0x00200C01 DMADSR=0x00000400 MTLTQOMR=0x0007000A MTLTQDR=0x00000000 MTLRQDR=0x00010010 MACCR=0x0030E002 MACDR=0x00000000
Assertion 'eth.link' @ 0x00000002 (2) failed!
Abandoning...
Breakpoint 2, modm::platform::EthernetMac::stopTimeoutError (location=...)
    at modm/src/modm/platform/eth/eth_impl.hpp:557
(gdb) bt
#0  modm::platform::EthernetMac::stopTimeoutError (location=...)
    at modm/src/modm/platform/eth/eth_impl.hpp:557
#1  0x0800132e in modm::platform::EthernetMac::stop () at modm/src/modm/platform/eth/eth_impl.hpp:357
#2  0x0800182e in modm::platform::EthernetMac::notifyUpdatedLinkStatus (observed=...)
    at modm/src/modm/platform/eth/eth_impl.hpp:675
#3  0x0800222c in main () at main.cpp:152

Disabling OSP didn't help, on b4b651e:

Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Ethernet link update: down -> up 100M full
Link up
TX copied sequence=0
TX acquired sequence=1
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
TX copied sequence=2
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
TX acquired sequence=3
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
TX copied sequence=4
TX acquired sequence=5
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
TX copied sequence=6
TX acquired sequence=7
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
TX copied sequence=8
TX acquired sequence=9
TX copied sequence=10
TX acquired sequence=11
TX copied sequence=12
Ethernet link update: up 100M full -> down
Ethernet MAC stop timeout at static modm::platform::EthernetMac::LinkUpdateError modm::platform::EthernetMac::stop():348: DMACTCR=0x00200000 DMACRCR=0x00200C01 DMADSR=0x00000400 MTLTQOMR=0x0007000A MTLTQDR=0x00000000 MTLRQDR=0x00010010 MACCR=0x0030E002 MACDR=0x00000000
Assertion 'eth.link' @ 0x00000002 (2) failed!
Abandoning...

Disabling stop flush also didn't help. On 28af3dc:

Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Ethernet link update: down -> up 100M full
Link up
TX copied sequence=0
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
TX acquired sequence=1
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
TX copied sequence=2
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
TX acquired sequence=3
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
TX copied sequence=4
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
Ethernet link update: up 100M full -> down
Link down
Ethernet link update: down -> up 100M full
Link up
TX acquired sequence=5
TX copied sequence=6
TX acquired sequence=7
Ethernet link update: up 100M full -> down
Ethernet MAC stop timeout at static modm::platform::EthernetMac::LinkUpdateError modm::platform::EthernetMac::stop():348: DMACTCR=0x00200000 DMACRCR=0x00200C01 DMADSR=0x00000400 MTLTQOMR=0x0007000A MTLTQDR=0x00000000 MTLRQDR=0x00010010 MACCR=0x0030E002 MACDR=0x00000000
Assertion 'eth.link' @ 0x00000002 (2) failed!
Abandoning...

So could perhaps call it stm32gmac4 or something like that.

Yes, I think that's better!

@salkinium salkinium left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice! Much approved.

@WasabiFan

WasabiFan commented Aug 10, 2026

Copy link
Copy Markdown
Contributor Author

Haha ok, it looks like we've probably root-caused one bug and discovered another.

I realize that the bare Ethernet example never handles received frames. It just transmits. The DMADSR value shown says the RX is stalled waiting for an available RX descriptor to save a received frame. Since the example never pops received packets, it can never get un-stuck if all the descriptors are full. I'll look into the stop sequence to figure out how to un-stick the peripheral and can add some RX prints in the example just to make it more complete.

That doesn't explain why we received packets at all if the link was never connected. Additionally, the logs you show have repeated link up/down/up/down. Assuming that isn't you physically disconnecting and reconnecting the cable, it means we are somehow misinterpreting the PHY state, or the PHY is messed up. It's conceivable that the PHY being messed up is generating phantom packets which then also trigger the RX stop hang. I'll have to think about what the best debug step is. I could pass you some prints for all the PHY register reads at least. I'll also improve the example to print the MAC error counters and see if anything there gives us a clue.

Edited to add: I re-tested on my H753 with Ethernet disconnected and didn't see the link state toggling. I'll see if I can provoke it into the same stalled RX state and perhaps that somehow is causing the PHY issue.

@WasabiFan

Copy link
Copy Markdown
Contributor Author

On these newer runs did you eventually see the "eth.phy.link" abandon as well or only the "eth.link" abandon?

@salkinium

Copy link
Copy Markdown
Member

Sorry I was using my Internet connection for this test and plugged and unplugged the cable repeatedly.

@WasabiFan

Copy link
Copy Markdown
Contributor Author

Ahh I see, ok, then maybe the symptom we see there is purely the example not handling RX and your network has some traffic arriving at the board which mine doesn't. Doesn't explain the earlier PHY MDIO timeout though.

I have local changes for the GMAC4 rename, fixing the stall if RX packets are pending, and some example/test improvements. Haven't gotten it fully cleaned up yet but should have some time tomorrow and will push the updates.

@salkinium

salkinium commented Aug 11, 2026

Copy link
Copy Markdown
Member

Yes, good point, I didn't see the difference between eth.link and eth.phy.link asserts.
I did this test again, this time not doing anything at all with the cable.

At both b4b651e and 28af3dc (using VOS1), it still fails after a while. I added a number in the upper nibble of the ethernet::MdioError(uint8_t(error) + 0x10) to figure out which branch was failing, it was always number 1, the first BasicStatus read:

Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000012 (18) failed!
Abandoning...


Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000012 (18) failed!
Abandoning...


Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000012 (18) failed!
Abandoning...


Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000012 (18) failed!
Abandoning...


Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000012 (18) failed!
Abandoning...


Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000012 (18) failed!
Abandoning...


Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000012 (18) failed!
Abandoning...


Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000012 (18) failed!
Abandoning...


Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000012 (18) failed!
Abandoning...


Reboot: STM32H7 raw Ethernet MAC example
MAC A2:70:EA:D8:6A:C2
EtherType 0x88b5
Link down
Assertion 'eth.phy.link' @ 0x00000012 (18) failed!
Abandoning...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Development

Successfully merging this pull request may close these issues.

2 participants