[PATCH net-next 2/3] r8169: propagate firmware access errors
From: Matheus Alves de Almeida
Date: Wed Sep 16 2026 - 12:07:07 EST
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 <matheus.aalmeida@xxxxxxxxxxxx>
---
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