We designed a custom board with reference design of Vedin Dev board. We are not using GPIO port expander to power second Ethernet port and we are using KSZ9893 switch with RGMII and tow Ethernet ports as we want to support daisy chaining on our product.
Following other threads on communication I am able to change regulator for ethernet switch to always enable and bypass port expander.
I updated fec node on device tree and Kernel can now see two Ethenet ports. But on RGMII port I am not able to do any communication and no ip address is assigned to it.
Here is my my fec node
/* Verdin ETH_2_RGMII */
&fec {
fsl,magic-packet;
#address-cells = <1>;
#size-cells = <0>;
phy-mode = “rgmii”;
pinctrl-names = “default”, “sleep”;
pinctrl-0 = <&pinctrl_fec>;
pinctrl-1 = <&pinctrl_fec_sleep>;
status = “okay”;
fixed-link {
speed = <100>;
full-duplex;
pause;
};
verdin_eth2_mdio: mdio {
#address-cells = <1>;
#size-cells = <0>;
switch0: switch@0 {
compatible = "microchip,ksz9893";
reg = <0>;
dsa,member = <0 0>; // one switch, CPU port 0
ports {
#address-cells = <1>;
#size-cells = <0>;
switch0port0: port@0 {
reg = <0>;
label = "cpu";
ethernet = <&fec>;
phy-mode = "rgmii-id";
};
switch0port1: port@1 {
reg = <1>;
label = "lan1";
};
switch0port2: port@2 {
reg = <2>;
label = "lan2";
};
};
};
};
};
Also in boot messages I see
Could not get PHY for FEC1: addr 7
Could not get PHY for mdio: addr 7
Hi, I’m the Toradex AI Assistant.
I might make mistakes. Our support team will step in if needed. If I answered your question, please tick the “Solution” checkbox. For follow-up questions to me, please use @ToradexAI in your post.
Did you like my answer?

