Commit Graph

1642 Commits

Author SHA1 Message Date
Markus Stockhausen
0ab3b047f1 realtek: eth: convert to regmap/msleep
Convert some coding

- from sw() macros to regmap and
- from mdelay() to msleep()

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22853
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-11 12:12:32 +02:00
Markus Stockhausen
f6066e5696 realtek: mdio: convert addr to pn
Make clear that the driver instructs the hardware via a port and
its number. To be consistent with other refactoring swap variable
addr for pn in this case.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22830
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-09 10:46:37 +02:00
Markus Stockhausen
67704c032f realtek: mdio: adapt debug output
Now that the driver drives multiple busses adapt the debug output
from port based to bus/phy based.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22830
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-09 10:46:37 +02:00
Markus Stockhausen
e27ad8b4f6 realtek: mdio: drop dn attribute
The dn attribute was used to register the phys of the mdio bus
individually. With the new multiple busses this is not needed
any longer. Drop it.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22830
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-09 10:46:37 +02:00
Markus Stockhausen
084da38a2e realtek: mdio: activate multiple busses
The mdio controller inside the Realtek switches drives multiple busses.
Until now the driver exposed a flattened single bus (aka port view).
Align to the upstream driver and expose up to 4 busses depending on
the dts definition. For this:

1. Adapt rtmdio_probe() so it calls rtmdio_probe_one() for each child
dts child node that represents a single bus.

2. Adapt rtmdio_probe_one() so it registers a single bus in "full-auto"
mode. No more hacks via fwnode_mdiobus_register_phy() needed.

3. Adapt rtmdio_phy_to_port() so it uses a lookup based on the new
topology.

4. Adapt rtmdio_get_phy_info() for multiple busses.

5. In the DSA driver adapt the mdio controller load check to wait
until all busses have been registered.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22830
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-09 10:46:36 +02:00
Markus Stockhausen
87d5b3f7e6 realtek: mdio: decouple controller setup from bus reset
Some central controller setup is currently realized in the bus reset
functions. As soon as we have multiple busses this coding will be
called multiple times. Rename the reset() functions to setup_ctrl()
and call that only once before the bus probing.

While we are here harmonize the variable for the bus loops and name
it smi_bus.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22830
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-09 10:46:36 +02:00
Markus Stockhausen
56c3f6f2c1 realtek: mdio: derive polling setup from control structure
All configuration helpers have been converted to look at the
control structure. Do the same for setup_polling(). With
this move the call location out of rtmdio_probe_one() into
the parent rtmdio_probe() where it belongs.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22830
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-09 10:46:36 +02:00
Markus Stockhausen
924db12314 realtek: mdio: derive phy info from control structure
For polling setup the driver looks up the atached phy ids with
function rtmdio_get_phy_info(). This derives the data from a
given bus and a port number. While this works for a single bus
the combination of port and bus makes no sense. One is the global
view the other the bus individual view. Change the signature so
the lookup is done globally via ctrl/port.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22830
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-09 10:46:36 +02:00
Markus Stockhausen
fafe10fd25 realtek: mdio: provide bidirectional bus lookup
Add two attributes to the central control and the channel structure.

chan->smi_bus: The index of the selected channel.
ctrl->bus[].mii_bus: Links to all busses

With this ctrl/chan can lookup each others data more easily.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22830
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-09 10:46:36 +02:00
Markus Stockhausen
c635df7030 realtek: mdio: rename for_each_phy() to for_each_port()
Currently phy and port are basically the same. One bus and each
port has a phy assigned. In the future the driver will make use
of multiple busses. Each of them will have a distinct set of
phys.

To make the iterators clearer use "port" for macros when the
driver must access the hardware independent from the bus. In this
case use "pn" (aka port number) as an iterator variable.

No functional changes.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22830
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-09 10:46:36 +02:00
Damien Dejean
c99a30668d realtek: add RTL8224 initialization to Realtek driver
Adds an initialization sequence for the RTL8224. It relies a lot on magic
values, however it explicitely initializes the SerDes part of the chip.

