From nobody Fri Sep 25 04:45:12 2026 Received: from smtp.inf.ufrgs.br (smtp.inf.ufrgs.br [143.54.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6EF3651D530; Wed, 16 Sep 2026 15:25:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=143.54.11.23 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572351; cv=none; b=sp9dixIekYCilYZvdy8/QxBD0Bsi0jxBc0vmWQix8XrDHR/b8Yoq/qSQivmxuoQdtoQh7U7ELqlQ6lFi149bdDBchydnRp/joXYiPpjC4/J7XPkYDGaHUuShJx5U+koeV+RSXh8J6kTvNUzq9eX/lvpLAMrNcSLt8SOuNHRYm6k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572351; c=relaxed/simple; bh=6U19CFgjC4wiVaj+zokd/daobTdZHm5D2820Xi2jXJA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XRsvzdfhv4pnTh6jvCr5xSMOe838/pumclIbYEHChy9fqYqljrKGlj3VJM0MoJZoUVVJ2KV11wVQ8MlXPukBcSdGGvJt8UuP1WpA4TIdYiFy0eAK099PgnhakaSBwExgLqVI36rq0ODB5FAecIwUpmk7r7enBmeatpo7vI/csKc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=inf.ufrgs.br; spf=pass smtp.mailfrom=inf.ufrgs.br; dkim=pass (2048-bit key) header.d=inf.ufrgs.br header.i=@inf.ufrgs.br header.b=rJSLSWMx; arc=none smtp.client-ip=143.54.11.23 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=inf.ufrgs.br Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=inf.ufrgs.br Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=inf.ufrgs.br header.i=@inf.ufrgs.br header.b="rJSLSWMx" Received: from LAPTOP-R01LEAQM.localdomain (unknown [186.210.28.117]) by smtp.inf.ufrgs.br (Postfix) with ESMTPSA id 2BCE7120351; Wed, 16 Sep 2026 12:25:26 -0300 (-03) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inf.ufrgs.br; s=dkim2026; t=1789572326; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=w93Pmc97U7hb6UILpYpO++7eUvByfxrKb/xlTIlOQOI=; b=rJSLSWMxjlWa9oMS1rAGd4zcpSy7p7gI24t2FoPwUvEghzf6KzpOLa4AcRi+xltCzQhliH AhsC72Re5Vp6+lc7DuBJ1789tJ7/92U7Ezxt5CqO9hRrR6XtcV5ZYCPH2IE8YN0s/e8hR/ 6ORRCczkRnw9/0OL6lJFmMS23I5WC/WLckW7jMYhcl9Ul5WIqtSaf+OjxQRCakNJmYKL/Z I2BZm6h4hNeJ4zjdYHdRSBevOf9ipnZjp+VUaTzgNKhh/oVG3K9w+7rTYgMU5OMzp7nuA0 JoVPTSXJS9TSP3jCng3m54uyGzrr0X4qRx9BalOjnTXGr1UOANk7zUATHEhntw== From: Matheus Alves de Almeida To: Heiner Kallweit , nic_swsd@realtek.com Cc: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Matheus Alves de Almeida Subject: [PATCH net-next 1/3] r8169: propagate errors from PHY write operations Date: Wed, 16 Sep 2026 12:24:42 -0300 Message-ID: <20260916152444.167196-2-matheus.aalmeida@inf.ufrgs.br> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260916152444.167196-1-matheus.aalmeida@inf.ufrgs.br> References: <20260916152444.167196-1-matheus.aalmeida@inf.ufrgs.br> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, hardware timeouts and other errors are ignored during PHY write operations. Return an error when these operations fail and propagate it through rtl_writephy(). Signed-off-by: Matheus Alves de Almeida --- drivers/net/ethernet/realtek/r8169_firmware.h | 2 +- drivers/net/ethernet/realtek/r8169_main.c | 44 +++++++++++-------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/drivers/net/ethernet/realtek/r8169_firmware.h b/drivers/net/et= hernet/realtek/r8169_firmware.h index 7dc348ed8..1285a1c28 100644 --- a/drivers/net/ethernet/realtek/r8169_firmware.h +++ b/drivers/net/ethernet/realtek/r8169_firmware.h @@ -12,7 +12,7 @@ #include =20 struct rtl8169_private; -typedef void (*rtl_fw_write_t)(struct rtl8169_private *tp, int reg, int va= l); +typedef int (*rtl_fw_write_t)(struct rtl8169_private *tp, int reg, int val= ); typedef int (*rtl_fw_read_t)(struct rtl8169_private *tp, int reg); =20 #define RTL_VER_SIZE 32 diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethern= et/realtek/r8169_main.c index 5415ff62a..3c37c5a6c 100644 --- a/drivers/net/ethernet/realtek/r8169_main.c +++ b/drivers/net/ethernet/realtek/r8169_main.c @@ -1145,14 +1145,15 @@ DECLARE_RTL_COND(rtl_ocp_gphy_cond) return RTL_R32(tp, GPHY_OCP) & OCPAR_FLAG; } =20 -static void r8168_phy_ocp_write(struct rtl8169_private *tp, u32 reg, u32 d= ata) +static int r8168_phy_ocp_write(struct rtl8169_private *tp, u32 reg, u32 da= ta) { if (rtl_ocp_reg_failure(reg)) - return; + return 0; =20 RTL_W32(tp, GPHY_OCP, OCPAR_FLAG | (reg << 15) | data); =20 - rtl_loop_wait_low(tp, &rtl_ocp_gphy_cond, 25, 10); + return rtl_loop_wait_low(tp, &rtl_ocp_gphy_cond, 25, 10) ? + 0 : -ETIMEDOUT; } =20 static int r8168_phy_ocp_read(struct rtl8169_private *tp, u32 reg) @@ -1337,11 +1338,11 @@ static void rtl8168g_phy_suspend_quirk(struct rtl81= 69_private *tp, int value) } }; =20 -static void r8168g_mdio_write(struct rtl8169_private *tp, int reg, int val= ue) +static int r8168g_mdio_write(struct rtl8169_private *tp, int reg, int valu= e) { if (reg =3D=3D 0x1f) { tp->ocp_base =3D value ? value << 4 : OCP_STD_PHY_BASE; - return; + return 0; } =20 if (tp->ocp_base !=3D OCP_STD_PHY_BASE) @@ -1350,7 +1351,7 @@ static void r8168g_mdio_write(struct rtl8169_private = *tp, int reg, int value) if (tp->ocp_base =3D=3D OCP_STD_PHY_BASE && reg =3D=3D MII_BMCR) rtl8168g_phy_suspend_quirk(tp, value); =20 - r8168_phy_ocp_write(tp, tp->ocp_base + reg * 2, value); + return r8168_phy_ocp_write(tp, tp->ocp_base + reg * 2, value); } =20 static int r8168g_mdio_read(struct rtl8169_private *tp, int reg) @@ -1364,14 +1365,15 @@ static int r8168g_mdio_read(struct rtl8169_private = *tp, int reg) return r8168_phy_ocp_read(tp, tp->ocp_base + reg * 2); } =20 -static void mac_mcu_write(struct rtl8169_private *tp, int reg, int value) +static int mac_mcu_write(struct rtl8169_private *tp, int reg, int value) { if (reg =3D=3D 0x1f) { tp->ocp_base =3D value << 4; - return; + return 0; } =20 r8168_mac_ocp_write(tp, tp->ocp_base + reg, value); + return 0; } =20 static bool rtl_is_8116af(struct rtl8169_private *tp) @@ -1393,16 +1395,19 @@ DECLARE_RTL_COND(rtl_phyar_cond) return RTL_R32(tp, PHYAR) & 0x80000000; } =20 -static void r8169_mdio_write(struct rtl8169_private *tp, int reg, int valu= e) +static int r8169_mdio_write(struct rtl8169_private *tp, int reg, int value) { RTL_W32(tp, PHYAR, 0x80000000 | (reg & 0x1f) << 16 | (value & 0xffff)); =20 - rtl_loop_wait_low(tp, &rtl_phyar_cond, 25, 20); + if (!rtl_loop_wait_low(tp, &rtl_phyar_cond, 25, 20)) + return -ETIMEDOUT; /* * According to hardware specs a 20us delay is required after write * complete indication, but before sending next command. */ udelay(20); + + return 0; } =20 static int r8169_mdio_read(struct rtl8169_private *tp, int reg) @@ -1440,13 +1445,17 @@ static void r8168dp_2_mdio_stop(struct rtl8169_priv= ate *tp) RTL_W32(tp, 0xd0, RTL_R32(tp, 0xd0) | R8168DP_1_MDIO_ACCESS_BIT); } =20 -static void r8168dp_2_mdio_write(struct rtl8169_private *tp, int reg, int = value) +static int r8168dp_2_mdio_write(struct rtl8169_private *tp, int reg, int v= alue) { + int rc; + r8168dp_2_mdio_start(tp); =20 - r8169_mdio_write(tp, reg, value); + rc =3D r8169_mdio_write(tp, reg, value); =20 r8168dp_2_mdio_stop(tp); + + return rc; } =20 static int r8168dp_2_mdio_read(struct rtl8169_private *tp, int reg) @@ -1466,19 +1475,16 @@ static int r8168dp_2_mdio_read(struct rtl8169_priva= te *tp, int reg) return value; } =20 -static void rtl_writephy(struct rtl8169_private *tp, int location, int val) +static int rtl_writephy(struct rtl8169_private *tp, int location, int val) { switch (tp->mac_version) { case RTL_GIGA_MAC_VER_28: case RTL_GIGA_MAC_VER_31: - r8168dp_2_mdio_write(tp, location, val); - break; + return r8168dp_2_mdio_write(tp, location, val); case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_LAST: - r8168g_mdio_write(tp, location, val); - break; + return r8168g_mdio_write(tp, location, val); default: - r8169_mdio_write(tp, location, val); - break; + return r8169_mdio_write(tp, location, val); } } =20 --=20 2.43.0 From nobody Fri Sep 25 04:45:12 2026 Received: from smtp.inf.ufrgs.br (smtp.inf.ufrgs.br [143.54.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6310136494B; Wed, 16 Sep 2026 15:25:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=143.54.11.23 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572364; cv=none; b=Atizb+1QpIvGaL5VOzhOORSECCiZ3DwwLGTWSyMAGYwGklNMteYCkKi6OJrtDfTJI/mLFDwp901PLLOYVu1QV0HGQH5Ylwld7GA00Hli6A8zzBx9CPRSf7so5CMghhxKozaROBjuU0nMvweVQrnDfsxWSUtExpcswPvGhX8ByDg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572364; c=relaxed/simple; bh=MW5vuYzITAvsFPghLqUxzbFZ7U+ZcFfESY8PyYgpBfk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=P9kgDbfkFgjPwlcc3HNSY5DJsOkyo1uhCLeZUcBg2pIkA7ApgWgSlp1ZvGRYzjhjC3ScgOZSZjMhNEcZGeHwBqMrf0aWPteyXwcTOeihOo4Nt6wLJzoMNIT3ucDdDeZXsXbrgBHGyNEQrOJvdINUGPuO70kuAZaHY0DuJJ6jVrc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=inf.ufrgs.br; spf=pass smtp.mailfrom=inf.ufrgs.br; dkim=pass (2048-bit key) header.d=inf.ufrgs.br header.i=@inf.ufrgs.br header.b=QDI/3veb; arc=none smtp.client-ip=143.54.11.23 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=inf.ufrgs.br Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=inf.ufrgs.br Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=inf.ufrgs.br header.i=@inf.ufrgs.br header.b="QDI/3veb" Received: from LAPTOP-R01LEAQM.localdomain (unknown [186.210.28.117]) by smtp.inf.ufrgs.br (Postfix) with ESMTPSA id 60DF9120357; Wed, 16 Sep 2026 12:25:28 -0300 (-03) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inf.ufrgs.br; s=dkim2026; t=1789572328; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Sp/8Y0GHB2KIHTY63kwEqsWWXYVutSd/ad2pUIc9qUQ=; b=QDI/3vebCvOALWqYQYRMB5ZELyAQr9VJxZWBovfdE3ff+ob9txA8nm+y2hERrtm7glttKx 2GKIVOYToQ8DEyM4Jisx4vDEPBVTwuBqcmYpU6LlA5XP2FRN9AmzJymFIMPzR0qI5/tNXn vzV66cwfb5KjwYiEIZ+3JTp64endQg2NPL556uhCFsltsQ+jVmEs41pkDeCj6JBrl8EsD3 FHrZ88RvKTDNyB+P/6str8LK63lnRsCax8BjQDBjl/DZlvidG/jSuxE41r2B124h7BjF0G TXpVEvBFoqUvLsoNw1gH7bZkY/yEIr9uNc2Er+ItlCylGqUW/HkXPy4+5nCueQ== From: Matheus Alves de Almeida To: Heiner Kallweit , nic_swsd@realtek.com Cc: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Matheus Alves de Almeida Subject: [PATCH net-next 2/3] r8169: propagate firmware access errors Date: Wed, 16 Sep 2026 12:24:43 -0300 Message-ID: <20260916152444.167196-3-matheus.aalmeida@inf.ufrgs.br> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260916152444.167196-1-matheus.aalmeida@inf.ufrgs.br> References: <20260916152444.167196-1-matheus.aalmeida@inf.ufrgs.br> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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/et= hernet/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; } =20 -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_f= w) { struct rtl_fw_phy_action *pa =3D &rtl_fw->phy_action; rtl_fw_write_t fw_write =3D rtl_fw->phy_write; @@ -150,10 +150,13 @@ void rtl_fw_write_firmware(struct rtl8169_private *tp= , struct rtl_fw *rtl_fw) u32 data =3D action & 0x0000ffff; u32 regno =3D (action & 0x0fff0000) >> 16; enum rtl_fw_opcode opcode =3D action >> 28; + int rc; =20 switch (opcode) { case PHY_READ: predata =3D 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 =3D 0; break; case PHY_WRITE: - fw_write(tp, regno, data); + rc =3D fw_write(tp, regno, data); + if (rc < 0) + return rc; break; case PHY_READCOUNT_EQ_SKIP: if (count =3D=3D data) @@ -194,7 +199,9 @@ void rtl_fw_write_firmware(struct rtl8169_private *tp, = struct rtl_fw *rtl_fw) index +=3D regno; break; case PHY_WRITE_PREVIOUS: - fw_write(tp, regno, predata); + rc =3D fw_write(tp, regno, predata); + if (rc < 0) + return rc; break; case PHY_SKIPN: index +=3D regno; @@ -204,6 +211,8 @@ void rtl_fw_write_firmware(struct rtl8169_private *tp, = struct rtl_fw *rtl_fw) break; } } + + return 0; } =20 void rtl_fw_release_firmware(struct rtl_fw *rtl_fw) diff --git a/drivers/net/ethernet/realtek/r8169_firmware.h b/drivers/net/et= hernet/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 { =20 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_f= w); --=20 2.43.0 From nobody Fri Sep 25 04:45:12 2026 Received: from smtp.inf.ufrgs.br (smtp.inf.ufrgs.br [143.54.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BAFD23947AE; Wed, 16 Sep 2026 15:26:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=143.54.11.23 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572373; cv=none; b=kbsDThdVlTN+UZG6bVeJ3PLT7fyTi3WdJQ7lu+hPjnuWUGJmeZ+g0EVKHot8vTngNZM6Eo5jSNq5gAwx9c374RY6QF524MVUOw/FHOYYIBM6YwcQBwMKcDwqHo3dpCHjLYeYx9e5U299zB8Ez2zOIYxgCQif0pD/ukHLYTntR1c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789572373; c=relaxed/simple; bh=1T8RPT9pP2V6OlcWkw9Asafth5FfY14l/EEYZ798V/A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EQrZmhfRIB3YSLIOXSx2F6+oVDQBFOFRAXapv4I/rbCChFuIWCPX299jNwBe1o/ghqnlisWzf1/4gv81VDL8SkqNOG56xNh6cXc3cSBPn8HnNReag/Asxiwyfs5Dfl0hNwsy4CTK33raDQf3DLdnms6l0Daj2lq/wko3n7A/xWE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=inf.ufrgs.br; spf=pass smtp.mailfrom=inf.ufrgs.br; dkim=pass (2048-bit key) header.d=inf.ufrgs.br header.i=@inf.ufrgs.br header.b=cRByXnkh; arc=none smtp.client-ip=143.54.11.23 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=inf.ufrgs.br Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=inf.ufrgs.br Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=inf.ufrgs.br header.i=@inf.ufrgs.br header.b="cRByXnkh" Received: from LAPTOP-R01LEAQM.localdomain (unknown [186.210.28.117]) by smtp.inf.ufrgs.br (Postfix) with ESMTPSA id E7D4A1203BC; Wed, 16 Sep 2026 12:25:30 -0300 (-03) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inf.ufrgs.br; s=dkim2026; t=1789572331; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jaFoqU+EogLCr42KfhIbunb00wPla6Jsw4l3DdvaJSI=; b=cRByXnkhUJO88fshxXZYMMyfE8TE7Ljz4pPg+U+fylx4o91I6nTTqdozs8VdfvbIaXhpb0 GV6L+LJv7BgGbj+NQipvJ5eSPcuCodWgHSKdEhW1ywrq2d9zcdg2KZc56KlQzEB7/5xXdK I7EPz1bqYEpCX9URdUrck0bw01J1qgNg5lPD8/LqHfPeo4d/C+oVL9TQYNETtA0eSrU5Gd ccfPFzvLBJqz8rq4u3y64Z6n1RBuf4/+XEV6K6yvNdahhwUP163juKlcvXpKOfbFSp1RvV iEQJS3ufo0rNxhSGGJLgsPf2SY/m8+/4qrWfqaKCdJ5r2rKUOppCJpsrpGK5HA== From: Matheus Alves de Almeida To: Heiner Kallweit , nic_swsd@realtek.com Cc: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Matheus Alves de Almeida Subject: [PATCH net-next 3/3] r8169: release firmware on application failure Date: Wed, 16 Sep 2026 12:24:44 -0300 Message-ID: <20260916152444.167196-4-matheus.aalmeida@inf.ufrgs.br> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260916152444.167196-1-matheus.aalmeida@inf.ufrgs.br> References: <20260916152444.167196-1-matheus.aalmeida@inf.ufrgs.br> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" After an rtl_fw_write_firmware() failure, r8169_apply_firmware() does not release the firmware. A TODO notes that it should be released in this case. Release the firmware on failure and remove the TODO. Signed-off-by: Matheus Alves de Almeida --- drivers/net/ethernet/realtek/r8169_main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethern= et/realtek/r8169_main.c index 3c37c5a6c..c54423cd2 100644 --- a/drivers/net/ethernet/realtek/r8169_main.c +++ b/drivers/net/ethernet/realtek/r8169_main.c @@ -2596,12 +2596,14 @@ void r8169_apply_firmware(struct rtl8169_private *t= p) { int val; =20 - /* TODO: release firmware if rtl_fw_write_firmware signals failure. */ if (tp->rtl_fw) { - rtl_fw_write_firmware(tp, tp->rtl_fw); + int rc =3D rtl_fw_write_firmware(tp, tp->rtl_fw); /* At least one firmware doesn't reset tp->ocp_base. */ tp->ocp_base =3D OCP_STD_PHY_BASE; =20 + if (rc < 0) + rtl_release_firmware(tp); + /* PHY soft reset may still be in progress */ if (tp->phydev) phy_read_poll_timeout(tp->phydev, MII_BMCR, val, --=20 2.43.0