From nobody Sat Jun 13 03:33:27 2026 Received: from bkemail.birger-koblitz.de (bkemail.birger-koblitz.de [23.88.97.239]) (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 AF503481FBD; Tue, 5 May 2026 15:56:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=23.88.97.239 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777996602; cv=none; b=P9hLywMBjVYsOOow7aHUR7e77kGt2j4kAc6IbU+zDSxeYMy95Rd6gVFK8WMs90GNpXTrDjNs5iPxHc9iKuYZJy9UmmCF9zOR1mD9icjIlaE5rOWyKwR92iREIw+1tG1OFfu6juq0kVXoagErjtcy4ERnliyZgBgauQ36/CeL8rU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777996602; c=relaxed/simple; bh=NzT3APBnqSAwLHn2gideBIQArpEmCV4zmBiX4w9QCPQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HJeExC+o3GKUdY3R5rXioBwjvqQejRLOhzah8W5meBUWVCsjELWtU8laFOjIVuhlzcVIt14RlC2xCNstVjAL0wS8+WnWcYRiCnGfBncB64WExIMojTdWC1oMXIpUChh3QMbMudtloB3ohl48VuQAIVp+oVUH0f92Or2xOS8VQmc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=birger-koblitz.de; spf=pass smtp.mailfrom=birger-koblitz.de; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=wky0/Epm; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=krNJpox/; arc=none smtp.client-ip=23.88.97.239 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=birger-koblitz.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=birger-koblitz.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="wky0/Epm"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="krNJpox/" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1777996599; bh=NzT3APBnqSAwLHn2gideBIQArpEmCV4zmBiX4w9QCPQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=wky0/EpmyTu2Jrwr3/oP+Hc3pONLGgppm8tTERPOY/0t9DvepJg1oaHib4LzAHmfe yQi9lLy0AvSbzXAgzPsdDjW1JaMHuWJp676T9mZ+43XsSwkhHLzy2abSe0D2m5FeMt 7+o/EedwJRjOhPzLGWhMBF2GZXI4hfEsQAmgMwE3kzfDXiVtfpN1gFTT4kJTZcoNod /3wrC5d0KAUc30btqDHVT2X1QmLw1jQ6SCbjhJmpDYY7E/GxNtjLiwFkxr24rKUqsE WWSa+NYsLjcIqDoD8Z/X9LYBl08YlNcZ7rZNN5jFJ/8jt2lYleWpNueqdOKCWJeg4S oW2azmRTz/nHA== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id 2C604425F2; Tue, 5 May 2026 15:56:39 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1777996597; bh=NzT3APBnqSAwLHn2gideBIQArpEmCV4zmBiX4w9QCPQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=krNJpox/uXMNdf3Oq+UdPKLq/f6o2lq/soP9JWUkl6ZnyIXLgqAYqzEUJCoLMZaUV fAgMPB1EXE+Yug6z50Et9YAFkTZD+p/8znlrnjGUvLVfqRafbk/fNkvnJ6w0+NOS1x XhBAvbl+6EsEmM4HnOJM+nOFKBjYwKqgCboEtTbatvXA0PIk/E7XBznkQ6E0aRN5jT ebBiPKQjwolX8LdiZ2ewoosm9I/L1AqCoRjcsgL1vFaiMHMRem8qJGYA8NBcWBjbZE A2n6RKfsR6sNKYMdR5sTlC9OLSU8HqILT9KXXZRQNTApQliNMrkvC5vob/Vb8CYWMB L65HJaAt1oFYA== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id 501E642465; Tue, 5 May 2026 15:56:37 +0000 (UTC) From: Birger Koblitz Date: Tue, 05 May 2026 17:56:33 +0200 Subject: [PATCH net-next v4 1/3] r8152: Add support for 10Gbit Link Speeds and EEE Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260505-rtl8159_net_next-v4-1-1a648a9c4d8d@birger-koblitz.de> References: <20260505-rtl8159_net_next-v4-0-1a648a9c4d8d@birger-koblitz.de> In-Reply-To: <20260505-rtl8159_net_next-v4-0-1a648a9c4d8d@birger-koblitz.de> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-usb@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Chih Kai Hsu , Birger Koblitz , Andrew Lunn , Aleksander Jan Bajkowski X-Mailer: b4 0.14.2 The RTL8159 supports 10GBit Link speeds. Add support for this speed in the setup and setting/getting through ethtool. Also add 10GBit EEE. Add functionality for setup and ethtool get/set methods. Signed-off-by: Birger Koblitz Reviewed-by: Andrew Lunn Tested-by: Aleksander Jan Bajkowski --- drivers/net/usb/r8152.c | 53 +++++++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index ae834876aa1acc7a9af08a4c01b7a984c4ab8433..05abfab1df94a571347196bfce7= c232865e1058e 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -621,6 +621,7 @@ enum spd_duplex { FORCE_1000M_FULL, NWAY_2500M_FULL, NWAY_5000M_FULL, + NWAY_10000M_FULL, }; =20 /* OCP_ALDPS_CONFIG */ @@ -742,6 +743,7 @@ enum spd_duplex { #define BP4_SUPER_ONLY 0x1578 /* RTL_VER_04 only */ =20 enum rtl_register_content { + _10000bps =3D BIT(14), _5000bps =3D BIT(12), _2500bps =3D BIT(10), _1250bps =3D BIT(9), @@ -757,6 +759,8 @@ enum rtl_register_content { =20 #define is_speed_2500(_speed) (((_speed) & (_2500bps | LINK_STATUS)) =3D= =3D (_2500bps | LINK_STATUS)) #define is_speed_5000(_speed) (((_speed) & (_5000bps | LINK_STATUS)) =3D= =3D (_5000bps | LINK_STATUS)) +#define is_speed_10000(_speed) (((_speed) & (_10000bps | LINK_STATUS)) \ + =3D=3D (_10000bps | LINK_STATUS)) #define is_flow_control(_speed) (((_speed) & (_tx_flow | _rx_flow)) =3D=3D= (_tx_flow | _rx_flow)) =20 #define RTL8152_MAX_TX 4 @@ -1008,6 +1012,7 @@ struct r8152 { =20 u32 support_2500full:1; u32 support_5000full:1; + u32 support_10000full:1; u32 lenovo_macpassthru:1; u32 dell_tb_rx_agg_bug:1; u16 ocp_base; @@ -1260,6 +1265,7 @@ enum tx_csum_stat { #define RTL_ADVERTISED_1000_FULL BIT(5) #define RTL_ADVERTISED_2500_FULL BIT(6) #define RTL_ADVERTISED_5000_FULL BIT(7) +#define RTL_ADVERTISED_10000_FULL BIT(8) =20 /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). * The RTL chips use a 64 element hash table based on the Ethernet CRC. @@ -6513,6 +6519,9 @@ static int rtl8152_set_speed(struct r8152 *tp, u8 aut= oneg, u32 speed, u8 duplex, =20 if (tp->support_5000full) support |=3D RTL_ADVERTISED_5000_FULL; + + if (tp->support_10000full) + support |=3D RTL_ADVERTISED_10000_FULL; } =20 advertising &=3D support; @@ -6559,9 +6568,10 @@ static int rtl8152_set_speed(struct r8152 *tp, u8 au= toneg, u32 speed, u8 duplex, r8152_mdio_write(tp, MII_CTRL1000, new1); } =20 - if (tp->support_2500full || tp->support_5000full) { + if (tp->support_2500full || tp->support_5000full || tp->support_10000ful= l) { orig =3D ocp_reg_read(tp, OCP_10GBT_CTRL); - new1 =3D orig & ~(MDIO_AN_10GBT_CTRL_ADV2_5G | MDIO_AN_10GBT_CTRL_ADV5G= ); + new1 =3D orig & ~(MDIO_AN_10GBT_CTRL_ADV2_5G | MDIO_AN_10GBT_CTRL_ADV5G + | MDIO_AN_10GBT_CTRL_ADV10G); =20 if (advertising & RTL_ADVERTISED_2500_FULL) { new1 |=3D MDIO_AN_10GBT_CTRL_ADV2_5G; @@ -6573,6 +6583,11 @@ static int rtl8152_set_speed(struct r8152 *tp, u8 au= toneg, u32 speed, u8 duplex, tp->ups_info.speed_duplex =3D NWAY_5000M_FULL; } =20 + if (advertising & RTL_ADVERTISED_10000_FULL) { + new1 |=3D MDIO_AN_10GBT_CTRL_ADV10G; + tp->ups_info.speed_duplex =3D NWAY_10000M_FULL; + } + if (orig !=3D new1) ocp_reg_write(tp, OCP_10GBT_CTRL, new1); } @@ -8708,7 +8723,10 @@ int rtl8152_get_link_ksettings(struct net_device *ne= tdev, linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, cmd->link_modes.supported, tp->support_5000full); =20 - if (tp->support_2500full || tp->support_5000full) { + linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, + cmd->link_modes.supported, tp->support_10000full); + + if (tp->support_2500full || tp->support_5000full || tp->support_10000full= ) { u16 ocp_10gbt_ctrl =3D ocp_reg_read(tp, OCP_10GBT_CTRL); u16 ocp_10gbt_stat =3D ocp_reg_read(tp, OCP_10GBT_STAT); =20 @@ -8737,6 +8755,19 @@ int rtl8152_get_link_ksettings(struct net_device *ne= tdev, if (is_speed_5000(rtl8152_get_speed(tp))) cmd->base.speed =3D SPEED_5000; } + + if (tp->support_10000full) { + linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, + cmd->link_modes.advertising, + ocp_10gbt_ctrl & MDIO_AN_10GBT_CTRL_ADV10G); + + linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, + cmd->link_modes.lp_advertising, + ocp_10gbt_stat & MDIO_AN_10GBT_STAT_LP10G); + + if (is_speed_10000(rtl8152_get_speed(tp))) + cmd->base.speed =3D SPEED_10000; + } } =20 mutex_unlock(&tp->control); @@ -8790,6 +8821,10 @@ static int rtl8152_set_link_ksettings(struct net_dev= ice *dev, cmd->link_modes.advertising)) advertising |=3D RTL_ADVERTISED_5000_FULL; =20 + if (test_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, + cmd->link_modes.advertising)) + advertising |=3D RTL_ADVERTISED_10000_FULL; + mutex_lock(&tp->control); =20 ret =3D rtl8152_set_speed(tp, cmd->base.autoneg, cmd->base.speed, @@ -8953,6 +8988,13 @@ static int r8153_get_eee(struct r8152 *tp, struct et= htool_keee *eee) linkmode_set_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, common); } =20 + if (tp->support_10000full) { + linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, eee->supported); + + if (speed & _10000bps) + linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, common); + } + eee->eee_enabled =3D tp->eee_en; =20 if (speed & _1000bps) @@ -9967,6 +10009,11 @@ static int rtl8152_probe_once(struct usb_interface = *intf, tp->speed =3D SPEED_5000; tp->advertising |=3D RTL_ADVERTISED_5000_FULL; } + if (tp->support_10000full && + tp->udev->speed >=3D USB_SPEED_SUPER) { + tp->speed =3D SPEED_10000; + tp->advertising |=3D RTL_ADVERTISED_10000_FULL; + } tp->advertising |=3D RTL_ADVERTISED_1000_FULL; } tp->duplex =3D DUPLEX_FULL; --=20 2.47.3 From nobody Sat Jun 13 03:33:27 2026 Received: from bkemail.birger-koblitz.de (bkemail.birger-koblitz.de [23.88.97.239]) (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 CE46F48B376; Tue, 5 May 2026 15:56:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=23.88.97.239 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777996604; cv=none; b=OEWWdH3oWmm5aKYobuV5MHrMghtb4vz4tgoMAvuXPFQf4wvsxqKcoI0c1bge5s7kS5sDctnMai7TIkgn94S/1LAj5Ibsv2Pq4PQeujK1/NFs+YL8Q03qHq+Cyz3g9jRALHYw860t4F65tRMYhAeL4ZdmgeSLNJyBYpWOUxIHUh4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777996604; c=relaxed/simple; bh=66sxBnO9qBeG5Q6k5q85z09IobaOPTQJpY8pPfYANoc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bljSK6wJfR1llFfMyGm4TUCJlD/JJNFHd0xKowDAo3ojqEQ24sgCe29z7YAF1zpodT1MI83TgmLfxAD8Dzj2tcZDMTQO1C2wk6QqQr9R29aa5UlM6DKu17ec0u+m2yKaoe3bgkzh4RAhFZYkns3QCNeyRLaaO9vEyAJTMhdkIyA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=birger-koblitz.de; spf=pass smtp.mailfrom=birger-koblitz.de; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=WI4hNCAJ; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=fyfN55D/; arc=none smtp.client-ip=23.88.97.239 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=birger-koblitz.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=birger-koblitz.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="WI4hNCAJ"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="fyfN55D/" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1777996601; bh=66sxBnO9qBeG5Q6k5q85z09IobaOPTQJpY8pPfYANoc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=WI4hNCAJwPtA2g8rRFnleeEe7IDvsgBqzeROqhBqRCSiL8SbAQB5F4JGDTdDL8IIA q9oA/jIZcr9jIFcF1IxhXnRkoWg7YCewT7gojs6UxVBI2v1gOHH9PlwNkPft5ZjjAb 26yGxkVjDyAqD9Pcf9OTDSb0HaLjt+2gLDgYXLe1B47Wv5DS1b1jSVFSQ6uqIc31h2 j0Tj/KK5GJX8ATE2MODU0oqPwQGdtenaLPowt1yyBs+gSIvsh8b3sMD41R9KmEn3lO y3WNKlVo65AGtZdJJT5xA/NXEZGX5RNPB3KudelTF4RhnA1IdoAmi87ceEbj9TGkwz PLmIavIn0fqQA== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id 6FADA42498; Tue, 5 May 2026 15:56:41 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1777996598; bh=66sxBnO9qBeG5Q6k5q85z09IobaOPTQJpY8pPfYANoc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=fyfN55D/UbTqJvfEaDtMX0sr4fFw6kC/jcZ0OAPnRcqYmZAlvNiGxOO3JAyiOF8CO jlJeEbaX+nPxnpNf7d0JJzFLvHBLAYUxMZ0n/tx6zeV0WAkr9pQ5p7SbNYcTI/xTIn tyJ08u0JIYHGxjDDTdacYNXoBMcG5up4V6n9gHmEra3kdtqDKvsbRADhu7uk263ztc BvLc62JlkGSocW/tFGahxuQz2boaIriVML79d1oegfa6NiYNmOzkkeeBnijTW+1IkI JPmO7zGrredN2ro2zJmOB7GDElKaTyQFZ7qBf/YOCOtCJBh+pxhdln7jaSWNnGED0T 8VrQmgjiD2IvQ== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id A8FB242466; Tue, 5 May 2026 15:56:37 +0000 (UTC) From: Birger Koblitz Date: Tue, 05 May 2026 17:56:34 +0200 Subject: [PATCH net-next v4 2/3] r8152: Add support for the RTL8159 chip Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260505-rtl8159_net_next-v4-2-1a648a9c4d8d@birger-koblitz.de> References: <20260505-rtl8159_net_next-v4-0-1a648a9c4d8d@birger-koblitz.de> In-Reply-To: <20260505-rtl8159_net_next-v4-0-1a648a9c4d8d@birger-koblitz.de> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-usb@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Chih Kai Hsu , Birger Koblitz , Aleksander Jan Bajkowski X-Mailer: b4 0.14.2 The RTL8159 re-uses the packet descriptor format introduced with the RTL8157 and other hardware features of the RTL8157 (RTL_VER_16) such as the SRAM access. The support therefore consists in expanding the existing RTL8157 code for initialization and USB power management to also be used for the RTL8159 (RTL_VER_17). Most of the additional code is added in r8157_hw_phy_cfg() to configure the RTL8159 PHY. Add support for the USB device ID of Realtek RTL8159-based adapters, for which the product ID is 0x815a. Detect the RTL8159 as RTL_VER_17 and set it up. Signed-off-by: Birger Koblitz Tested-by: Aleksander Jan Bajkowski --- drivers/net/usb/r8152.c | 277 ++++++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 261 insertions(+), 16 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 05abfab1df94a571347196bfce7c232865e1058e..1e7f20348ac6def85106f1e8bab= 93a377980c77d 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -1247,6 +1247,7 @@ enum rtl_version { RTL_VER_14, RTL_VER_15, RTL_VER_16, + RTL_VER_17, =20 RTL_VER_MAX }; @@ -3432,6 +3433,7 @@ static void rtl8152_nic_reset(struct r8152 *tp) break; =20 case RTL_VER_16: + case RTL_VER_17: ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_CR, CR_RE | CR_TE); break; =20 @@ -3471,6 +3473,9 @@ static void rtl_eee_plus_en(struct r8152 *tp, bool en= able) =20 static void rtl_set_eee_plus(struct r8152 *tp) { + if (tp->version =3D=3D RTL_VER_17) + return rtl_eee_plus_en(tp, false); + if (rtl8152_get_speed(tp) & _10bps) rtl_eee_plus_en(tp, true); else @@ -3656,6 +3661,7 @@ static void r8153_set_rx_early_timeout(struct r8152 *= tp) case RTL_VER_13: case RTL_VER_15: case RTL_VER_16: + case RTL_VER_17: ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_TIMEOUT, 640 / 8); ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EXTRA_AGGR_TMR, @@ -3700,6 +3706,7 @@ static void r8153_set_rx_early_size(struct r8152 *tp) ocp_data / 8); break; case RTL_VER_16: + case RTL_VER_17: ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data / 16); break; @@ -4548,6 +4555,7 @@ static void rtl_clear_bp(struct r8152 *tp, u16 type) break; case RTL_VER_14: case RTL_VER_16: + case RTL_VER_17: default: ocp_write_word(tp, type, USB_BP2_EN, 0); bp_num =3D 16; @@ -5818,6 +5826,7 @@ static void rtl_eee_enable(struct r8152 *tp, bool ena= ble) case RTL_VER_13: case RTL_VER_15: case RTL_VER_16: + case RTL_VER_17: if (enable) { r8156_eee_en(tp, true); ocp_reg_write(tp, OCP_EEE_ADV, tp->eee_adv); @@ -6408,7 +6417,7 @@ static int rtl8156_enable(struct r8152 *tp) set_tx_qlen(tp); rtl_set_eee_plus(tp); =20 - if (tp->version >=3D RTL_VER_12 && tp->version <=3D RTL_VER_16) + if (tp->version >=3D RTL_VER_12 && tp->version <=3D RTL_VER_17) ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_RX_AGGR_NUM, RX_AGGR_NUM_MASK); =20 r8153_set_rx_early_timeout(tp); @@ -6817,7 +6826,7 @@ static void rtl8156_up(struct r8152 *tp) return; =20 r8153b_u1u2en(tp, false); - if (tp->version !=3D RTL_VER_16) + if (tp->version < RTL_VER_16) r8153_u2p3en(tp, false); r8153_aldps_en(tp, false); =20 @@ -6831,7 +6840,7 @@ static void rtl8156_up(struct r8152 *tp) =20 ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, NOW_IS_OOB); =20 - if (tp->version =3D=3D RTL_VER_16) + if (tp->version >=3D RTL_VER_16) ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR1, BIT(3)); =20 ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, MCU_BORW_EN); @@ -6856,7 +6865,7 @@ static void rtl8156_up(struct r8152 *tp) =20 ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, PLA_MCU_SPDWN_EN); =20 - if (tp->version !=3D RTL_VER_16) + if (tp->version < RTL_VER_16) ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_SPEED_OPTION, RG_PWRDN_EN | ALL_SPEED_OFF); =20 @@ -6868,10 +6877,10 @@ static void rtl8156_up(struct r8152 *tp) } =20 r8153_aldps_en(tp, true); - if (tp->version !=3D RTL_VER_16) + if (tp->version < RTL_VER_16) r8153_u2p3en(tp, true); =20 - if (tp->version !=3D RTL_VER_16 && tp->udev->speed >=3D USB_SPEED_SUPER) + if (tp->version < RTL_VER_16 && tp->udev->speed >=3D USB_SPEED_SUPER) r8153b_u1u2en(tp, true); } =20 @@ -6886,7 +6895,7 @@ static void rtl8156_down(struct r8152 *tp) PLA_MCU_SPDWN_EN); =20 r8153b_u1u2en(tp, false); - if (tp->version !=3D RTL_VER_16) { + if (tp->version < RTL_VER_16) { r8153_u2p3en(tp, false); r8153b_power_cut_en(tp, false); } @@ -7996,7 +8005,7 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) /* Advanced Power Saving parameter */ ocp_reg_set_bits(tp, 0xa430, BIT(0) | BIT(1)); =20 - /* aldpsce force mode */ + /* Disable ALDPS force mode */ ocp_reg_clr_bits(tp, 0xa44a, BIT(2)); =20 switch (tp->version) { @@ -8120,6 +8129,190 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) sram2_write_w0w1(tp, 0x807c, 0xff00, 0x5000); sram2_write_w0w1(tp, 0x809d, 0xff00, 0x5000); break; + + case RTL_VER_17: + /* Disable bypass turn off clk in ALDPS */ + ocp_byte_clr_bits(tp, MCU_TYPE_PLA, 0xd3c8, BIT(0)); + + /* Power level tuning + * test mode power level + */ + sram_write_w0w1(tp, 0x8415, 0xff00, 0x9300); + /* normal link power level 10G, 5G, 2.5G */ + sram_write_w0w1(tp, 0x81a3, 0xff00, 0x0f00); + sram_write_w0w1(tp, 0x81ae, 0xff00, 0x0f00); + sram_write_w0w1(tp, 0x81b9, 0xff00, 0xb900); + /* normal link TX filter */ + sram2_write_w0w1(tp, 0x83b0, 0x0e00, 0); + sram2_write_w0w1(tp, 0x83c5, 0x0e00, 0); + sram2_write_w0w1(tp, 0x83da, 0x0e00, 0); + sram2_write_w0w1(tp, 0x83ef, 0x0e00, 0); + + /* AFE power saving for 2.5G & 5G */ + sram_write(tp, 0x8173, 0x8620); + sram_write(tp, 0x8175, 0x8671); + + sram_write_w0w1(tp, 0x817c, 0, BIT(13)); + sram_write_w0w1(tp, 0x8187, 0, BIT(13)); + sram_write_w0w1(tp, 0x8192, 0, BIT(13)); + sram_write_w0w1(tp, 0x819d, 0, BIT(13)); + sram_write_w0w1(tp, 0x81a8, BIT(13), 0); + sram_write_w0w1(tp, 0x81b3, BIT(13), 0); + sram_write_w0w1(tp, 0x81be, 0, BIT(13)); + + sram_write_w0w1(tp, 0x817d, 0xff00, 0xa600); + sram_write_w0w1(tp, 0x8188, 0xff00, 0xa600); + sram_write_w0w1(tp, 0x8193, 0xff00, 0xa600); + sram_write_w0w1(tp, 0x819e, 0xff00, 0xa600); + sram_write_w0w1(tp, 0x81a9, 0xff00, 0x1400); + sram_write_w0w1(tp, 0x81b4, 0xff00, 0x1400); + sram_write_w0w1(tp, 0x81bf, 0xff00, 0xa600); + + /* RFI parameter + * disable preset FBE + */ + ocp_reg_clr_bits(tp, 0xaeaa, BIT(5) | BIT(3)); + /* modify PGA for 5G&10G */ + sram2_write(tp, 0x84f0, 0x201c); + sram2_write(tp, 0x84f2, 0x3117); + /* RFI parameter */ + ocp_reg_write(tp, 0xaec6, 0x0000); + ocp_reg_write(tp, 0xae20, 0xffff); + ocp_reg_write(tp, 0xaece, 0xffff); + ocp_reg_write(tp, 0xaed2, 0xffff); + ocp_reg_write(tp, 0xaec8, 0x0000); + ocp_reg_clr_bits(tp, 0xaed0, BIT(0)); + ocp_reg_write(tp, 0xadb8, 0x0150); + sram2_write_w0w1(tp, 0x8197, 0xff00, 0x5000); + sram2_write_w0w1(tp, 0x8231, 0xff00, 0x5000); + sram2_write_w0w1(tp, 0x82cb, 0xff00, 0x5000); + sram2_write_w0w1(tp, 0x82cd, 0xff00, 0x5700); + sram2_write_w0w1(tp, 0x8233, 0xff00, 0x5700); + sram2_write_w0w1(tp, 0x8199, 0xff00, 0x5700); + + sram2_write(tp, 0x815a, 0x0150); + sram2_write(tp, 0x81f4, 0x0150); + sram2_write(tp, 0x828e, 0x0150); + sram2_write(tp, 0x81b1, 0x0000); + sram2_write(tp, 0x824b, 0x0000); + sram2_write(tp, 0x82e5, 0x0000); + + sram2_write_w0w1(tp, 0x84f7, 0xff00, 0x2800); + ocp_reg_set_bits(tp, 0xaec2, BIT(12)); + sram2_write_w0w1(tp, 0x81b3, 0xff00, 0xad00); + sram2_write_w0w1(tp, 0x824d, 0xff00, 0xad00); + sram2_write_w0w1(tp, 0x82e7, 0xff00, 0xad00); + ocp_reg_w0w1(tp, 0xae4e, 0x000f, 0x0001); + sram2_write_w0w1(tp, 0x82ce, 0xf000, 0x4000); + + /* 5G shift sel, default =3D '04' + * 10G shift sel, default =3D '03' + */ + sram2_write_w0w1(tp, 0x83a5, 0xff00, 0x0400); + sram2_write_w0w1(tp, 0x83a6, 0xff00, 0x0400); + sram2_write_w0w1(tp, 0x83a7, 0xff00, 0x0400); + sram2_write_w0w1(tp, 0x83a8, 0xff00, 0x0400); + + /* XG INRX parameters + * RC coefficients + */ + sram2_write(tp, 0x84ac, 0x0000); + sram2_write(tp, 0x84ae, 0x0000); + sram2_write(tp, 0x84b0, 0xf818); + sram2_write_w0w1(tp, 0x84b2, 0xff00, 0x6000); + /* Training AAGC PAR (with uc2 patch) */ + sram2_write(tp, 0x8ffc, 0x6008); + sram2_write(tp, 0x8ffe, 0xf450); + /* DAC BGK */ + sram2_write_w0w1(tp, 0x8015, 0, BIT(9)); + sram2_write_w0w1(tp, 0x8016, 0, BIT(11)); + sram2_write_w0w1(tp, 0x8fe6, 0xff00, 0x0800); + sram2_write(tp, 0x8fe4, 0x2114); + /* 10G PBO table */ + sram2_write(tp, 0x8647, 0xa7b1); + sram2_write(tp, 0x8649, 0xbbca); + sram2_write_w0w1(tp, 0x864b, 0xff00, 0xdc00); + /* 2.5G ado power window size */ + sram2_write_w0w1(tp, 0x8154, 0xc000, 0x4000); + sram2_write_w0w1(tp, 0x8158, 0xc000, 0); + /* 10G lock far */ + sram2_write(tp, 0x826c, 0xffff); + sram2_write(tp, 0x826e, 0xffff); + /* XG INRX parameter */ + sram2_write_w0w1(tp, 0x8872, 0xff00, 0x0e00); + sram_write_w0w1(tp, 0x8012, 0, BIT(11)); + sram_write_w0w1(tp, 0x8012, 0, BIT(14)); + ocp_reg_set_bits(tp, 0xb576, BIT(0)); + sram_write_w0w1(tp, 0x834a, 0xff00, 0x0700); + sram2_write_w0w1(tp, 0x8217, 0x3f00, 0x2a00); + sram_write_w0w1(tp, 0x81b1, 0xff00, 0x0b00); + sram2_write_w0w1(tp, 0x8fed, 0xff00, 0x4e00); + /* Slave about EC mu of datamode AAGC and DAC BG */ + sram2_write_w0w1(tp, 0x88ac, 0xff00, 0x2300); + /* improve UBE */ + ocp_reg_set_bits(tp, 0xbf0c, 0x7 << 11); + /* close Sparse NEC, improve connect 5EUU cable performance */ + sram2_write_w0w1(tp, 0x88de, 0xff00, 0); + /* 5G slave compatibility issue */ + sram2_write(tp, 0x80b4, 0x5195); + + /* XG Test Mode + * xgtstm_map_tbl for mdi_cap_sel + */ + sram_write(tp, 0x8370, 0x8671); + sram_write(tp, 0x8372, 0x86c8); + /* xgtstm_amp_map_tbl for REG_IBX_UP_SHIFT_L */ + sram_write(tp, 0x8401, 0x86c8); + sram_write(tp, 0x8403, 0x86da); + sram_write_w0w1(tp, 0x8406, 0x1800, 0x1000); + sram_write_w0w1(tp, 0x8408, 0x1800, 0x1000); + sram_write_w0w1(tp, 0x840a, 0x1800, 0x1000); + sram_write_w0w1(tp, 0x840c, 0x1800, 0x1000); + sram_write_w0w1(tp, 0x840e, 0x1800, 0x1000); + sram_write_w0w1(tp, 0x8410, 0x1800, 0x1000); + sram_write_w0w1(tp, 0x8412, 0x1800, 0x1000); + sram_write_w0w1(tp, 0x8414, 0x1800, 0x1000); + sram_write_w0w1(tp, 0x8416, 0x1800, 0x1000); + + /* Cable Test Patch */ + sram_write(tp, 0x82bd, 0x1f40); + + /* Thermal sensor parameters */ + ocp_reg_w0w1(tp, 0xbfb4, 0x07ff, 0x0328); + ocp_reg_write(tp, 0xbfb6, 0x3e14); + + /* spdchg_gtx_shape_100M */ + ocp_reg_write(tp, OCP_SRAM_ADDR, 0x81c4); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x003b); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0086); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x00b7); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x00db); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x00fe); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x00fe); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x00fe); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x00fe); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x00c3); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0078); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0047); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0023); + + /* lsbmsk_parameters + * RL6961_lsbmsk_parameter_250207 + */ + sram2_write(tp, 0x88d7, 0x01a0); + sram2_write(tp, 0x88d9, 0x01a0); + sram2_write(tp, 0x8ffa, 0x002a); + + sram2_write(tp, 0x8fee, 0xffdf); + sram2_write(tp, 0x8ff0, 0xffff); + sram2_write(tp, 0x8ff2, 0x0a4a); + sram2_write(tp, 0x8ff4, 0xaa5a); + sram2_write(tp, 0x8ff6, 0x0a4a); + sram2_write(tp, 0x8ff8, 0xaa5a); + + sram2_write_w0w1(tp, 0x88d5, 0xff00, 0x0200); + break; + default: break; } @@ -8155,6 +8348,18 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) set_bit(PHY_RESET, &tp->flags); } =20 +static int r8159_wait_backup_restore(struct r8152 *tp) +{ + u32 ocp_data; + + ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0); + if (!(ocp_data & PCUT_STATUS)) + return 0; + + return poll_timeout_us(ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_G= PHY_CTRL), + ocp_data & BACKUP_RESTRORE, 200, 20000, false); +} + static void r8156_init(struct r8152 *tp) { u32 ocp_data; @@ -8164,14 +8369,14 @@ static void r8156_init(struct r8152 *tp) if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) return; =20 - if (tp->version =3D=3D RTL_VER_16) { + if (tp->version =3D=3D RTL_VER_16 || tp->version =3D=3D RTL_VER_17) { ocp_byte_set_bits(tp, MCU_TYPE_USB, 0xcffe, BIT(3)); ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xd3ca, BIT(0)); } =20 ocp_byte_clr_bits(tp, MCU_TYPE_USB, USB_ECM_OP, EN_ALL_SPEED); =20 - if (tp->version !=3D RTL_VER_16) + if (tp->version < RTL_VER_16) ocp_write_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION, 0); =20 ocp_word_set_bits(tp, MCU_TYPE_USB, USB_ECM_OPTION, BYPASS_MAC_RESET); @@ -8185,6 +8390,7 @@ static void r8156_init(struct r8152 *tp) case RTL_VER_13: case RTL_VER_15: case RTL_VER_16: + case RTL_VER_17: r8156b_wait_loading_flash(tp); break; default: @@ -8201,6 +8407,12 @@ static void r8156_init(struct r8152 *tp) return; } =20 + if (tp->version =3D=3D RTL_VER_17 && r8159_wait_backup_restore(tp)) { + rtl_set_inaccessible(tp); + dev_err(&tp->intf->dev, "init failed, backup-restore timed out\n"); + return; + } + data =3D r8153_phy_status(tp, 0); if (data =3D=3D PHY_STAT_EXT_INIT) { ocp_reg_clr_bits(tp, 0xa468, BIT(3) | BIT(1)); @@ -8216,7 +8428,7 @@ static void r8156_init(struct r8152 *tp) =20 data =3D r8153_phy_status(tp, PHY_STAT_LAN_ON); =20 - if (tp->version =3D=3D RTL_VER_16) + if (tp->version >=3D RTL_VER_16) r8157_u2p3en(tp, false); else r8153_u2p3en(tp, false); @@ -8227,7 +8439,7 @@ static void r8156_init(struct r8152 *tp) /* U1/U2/L1 idle timer. 500 us */ ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500); =20 - if (tp->version =3D=3D RTL_VER_16) + if (tp->version >=3D RTL_VER_16) r8157_power_cut_en(tp, false); else r8153b_power_cut_en(tp, false); @@ -8260,7 +8472,7 @@ static void r8156_init(struct r8152 *tp) =20 r8156_mac_clk_spd(tp, true); =20 - if (tp->version !=3D RTL_VER_16) + if (tp->version < RTL_VER_16) ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, PLA_MCU_SPDWN_EN); =20 ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS); @@ -8273,8 +8485,13 @@ static void r8156_init(struct r8152 *tp) =20 set_bit(GREEN_ETHERNET, &tp->flags); =20 - /* rx aggregation / 16 bytes Rx descriptor */ - if (tp->version =3D=3D RTL_VER_16) + /* RX aggregation / 16 bytes RX descriptor + * BIT(11) is specific to RTL8159, with unknown meaning + */ + if (tp->version =3D=3D RTL_VER_17) + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL, + RX_AGG_DISABLE | RX_DESC_16B | BIT(11)); + else if (tp->version =3D=3D RTL_VER_16) ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL, RX_AGG_DISABLE | RX_DE= SC_16B); else ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL, RX_AGG_DISABLE | RX_ZE= RO_EN); @@ -8282,7 +8499,7 @@ static void r8156_init(struct r8152 *tp) if (tp->version < RTL_VER_12) ocp_byte_set_bits(tp, MCU_TYPE_USB, USB_BMU_CONFIG, ACT_ODMA); =20 - if (tp->version =3D=3D RTL_VER_16) { + if (tp->version >=3D RTL_VER_16) { /* Disable Rx Zero Len */ rtl_bmu_clr_bits(tp, 0x2300, BIT(3)); /* TX descriptor Signature */ @@ -9670,6 +9887,29 @@ static int rtl_ops_init(struct r8152 *tp) r8157_desc_init(tp); break; =20 + case RTL_VER_17: + tp->eee_en =3D true; + tp->eee_adv =3D MDIO_EEE_100TX | MDIO_EEE_1000T | MDIO_EEE_10GT; + tp->eee_adv2 =3D MDIO_EEE_2_5GT | MDIO_EEE_5GT; + ops->init =3D r8156_init; + ops->enable =3D rtl8156_enable; + ops->disable =3D rtl8153_disable; + ops->up =3D rtl8156_up; + ops->down =3D rtl8156_down; + ops->unload =3D rtl8153_unload; + ops->eee_get =3D r8153_get_eee; + ops->eee_set =3D r8152_set_eee; + ops->in_nway =3D rtl8153_in_nway; + ops->hw_phy_cfg =3D r8157_hw_phy_cfg; + ops->autosuspend_en =3D rtl8157_runtime_enable; + ops->change_mtu =3D rtl8156_change_mtu; + tp->rx_buf_sz =3D 48 * 1024; + tp->support_2500full =3D 1; + tp->support_5000full =3D 1; + tp->support_10000full =3D 1; + r8157_desc_init(tp); + break; + default: ret =3D -ENODEV; dev_err(&tp->intf->dev, "Unknown Device\n"); @@ -9823,6 +10063,9 @@ static u8 __rtl_get_hw_ver(struct usb_device *udev) case 0x1030: version =3D RTL_VER_16; break; + case 0x2020: + version =3D RTL_VER_17; + break; default: version =3D RTL_VER_UNKNOWN; dev_info(&udev->dev, "Unknown version 0x%04x\n", ocp_data); @@ -9975,6 +10218,7 @@ static int rtl8152_probe_once(struct usb_interface *= intf, case RTL_VER_13: case RTL_VER_15: case RTL_VER_16: + case RTL_VER_17: netdev->max_mtu =3D size_to_mtu(16 * 1024); break; case RTL_VER_01: @@ -10140,6 +10384,7 @@ static const struct usb_device_id rtl8152_table[] = =3D { { USB_DEVICE(VENDOR_ID_REALTEK, 0x8155) }, { USB_DEVICE(VENDOR_ID_REALTEK, 0x8156) }, { USB_DEVICE(VENDOR_ID_REALTEK, 0x8157) }, + { USB_DEVICE(VENDOR_ID_REALTEK, 0x815a) }, =20 /* Microsoft */ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab) }, --=20 2.47.3 From nobody Sat Jun 13 03:33:27 2026 Received: from bkemail.birger-koblitz.de (bkemail.birger-koblitz.de [23.88.97.239]) (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 C322748B375; Tue, 5 May 2026 15:56:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=23.88.97.239 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777996604; cv=none; b=WAxdWmCNr0+EGvzRx+impsqNUq1CMhGg6g9RHMehG9I+xj4LyNTY8ttrSmtXzHdmi/3c7c3rxdgfwHum5PUB9BJA0JU7o2SWjQclmxTyQ6/DW049FyDNBnPDeAheVMwzzU+2jd8UjJ9kgfabkCsD0ADMm7bY6FlcwoBYtir+9Ag= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777996604; c=relaxed/simple; bh=P/nWth4JdW9U9oijroHIeR3esaQQeQ+oA9kKEBeJmFg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WTdQJA/ZNw9g1eg/3eQ1UdfynG3zm+Du/HKPf6oGJZOVdSuYkiIxzAf7Zc8TfjPgiHAchhVnVfuttK24cXwm1D8zsJCdM43IA5dhwRdPZTWtgRBJlEhf6H23mb+K4z5zGJc/gQAf9hdsAAir7vx0DHoVa9O8zqsMRnXQ3n1zLFc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=birger-koblitz.de; spf=pass smtp.mailfrom=birger-koblitz.de; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=gZy73bsS; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=Vvj1h9Y6; arc=none smtp.client-ip=23.88.97.239 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=birger-koblitz.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=birger-koblitz.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="gZy73bsS"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="Vvj1h9Y6" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1777996601; bh=P/nWth4JdW9U9oijroHIeR3esaQQeQ+oA9kKEBeJmFg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=gZy73bsSTAq6574LDxLmLYrhytj6+9zI4qQEzgHDAWGfCYRoR+1zCH5UxG7UlIAZT Rv9M63yW/r1h4sKZprrBx0haXf79KgFpD2wKsKLxnE9aZ/xGPqJy5Y19M6iSdMe1rM eT6CZotcbVqYolprg6K7L9YL8X2twMdaPTtn2ohPqwtjBHk3FlW6O9SsM9XgrDihDb XVB4ldUciAejrjVUtLAMGfdZKvOpyz20BGq3ajoSbOdl3S9Z7pTurkfYm9rcE/6YC1 JVwMqzGQFRPrj4pJiSb0gRwvBbBd2VJ0+EGBqcJ+FQNjEWmUgM/tVRd26FnId3AYOq CDmGmQCcCgcsg== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id 40E41425FD; Tue, 5 May 2026 15:56:41 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1777996598; bh=P/nWth4JdW9U9oijroHIeR3esaQQeQ+oA9kKEBeJmFg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Vvj1h9Y6hu/NGgWJpf52X5wlIIGScNAU4CKAUn8ZgWntQJo+jiEYTCUkNWpZ+JTH1 OL6hIB8xspxqMmjqUOyckO5qKnPoByirigs/Ed0lTC+BxshNtr+Zu8lYs4iN5VIcMx R70IDajwUUZHNzOBWzOJ1EBuq0fnlHBPg5givZH045mj8HI0wi7oh/swSrZEBRcg5j 29gtbiyRA6oMLH09bIkiICw2ngDtIo9tRskBWce4blFb7S1EabVksZQTcoNRTxaSqz L73TVLvwxDDc350vTkTdDQ1aFB6g9eVkvGUyT1lXEu95XfPyb1WeO3njewQ5gD2ML0 b4AHgfxIPnxWg== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id 0EA8142498; Tue, 5 May 2026 15:56:38 +0000 (UTC) From: Birger Koblitz Date: Tue, 05 May 2026 17:56:35 +0200 Subject: [PATCH net-next v4 3/3] r8152: Add firmware upload capability for RTL8157/RTL8159 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260505-rtl8159_net_next-v4-3-1a648a9c4d8d@birger-koblitz.de> References: <20260505-rtl8159_net_next-v4-0-1a648a9c4d8d@birger-koblitz.de> In-Reply-To: <20260505-rtl8159_net_next-v4-0-1a648a9c4d8d@birger-koblitz.de> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-usb@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Chih Kai Hsu , Birger Koblitz , Aleksander Jan Bajkowski X-Mailer: b4 0.14.2 The RTL8159 (RTL_VER_17) requires firmware for its PHY in order to work at connection speeds > 5GBit. Add support for uploading firmware for the PHY using the existing rtl8152_apply_firmware() function in r8157_hw_phy_cfg() and set up the correct names for the firmware files. This also adds support for uploading firmware for the RTL8157 (RTL_VER_16) PHY, for which firmware is however not strictly necessary to work. Still, this allows to upload newer versions of the firmware used by this chip, e.g. to improve interoperability. If no firmware is found, both the RTL8157 and the RTL8159 will continue to work. Signed-off-by: Birger Koblitz Tested-by: Aleksander Jan Bajkowski --- drivers/net/usb/r8152.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 1e7f20348ac6def85106f1e8bab93a377980c77d..d281ad5ed78eded01876c6064ae= d95e1f78cfc05 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -4663,10 +4663,11 @@ static bool rtl8152_is_fw_phy_speed_up_ok(struct r8= 152 *tp, struct fw_phy_speed_ case RTL_VER_11: case RTL_VER_12: case RTL_VER_14: - case RTL_VER_16: goto out; case RTL_VER_13: case RTL_VER_15: + case RTL_VER_16: + case RTL_VER_17: default: break; } @@ -7982,12 +7983,14 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) data =3D r8153_phy_status(tp, 0); switch (data) { case PHY_STAT_EXT_INIT: + rtl8152_apply_firmware(tp, true); ocp_reg_clr_bits(tp, 0xa466, BIT(0)); ocp_reg_clr_bits(tp, 0xa468, BIT(3) | BIT(1)); break; case PHY_STAT_LAN_ON: case PHY_STAT_PWRDN: default: + rtl8152_apply_firmware(tp, false); break; } =20 @@ -9926,6 +9929,8 @@ static int rtl_ops_init(struct r8152 *tp) #define FIRMWARE_8153C_1 "rtl_nic/rtl8153c-1.fw" #define FIRMWARE_8156A_2 "rtl_nic/rtl8156a-2.fw" #define FIRMWARE_8156B_2 "rtl_nic/rtl8156b-2.fw" +#define FIRMWARE_8157_1 "rtl_nic/rtl8157-1.fw" +#define FIRMWARE_8159_1 "rtl_nic/rtl8159-1.fw" =20 MODULE_FIRMWARE(FIRMWARE_8153A_2); MODULE_FIRMWARE(FIRMWARE_8153A_3); @@ -9934,6 +9939,8 @@ MODULE_FIRMWARE(FIRMWARE_8153B_2); MODULE_FIRMWARE(FIRMWARE_8153C_1); MODULE_FIRMWARE(FIRMWARE_8156A_2); MODULE_FIRMWARE(FIRMWARE_8156B_2); +MODULE_FIRMWARE(FIRMWARE_8157_1); +MODULE_FIRMWARE(FIRMWARE_8159_1); =20 static int rtl_fw_init(struct r8152 *tp) { @@ -9972,6 +9979,12 @@ static int rtl_fw_init(struct r8152 *tp) rtl_fw->pre_fw =3D r8153b_pre_firmware_1; rtl_fw->post_fw =3D r8153c_post_firmware_1; break; + case RTL_VER_16: + rtl_fw->fw_name =3D FIRMWARE_8157_1; + break; + case RTL_VER_17: + rtl_fw->fw_name =3D FIRMWARE_8159_1; + break; default: break; } --=20 2.47.3