Signed-off-by: Damien Dejean <dam.dejean@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22609
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-08 18:46:32 +02:00
Jonas Jelonek
03002d456a realtek: pcs: rtl930x: enable USXGMII-QX configuration
The RTL8224 driver now puts the PHY into the proper mode, but the SerDes
side is still missing. It was deactivated due to a known regression.
Thus, allow USXGMII-QX configuration since both sides should be properly
configured now.

Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22609
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-08 18:46:32 +02:00
Mieczyslaw Nalewaj
3e42e349d4
treewide: strip trailing whitespace
Strip trailing whitespace in all code:
find . -type f | grep "\.c$" | xargs sed -i 's/[ \t]\+$//'
find . -type f | grep "\.h$" | xargs sed -i 's/[ \t]\+$//'
find . -type f | grep "\.dts$" | xargs sed -i 's/[ \t]\+$//'
find . -type f | grep "\.dtsi$" | xargs sed -i 's/[ \t]\+$//'

Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com>
Link: https://github.com/openwrt/openwrt/pull/22840
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
2026-04-08 10:05:53 +02:00
Markus Stockhausen
7f94645fef realtek: dsa: drop priv->id
There is only one check left for that attribute in rtldsa_port_mdb_add().
Split the consumer into device specific implementations and remove the
attribute from the private structure.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22794
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-07 10:14:52 +02:00
Markus Stockhausen
1aedb2af54 realtek: dsa: drop soc_info usage
The soc_info structure should only be used in the mach setup
functions. Drop its usage in the dsa qos functions. Instead
derive the data from the das private structure.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22794
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-07 10:14:52 +02:00
Markus Stockhausen
8bfb2b4b3f realtek: dsa: fix ingress priority setter
There are two issues with the current setter.

- It is only called for RTL839x
- It unconditionally overwrites the register and not only
  the needed bits.

Fix that by renaming it to the right prefix and using a
register write based on mask.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22794
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-07 10:14:52 +02:00
Markus Stockhausen
83d5eaa50d realtek: dsa: remove family check from priority settings
Split the existing generic priority setters with family
checks into two dedicated paths.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22794
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-07 10:14:52 +02:00
Markus Stockhausen
ad087c20b8 realtek: dsa: drop dsa builtin mdio bus
For a long time the dsa driver has been providing a builtin mdio bus
via dsa default attribute user_mii_bus. This simply uses read/write
commands from the standard realtek otto bus (aka parent). The reason
has always been unclear.

Looking around the kernel 6.18 codebase there is only one case where
this is really needed. The only consumer is dsa_user_phy_setup().

ret = phylink_of_phy_connect(dp->pl, port_dn, phy_flags);
if (ret == -ENODEV && ds->user_mii_bus) {
	/* We could not connect to a designated PHY or SFP, so try to
	 * use the switch internal MDIO bus instead
	 */
	ret = dsa_user_phy_connect(user_dev, dp->index, phy_flags);
}

Luckily the phylink_of_phy_connect() works fine and the internal bus
access is not needed at all. No need to keep the bus alive. Drop it.

While we are here fix the error handling issue of this code

if (!of_device_is_available(dn))
	ret = -ENODEV;

Returncode was set to error but never handed back to the caller.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22799
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-07 10:14:01 +02:00
Markus Stockhausen
3ef3fb9db9 realtek: mdio: add phy to port lookup
The Realtek mdio bus operations are based on the port number. As
of now the driver exposes a single bus with a 1:1 mapping between
phy and port. This will change in the future when the driver
exposes multiple busses. This will need a mapping - e.g.

- bus 0, phy 23 -> read/write port 23
- bus 1, phy 0 -> read/write port 24

Provide a rtmdio_phy_to_port() indirection function that will
lookup the port number based on a bus and a phy. For now it
will only run some basic sanity checks and return the given
input address (because of 1:1 mapping).

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22731
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-06 11:24:23 +02:00
Markus Stockhausen
15de91f1e9 realtek: mdio: add mutex for multiple busses
When the mdio driver gets enhanced for multiple busses it must
snchronize reads/writes to the single controller. Add a lock
to the control structure and guard the critical operations.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22731
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-06 11:24:23 +02:00
Markus Stockhausen
063223da70 realtek: eth: convert set_rx_mode() to regmap
Make use of regmap in all device specific set_rx_mode() functions.
Adapt the constant prefixes to the rest of the driver. While we
are here:

