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 --- 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