Thread (15 messages) flat view 15 messages, 2 authors, 11h ago
HOTtoday

[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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help