- align the RTL931x function name with the other targets
- replace constants with GENMASK()
- use new lowercase style for hexadecimal values

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22757
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-06 11:23:17 +02:00
Markus Stockhausen
99a0cf9c44 realtek: eth: introduce regmap
The ethernet driver currently uses the legacy sw() macros. Add a
regmap to the driver that is derived from the parent mfd (like in
the mdio drivers). As a first consumer make use of that in the IRQ
functions.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22757
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-06 11:23:17 +02:00
Shiji Yang
6c3c959b1b kernel: 6.18: move CONFIG_CRYPTO_LIB_SHA256 to generic
This symbol is selected by CONFIG_BPF, which was already enabled
on generic config-6.18.

Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
Link: https://github.com/openwrt/openwrt/pull/22730
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-04-06 01:38:41 +02:00
Shiji Yang
c3109a565c kernel: 6.12: move CONFIG_CRYPTO_LIB_SHA1 to generic
This symbol is selected by CONFIG_BPF, which was already enabled
on generic config-6.12.

Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
Link: https://github.com/openwrt/openwrt/pull/22730
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-04-06 01:38:41 +02:00
Shiji Yang
499886de05 kernel: enable CRYPTO_RNG2 and CRYPTO_SIG2 by default
These two symbols are selected by CONFIG_CRYPTO_MANAGER2[1-2], which
was already enabled on generic config-{6.12,6.18}.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-6.6.y&id=fb28fabfad332a731423ffdd2be122b73ea90f1e
[2] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-6.6.y&id=6cb8815f41a966b217c0d9826c592254d72dcc31
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
Link: https://github.com/openwrt/openwrt/pull/22730
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-04-06 01:38:41 +02:00
Shiji Yang
ac0cb87a45 kernel: 6.18: move CONFIG_PAGE_BLOCK_MAX_ORDER to subtargets
This symbol depends on the specific CPU type, so we should not
set it globally.

Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
Link: https://github.com/openwrt/openwrt/pull/22730
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-04-06 01:38:41 +02:00
Sander Vanheule
0d769903dd realtek: Indicate that RTL8231 LED ops can sleep
The RTL8231 LED driver is using the .brightness_set op, which according
to the documentation should not sleep. Since the RTL8231 is controlled
via an MDIO bus, this is not the case.

When using a non-offloaded LED driver such as netdev, this may currently
trigger kernel warnings:
    WARNING: CPU: 0 PID: 14 at kernel/time/timer.c:1754 call_timer_fn.isra.0+0x84/0x8c
    timer: led_timer_function+0x0/0x1d8 preempt leak: 00000100 -> 00000000

Switch to the .brightness_set_blocking op to indicate the operation
might sleep.

Fixes: 6ef6014887 ("realtek: Add pinctrl support for RTL8231")
Signed-off-by: Sander Vanheule <sander@svanheule.net>
2026-04-06 00:03:25 +02:00
Markus Stockhausen
361c1107cb realtek: eth: merge decode_tag() for RTL93xx
rteth_930x_decode_tag() and rteth_931x_decode_tag() are basically
the same. The only difference is the port bitmask. Luckily on the
RTL930x devices the unused fifth bit is always zero and the mask
can be aligned with RTL931x. Take over the RTL931x reason debugging
for both targets.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22717
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-05 11:28:51 +02:00
Markus Stockhausen
bff6b3f2d0 realtek: dts: convert D-Link DGS-1250-28X to PHY_C22()
Use the new PHY_C22() macro for this RTL9301 device.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22721
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-05 11:28:14 +02:00
Jonas Jelonek
0f5015fc5e realtek: pcs: rtl931x: set SerDes to off early
Set the SerDes mode to OFF early in the setup process to have a clear
starting point. This was part of the media handling before as a leftover
from the SDK code import. In the SDK, this function didn't only care
about applying some media settings but was also some kind of mode
setting for fiber modes.

Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22786
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-05 11:27:06 +02:00
Jonas Jelonek
be10ea16ac realtek: pcs: condense fiber media types
Right now we operate with distinct media types for fiber using different
speeds. This is more of a leftover from the SDK then it really makes
sense design-wise. The set_media function from the SDK did a lot more
than just setting some media-specific parameters. As part of
deconstructing this, also reduce the fiber types to a single media type
and handle the speed-agnostic parts based on the hw_mode for now.