Hello! Thank you for your detailed explanation and for sharing your device tree configuration. It’s great that the kernel can see two Ethernet ports now. Let’s troubleshoot the RGMII port not working and the PHY errors.
Key Observations
Troubleshooting Steps
1. RGMII pin configuration
The CPU’s FEC interface (i.MX8MP) must be configured for RGMII.
- Check pinctrl settings: Make sure your
pinctrl_fec
matches the RGMII signals actually routed between the SoC and the KSZ9893.
- Double-check that there are no mismatches or missing lines.
- Reference:
Device Tree Overview
2. RGMII Fixed-Link & PHY Configuration
-
If you’re using a fixed-link, make sure the switch’s CPU port (RGMII-to-SoC) and the FEC node both match in speed and mode.
-
In your fixed-link
:
fixed-link {
speed = <100>;
full-duplex;
pause;
};
This sets the FEC-to-switch link at 100Mbps. If your connection is 1G, change speed to <1000>
.
-
For the KSZ9893 as a DSA switch, you usually don’t need a separate PHY handled by the FEC interface. The DSA framework makes the CPU port act as a fixed link.
3. Check your switch’s CPU port node
In your switch0: switch@0
node, you specify:
switch0port0: port@0 {
reg = <0>;
label = "cpu";
ethernet = <&fec>;
phy-mode = "rgmii-id";
};
- Confirm
phy-mode
matches the hardware connection and the FEC’s phy-mode
.
- Use
"rgmii"
for no delays, "rgmii-id"
for internal delay, or "rgmii-txid"
/"rgmii-rxid"
as needed (consult KSZ9893 datasheet and your PCB design).
4. Addressing the “addr 7” error
You see:
Could not get PHY for FEC1: addr 7
- This often means the kernel tries to probe for a PHY at MDIO address 7 but does not find one.
- Since you’re using a switch (not a discrete PHY for the CPU port), set
phy-handle = <&switch0port0>;
or define things as a fixed-link (what you are doing), making sure there’s no phy-handle
pointing to a non-existent external PHY.
- In some SoCs, you may need to add
phy-handle
property to tell the kernel which port is the CPU (see DSA documentation).
5. Test Without fixed-link
Since the DSA switch should manage the CPU connection, sometimes you do not need to declare fixed-link
under &fec
. Try removing the fixed-link
property and see if the DSA framework attaches the CPU port correctly.
6. Bring-up and Test Interfaces
- Check with
ip link
and dmesg
after boot. Are two interfaces (like br0
, lan1
, lan2
) created?
- Assign static IPs to test basic traffic, in case DHCP is not getting replies.
Example Switch Section (for DSA)
Here’s a common pattern for KSZ switches (edit for your board and required addresses):
&fec {
phy-mode = "rgmii";
pinctrl-names = "default", "sleep";
pinctrl-0 = <&pinctrl_fec>;
pinctrl-1 = <&pinctrl_fec_sleep>;
status = "okay";
mdio {
#address-cells = <1>;
#size-cells = <0>;
switch0: ksz9893@0 {
compatible = "microchip,ksz9893";
reg = <0>;
dsa,member = <0 0>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
label = "cpu";
ethernet = <&fec>;
phy-mode = "rgmii-id";
/* No phy-handle here for switch CPU port */
};
port@1 {
reg = <1>;
label = "lan1";
};
port@2 {
reg = <2>;
label = "lan2";
};
};
};
};
};
(Note: Remove fixed-link
if handled by DSA.)
References
Could you share:
- Your actual
pinctrl_fec
settings,
- If possible, your full
dmesg
log related to FEC/KSZ9893.
This will help guide you further.
Best regards,
Toradex AI Assistant.
This is tdx-info
Software summary
Bootloader: U-Boot
Kernel version: 6.6.84-7.2.0-devel-g87bfb710b6f1 #1-Torizon SMP PREEMPT Mon Mar 31 08:47:48 UTC 2025
Kernel command line: root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3 ostree=/ostree/boot.1/torizon/bb952284426e353c99a2c275bf8e500a1630db81baf0883f7fb8cf005dd8b462/0
Distro name: NAME=“Torizon OS”
Distro version: VERSION_ID=7.2.0-devel-20250521192050-build.0
Distro variant: VARIANT=“Docker”
Hostname: verdin-imx8mp-15128194
Hardware info
HW model: Toradex Verdin iMX8M Plus WB on Verdin Development Board
Toradex version: 0064 V1.1A
Serial number: 15128194
Processor arch: aarch64
I compile dtb file with suggested switch setting in dts file but device keep restarting. Here is the log
U-Boot SPL 2024.07-7.2.0-devel+git.3f772959501c (Jan 01 1970 - 00:00:00 +0000)
Training FAILED
DDR configured as single rank
SEC0: RNG instantiated
Normal Boot
WDT: Started watchdog@30280000 with servicing every 1000ms (60s timeout)
Trying to boot from BOOTROM
Boot Stage: Primary boot
Find img info 0x4802f000, size 1068
Need continue download 1024
NOTICE: Do not release JR0 to NS as it can be used by HAB
NOTICE: BL31: v2.10.0 (release):lf-6.6.52-2.2.0-dirty
NOTICE: BL31: Built : 00:00:00, Jan 1 1970
U-Boot 2024.07-7.2.0-devel+git.3f772959501c (Jan 01 1970 - 00:00:00 +0000)
CPU: Freescale i.MX8MP[6] rev1.1 1600 MHz (running at 1200 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 62C
Reset cause: POR
DRAM: 2 GiB
Core: 176 devices, 31 uclasses, devicetree: separate
WDT: Started watchdog@30280000 with servicing every 1000ms (60s timeout)
MMC: FSL_SDHC: 1, FSL_SDHC: 2
Loading Environment from MMC... Reading from MMC(2)... OK
get_tdx_eeprom: cannot find EEPROM by node
MISSING TORADEX CARRIER CONFIG BLOCKS
get_tdx_eeprom: cannot find EEPROM by node
In: serial@30880000
Out: serial@30880000
Err: serial@30880000
Model: Toradex 0064 Verdin iMX8M Plus Quad 2GB WB IT V1.1A
Serial#: 15128194
SEC0: RNG instantiated
Net: Could not get PHY for mdio: addr 7
Could not get PHY for FEC1: addr 7
Could not get PHY for mdio: addr 7
Could not get PHY for FEC1: addr 7
eth0: ethernet@30bf0000 [PRIME]
Hit any key to stop autoboot: 0
Card did not respond to voltage select! : -110
switch to partitions #0, OK
mmc2(part 0) is current device
Scanning mmc 2:1...
Found U-Boot script /boot.scr
969 bytes read in 1 ms (946.3 KiB/s)
## Executing script at 50280000
7056 bytes read in 2 ms (3.4 MiB/s)
87860 bytes read in 2 ms (41.9 MiB/s)
14 bytes read in 1 ms (13.7 KiB/s)
Working FDT set to 50200000
11459569 bytes read in 39 ms (280.2 MiB/s)
13131288 bytes read in 45 ms (278.3 MiB/s)
Uncompressing Kernel Image to 0
## Flattened Device Tree blob at 50200000
Booting using the fdt blob at 0x50200000
Working FDT set to 50200000
Loading Device Tree to 00000000beaa0000, end 00000000bead8fff ... OK
Working FDT set to beaa0000
Modify /vipsi@38500000:status disabled
Starting kernel ...
[ 1.006198] imx-drm display-subsystem: no available port
[ 1.115482] pca953x 3-0021: failed writing register
Starting systemd-udevd version 255.17^
sysroot.readonly configuration value: 0 (fs writable: 1)
Using legacy ostree bind mount for /
[ 6.770695] ina2xx 3-0040: error configuring the device: -6
[ 6.786409] nau8822 3-001a: Failed to issue reset: -6
[ 6.933204] imx-bus-devfreq 32700000.interconnect: failed to fetch clk: -2
[ 6.980336] fsl-aud2htx 30cb0000.aud2htx: failed to pcm register
[ 7.236820] Unable to handle kernel paging request at virtual address 00000009024f11a0
[ 7.244742] Mem abort info:
[ 7.247536] ESR = 0x0000000096000005
[ 7.251287] EC = 0x25: DABT (current EL), IL = 32 bits
[ 7.256602] SET = 0, FnV = 0
[ 7.259655] EA = 0, S1PTW = 0
[ 7.259657] FSC = 0x05: level 1 translation fault
[ 7.259660] Data abort info:
[ 7.259661] ISV = 0, ISS = 0x00000005, ISS2 = 0x00000000
[ 7.259664] CM = 0, WnR = 0, TnD = 0, TagAccess = 0
[ 7.281086] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
[ 7.286400] user pgtable: 4k pages, 39-bit VAs, pgdp=0000000041768000
[ 7.292851] [00000009024f11a0] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000
[ 7.301565] Internal error: Oops: 0000000096000005 [#1] PREEMPT SMP
[ 7.307836] Modules linked in: sha1_ce fsl_imx8_ddr_perf phy_fsl_imx8mq_usb snd_soc_imx_hdmi snd_soc_fsl_sai mwifiex_sdio mwifiex ksz9477_i2c snd_soc_fsl_utils ksz_switch snd_soc_fsl_aud2htx phy_fsl_imx8m_pcie imx_pcm_dma dsa_core bridge stp llc imx_bus dwc3_imx8mp hci_uart btqca btbcm imx_sdma btintel spi_nxp_fspi ti_ads1015 industrialio_triggered_buffer kfifo_buf ina2xx industrialio lm75 snd_soc_nau8822 fsl_jr_uio flexcan can_dev spi_imx imx8mm_thermal nvmem_snvs_lpgpr cfg80211 uio_pdrv_genirq uio openvswitch nsh nf_conncount nf_nat libcomposite galcore(O) fuse nfnetlink lontium_lt8912b ti_sn65dsi83 sec_mipi_dsim_imx display_connector sec_dsim
[ 7.365135] CPU: 2 PID: 553 Comm: NetworkManager Tainted: G W O 6.6.84-7.2.0-devel-g87bfb710b6f1 #1-Torizon
[ 7.376094] Hardware name: Toradex Verdin iMX8M Plus WB on Verdin Development Board (DT)
[ 7.384185] pstate: 000000c5 (nzcv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 7.391153] pc : string+0x54/0x12c
[ 7.394567] lr : vsnprintf+0x278/0x6e0
[ 7.398322] sp : ffffffc082bd3000
[ 7.401636] x29: ffffffc082bd3000 x28: ffffffc0814cd616 x27: 00000000ffffffd0
[ 7.408781] x26: ffffffc082bd3340 x25: 0000000000000008 x24: ffffffc082bd3340
[ 7.415927] x23: ffffffc082bd3130 x22: ffffffc082bd3138 x21: 0000000000000002
[ 7.423072] x20: ffffffc082bd313c x19: ffffffc0814cd616 x18: fffffffffffc9680
[ 7.430217] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000030
[ 7.437362] x14: fffffffffffc96b0 x13: ffffffc0819f2ba8 x12: 0000000000000684
[ 7.444505] x11: 000000000000022c x10: ffffffc081aa2ba8 x9 : ffffffc082bd3340
[ 7.451648] x8 : ffffffc082bd3340 x7 : 00000000ffffffff x6 : ffffffc082bd3138
[ 7.458795] x5 : 0000000000000000 x4 : ffffffffffffffff x3 : ffff0a00ffffff04
[ 7.465941] x2 : 00000009024f11a0 x1 : 0000000000000000 x0 : ffffffc082bd313c
[ 7.473084] Call trace:
[ 7.475532] string+0x54/0x12c
[ 7.478594] vsnprintf+0x278/0x6e0
[ 7.482001] vprintk_store+0x154/0x448
[ 7.485757] vprintk_emit+0x10c/0x2cc
[ 7.489424] vprintk_default+0x38/0x44
[ 7.493179] vprintk+0xbc/0xd0
[ 7.496239] __warn_printk+0x160/0x1cc
[ 7.499992] kobject_put+0xf0/0x220
[ 7.503487] klist_children_put+0x18/0x28
[ 7.507501] klist_put+0xb0/0xf0
[ 7.510737] klist_del+0x14/0x20
[ 7.513969] device_del+0xac/0x3cc
[ 7.517375] device_unregister+0x20/0x74
[ 7.521302] wakeup_source_sysfs_remove+0x14/0x20
[ 7.526011] wakeup_source_unregister.part.0+0x28/0x6c
[ 7.531158] device_set_wakeup_enable+0x60/0x84
[ 7.535693] fec_enet_open+0x370/0x544
[ 7.539447] __dev_open+0x100/0x1d8
[ 7.542940] __dev_change_flags+0x194/0x20c
[ 7.547127] dev_change_flags+0x24/0x6c
[ 7.550968] do_setlink+0x27c/0xeb0
[ 7.554463] __rtnl_newlink+0x520/0x88c
[ 7.558318] rtnl_newlink+0x50/0x7c
[ 7.561820] rtnetlink_rcv_msg+0x128/0x370
[ 7.565922] netlink_rcv_skb+0x60/0x130
[ 7.569768] rtnetlink_rcv+0x18/0x24
[ 7.573349] netlink_unicast+0x2fc/0x364
[ 7.577279] netlink_sendmsg+0x194/0x3fc
[ 7.581212] ____sys_sendmsg+0x124/0x278
[ 7.585139] ___sys_sendmsg+0xb0/0xfc
[ 7.588806] __sys_sendmsg+0x78/0xd0
[ 7.592389] __arm64_sys_sendmsg+0x24/0x30
[ 7.596492] invoke_syscall.constprop.0+0x50/0xec
[ 7.601203] do_el0_svc+0x40/0xc8
[ 7.604524] el0_svc+0x40/0x12c
[ 7.607670] el0t_64_sync_handler+0x120/0x12c
[ 7.612031] el0t_64_sync+0x190/0x194
[ 7.615701] Code: 91000400 eb07003f 54000560 aa0103e5 (38656844)
[ 7.621797] ---[ end trace 0000000000000000 ]---
[ 7.626417] Kernel panic - not syncing: Oops: Fatal exception
[ 7.632165] SMP: stopping secondary CPUs
[ 7.636093] Kernel Offset: disabled
[ 7.639583] CPU features: 0x0,00000000,00020000,1000420b
[ 7.644897] Memory Limit: none
[ 7.647955] Rebooting in 5 seconds..
Also, in the boot it always prints these lines even though I have not put FEC at mdio 7
U-Boot 2024.07-7.2.0-devel+git.3f772959501c (Jan 01 1970 - 00:00:00 +0000)
CPU: Freescale i.MX8MP[6] rev1.1 1600 MHz (running at 1200 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 47C
Reset cause: POR
DRAM: 2 GiB
Core: 176 devices, 31 uclasses, devicetree: separate
WDT: Started watchdog@30280000 with servicing every 1000ms (60s timeout)
MMC: FSL_SDHC: 1, FSL_SDHC: 2
Loading Environment from MMC... Reading from MMC(2)... OK
get_tdx_eeprom: cannot find EEPROM by node
MISSING TORADEX CARRIER CONFIG BLOCKS
get_tdx_eeprom: cannot find EEPROM by node
In: serial@30880000
Out: serial@30880000
Err: serial@30880000
Model: Toradex 0064 Verdin iMX8M Plus Quad 2GB WB IT V1.1A
Serial#: 15128194
SEC0: RNG instantiated
Net: Could not get PHY for mdio: addr 7
Could not get PHY for FEC1: addr 7
Could not get PHY for mdio: addr 7
Could not get PHY for FEC1: addr 7
eth0: ethernet@30bf0000 [PRIME]
Hit any key to stop autoboot: 0
Card did not respond to voltage select! : -110
switch to partitions #0, OK
mmc2(part 0) is current device