firmware: add Realtek RTL826X firmware package

This is required by the realtek PHY driver for:

* rtl8261n.bin (package "rtl8261n-firmware" or "rtl8261n-lp-firmware")
  - RTL8251L 5Gbps PHY
  - RTL8261BE 10Gbps PHY
  - RTL8261N 10Gbps PHY
* rtl8264b.bin (package "rtl8264b-firmware")
  - RTL8254B 5Gbps PHY
  - RTL8264 10Gbps PHY
  - RTL8264B 10Gbps PHY

These PHY chips need a sequence of register writes for initialization.
These are provided as firmware files which are interpreted/applied by a
new register patch engine.

For the moment, the patch instructions in rtl8261-firmware and
rtl8264b-firmware are the same as from the rtl8261n driver. This should
make it possible to first evaluate the patch engine and driver development
for switching over in adjusting the patch instructions.

Signed-off-by: Balázs Triszka <info@balika011.hu>
[sven: rebase, split, fix package version/release, use conf from rtl8261n
driver]
Signed-off-by: Sven Eckelmann <sven@narfation.org>
[daniel: define VERSION matching source date for the resulting packages]
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
Balázs Triszka
2025-10-18 18:13:28 +02:00
committed by Daniel Golle
parent a7b5926bba
commit a3395c60ba
4 changed files with 3761 additions and 0 deletions
@@ -0,0 +1,72 @@
# SPDX-License-Identifier: GPL-2.0-or-later
include $(TOPDIR)/rules.mk
PKG_NAME:=rtl826x-firmware
PKG_SOURCE_DATE:=2026-01-24
PKG_RELEASE:=1
PKG_SOURCE_URL:=https://github.com/balika011/realtek_phy_firmware
PKG_SOURCE_VERSION:=0cd4abe2b0bf197f75c27088f86a74c7ddb103b4
PKG_SOURCE_PROTO:=git
PKG_MIRROR_HASH:=f665e9f119cbfddcccae09a17382daa8306772d1e37db7eb69a8771157d06d5f
PKG_MAINTAINER:=Balázs Triszka <info@balika011.hu>
PKG_LICENSE:=GPL-2.0-only
include $(INCLUDE_DIR)/package.mk
define Build/Compile
(set -e; cd $(PKG_BUILD_DIR); \
$(HOSTCC) rtl8261n_rtl8264b.c phy_patch.c -o phy_patch; \
./phy_patch \
)
endef
define Package/rtl8261n-firmware
SECTION:=firmware
CATEGORY:=Firmware
TITLE:=Realtek RTL8251L/RTL8261BE/RTL8261N firmware
VERSION:=20221115
endef
define Package/rtl8261n-lp-firmware
SECTION:=firmware
CATEGORY:=Firmware
TITLE:=Realtek RTL8251L/RTL8261BE/RTL8261N low-power firmware
VERSION:=20240729
PROVIDES:=rtl8261n-firmware
CONFLICTS:=rtl8261n-firmware
endef
define Package/rtl8264b-firmware
SECTION:=firmware
CATEGORY:=Firmware
TITLE:=Realtek RTL8254B/RTL8264/RTL8264B firmware
VERSION:=20221215
endef
define Package/rtl8261n-firmware/install
$(INSTALL_DIR) $(1)/lib/firmware
$(INSTALL_DATA) \
$(PKG_BUILD_DIR)/rtl8261n.bin \
$(1)/lib/firmware/
endef
define Package/rtl8261n-lp-firmware/install
$(INSTALL_DIR) $(1)/lib/firmware
$(INSTALL_DATA) \
$(PKG_BUILD_DIR)/rtl8261n_lp.bin \
$(1)/lib/firmware/rtl8261n.bin
endef
define Package/rtl8264b-firmware/install
$(INSTALL_DIR) $(1)/lib/firmware
$(INSTALL_DATA) \
$(PKG_BUILD_DIR)/rtl8264b.bin \
$(1)/lib/firmware/
endef
$(eval $(call BuildPackage,rtl8261n-firmware))
$(eval $(call BuildPackage,rtl8261n-lp-firmware))
$(eval $(call BuildPackage,rtl8264b-firmware))
@@ -0,0 +1,47 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Fri, 27 Mar 2026 00:17:23 +0100
Subject: Fix endianness when building on big endian systems
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Forwarded: https://github.com/balika011/realtek_phy_firmware/pull/2
--- a/phy_patch.c
+++ b/phy_patch.c
@@ -3,6 +3,7 @@
#include <linux/errno.h>
#include <string.h>
#include <stdlib.h>
+#include <endian.h>
#include "phy_patch.h"
@@ -12,11 +13,11 @@ int phy_patch_op(rt_phy_patch_db_t *pPhy
op.patch_op = patch_op;
op.portmask = portmask;
- op.pagemmd = pagemmd;
- op.addr = addr;
+ op.pagemmd = htole16(pagemmd);
+ op.addr = htole16(addr);
op.msb = msb;
op.lsb = lsb;
- op.data = data;
+ op.data = htole16(data);
return pPhy_patchDb->fPatch_op(phydev, &op);
}
@@ -41,11 +42,11 @@ static int _phy_patch_process(struct phy
{
patch.patch_op = pPatch[i].patch_op;
patch.portmask = pPatch[i].portmask;
- patch.pagemmd = pPatch[i].pagemmd;
- patch.addr = pPatch[i].addr;
+ patch.pagemmd = htole16(pPatch[i].pagemmd);
+ patch.addr = htole16(pPatch[i].addr);
patch.msb = pPatch[i].msb;
patch.lsb = pPatch[i].lsb;
- patch.data = pPatch[i].data;
+ patch.data = htole16(pPatch[i].data);
ret = pPatchDb->fPatch_op(phydev, &patch);
if (ret < 0)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff