[PATCH net-next 2/3] r8169: propagate firmware access errors
From: Matheus Alves de Almeida <hidden>
Date: 2026-09-16 15:25:57
Also in:
lkml
Subsystem:
8169 10/100/1000 gigabit ethernet driver, networking drivers, the rest · Maintainers:
Heiner Kallweit, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
rtl_fw_write_firmware() does not check errors returned from fw_write() and fw_read(), nor does it report failures to its caller. Change rtl_fw_write_firmware() to return an int and propagate errors from fw_write() and fw_read(). Signed-off-by: Matheus Alves de Almeida <redacted> --- drivers/net/ethernet/realtek/r8169_firmware.c | 15 ++++++++++++--- drivers/net/ethernet/realtek/r8169_firmware.h | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/realtek/r8169_firmware.c b/drivers/net/ethernet/realtek/r8169_firmware.c
index 6dff3d947..645d510e6 100644
--- a/drivers/net/ethernet/realtek/r8169_firmware.c
+++ b/drivers/net/ethernet/realtek/r8169_firmware.c@@ -137,7 +137,7 @@ static bool rtl_fw_data_ok(struct rtl_fw *rtl_fw) return false; } -void rtl_fw_write_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw) +int rtl_fw_write_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw) { struct rtl_fw_phy_action *pa = &rtl_fw->phy_action; rtl_fw_write_t fw_write = rtl_fw->phy_write;
@@ -150,10 +150,13 @@ void rtl_fw_write_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw) u32 data = action & 0x0000ffff; u32 regno = (action & 0x0fff0000) >> 16; enum rtl_fw_opcode opcode = action >> 28; + int rc; switch (opcode) { case PHY_READ: predata = fw_read(tp, regno); + if (predata < 0) + return predata; count++; break; case PHY_DATA_OR:
@@ -179,7 +182,9 @@ void rtl_fw_write_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw) count = 0; break; case PHY_WRITE: - fw_write(tp, regno, data); + rc = fw_write(tp, regno, data); + if (rc < 0) + return rc; break; case PHY_READCOUNT_EQ_SKIP: if (count == data)
@@ -194,7 +199,9 @@ void rtl_fw_write_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw) index += regno; break; case PHY_WRITE_PREVIOUS: - fw_write(tp, regno, predata); + rc = fw_write(tp, regno, predata); + if (rc < 0) + return rc; break; case PHY_SKIPN: index += regno;
@@ -204,6 +211,8 @@ void rtl_fw_write_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw) break; } } + + return 0; } void rtl_fw_release_firmware(struct rtl_fw *rtl_fw)
diff --git a/drivers/net/ethernet/realtek/r8169_firmware.h b/drivers/net/ethernet/realtek/r8169_firmware.h
index 1285a1c28..36c89bfda 100644
--- a/drivers/net/ethernet/realtek/r8169_firmware.h
+++ b/drivers/net/ethernet/realtek/r8169_firmware.h@@ -36,4 +36,4 @@ struct rtl_fw { int rtl_fw_request_firmware(struct rtl_fw *rtl_fw); void rtl_fw_release_firmware(struct rtl_fw *rtl_fw); -void rtl_fw_write_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw); +int rtl_fw_write_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw);
--
2.43.0