This also drops the check for 100M speed around a block of writes. This
check has it's origin in SDK code where a switch statement just didn't
handle this case. However, the rest of the SDK doesn't handle this case
either. While the explicit 100M support isn't verified yet, there's no
need to keep that check.

Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22786
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-05 11:27:06 +02:00
Jonas Jelonek
7c7058b66b realtek: pcs: collapse DAC media types
So far we had separate media types for different DAC cable lengths,
equal to how the SDK defines them. However, this seems overengineered.
The types '_50CM' and '_100CM' are always treated equally, same for
'_300CM' and '_500CM'. Not only in the RTL931x code, but also the
RTL930x code usually just makes a distinction between short and long.
Thus, make that a bit cleaner by reducing the DAC type set to '_SHORT'
and '_LONG' with DAC cables < 3m being considered short and those with
>= 3m being considered as long.

Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22786
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-05 11:27:06 +02:00
Jonas Jelonek
beb57dbc6d realtek: pcs: rename port_media to sds_media
The term 'port media' was chosen due to how the code taken from the SDK
was organized. However, the SDK does a pretty good job at intermixing a
lot of things which cause confusion in the end. This also applies to the
media settings. To be correct, we do not really have port awareness in
the PCS driver (and probably shouldn't have) so we do not really deal
with a port's media. Instead, we set settings depending on what is
attached to the SerDes itself.

To fix this confusion, rename the enum, its fields and all usage from
'port_media' to 'sds_media'.

Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22786
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-05 11:27:06 +02:00
Markus Stockhausen
8ea46952d6 realtek: dsa: common MSTI initialization
The dsa probing currently disable multiple spanning tree for RTL93xx
and keeps the bootloader setup for RTL83xx untouched. Additionally it
does this by checking for the family id. Refactor this to a common
"disable msti" setup.

To make it clear: From now on RTL83xx will also run in MSTI disabled
state. Tested on Linksys LGS310C.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22749
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-04-04 20:09:26 +02:00
Markus Stockhausen
e745ee3f13 realtek: dsa: move n_mst/l2_bucket_size out of family check
Another two variables that are not part of the runtime but the
configuration structure. Move them around.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22749
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-04-04 20:09:26 +02:00
Markus Stockhausen
e7738904d8 realtek: dsa: remove num_lag_ids from family check
num_lag_ids is a device specific constant and must therefore
live in the configuration structure. Avoid dynamic assignment.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22749
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-04-04 20:09:26 +02:00
Markus Stockhausen
a3442aa95c realtek: dsa: remove ops structures from family check
dsa_switch_ops and phylink_mac_ops do not need to be assigned
by a family check. Instead they can be directly linked in the
configuration structure.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22749
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-04-04 20:09:26 +02:00
Hal Martin
45a7dd5547 realtek: fixup Datto L8 device tree
ports should be ethernet-ports, otherwise initialising ethernet
ports fails on 6.18 testing kernel.

Signed-off-by: Hal Martin <hal.martin@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22764
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-03 20:34:00 +02:00
Rustam Adilov
39b31b31f5 realtek: i2c: rtl9300: backport rtl9607c i2c support and speed patches
The [1] patch and [2] patch series has been accepted by upstream linux so
backport them to OpenWrt.

Patch from [1] adds 50 kHz and 2.5 MHz bus speeds.
Patch series from [2] adds support for RTL9607C i2c controller.

[1] - https://lore.kernel.org/linux-i2c/20260227111134.2163701-1-jan-kernel@kantert.net/
[2] - https://lore.kernel.org/linux-i2c/20260401180648.337834-1-adilov@disroot.org/

Signed-off-by: Rustam Adilov <adilov@tutamail.com>
Link: https://github.com/openwrt/openwrt/pull/22663
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-04-03 18:43:11 +02:00
Markus Stockhausen
406a5d35e0 realtek: refresh patches
Builders are currently complaining. Refresh patches. Automatic
update, no manual intervention needed.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22747
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-03 11:10:55 +02:00
Markus Stockhausen
976d946885 realtek: cleanup config-6.18
Some obsolete values made their way into the Realtek config
files. Identified via:

make menuconfig -> choose target -> save -> exit
make kernel_menuconfig -> save -> exit

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22747
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-03 11:10:55 +02:00
Hal Martin
741ac49396 realtek: add support for Datto L8
Add support for Datto L8 with 8 copper ports.
POE+ support with 55W power budget.

Specifications:
---------------

    * SoC: Realtek RTL8380M
    * Flash: 32MiB Flash
    * RAM: 256MiB
    * Ethernet: 8x 10/100/1000 Mbps
    * PoE: 8x
    * Serial: UART 3.3V TTL logic, 115200 8N1
        * pinout: G(ND) R(x) T(x) V(cc)
    * Buttons: 1x Reset, 1x LED Mode (noop in OpenWrt)

Note: OpenWrt combines the stock dual firmware partitions
for more overlay capacity, however the OpenWrt image cannot
exceed 13504k

Installation:
-------------

> When connected to CloudTrax, the local management login will be disabled to prevent settings conflicts.

Ensure the switch does not have a working internet connection or the local
web management interface is disabled.

Go to the web management page of the switch (may require factory reset).
By default the switch will use DHCP to obtain an IP address.

The default login user is `admin` with password `0p3nm3$h!`

On the left menu, click "Management" and then "Dual Image" and ensure that
"Partition 0" is selected as the active partition. If it is not, select
"Partition 0" and click "Apply" to save changes.

Click on "Upgrade" in the top right of the web interface. Select the
Active boot partition to update. Select the OpenWrt file ending
in `-initramfs-kernel.bin` as the update file to upload.

Upload the file and follow the prompts to upgrade the firmware.

Reboot the switch from the web UI after the firmware update is completed.
Wait for OpenWrt to finish booting (~2 minutes)

Use SSH or the Luci UI (if available) to perform the sysupgrade.

Copy the sysupgrade file ending in `-squashfs-sysupgrade.bin` to the switch:
```
scp -O openwrt-realtek-rtl838x-datto_l8-squashfs-sysupgrade.bin root@192.168.1.1:/tmp/
```

SSH to the switch and run `sysupgrade`:
```
ssh root@192.168.1.1
$ sysupgrade -n /tmp/openwrt-realtek-rtl838x-datto_l8-squashfs-sysupgrade.bin
```

OpenWrt will be installed. Note that first boot after installing requires ~3
minutes for the JFFS2 overlay to be formatted. When the Power LED stops blinking
in the first boot after `sysupgrade`, JFFS2 formatting is completed.

----

Revert back to stock firmware:

You will need a tftp server and the original Datto firmware.

Download the firmware for the S8-L/L8 from Datto:
https://networkinghelp.datto.com/help/Content/kb/Networking/Switches/KB360023113291.html

Rename `s8-l_fw_01.03.24_180823-1639.bix` to `vmlinux.bix`,
put `vmlinux.bix` in the root directory of your tftp server.

Connect a serial console to the UART header and power on the switch.

Interrupt U-Boot by typing `pac` when you see
`Enter correct key to stop autoboot:`

Run the following commands:
```
setenv serverip <tftp_server_ip>
setenv ipaddr <ip_on_same_subnet>
setenv netmask 255.255.255.0
run rtkon
run update_linux
run update_linux2
reset
```

The switch will boot the Datto firmware.

Signed-off-by: Hal Martin <hal.martin@gmail.com>
Tested-By: Raylynn Knight <rayknight@me.com>
Signed-off-by: Sander Vanheule <sander@svanheule.net>
2026-04-02 22:25:37 +02:00
Markus Stockhausen
d7de7cae1a realtek: dts: convert devices to PHY_C45()
Make the remaining devices use the new PHY_C45() macro. At least
those that have no extra attributes in the phy definitions.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22715
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-01 14:12:14 +02:00
Markus Stockhausen
e0287f7aba realtek: dts: add PHY_C45() macro
Like the PHY_C22() macro before add a helper that allows to define
a C45 based phy. It works basically the same with two parameters
PHY_C45(port_number, bus_address) where

- port_number is the absolute overall unique phy number
- bus_address is the location of the phy on the bus

As a first consumer adapt the Xikestor SKS8300-8T devicetree.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22715
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-01 14:12:14 +02:00
Shiji Yang
2f44a5177d kernel: tune 24kc instead of 34kc for mips32r2
GCC generates the same code for 24kc and 34kc. Since we have
converted all 34kc targets to the 24kc, it's better to switch
kernel -mtune to 24kc to avoid confusing developers.

Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
Link: https://github.com/openwrt/openwrt/pull/22703
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-01 14:05:56 +02:00
Robert Marko
e0cfd7f58b realtek: refresh patches
It seems that Realtek patches need to be refreshed after MXL DSA update.

Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-01 13:41:11 +02:00
Rustam Adilov
cd0f6ddf13 realtek: i2c: rtl9300: backport driver cleanup patches
Backport 2 patches from [1] that cleanup the i2c-rtl9300 upstream driver.
They have been long accepted and are already in mainline kernel as of 7.0-rc1.

The "100-rtl9300-i2c-add-more-speeds.patch" required refreshing after adding
these backport patches.

[1] - https://lore.kernel.org/linux-i2c/20251217063027.37987-1-rosenp@gmail.com/

Signed-off-by: Rustam Adilov <adilov@tutamail.com>
Link: https://github.com/openwrt/openwrt/pull/22662
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-03-31 23:39:57 +02:00
Markus Stockhausen
59f146c581 realtek: dsa: move fib_entries to config structure
The fib_entries attribute is a device specific constant.
Therefore move it into the configuration structure. Add
a comment why someone used 16K fib_entries for RTL931x
instead of the possible 32K.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22438
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-03-31 23:35:22 +02:00
Markus Stockhausen
85961cc798 realtek: dsa: drop port_width from instance structure
The port_width attribute is only used once and can be derived
from the cpu_port. Drop it. Add a comment for better readability.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22438
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-03-31 23:35:22 +02:00
Markus Stockhausen
09c9de1128 realtek: dsa: drop port_mask from instance structure
The port_mask attribute is set but never used. Drop it.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22438
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-03-31 23:35:22 +02:00