* [PATCH v2 0/4] net: phy: aquantia: Switch to generic firmware loader
@ 2025-10-14 11:53 Beiyan Yun
2025-10-14 11:53 ` [PATCH v2 1/4] net: phy: aquantia: switch to use phy_get_ofnode() Beiyan Yun
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Beiyan Yun @ 2025-10-14 11:53 UTC (permalink / raw)
To: u-boot
Cc: Tom Rini, Yao Zi, Beiyan Yun, Ilias Apalodimas, Jerome Forissier,
Joe Hershberger, Lucien.Jheng, Marek Vasut, Paul Barker,
Ramon Fried, Romain Gantois, Siddharth Vadapalli, Weijie Gao
Hi,
This patch series refactors the Aquantia PHY firmware loader to use
the generic fsloader framework.
The existing loader is limited to loading firmware from an MMC device,
which restricts its use on many devices (e.g., routers) that may use
other storage like USB or have a UBIFS root filesystem. Migrating to the
generic firmware loader allows firmware to be sourced from any backend
supported by the fwloader and fsloader framework.
The series is structured as follows:
- The first patch is a minor cleanup, switching to the phy_get_ofnode()
helper.
- The second patch aligns binding document with upstream and prepares
for the migration.
- The third patch aligns binding for MDI with upstream.
- The final and main patch replaces the custom loader with generic one.
Kept smb-addr intact as NXP is the only consumer.
This change has been tested on a Buffalo WXR18000BE10P router, loading
firmware from a UBIFS volume for Marvell CUX3410.
Changes in v2:
- doc: bindings: use upstream bindings for aquantia phy
- net: phy: aquantia: replace the "mdi-reversal" node with "marvell,mdi-cfg-order"
- Add support for script based loader
Beiyan Yun (4):
net: phy: aquantia: switch to use phy_get_ofnode()
doc: bindings: use upstream bindings for aquantia phy
net: phy: aquantia: replace the "mdi-reversal" node with
"marvell,mdi-cfg-order"
net: phy: aquantia: use generic firmware loader
arch/arm/dts/fsl-sch-30841.dtsi | 8 +-
arch/arm/dts/fsl-sch-30842.dtsi | 2 +-
doc/device-tree-bindings/net/aquantia-phy.txt | 15 +-
drivers/net/phy/Kconfig | 23 +--
drivers/net/phy/aquantia.c | 139 ++++++++++--------
5 files changed, 98 insertions(+), 89 deletions(-)
--
2.47.3
base-commit: 48f21e66e360552c75d70a50421d0e0ed1f59e90
branch: aquantia-fsloader-v2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/4] net: phy: aquantia: switch to use phy_get_ofnode()
2025-10-14 11:53 [PATCH v2 0/4] net: phy: aquantia: Switch to generic firmware loader Beiyan Yun
@ 2025-10-14 11:53 ` Beiyan Yun
2025-10-14 11:53 ` [PATCH v2 2/4] doc: bindings: use upstream bindings for aquantia phy Beiyan Yun
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Beiyan Yun @ 2025-10-14 11:53 UTC (permalink / raw)
To: u-boot
Cc: Tom Rini, Yao Zi, Beiyan Yun, Jerome Forissier, Joe Hershberger,
Ramon Fried, Siddharth Vadapalli
Use PHY API phy_get_ofnode() helper to get PHY DT node.
Signed-off-by: Beiyan Yun <root@infi.wang>
---
(no changes since v1)
drivers/net/phy/aquantia.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/phy/aquantia.c b/drivers/net/phy/aquantia.c
index f63a13824ca..903fcd667f6 100644
--- a/drivers/net/phy/aquantia.c
+++ b/drivers/net/phy/aquantia.c
@@ -338,7 +338,7 @@ static int aquantia_set_proto(struct phy_device *phydev,
static int aquantia_dts_config(struct phy_device *phydev)
{
- ofnode node = phydev->node;
+ ofnode node = phy_get_ofnode(phydev);
u32 prop;
u16 reg;
--
2.47.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/4] doc: bindings: use upstream bindings for aquantia phy
2025-10-14 11:53 [PATCH v2 0/4] net: phy: aquantia: Switch to generic firmware loader Beiyan Yun
2025-10-14 11:53 ` [PATCH v2 1/4] net: phy: aquantia: switch to use phy_get_ofnode() Beiyan Yun
@ 2025-10-14 11:53 ` Beiyan Yun
2025-10-14 11:53 ` [PATCH v2 3/4] net: phy: aquantia: replace the "mdi-reversal" node with "marvell, mdi-cfg-order" Beiyan Yun
2025-10-14 11:54 ` [PATCH v2 4/4] net: phy: aquantia: use generic firmware loader Beiyan Yun
3 siblings, 0 replies; 5+ messages in thread
From: Beiyan Yun @ 2025-10-14 11:53 UTC (permalink / raw)
To: u-boot; +Cc: Tom Rini, Yao Zi, Beiyan Yun
Prepare for the switch to upstream bindings and generic firmware loader,
remove reference to upstreamed bindings, also add a firmware-name example.
Signed-off-by: Beiyan Yun <root@infi.wang>
---
Changes in v2:
- New
doc/device-tree-bindings/net/aquantia-phy.txt | 15 +++------------
1 file changed, 3 insertions(+), 12 deletions(-)
diff --git a/doc/device-tree-bindings/net/aquantia-phy.txt b/doc/device-tree-bindings/net/aquantia-phy.txt
index 89ce61e05bb..80de0e8b158 100644
--- a/doc/device-tree-bindings/net/aquantia-phy.txt
+++ b/doc/device-tree-bindings/net/aquantia-phy.txt
@@ -1,25 +1,16 @@
PHY nodes for Aquantia devices.
This text describes properties that are applicable to Aquantia PHY nodes in
-addition to the bindings in phy.txt.
-
-Aquantia PHYs allow some flexibility in the way they are wired in a system,
-they allow MDI pins to be reversed, LEDs linked up in different weays, have an
-I2C slave interface that can be used for debug. Normally the configuration
-corresponding to these is driven by the PHY firmware with the downside that
-a custom firmware is needed for each integration of a PHY.
-Several optional bindings are defined that allow these configuration points to
-be driven by the PHY driver and reduce dependency on specific FW versions.
+addition to the bindings in upstream and phy.txt.
Optional properties:
-mdi-reversal: 0 or 1 indicating that reversal must be disabled/enabled.
- Firmware default is used if the property is missing.
smb-addr: I2C/SMBus address to use, firmware default is used if the property
is missing.
Example node:
phy@00 {
reg = <0x00>;
- mdi-reversal = <1>;
+ marvell,mdi-cfg-order = <1>;
smb-addr = <0x25>;
+ firmware-name = "aqr-firmware.cld";
};
--
2.47.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 3/4] net: phy: aquantia: replace the "mdi-reversal" node with "marvell, mdi-cfg-order"
2025-10-14 11:53 [PATCH v2 0/4] net: phy: aquantia: Switch to generic firmware loader Beiyan Yun
2025-10-14 11:53 ` [PATCH v2 1/4] net: phy: aquantia: switch to use phy_get_ofnode() Beiyan Yun
2025-10-14 11:53 ` [PATCH v2 2/4] doc: bindings: use upstream bindings for aquantia phy Beiyan Yun
@ 2025-10-14 11:53 ` Beiyan Yun
2025-10-14 11:54 ` [PATCH v2 4/4] net: phy: aquantia: use generic firmware loader Beiyan Yun
3 siblings, 0 replies; 5+ messages in thread
From: Beiyan Yun @ 2025-10-14 11:53 UTC (permalink / raw)
To: u-boot
Cc: Tom Rini, Yao Zi, Beiyan Yun, Jerome Forissier, Joe Hershberger,
Ramon Fried, Siddharth Vadapalli
As part of the effort of making U-Boot work with the same device tree as
Linux, align with upstream node name.
Signed-off-by: Beiyan Yun <root@infi.wang>
---
Changes in v2:
- New
arch/arm/dts/fsl-sch-30841.dtsi | 8 ++++----
arch/arm/dts/fsl-sch-30842.dtsi | 2 +-
drivers/net/phy/aquantia.c | 4 ++--
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/arch/arm/dts/fsl-sch-30841.dtsi b/arch/arm/dts/fsl-sch-30841.dtsi
index 28b1bec18a5..a92d9811fd3 100644
--- a/arch/arm/dts/fsl-sch-30841.dtsi
+++ b/arch/arm/dts/fsl-sch-30841.dtsi
@@ -15,24 +15,24 @@
*/
phy@00 {
reg = <0x00>;
- mdi-reversal = <1>;
+ marvell,mdi-cfg-order = <1>;
smb-addr = <0x25>;
};
phy@01 {
reg = <0x01>;
- mdi-reversal = <1>;
+ marvell,mdi-cfg-order = <1>;
smb-addr = <0x26>;
};
phy@02 {
reg = <0x02>;
- mdi-reversal = <1>;
+ marvell,mdi-cfg-order = <1>;
smb-addr = <0x27>;
};
phy@03 {
reg = <0x03>;
- mdi-reversal = <1>;
+ marvell,mdi-cfg-order = <1>;
smb-addr = <0x28>;
};
diff --git a/arch/arm/dts/fsl-sch-30842.dtsi b/arch/arm/dts/fsl-sch-30842.dtsi
index bff9e76570b..fca38d14975 100644
--- a/arch/arm/dts/fsl-sch-30842.dtsi
+++ b/arch/arm/dts/fsl-sch-30842.dtsi
@@ -13,6 +13,6 @@
*/
phy@02 {
reg = <0x02>;
- mdi-reversal = <1>;
+ marvell,mdi-cfg-order = <1>;
smb-addr = <0x25>;
};
diff --git a/drivers/net/phy/aquantia.c b/drivers/net/phy/aquantia.c
index 903fcd667f6..d9df0e23a45 100644
--- a/drivers/net/phy/aquantia.c
+++ b/drivers/net/phy/aquantia.c
@@ -350,8 +350,8 @@ static int aquantia_dts_config(struct phy_device *phydev)
if (!ofnode_valid(node))
return 0;
- if (!ofnode_read_u32(node, "mdi-reversal", &prop)) {
- debug("mdi-reversal = %d\n", (int)prop);
+ if (!ofnode_read_u32(node, "marvell,mdi-cfg-order", &prop)) {
+ debug("marvell,mdi-cfg-order = %d\n", (int)prop);
reg = phy_read(phydev, MDIO_MMD_PMAPMD,
AQUANTIA_PMA_RX_VENDOR_P1);
reg &= ~AQUANTIA_PMA_RX_VENDOR_P1_MDI_MSK;
--
2.47.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 4/4] net: phy: aquantia: use generic firmware loader
2025-10-14 11:53 [PATCH v2 0/4] net: phy: aquantia: Switch to generic firmware loader Beiyan Yun
` (2 preceding siblings ...)
2025-10-14 11:53 ` [PATCH v2 3/4] net: phy: aquantia: replace the "mdi-reversal" node with "marvell, mdi-cfg-order" Beiyan Yun
@ 2025-10-14 11:54 ` Beiyan Yun
3 siblings, 0 replies; 5+ messages in thread
From: Beiyan Yun @ 2025-10-14 11:54 UTC (permalink / raw)
To: u-boot
Cc: Tom Rini, Yao Zi, Beiyan Yun, Ilias Apalodimas, Jerome Forissier,
Joe Hershberger, Lucien.Jheng, Marek Vasut, Paul Barker,
Ramon Fried, Romain Gantois, Siddharth Vadapalli, Weijie Gao
Aquantia PHYs are being used w/o SPI flash in some routers recently.
Current firmware loader only attempts to load from FS on top of MMC,
limiting the use on many devices.
Removed the old firmware loader, migrate to generic firmware loader to
allow a wider range and runtime override of firmware source. (e.g., USB).
Tested on Buffalo WXR18000BE10P with UBIFS.
Tested-by: Beiyan Yun <root@infi.wang>
Signed-off-by: Beiyan Yun <root@infi.wang>
---
Changes in v2:
- Add support for script based loader
drivers/net/phy/Kconfig | 23 ++++---
drivers/net/phy/aquantia.c | 133 ++++++++++++++++++++-----------------
2 files changed, 87 insertions(+), 69 deletions(-)
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
index 185c6a3156e..00d6a01e260 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -1,4 +1,3 @@
-
config BITBANGMII
bool "Bit-banged ethernet MII management channel support"
@@ -90,23 +89,29 @@ menuconfig PHY_AQUANTIA
config PHY_AQUANTIA_UPLOAD_FW
bool "Aquantia firmware loading support"
depends on PHY_AQUANTIA
+ select FS_LOADER
help
Aquantia PHYs use firmware which can be either loaded automatically
from storage directly attached to the phy or loaded by the boot loader
- via MDIO commands. The firmware is loaded from a file, specified by
- the PHY_AQUANTIA_FW_PART and PHY_AQUANTIA_FW_NAME options.
+ via MDIO commands.
+
+ This option enables loading the firmware using the generic
+ file system firmware loader framework.
-config PHY_AQUANTIA_FW_PART
- string "Aquantia firmware partition"
+config PHY_AQUANTIA_FW_MAX_SIZE
+ hex "Max firmware size"
depends on PHY_AQUANTIA_UPLOAD_FW
+ default 0x80000
help
- Partition containing the firmware file.
+ The maximum size of the Aquantia PHY firmware. This is used to
+ allocate a buffer to load the firmware into.
-config PHY_AQUANTIA_FW_NAME
- string "Aquantia firmware filename"
+config PHY_AQUANTIA_FW_LOADER_SCRIPT
+ string "Aquantia firmware loader script"
depends on PHY_AQUANTIA_UPLOAD_FW
+ default "aqr_phy_load_firmware"
help
- Firmware filename.
+ The firmware loading script variable name.
config PHY_ATHEROS
bool "Atheros Ethernet PHYs support"
diff --git a/drivers/net/phy/aquantia.c b/drivers/net/phy/aquantia.c
index d9df0e23a45..98ee7ae10e7 100644
--- a/drivers/net/phy/aquantia.c
+++ b/drivers/net/phy/aquantia.c
@@ -17,6 +17,10 @@
#include <malloc.h>
#include <asm/byteorder.h>
#include <fs.h>
+#if (IS_ENABLED(CONFIG_PHY_AQUANTIA_UPLOAD_FW))
+#include <fs_loader.h>
+#include <fw_loader.h>
+#endif
#define AQUNTIA_10G_CTL 0x20
#define AQUNTIA_VENDOR_P1 0xc400
@@ -127,53 +131,7 @@ struct fw_header {
#pragma pack()
-#if defined(CONFIG_PHY_AQUANTIA_UPLOAD_FW)
-static int aquantia_read_fw(u8 **fw_addr, size_t *fw_length)
-{
- loff_t length, read;
- int ret;
- void *addr = NULL;
-
- *fw_addr = NULL;
- *fw_length = 0;
- debug("Loading Aquantia microcode from %s %s\n",
- CONFIG_PHY_AQUANTIA_FW_PART, CONFIG_PHY_AQUANTIA_FW_NAME);
- ret = fs_set_blk_dev("mmc", CONFIG_PHY_AQUANTIA_FW_PART, FS_TYPE_ANY);
- if (ret < 0)
- goto cleanup;
-
- ret = fs_size(CONFIG_PHY_AQUANTIA_FW_NAME, &length);
- if (ret < 0)
- goto cleanup;
-
- addr = malloc(length);
- if (!addr) {
- ret = -ENOMEM;
- goto cleanup;
- }
-
- ret = fs_set_blk_dev("mmc", CONFIG_PHY_AQUANTIA_FW_PART, FS_TYPE_ANY);
- if (ret < 0)
- goto cleanup;
-
- ret = fs_read(CONFIG_PHY_AQUANTIA_FW_NAME, (ulong)addr, 0, length,
- &read);
- if (ret < 0)
- goto cleanup;
-
- *fw_addr = addr;
- *fw_length = length;
- debug("Found Aquantia microcode.\n");
-
-cleanup:
- if (ret < 0) {
- printf("loading firmware file %s %s failed with error %d\n",
- CONFIG_PHY_AQUANTIA_FW_PART,
- CONFIG_PHY_AQUANTIA_FW_NAME, ret);
- free(addr);
- }
- return ret;
-}
+#if (IS_ENABLED(CONFIG_PHY_AQUANTIA_UPLOAD_FW))
/* load data into the phy's memory */
static int aquantia_load_memory(struct phy_device *phydev, u32 addr,
@@ -218,27 +176,27 @@ static u32 unpack_u24(const u8 *data)
return (data[2] << 16) + (data[1] << 8) + data[0];
}
-static int aquantia_upload_firmware(struct phy_device *phydev)
+/* Common firmware upload implementation */
+static int aquantia_do_upload_firmware(struct phy_device *phydev,
+ const u8 *addr, size_t fw_length)
{
int ret;
- u8 *addr = NULL;
- size_t fw_length = 0;
u16 calculated_crc, read_crc;
char version[VERSION_STRING_SIZE];
u32 primary_offset, iram_offset, iram_size, dram_offset, dram_size;
const struct fw_header *header;
- ret = aquantia_read_fw(&addr, &fw_length);
- if (ret != 0)
- return ret;
+ if (!addr || !fw_length) {
+ printf("%s: Invalid firmware data\n", phydev->dev->name);
+ return -EINVAL;
+ }
- read_crc = (addr[fw_length - 2] << 8) | addr[fw_length - 1];
+ read_crc = (addr[fw_length - 2] << 8) | addr[fw_length - 1];
calculated_crc = crc16_ccitt(0, addr, fw_length - 2);
if (read_crc != calculated_crc) {
printf("%s bad firmware crc: file 0x%04x calculated 0x%04x\n",
phydev->dev->name, read_crc, calculated_crc);
- ret = -EINVAL;
- goto done;
+ return -EINVAL;
}
/* Find the DRAM and IRAM sections within the firmware file. */
@@ -268,14 +226,14 @@ static int aquantia_upload_firmware(struct phy_device *phydev)
ret = aquantia_load_memory(phydev, DRAM_BASE_ADDR, &addr[dram_offset],
dram_size);
if (ret != 0)
- goto done;
+ return ret;
debug("loading iram 0x%08x from offset=%d size=%d\n",
IRAM_BASE_ADDR, iram_offset, iram_size);
ret = aquantia_load_memory(phydev, IRAM_BASE_ADDR, &addr[iram_offset],
iram_size);
if (ret != 0)
- goto done;
+ return ret;
/* make sure soft reset and low power mode are clear */
phy_write(phydev, MDIO_MMD_VEND1, GLOBAL_STANDARD_CONTROL, 0);
@@ -289,8 +247,63 @@ static int aquantia_upload_firmware(struct phy_device *phydev)
phy_write(phydev, MDIO_MMD_VEND1, UP_CONTROL, UP_RUN_STALL_OVERRIDE);
printf("%s firmware loading done.\n", phydev->dev->name);
-done:
- free(addr);
+ return 0;
+}
+
+static int aquantia_upload_firmware(struct phy_device *phydev)
+{
+ int ret;
+ ofnode node;
+ struct udevice *loader_dev;
+ const char *fw_name;
+ u8 *fw_addr = NULL;
+ size_t fw_length;
+
+ fw_addr = malloc(CONFIG_PHY_AQUANTIA_FW_MAX_SIZE);
+ if (!fw_addr) {
+ printf("Failed to allocate memory for firmware\n");
+ return -ENOMEM;
+ }
+
+ /* First, try to load firmware via script */
+ ret = request_firmware_into_buf_via_script(fw_addr,
+ CONFIG_PHY_AQUANTIA_FW_MAX_SIZE,
+ CONFIG_PHY_AQUANTIA_FW_LOADER_SCRIPT,
+ &fw_length);
+ if (ret) {
+ /* Fallback to DT specified firmware */
+ node = phy_get_ofnode(phydev);
+ if (!ofnode_valid(node)) {
+ printf("Failed to get PHY node\n");
+ ret = -EINVAL;
+ goto out;
+ }
+
+ fw_name = ofnode_read_string(node, "firmware-name");
+ if (!fw_name) {
+ printf("Failed to get firmware name\n");
+ ret = -ENOENT;
+ goto out;
+ }
+
+ ret = get_fs_loader(&loader_dev);
+ if (ret) {
+ printf("Failed to get fs_loader instance: %d\n", ret);
+ goto out;
+ }
+
+ ret = request_firmware_into_buf(loader_dev, fw_name, fw_addr,
+ CONFIG_PHY_AQUANTIA_FW_MAX_SIZE, 0);
+ if (ret < 0) {
+ printf("Failed to load firmware %s: %d\n", fw_name, ret);
+ goto out;
+ }
+ fw_length = ret;
+ }
+
+ ret = aquantia_do_upload_firmware(phydev, fw_addr, fw_length);
+out:
+ free(fw_addr);
return ret;
}
#else
--
2.47.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-10-14 11:57 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-14 11:53 [PATCH v2 0/4] net: phy: aquantia: Switch to generic firmware loader Beiyan Yun
2025-10-14 11:53 ` [PATCH v2 1/4] net: phy: aquantia: switch to use phy_get_ofnode() Beiyan Yun
2025-10-14 11:53 ` [PATCH v2 2/4] doc: bindings: use upstream bindings for aquantia phy Beiyan Yun
2025-10-14 11:53 ` [PATCH v2 3/4] net: phy: aquantia: replace the "mdi-reversal" node with "marvell, mdi-cfg-order" Beiyan Yun
2025-10-14 11:54 ` [PATCH v2 4/4] net: phy: aquantia: use generic firmware loader Beiyan Yun
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox