From nobody Tue Apr 7 08:15:23 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 A6E24284686; Sat, 14 Mar 2026 09:41:06 +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=1773481268; cv=none; b=U7C9YB3uHoCSnw1hmtjVd4t01pogFJLu1m8jIcIVW4A24rZePtpXDmPSUK3v3/unV4EJXaF9tLv5CX7P7aDhYMCwbMac1DQx6xIfNjaFU4VLjQ6dGBSRO6DVai5QlQxWj6C3FvNCjXOsxz3rrgXGD5RrJoLAgrUXOUWkArbvKOQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773481268; c=relaxed/simple; bh=RnnK7oFh5Fvk+YmVsyzNpaRHi+lsOqqdptNagFNY/xE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=S/OqIDmnitS0leyqaukzCX05G9+bWtViisa/j0+C/k9vKmhjO6dMEMutGJDV54d+Zx/dOvKh1DvSA8t6R9e0JHtwV2I3G9+Lx3eF2vWQt6tJiiFYxOxrSn+0WIAn4+yNrKWXOfuk5v7rZl8IvTs0NfQtOVzWW+dEIMT/XyJBrgk= 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=Dutbwka9; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=V85RkQTA; 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="Dutbwka9"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="V85RkQTA" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480704; bh=RnnK7oFh5Fvk+YmVsyzNpaRHi+lsOqqdptNagFNY/xE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Dutbwka9BCVj8LoI+jYmsaPLJ39tD1AS8NE9/9ektpCUlURjDKL1gYx3lVkz+BTZF MayCgv16PzhXnimzCOMiAoNapI8N1ogkQ4cjgWkZdaazvNgqfB+nBj/K5lo/+hG39f cMWtvFeH176lRh15NZyURsIHi17ozQqGjQ5DB6KhjxDz82GkBa/EJSXBp3JjIiLHcF QB8aCBCnIxufmC5+iQEYR0XvxlMB+449pLSXmdcXnbvUu2ZuMWaaTo0Ebnzt9cEMe0 uL86sEfVw76QHeteuKGFoPbDjss9i6Na4ITxeJzmQFajusvxYzJ4CwlfYHSx5IU3Rw t2TCIE1fOl1Hg== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id F12903FCEA; Sat, 14 Mar 2026 09:31:44 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480702; bh=RnnK7oFh5Fvk+YmVsyzNpaRHi+lsOqqdptNagFNY/xE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=V85RkQTAgNgmgcMsPItM2d/XbwKWvKu0E1crEmica+jWrkX0OiOYlXOK1nwNnHVIp nowmRhTL19U6PqS44EeBaP5S6NEwhPrxY6VsiDwJryCGz90gQUnh57Cbh1rpZTE2JK VDCIgrVM/0yQYwIb1vkhOsqK2LJpNgthqt89hmd6ObBUTfeY4CkiMXizdqprHPFaCd 4HKamPXqbBj+6hirnWk88zbp2BFvTjwBhX337SFVeQqkRydr9gtPgpP8nlRTIyStMR qboWMUR5BrumtLaVeVuJZE6VDtIUjI5ziNl6Dwhb8TDG+Aay7z6Wb4HPpSvi5YoP9T 57WNJ2gCecxJw== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id 5974C3FC9B; Sat, 14 Mar 2026 09:31:42 +0000 (UTC) From: Birger Koblitz Date: Sat, 14 Mar 2026 10:31:37 +0100 Subject: [PATCH net-next 1/9] r8152: Add support for RTL8157 RX/TX descriptor format 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: <20260314-rtl8157_next-v1-1-9ba77b428afd@birger-koblitz.de> References: <20260314-rtl8157_next-v1-0-9ba77b428afd@birger-koblitz.de> In-Reply-To: <20260314-rtl8157_next-v1-0-9ba77b428afd@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, Birger Koblitz X-Mailer: b4 0.14.2 The RTL8157 uses a different packet descriptor format compared to the previous generation of chips. Add support for this format by adding a descriptor format structure into the r8152 structure and corresponding desc_ops functions which abstract the vlan-tag, tx/rx len and tx/rx checksum algorithms. Adapt the previous functions for the first chip generation to support abstraction and add additional functions for the second generation. Replace all calls to the descriptor functions with abstracted functions. Signed-off-by: Birger Koblitz --- drivers/net/usb/r8152.c | 268 +++++++++++++++++++++++++++++++++++++++++---= ---- 1 file changed, 230 insertions(+), 38 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 3b6d4252d34c63ead8f11a120e212325a5f7d505..cefc08fd15c824025ae10426dcf= 41609687a723e 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -743,8 +743,6 @@ enum rtl_register_content { #define RTL8152_MAX_TX 4 #define RTL8152_MAX_RX 10 #define INTBUFSIZE 2 -#define TX_ALIGN 4 -#define RX_ALIGN 8 =20 #define RTL8152_RX_MAX_PENDING 4096 #define RTL8152_RXFG_HEADSZ 256 @@ -756,7 +754,6 @@ enum rtl_register_content { #define RTL8152_TX_TIMEOUT (5 * HZ) #define mtu_to_size(m) ((m) + VLAN_ETH_HLEN + ETH_FCS_LEN) #define size_to_mtu(s) ((s) - VLAN_ETH_HLEN - ETH_FCS_LEN) -#define rx_reserved_size(x) (mtu_to_size(x) + sizeof(struct rx_desc) + RX_= ALIGN) =20 /* rtl8152 flags */ enum rtl8152_flags { @@ -841,6 +838,40 @@ struct tx_desc { #define TX_VLAN_TAG BIT(16) }; =20 +struct rx_desc_v2 { + __le32 opts1; +#define RX_LEN_MASK_2 0xfffe0000 +#define rx_v2_get_len(x) (((x) & RX_LEN_MASK_2) >> 17) +#define RX_VLAN_TAG_2 BIT(3) +#define RX_VER_MASK 0x3 + + __le32 opts2; + + __le32 opts3; +#define IPF_2 BIT(26) /* IP checksum fail */ +#define UDPF_2 BIT(25) /* UDP checksum fail */ +#define TCPF_2 BIT(24) /* TCP checksum fail */ +#define RD_IPV6_CS_2 BIT(15) +#define RD_IPV4_CS_2 BIT(14) +#define RD_UDP_CS_2 BIT(11) +#define RD_TCP_CS_2 BIT(10) + + __le32 opts4; +}; + +struct tx_desc_v2 { + __le32 opts1; + + __le32 opts2; +#define TCPHO_MAX_2 0x3ffU + + __le32 opts3; +#define tx_v2_set_len(x) ((x) << 4) + + __le32 opts4; +#define TX_SIG (0x15 << 27) +}; + struct r8152; =20 struct rx_agg { @@ -914,6 +945,19 @@ struct r8152 { u32 ctap_short_off:1; } ups_info; =20 + struct desc_info { + void (*vlan_tag)(void *desc, struct sk_buff *skb); + u8 align; + u8 size; + } rx_desc, tx_desc; + + struct desc_ops { + void (*tx_len)(struct r8152 *tp, void *desc, u32 len); + u32 (*rx_len)(struct r8152 *tp, void *desc); + u8 (*rx_csum)(struct r8152 *tp, void *desc); + int (*tx_csum)(struct r8152 *tp, void *desc, struct sk_buff *skb, u32 le= n); + } desc_ops; + #define RTL_VER_SIZE 32 =20 struct rtl_fw { @@ -1201,7 +1245,7 @@ enum tx_csum_stat { static const int multicast_filter_limit =3D 32; static unsigned int agg_buf_sz =3D 16384; =20 -#define RTL_LIMITED_TSO_SIZE (size_to_mtu(agg_buf_sz) - sizeof(struct tx_d= esc)) +#define RTL_LIMITED_TSO_SIZE (size_to_mtu(agg_buf_sz) - tp->tx_desc.size) =20 /* If register access fails then we block access and issue a reset. If this * happens too many times in a row without a successful access then we stop @@ -2017,14 +2061,14 @@ static void intr_callback(struct urb *urb) } } =20 -static inline void *rx_agg_align(void *data) +static inline void *rx_agg_align(struct r8152 *tp, void *data) { - return (void *)ALIGN((uintptr_t)data, RX_ALIGN); + return (void *)ALIGN((uintptr_t)data, tp->rx_desc.align); } =20 -static inline void *tx_agg_align(void *data) +static inline void *tx_agg_align(struct r8152 *tp, void *data) { - return (void *)ALIGN((uintptr_t)data, TX_ALIGN); + return (void *)ALIGN((uintptr_t)data, tp->tx_desc.align); } =20 static void free_rx_agg(struct r8152 *tp, struct rx_agg *agg) @@ -2142,9 +2186,9 @@ static int alloc_all_mem(struct r8152 *tp) if (!buf) goto err1; =20 - if (buf !=3D tx_agg_align(buf)) { + if (buf !=3D tx_agg_align(tp, buf)) { kfree(buf); - buf =3D kmalloc_node(agg_buf_sz + TX_ALIGN, GFP_KERNEL, + buf =3D kmalloc_node(agg_buf_sz + tp->tx_desc.align, GFP_KERNEL, node); if (!buf) goto err1; @@ -2160,7 +2204,7 @@ static int alloc_all_mem(struct r8152 *tp) tp->tx_info[i].context =3D tp; tp->tx_info[i].urb =3D urb; tp->tx_info[i].buffer =3D buf; - tp->tx_info[i].head =3D tx_agg_align(buf); + tp->tx_info[i].head =3D tx_agg_align(tp, buf); =20 list_add_tail(&tp->tx_info[i].list, &tp->tx_free); } @@ -2247,8 +2291,17 @@ static void r8152_csum_workaround(struct r8152 *tp, = struct sk_buff *skb, } } =20 -static inline void rtl_tx_vlan_tag(struct tx_desc *desc, struct sk_buff *s= kb) +static void r8152_tx_len(struct r8152 *tp, void *tx_desc, u32 len) +{ + struct tx_desc *desc =3D tx_desc; + + desc->opts1 |=3D cpu_to_le32(len); +} + +static void r8152_tx_vlan_tag(void *d, struct sk_buff *skb) { + struct tx_desc *desc =3D d; + if (skb_vlan_tag_present(skb)) { u32 opts2; =20 @@ -2257,8 +2310,10 @@ static inline void rtl_tx_vlan_tag(struct tx_desc *d= esc, struct sk_buff *skb) } } =20 -static inline void rtl_rx_vlan_tag(struct rx_desc *desc, struct sk_buff *s= kb) +static void r8152_rx_vlan_tag(void *d, struct sk_buff *skb) { + struct rx_desc *desc =3D d; + u32 opts2 =3D le32_to_cpu(desc->opts2); =20 if (opts2 & RX_VLAN_TAG) @@ -2266,9 +2321,10 @@ static inline void rtl_rx_vlan_tag(struct rx_desc *d= esc, struct sk_buff *skb) swab16(opts2 & 0xffff)); } =20 -static int r8152_tx_csum(struct r8152 *tp, struct tx_desc *desc, +static int r8152_tx_csum(struct r8152 *tp, void *d, struct sk_buff *skb, u32 len) { + struct rx_desc *desc =3D d; u32 mss =3D skb_shinfo(skb)->gso_size; u32 opts1, opts2 =3D 0; int ret =3D TX_CSUM_SUCCESS; @@ -2354,6 +2410,73 @@ static int r8152_tx_csum(struct r8152 *tp, struct tx= _desc *desc, return ret; } =20 +static u32 r8152_rx_len(struct r8152 *tp, void *d) +{ + struct rx_desc *desc =3D d; + + return le32_to_cpu(desc->opts1) & RX_LEN_MASK; +} + +static u32 r8157_rx_len(struct r8152 *tp, void *d) +{ + struct rx_desc_v2 *desc =3D d; + + return rx_v2_get_len(le32_to_cpu(desc->opts1)); +} + +static void r8157_rx_vlan_tag(void *desc, struct sk_buff *skb) +{ + struct rx_desc_v2 *d =3D desc; + u32 opts1 =3D le32_to_cpu(d->opts1); + + if (opts1 & RX_VLAN_TAG_2) { + u32 opts2 =3D le32_to_cpu(d->opts2); + + __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), + swab16((opts2 >> 16) & 0xffff)); + } +} + +static int r8157_tx_csum(struct r8152 *tp, void *tx_desc, struct sk_buff *= skb, u32 len) +{ + u32 mss =3D skb_shinfo(skb)->gso_size; + + if (!mss && skb->ip_summed =3D=3D CHECKSUM_PARTIAL) { + u32 transport_offset =3D (u32)skb_transport_offset(skb); + + if (transport_offset > TCPHO_MAX_2) { + netif_warn(tp, tx_err, tp->netdev, + "Invalid transport offset 0x%x\n", + transport_offset); + return TX_CSUM_NONE; + } + } + + return r8152_tx_csum(tp, tx_desc, skb, len); +} + +static void r8157_tx_len(struct r8152 *tp, void *tx_desc, u32 len) +{ + struct tx_desc_v2 *desc =3D tx_desc; + + desc->opts3 =3D cpu_to_le32(tx_v2_set_len(len)); + desc->opts4 =3D cpu_to_le32(TX_SIG); +} + +static int rtl_tx_csum(struct r8152 *tp, void *desc, struct sk_buff *skb, + u32 len) +{ + int ret =3D TX_CSUM_SUCCESS; + + WARN_ON_ONCE(len > TX_LEN_MAX); + + ret =3D tp->desc_ops.tx_csum(tp, desc, skb, len); + if (!ret) + tp->desc_ops.tx_len(tp, desc, len); + + return ret; +} + static int r8152_tx_agg_fill(struct r8152 *tp, struct tx_agg *agg) { struct sk_buff_head skb_head, *tx_queue =3D &tp->tx_queue; @@ -2370,33 +2493,33 @@ static int r8152_tx_agg_fill(struct r8152 *tp, stru= ct tx_agg *agg) agg->skb_len =3D 0; remain =3D agg_buf_sz; =20 - while (remain >=3D ETH_ZLEN + sizeof(struct tx_desc)) { - struct tx_desc *tx_desc; + while (remain >=3D ETH_ZLEN + tp->tx_desc.size) { struct sk_buff *skb; unsigned int len; + void *tx_desc; =20 skb =3D __skb_dequeue(&skb_head); if (!skb) break; =20 - len =3D skb->len + sizeof(*tx_desc); + len =3D skb->len + tp->tx_desc.size; =20 if (len > remain) { __skb_queue_head(&skb_head, skb); break; } =20 - tx_data =3D tx_agg_align(tx_data); - tx_desc =3D (struct tx_desc *)tx_data; + tx_data =3D tx_agg_align(tp, tx_data); + tx_desc =3D (void *)tx_data; =20 - if (r8152_tx_csum(tp, tx_desc, skb, skb->len)) { + if (rtl_tx_csum(tp, tx_desc, skb, skb->len)) { r8152_csum_workaround(tp, skb, &skb_head); continue; } =20 - rtl_tx_vlan_tag(tx_desc, skb); + tp->tx_desc.vlan_tag(tx_desc, skb); =20 - tx_data +=3D sizeof(*tx_desc); + tx_data +=3D tp->tx_desc.size; =20 len =3D skb->len; if (skb_copy_bits(skb, 0, tx_data, len) < 0) { @@ -2404,7 +2527,7 @@ static int r8152_tx_agg_fill(struct r8152 *tp, struct= tx_agg *agg) =20 stats->tx_dropped++; dev_kfree_skb_any(skb); - tx_data -=3D sizeof(*tx_desc); + tx_data -=3D tp->tx_desc.size; continue; } =20 @@ -2414,7 +2537,7 @@ static int r8152_tx_agg_fill(struct r8152 *tp, struct= tx_agg *agg) =20 dev_kfree_skb_any(skb); =20 - remain =3D agg_buf_sz - (int)(tx_agg_align(tx_data) - agg->head); + remain =3D agg_buf_sz - (int)(tx_agg_align(tp, tx_data) - agg->head); =20 if (tp->dell_tb_rx_agg_bug) break; @@ -2452,8 +2575,9 @@ static int r8152_tx_agg_fill(struct r8152 *tp, struct= tx_agg *agg) return ret; } =20 -static u8 r8152_rx_csum(struct r8152 *tp, struct rx_desc *rx_desc) +static u8 r8152_rx_csum(struct r8152 *tp, void *d) { + struct rx_desc *rx_desc =3D d; u8 checksum =3D CHECKSUM_NONE; u32 opts2, opts3; =20 @@ -2481,6 +2605,30 @@ static u8 r8152_rx_csum(struct r8152 *tp, struct rx_= desc *rx_desc) return checksum; } =20 +static u8 r8157_rx_csum(struct r8152 *tp, void *desc) +{ + struct rx_desc_v2 *d =3D desc; + u8 checksum =3D CHECKSUM_NONE; + u32 opts3; + + if (!(tp->netdev->features & NETIF_F_RXCSUM)) + goto return_result; + + opts3 =3D le32_to_cpu(d->opts3); + + if ((opts3 & (RD_IPV4_CS_2 | IPF_2)) =3D=3D (RD_IPV4_CS_2 | IPF_2)) { + checksum =3D CHECKSUM_NONE; + } else if (opts3 & (RD_IPV4_CS_2 | RD_IPV6_CS_2)) { + if ((opts3 & (RD_UDP_CS_2 | UDPF_2)) =3D=3D RD_UDP_CS_2) + checksum =3D CHECKSUM_UNNECESSARY; + else if ((opts3 & (RD_TCP_CS_2 | TCPF_2)) =3D=3D RD_TCP_CS_2) + checksum =3D CHECKSUM_UNNECESSARY; + } + +return_result: + return checksum; +} + static inline bool rx_count_exceed(struct r8152 *tp) { return atomic_read(&tp->rx_count) > RTL8152_MAX_RX; @@ -2556,10 +2704,10 @@ static int rx_bottom(struct r8152 *tp, int budget) spin_unlock_irqrestore(&tp->rx_lock, flags); =20 list_for_each_safe(cursor, next, &rx_queue) { - struct rx_desc *rx_desc; struct rx_agg *agg, *agg_free; int len_used =3D 0; struct urb *urb; + void *rx_desc; u8 *rx_data; =20 /* A bulk transfer of USB may contain may packets, so the @@ -2582,7 +2730,7 @@ static int rx_bottom(struct r8152 *tp, int budget) =20 rx_desc =3D agg->buffer; rx_data =3D agg->buffer; - len_used +=3D sizeof(struct rx_desc); + len_used +=3D tp->rx_desc.size; =20 while (urb->actual_length > len_used) { struct net_device *netdev =3D tp->netdev; @@ -2593,7 +2741,7 @@ static int rx_bottom(struct r8152 *tp, int budget) =20 WARN_ON_ONCE(skb_queue_len(&tp->rx_queue) >=3D 1000); =20 - pkt_len =3D le32_to_cpu(rx_desc->opts1) & RX_LEN_MASK; + pkt_len =3D tp->desc_ops.rx_len(tp, rx_desc); if (pkt_len < ETH_ZLEN) break; =20 @@ -2603,7 +2751,7 @@ static int rx_bottom(struct r8152 *tp, int budget) =20 pkt_len -=3D ETH_FCS_LEN; len =3D pkt_len; - rx_data +=3D sizeof(struct rx_desc); + rx_data +=3D tp->rx_desc.size; =20 if (!agg_free || tp->rx_copybreak > len) use_frags =3D false; @@ -2634,8 +2782,8 @@ static int rx_bottom(struct r8152 *tp, int budget) goto find_next_rx; } =20 - skb->ip_summed =3D r8152_rx_csum(tp, rx_desc); - rtl_rx_vlan_tag(rx_desc, skb); + skb->ip_summed =3D tp->desc_ops.rx_csum(tp, rx_desc); + tp->rx_desc.vlan_tag(rx_desc, skb); =20 if (use_frags) { if (rx_frag_head_sz) { @@ -2672,10 +2820,10 @@ static int rx_bottom(struct r8152 *tp, int budget) } =20 find_next_rx: - rx_data =3D rx_agg_align(rx_data + len + ETH_FCS_LEN); - rx_desc =3D (struct rx_desc *)rx_data; + rx_data =3D rx_agg_align(tp, rx_data + len + ETH_FCS_LEN); + rx_desc =3D rx_data; len_used =3D agg_offset(agg, rx_data); - len_used +=3D sizeof(struct rx_desc); + len_used +=3D tp->rx_desc.size; } =20 WARN_ON(!agg_free && page_count(agg->page) > 1); @@ -2918,13 +3066,14 @@ static netdev_features_t rtl8152_features_check(struct sk_buff *skb, struct net_device *dev, netdev_features_t features) { + struct r8152 *tp =3D netdev_priv(dev); u32 mss =3D skb_shinfo(skb)->gso_size; int max_offset =3D mss ? GTTCPHO_MAX : TCPHO_MAX; =20 if ((mss || skb->ip_summed =3D=3D CHECKSUM_PARTIAL) && skb_transport_offset(skb) > max_offset) features &=3D ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK); - else if ((skb->len + sizeof(struct tx_desc)) > agg_buf_sz) + else if ((skb->len + tp->tx_desc.size) > agg_buf_sz) features &=3D ~NETIF_F_GSO_MASK; =20 return features; @@ -3015,7 +3164,7 @@ static void rtl8152_nic_reset(struct r8152 *tp) =20 static void set_tx_qlen(struct r8152 *tp) { - tp->tx_qlen =3D agg_buf_sz / (mtu_to_size(tp->netdev->mtu) + sizeof(struc= t tx_desc)); + tp->tx_qlen =3D agg_buf_sz / (mtu_to_size(tp->netdev->mtu) + tp->tx_desc.= size); } =20 static inline u16 rtl8152_get_speed(struct r8152 *tp) @@ -3248,9 +3397,14 @@ static void r8153_set_rx_early_timeout(struct r8152 = *tp) } } =20 +static u32 rx_reserved_size(struct r8152 *tp, u32 mtu) +{ + return mtu_to_size(mtu) + tp->rx_desc.size + tp->rx_desc.align; +} + static void r8153_set_rx_early_size(struct r8152 *tp) { - u32 ocp_data =3D tp->rx_buf_sz - rx_reserved_size(tp->netdev->mtu); + u32 ocp_data =3D tp->rx_buf_sz - rx_reserved_size(tp, tp->netdev->mtu); =20 switch (tp->version) { case RTL_VER_03: @@ -6603,7 +6757,7 @@ static void rtl8156_change_mtu(struct r8152 *tp) /* TX share fifo free credit full threshold */ ocp_write_word(tp, MCU_TYPE_PLA, PLA_TXFIFO_CTRL, 512 / 64); ocp_write_word(tp, MCU_TYPE_PLA, PLA_TXFIFO_FULL, - ALIGN(rx_max_size + sizeof(struct tx_desc), 1024) / 16); + ALIGN(rx_max_size + tp->tx_desc.size, 1024) / 16); } =20 static void rtl8156_up(struct r8152 *tp) @@ -9473,6 +9627,38 @@ static void rtl8153b_unload(struct r8152 *tp) r8153b_power_cut_en(tp, false); } =20 +static int r8152_desc_init(struct r8152 *tp) +{ + tp->rx_desc.size =3D sizeof(struct rx_desc); + tp->rx_desc.align =3D 8; + tp->rx_desc.vlan_tag =3D r8152_rx_vlan_tag; + tp->desc_ops.rx_csum =3D r8152_rx_csum; + tp->desc_ops.rx_len =3D r8152_rx_len; + tp->tx_desc.size =3D sizeof(struct tx_desc); + tp->tx_desc.align =3D 4; + tp->tx_desc.vlan_tag =3D r8152_tx_vlan_tag; + tp->desc_ops.tx_csum =3D r8152_tx_csum; + tp->desc_ops.tx_len =3D r8152_tx_len; + + return 0; +} + +static int r8157_desc_init(struct r8152 *tp) +{ + tp->rx_desc.size =3D sizeof(struct rx_desc_v2); + tp->rx_desc.align =3D 16; + tp->rx_desc.vlan_tag =3D r8157_rx_vlan_tag; + tp->desc_ops.rx_csum =3D r8157_rx_csum; + tp->desc_ops.rx_len =3D r8157_rx_len; + tp->tx_desc.size =3D sizeof(struct tx_desc_v2); + tp->tx_desc.align =3D 16; + tp->tx_desc.vlan_tag =3D r8152_tx_vlan_tag; + tp->desc_ops.tx_csum =3D r8157_tx_csum; + tp->desc_ops.tx_len =3D r8157_tx_len; + + return 0; +} + static int rtl_ops_init(struct r8152 *tp) { struct rtl_ops *ops =3D &tp->rtl_ops; @@ -9496,6 +9682,7 @@ static int rtl_ops_init(struct r8152 *tp) tp->rx_buf_sz =3D 16 * 1024; tp->eee_en =3D true; tp->eee_adv =3D MDIO_EEE_100TX; + r8152_desc_init(tp); break; =20 case RTL_VER_03: @@ -9520,6 +9707,7 @@ static int rtl_ops_init(struct r8152 *tp) tp->rx_buf_sz =3D 32 * 1024; tp->eee_en =3D true; tp->eee_adv =3D MDIO_EEE_1000T | MDIO_EEE_100TX; + r8152_desc_init(tp); break; =20 case RTL_VER_08: @@ -9539,6 +9727,7 @@ static int rtl_ops_init(struct r8152 *tp) tp->rx_buf_sz =3D 32 * 1024; tp->eee_en =3D true; tp->eee_adv =3D MDIO_EEE_1000T | MDIO_EEE_100TX; + r8152_desc_init(tp); break; =20 case RTL_VER_11: @@ -9561,6 +9750,7 @@ static int rtl_ops_init(struct r8152 *tp) ops->change_mtu =3D rtl8156_change_mtu; tp->rx_buf_sz =3D 48 * 1024; tp->support_2500full =3D 1; + r8152_desc_init(tp); break; =20 case RTL_VER_12: @@ -9584,6 +9774,7 @@ static int rtl_ops_init(struct r8152 *tp) ops->autosuspend_en =3D rtl8156_runtime_enable; ops->change_mtu =3D rtl8156_change_mtu; tp->rx_buf_sz =3D 48 * 1024; + r8152_desc_init(tp); break; =20 case RTL_VER_14: @@ -9602,6 +9793,7 @@ static int rtl_ops_init(struct r8152 *tp) tp->rx_buf_sz =3D 32 * 1024; tp->eee_en =3D true; tp->eee_adv =3D MDIO_EEE_1000T | MDIO_EEE_100TX; + r8152_desc_init(tp); break; =20 default: --=20 2.47.3 From nobody Tue Apr 7 08:15:23 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 A6EA23090F5; Sat, 14 Mar 2026 09:41:06 +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=1773481268; cv=none; b=tzFgp9LKJSEaAw3EVfc5/6SYa3xwhFIOdCSNBKvLwxDPRySgPWg5ayvry5IjvcxB/tdZBzI2jTOEs+lmbrLRh2Htnihi7RbYd8k/d8kS7tAtiNgWnxuhgwzsY4p6+XjhZ+43/AvKoGlnEnAsz+sSj0Pk2A2iPS+cTFOF6p3wH6Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773481268; c=relaxed/simple; bh=cNmPnsKqP2KaYH0AL/oFZr4lCyZZpafsyOjdaRm1B9I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XNCd8jnyZhusemA+HF4WAIJagOnHS3UiN/xwqHkKM8jnxlixc5ns3kOpJrqDBJt4SnAA5nBRgDkFS3fuWr+xdCSQLjhl/PNGd3XijafTbUdkUe7Jbn2QFFpHw/palEDl8AoAm8+TDhRUFGPvVSfS/3x4pCAcC4T9MZ/gvdvx0K8= 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=LdVCMBFu; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=1N9Bg0OP; 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="LdVCMBFu"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="1N9Bg0OP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480705; bh=cNmPnsKqP2KaYH0AL/oFZr4lCyZZpafsyOjdaRm1B9I=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=LdVCMBFu2m+j6owDXgRMWMtpHKqKnAzz6nJnh31cehELADjm+/cX9J0lU/Yc66LrS Ns4igDjOep+vQ3n2l04M6FX8k5LrJJAozDo3GEOlPgMsKcuYRfQi2Tr+KFBF/rQx7X 4DyVCTC8ffIPr+Dmu6QU67HEgTrK1MYdQ39Dr776mkc3JQ06a6vMe1nNrYl/poBEM2 gjOQ5yX0cAEDLUT4aaA3zNAp5wo4P0ZUs/fDgr5eDvKxMtTn4HaSISrpuZCO7eaw1L SL0Lexwp+Ia9MQZ//K8M0jKBe4XuRitHcn+tn8jFu6sQ42Qn0MV+AiDP7XaUOeB1CF pTHJWYRck5E3Q== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id 31D3D3FCED; Sat, 14 Mar 2026 09:31:45 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480702; bh=cNmPnsKqP2KaYH0AL/oFZr4lCyZZpafsyOjdaRm1B9I=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=1N9Bg0OPQ8FPFho+55p+Fz9MIYzQltoXvBLtwzFDw5ArL9LAs8QSOoE6mFvU/yYGq 3gyBaY8XZ3i5J7vylx5Iww5dHsVlN2AAMFX4/5EKO/u1b9fP3/kNXNMRJTXLcxAmiy GJfGC7AL8XWBieJd67AqIn9efFAdgm5khlPhotVbBLB+Sx1BNGhHRZEBfER7judp4o jO/fmB704muVrt/l33Ucy112wXT5ukDBxjt+3E3KTxHENEX5F9LZ6NdwlKzkUE+Gdi J8tsFXGq4zDTNTEOLbrQS5xGNPgHnNWJp2f9W63XehZ9AUG66bqx5/q0uhPgLB5Ktb WGRbVB6rjwVOg== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id 9FBF73FCAD; Sat, 14 Mar 2026 09:31:42 +0000 (UTC) From: Birger Koblitz Date: Sat, 14 Mar 2026 10:31:38 +0100 Subject: [PATCH net-next 2/9] r8152: Add support for RTL8157 SRAM access and ADV indirect access 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: <20260314-rtl8157_next-v1-2-9ba77b428afd@birger-koblitz.de> References: <20260314-rtl8157_next-v1-0-9ba77b428afd@birger-koblitz.de> In-Reply-To: <20260314-rtl8157_next-v1-0-9ba77b428afd@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, Birger Koblitz X-Mailer: b4 0.14.2 Add support for the SRAM access interface of the RTL8157 and the ADV indirect access interface. Signed-off-by: Birger Koblitz --- drivers/net/usb/r8152.c | 161 ++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 161 insertions(+) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index cefc08fd15c824025ae10426dcf41609687a723e..45b79a0138f0440a8cb0b2124b2= b71b85a319b6b 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -156,6 +156,9 @@ #define USB_U1U2_TIMER 0xd4da #define USB_FW_TASK 0xd4e8 /* RTL8153B */ #define USB_RX_AGGR_NUM 0xd4ee +#define USB_ADV_ADDR 0xd5d6 +#define USB_ADV_DATA 0xd5d8 +#define USB_ADV_CMD 0xd5dc #define USB_UPS_CTRL 0xd800 #define USB_POWER_CUT 0xd80a #define USB_MISC_0 0xd81a @@ -213,6 +216,8 @@ #define OCP_PHY_PATCH_STAT 0xb800 #define OCP_PHY_PATCH_CMD 0xb820 #define OCP_PHY_LOCK 0xb82e +#define OCP_SRAM2_ADDR 0xb87c +#define OCP_SRAM2_DATA 0xb87e #define OCP_ADC_IOFFSET 0xbcfc #define OCP_ADC_CFG 0xbc06 #define OCP_SYSCLK_CFG 0xc416 @@ -490,6 +495,12 @@ /* USB_RX_AGGR_NUM */ #define RX_AGGR_NUM_MASK 0x1ff =20 +/* USB_ADV_CMD */ +#define ADV_CMD_BMU 0 +#define ADV_CMD_BUSY BIT(0) +#define ADV_CMD_WR BIT(1) +#define ADV_CMD_IP BIT(2) + /* USB_UPS_CTRL */ #define POWER_CUT 0x0100 =20 @@ -1656,6 +1667,134 @@ static inline int r8152_mdio_read(struct r8152 *tp,= u32 reg_addr) return ocp_reg_read(tp, OCP_BASE_MII + reg_addr * 2); } =20 +static int wait_cmd_ready(struct r8152 *tp, u16 cmd) +{ + int i, ret; + + for (i =3D 0; i < 10; i++) { + u16 ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, cmd); + + if (!(ocp_data & ADV_CMD_BUSY)) + break; + usleep_range(1000, 2000); + } + + if (i =3D=3D 10) + ret =3D -ETIMEDOUT; + + return ret; +} + +static u32 ocp_adv_read(struct r8152 *tp, u16 cmd, u16 addr, u32 *data) +{ + int ret; + + ret =3D wait_cmd_ready(tp, USB_ADV_CMD); + if (ret < 0) + goto out; + + ocp_write_word(tp, MCU_TYPE_USB, USB_ADV_ADDR, addr); + + cmd |=3D ADV_CMD_BUSY; + ocp_write_word(tp, MCU_TYPE_USB, USB_ADV_CMD, cmd); + + ret =3D wait_cmd_ready(tp, USB_ADV_CMD); + if (ret < 0) + goto out; + + *data =3D ocp_read_dword(tp, MCU_TYPE_USB, USB_ADV_DATA); + +out: + return ret; +} + +static int ocp_adv_write(struct r8152 *tp, u16 cmd, u16 addr, u32 data) +{ + int ret; + + ret =3D wait_cmd_ready(tp, USB_ADV_CMD); + if (ret < 0) + goto out; + + cmd |=3D ADV_CMD_WR; + ocp_write_dword(tp, MCU_TYPE_USB, USB_ADV_DATA, data); + + ocp_write_word(tp, MCU_TYPE_USB, USB_ADV_ADDR, addr); + + cmd |=3D ADV_CMD_BUSY; + ocp_write_word(tp, MCU_TYPE_USB, USB_ADV_CMD, cmd); + +out: + return ret; +} + +static int rtl_bmu_read(struct r8152 *tp, u16 addr, u32 *data) +{ + return ocp_adv_read(tp, ADV_CMD_BMU, addr, data); +} + +static int rtl_bmu_write(struct r8152 *tp, u16 addr, u32 data) +{ + return ocp_adv_write(tp, ADV_CMD_BMU, addr, data); +} + +static int rtl_bmu_w0w1(struct r8152 *tp, u16 addr, u32 clear, u32 set) +{ + u32 bmu; + int ret; + + ret =3D rtl_bmu_read(tp, addr, &bmu); + if (ret < 0) + goto out; + + bmu =3D (bmu & ~clear) | set; + ret =3D rtl_bmu_write(tp, addr, bmu); + +out: + return ret; +} + +static int rtl_bmu_clr_bits(struct r8152 *tp, u16 addr, u32 clear) +{ + return rtl_bmu_w0w1(tp, addr, clear, 0); +} + +static int rtl_ip_read(struct r8152 *tp, u16 addr, u32 *data) +{ + return ocp_adv_read(tp, ADV_CMD_IP, addr, data); +} + +static int rtl_ip_write(struct r8152 *tp, u16 addr, u32 data) +{ + return ocp_adv_write(tp, ADV_CMD_IP, addr, data); +} + +static int rtl_ip_w0w1(struct r8152 *tp, u16 addr, u32 clear, u32 set) +{ + int ret; + u32 ip; + + ret =3D rtl_ip_read(tp, addr, &ip); + if (ret < 0) + goto out; + + ip =3D (ip & ~clear) | set; + ret =3D rtl_ip_write(tp, addr, ip); + +out: + return ret; +} + +static int rtl_ip_clr_bits(struct r8152 *tp, u16 addr, u32 clear) +{ + return rtl_ip_w0w1(tp, addr, clear, 0); +} + +static int rtl_ip_set_bits(struct r8152 *tp, u16 addr, u32 set) +{ + return rtl_ip_w0w1(tp, addr, 0, set); +} + static void sram_write(struct r8152 *tp, u16 addr, u16 data) { ocp_reg_write(tp, OCP_SRAM_ADDR, addr); @@ -1668,6 +1807,28 @@ static u16 sram_read(struct r8152 *tp, u16 addr) return ocp_reg_read(tp, OCP_SRAM_DATA); } =20 +static void sram_write_w0w1(struct r8152 *tp, u16 addr, u16 clear, u16 set) +{ + u16 data =3D sram_read(tp, addr); + + data =3D (data & ~clear) | set; + ocp_reg_write(tp, OCP_SRAM_DATA, data); +} + +static u16 sram2_read(struct r8152 *tp, u16 addr) +{ + ocp_reg_write(tp, OCP_SRAM2_ADDR, addr); + return ocp_reg_read(tp, OCP_SRAM2_DATA); +} + +static void sram2_write_w0w1(struct r8152 *tp, u16 addr, u16 clear, u16 se= t) +{ + u16 data =3D sram2_read(tp, addr); + + data =3D (data & ~clear) | set; + ocp_reg_write(tp, OCP_SRAM2_DATA, data); +} + static int read_mii_word(struct net_device *netdev, int phy_id, int reg) { struct r8152 *tp =3D netdev_priv(netdev); --=20 2.47.3 From nobody Tue Apr 7 08:15:23 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 A6F2C314D18; Sat, 14 Mar 2026 09:41:06 +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=1773481268; cv=none; b=CCPW3LT9/qI/wwN3Wn17uojnTkAS0oqW30zp9KLIexiV58lvjtNZADHYkm2bASBPE+EsSr/64MDHD86ftEMYVRZgNenL11+Cym2OOn6b4kzzVwZXbWM+e7KKzOTE7EX0k2dmRCDgJYZYz1bENj/hTsWVk/Tyjd9v/HjyhKxE2Z0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773481268; c=relaxed/simple; bh=qZul5VwJ7fo3tUtCo7/cVtxNgXfnshbnUs49IGVBbe8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ljPW8ouXnTvxJbAsishSqzX+Ift/asHwAd6oMOgL+xpfIZuWESoF4AHl0kRfVPToKyqntWxRalg5q7P1VGqKKd/y+GS0ztW3SAaF/Mn4t9LdyphmclBxhxwX181N19P7oppjCOqQNFt6ynxvrFHPWAe2LMreGEKZdcOdPYh9jZE= 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=fNK++MXc; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=YKvmhYLy; 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="fNK++MXc"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="YKvmhYLy" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480706; bh=qZul5VwJ7fo3tUtCo7/cVtxNgXfnshbnUs49IGVBbe8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=fNK++MXcSG6O0PDVVID/AxsUwvud+AUAEdNQiRh+vh/eN7aM0V86JwhYcpIjYtP5p qiAWUkJz0no25Qtc1G1dqdu8LGRyuYt+xOC9y2jKT0XTTb2+SqfsQErErheiULqkSR vom9bfHvmw0t42xp0Xmfu0gF4+o7NJL6hQeCLpQcBTqfe8eZUVAqsXN/8s5ohfNfcI U3YOYYbmpYM3jBAlO/0YH1qpRFFbx9gBI87vIbBlDtL+GoDVkaNI4GYkYfZQzwL0Ox OGTsY2WnGR3zwK0hpp8cVLwWBHwlXv2scvu055hf48sUs5mXqhDBplGkxPTULH1QB9 pHUscXiQhJvsg== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id 1E6C23FCEE; Sat, 14 Mar 2026 09:31:46 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480703; bh=qZul5VwJ7fo3tUtCo7/cVtxNgXfnshbnUs49IGVBbe8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=YKvmhYLywUtSN7n3hcGlZCMdMqqdLtRNDhtVlJivLRLjVKd9v/hQHfDoI/Iyzd15s We4lTFlj0clDMkIEdQZqKkwG1E8aamHVqWFFU9RAbnQWL+ZmDtWRyYTF+Hmp7cZ1ul o/w9afeCDyNsccM0+OkNtouhFppsWTDYOkjoYJ30dXNYD4m35a7HpwnjEpbTCbaJ/Z BVhTrqUgmHCsBOFy4Utq0wwUy9no2JFV1fE4s6tqAw/b8BsoEDjnP6P9D7X+vCxjsn U/BW1SfpZsmmseku1C29efG76rguDNR+xq1327ATvJ7hdG6ohzx1EttJzvjbvV0ph2 tm8Yuaq2O/s5A== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id DF45F3FCB1; Sat, 14 Mar 2026 09:31:42 +0000 (UTC) From: Birger Koblitz Date: Sat, 14 Mar 2026 10:31:39 +0100 Subject: [PATCH net-next 3/9] r8152: Add support for configuring the PHY of the RTL8157 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: <20260314-rtl8157_next-v1-3-9ba77b428afd@birger-koblitz.de> References: <20260314-rtl8157_next-v1-0-9ba77b428afd@birger-koblitz.de> In-Reply-To: <20260314-rtl8157_next-v1-0-9ba77b428afd@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, Birger Koblitz X-Mailer: b4 0.14.2 Add configuration support for the initial configuration of the PHY of the RTL8157 at startup. Signed-off-by: Birger Koblitz --- drivers/net/usb/r8152.c | 249 ++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 249 insertions(+) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 45b79a0138f0440a8cb0b2124b2b71b85a319b6b..c7f6566e87cfab2efa7c580ed71= f0d708b3cf85d 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -1232,6 +1232,7 @@ enum rtl_version { RTL_VER_13, RTL_VER_14, RTL_VER_15, + RTL_VER_16, =20 RTL_VER_MAX }; @@ -1591,6 +1592,22 @@ static void ocp_write_word(struct r8152 *tp, u16 typ= e, u16 index, u32 data) generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); } =20 +static void ocp_word_set_bits(struct r8152 *tp, u16 type, u16 index, u32 b= its) +{ + u32 ocp_data =3D ocp_read_word(tp, type, index); + + ocp_data |=3D bits; + ocp_write_word(tp, type, index, ocp_data); +} + +static void ocp_word_clr_bits(struct r8152 *tp, u16 type, u16 index, u32 b= its) +{ + u32 ocp_data =3D ocp_read_word(tp, type, index); + + ocp_data &=3D ~bits; + ocp_write_word(tp, type, index, ocp_data); +} + static u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index) { u32 data; @@ -1657,6 +1674,30 @@ static void ocp_reg_write(struct r8152 *tp, u16 addr= , u16 data) ocp_write_word(tp, MCU_TYPE_PLA, ocp_index, data); } =20 +static void ocp_reg_w0w1(struct r8152 *tp, u16 addr, u16 clear, u16 set) +{ + u16 data =3D ocp_reg_read(tp, addr); + + data =3D (data & ~clear) | set; + ocp_reg_write(tp, addr, data); +} + +static void ocp_reg_clr_bits(struct r8152 *tp, u16 addr, u16 bits) +{ + u16 data =3D ocp_reg_read(tp, addr); + + data &=3D ~bits; + ocp_reg_write(tp, addr, data); +} + +static void ocp_reg_set_bits(struct r8152 *tp, u16 addr, u16 bits) +{ + u16 data =3D ocp_reg_read(tp, addr); + + data |=3D bits; + ocp_reg_write(tp, addr, data); +} + static inline void r8152_mdio_write(struct r8152 *tp, u32 reg_addr, u32 va= lue) { ocp_reg_write(tp, OCP_BASE_MII + reg_addr * 2, value); @@ -8444,6 +8485,214 @@ static void r8156b_hw_phy_cfg(struct r8152 *tp) set_bit(PHY_RESET, &tp->flags); } =20 +static void r8157_hw_phy_cfg(struct r8152 *tp) +{ + u32 ocp_data; + u16 data; + int ret; + + r8156b_wait_loading_flash(tp); + + ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0); + if (ocp_data & PCUT_STATUS) { + ocp_data &=3D ~PCUT_STATUS; + ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data); + } + + ret =3D r8153_phy_status(tp, 0); + if (ret < 0) + return; + + switch (ret) { + case PHY_STAT_EXT_INIT: + 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: + break; + } + + data =3D r8152_mdio_read(tp, MII_BMCR); + if (data & BMCR_PDOWN) { + data &=3D ~BMCR_PDOWN; + r8152_mdio_write(tp, MII_BMCR, data); + } + + r8153_aldps_en(tp, false); + rtl_eee_enable(tp, false); + + ret =3D r8153_phy_status(tp, PHY_STAT_LAN_ON); + if (ret < 0) + return; + WARN_ON_ONCE(ret !=3D PHY_STAT_LAN_ON); + + /* PFM mode */ + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_PHY_PWR, PFM_PWM_SWITCH); + + /* Advanced Power Saving parameter */ + ocp_reg_set_bits(tp, 0xa430, BIT(0) | BIT(1)); + + /* aldpsce force mode */ + ocp_reg_clr_bits(tp, 0xa44a, BIT(2)); + + switch (tp->version) { + case RTL_VER_16: + /* XG_INRX parameter */ + sram_write_w0w1(tp, 0x8183, 0xff00, 0x5900); + ocp_reg_set_bits(tp, 0xa654, BIT(11)); + ocp_reg_set_bits(tp, 0xb648, BIT(14)); + ocp_reg_clr_bits(tp, 0xad2c, BIT(15)); + ocp_reg_set_bits(tp, 0xad94, BIT(5)); + ocp_reg_set_bits(tp, 0xada0, BIT(1)); + ocp_reg_w0w1(tp, 0xae06, 0xfc00, 0x7c00); + sram2_write_w0w1(tp, 0x8647, 0xff00, 0xe600); + sram2_write_w0w1(tp, 0x8036, 0xff00, 0x3000); + sram2_write_w0w1(tp, 0x8078, 0xff00, 0x3000); + + /* green mode */ + sram2_write_w0w1(tp, 0x89e9, 0xff00, 0); + sram2_write_w0w1(tp, 0x8ffd, 0xff00, 0x0100); + sram2_write_w0w1(tp, 0x8ffe, 0xff00, 0x0200); + sram2_write_w0w1(tp, 0x8fff, 0xff00, 0x0400); + + /* recognize AQC/Bcom function */ + sram_write_w0w1(tp, 0x8018, 0xff00, 0x7700); + ocp_reg_write(tp, OCP_SRAM_ADDR, 0x8f9c); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0005); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0000); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x00ed); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0502); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0b00); + ocp_reg_write(tp, OCP_SRAM_DATA, 0xd401); + sram_write_w0w1(tp, 0x8fa8, 0xff00, 0x2900); + + /* RFI_corr_thd 5g */ + sram2_write_w0w1(tp, 0x814b, 0xff00, 0x1100); + sram2_write_w0w1(tp, 0x814d, 0xff00, 0x1100); + sram2_write_w0w1(tp, 0x814f, 0xff00, 0x0b00); + sram2_write_w0w1(tp, 0x8142, 0xff00, 0x0100); + sram2_write_w0w1(tp, 0x8144, 0xff00, 0x0100); + sram2_write_w0w1(tp, 0x8150, 0xff00, 0x0100); + + /* RFI_corr_thd 2p5g */ + sram2_write_w0w1(tp, 0x8118, 0xff00, 0x0700); + sram2_write_w0w1(tp, 0x811a, 0xff00, 0x0700); + sram2_write_w0w1(tp, 0x811c, 0xff00, 0x0500); + sram2_write_w0w1(tp, 0x810f, 0xff00, 0x0100); + sram2_write_w0w1(tp, 0x8111, 0xff00, 0x0100); + sram2_write_w0w1(tp, 0x811d, 0xff00, 0x0100); + + /* RFI parameter */ + ocp_reg_clr_bits(tp, 0xad1c, BIT(8)); + ocp_reg_w0w1(tp, 0xade8, 0xffc0, 0x1400); + sram2_write_w0w1(tp, 0x864b, 0xff00, 0x9d00); + sram2_write_w0w1(tp, 0x862c, 0xff00, 0x1200); + ocp_reg_write(tp, OCP_SRAM_ADDR, 0x8566); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x003f); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x3f02); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x023c); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x3b0a); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x1c00); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0000); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0000); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0000); + ocp_reg_write(tp, OCP_SRAM_DATA, 0x0000); + + /* RFI-color noise gen parameter 5g */ + ocp_reg_set_bits(tp, 0xad9c, BIT(5)); + sram2_write_w0w1(tp, 0x8122, 0xff00, 0x0c00); + ocp_reg_write(tp, OCP_SRAM2_ADDR, 0x82c8); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03ed); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03ff); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0009); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03fe); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x000b); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0021); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03f7); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03b8); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03e0); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0049); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0049); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03e0); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03b8); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03f7); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0021); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x000b); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03fe); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0009); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03ff); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03ed); + + /* RFI-color noise gen parameter 2p5g */ + sram2_write_w0w1(tp, 0x80ef, 0xff00, 0x0c00); + ocp_reg_write(tp, OCP_SRAM2_ADDR, 0x82a0); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x000e); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03fe); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03ed); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0006); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x001a); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03f1); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03d8); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0023); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0054); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0322); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x00dd); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03ab); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03dc); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0027); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x000e); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03e5); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03f9); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0012); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x0001); + ocp_reg_write(tp, OCP_SRAM2_DATA, 0x03f1); + + /* modify thermal speed down threshold */ + ocp_reg_w0w1(tp, 0xb54c, 0xffc0, 0x3700); + + /* XG compatibility modification */ + ocp_reg_set_bits(tp, 0xb648, BIT(6)); + sram2_write_w0w1(tp, 0x8082, 0xff00, 0x5d00); + sram2_write_w0w1(tp, 0x807c, 0xff00, 0x5000); + sram2_write_w0w1(tp, 0x809d, 0xff00, 0x5000); + break; + default: + break; + } + + if (rtl_phy_patch_request(tp, true, true)) + return; + + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, EEE_SPDWN_EN); + + ocp_reg_w0w1(tp, OCP_DOWN_SPEED, EN_EEE_100 | EN_EEE_1000, EN_10M_CLKDIV); + + tp->ups_info._10m_ckdiv =3D true; + tp->ups_info.eee_plloff_100 =3D false; + tp->ups_info.eee_plloff_giga =3D false; + + ocp_reg_set_bits(tp, OCP_POWER_CFG, EEE_CLKDIV_EN); + tp->ups_info.eee_ckdiv =3D true; + + rtl_phy_patch_request(tp, false, true); + + rtl_green_en(tp, test_bit(GREEN_ETHERNET, &tp->flags)); + + ocp_reg_clr_bits(tp, 0xa428, BIT(9)); + ocp_reg_clr_bits(tp, 0xa5ea, BIT(0) | BIT(1)); + tp->ups_info.lite_mode =3D 0; + + if (tp->eee_en) + rtl_eee_enable(tp, true); + + r8153_aldps_en(tp, true); + r8152b_enable_fc(tp); + + set_bit(PHY_RESET, &tp->flags); +} + static void r8156_init(struct r8152 *tp) { u32 ocp_data; --=20 2.47.3 From nobody Tue Apr 7 08:15:23 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 A6FDA314D35; Sat, 14 Mar 2026 09:41:06 +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=1773481268; cv=none; b=B/vc13AwjM243Br1WRkWuTgOcixrm/yRa3uoWdBErVqBudISJ9uSNo+sPCviJfiHYn0jIaWqA+dHPEEMdTJI+l+unnEI45tK8eLMROUASaY8vwh2SvyIoMeq+Sf5sjIX1j+CXJJ2wKpD7ax/TBUS4CBedaGKgG4tcn2AuLIUHNw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773481268; c=relaxed/simple; bh=pbmbMBdfn5il7owA5VpO2JviffRpIlTN5GCsZTn69mQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Lzxpc6Tfx5czbY5UVSPqziR2mLTAiHIebmhl7HFVUCtkiAY8YupK24H/HFt2VzJ9Yh57D7ZEWLZdjPKEh/UkGTg3cXkrjnH3NZyKXgSnLcy4nEL3yYfm/3JjeRrhPBguyRXuo5CZu2385PQA+6p2O7HX8/d2iJPI5+6TARqXQsQ= 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=VfBKjdZ5; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=SDMJRamD; 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="VfBKjdZ5"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="SDMJRamD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480707; bh=pbmbMBdfn5il7owA5VpO2JviffRpIlTN5GCsZTn69mQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=VfBKjdZ5BEXcZ1V3ZTASgDlvJwef0fj11uI/o04vz+ID736jeNb1Ur1Fd4RTY+J4E BYfUB1L0im53HcVDBFZ9KIPzfqNTcoKi8oG7JYkYXgF3CXQSSauH79OrZG1wlJg0kt K6ujUlgDFniFyOfvb2vr81fwJcgPgkNtUdjfS2+o20Uv9cjwJFQ1dsKX5UXmv5W9zn /7Oqn//CVZg/QS59CfHE9F0BQHaFNl0LNT9jxtM/umtyA1hHCSB/e6fETny6jqdyeM 8AaLM1C6y/32GEdKKiFHuQecXetDtWwCWxyjH+QDD1Sxi+j38GDea+6VISSE2zChWG 7+Qevdk1Khnbg== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id 440B93FCD6; Sat, 14 Mar 2026 09:31:47 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480703; bh=pbmbMBdfn5il7owA5VpO2JviffRpIlTN5GCsZTn69mQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=SDMJRamDADt95yzZGXitsaPFYNZ+HnVRENLj6nyI0L0xHR5ewISDvmhitNFfKrQS5 3bVR20+Xzg6GZom5+zDEvxLnpkFrfu330/xsZIzxVEl22ZzGNJTrPuo9RynJ5Gl2De jOjfbSdgMiLgya2CxZrLgd7xP8B7YUj9dNUWQTsrYUD5q9/Pe807vUGuRUtbBme4af tjTFcIgRGi2jqBuia4LEBm3oHFQVNV2MncPQxb/oGyrPIzQZRmSmczNMTUg9HeGUm1 h40ZA4aw13zDOAF/iD6YrIQ4AYCQDJjhl85VrDHZkIwywvqxI9hTEOeNB3JJmyINqS rN6NWVSX8seZg== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id 291183FCBF; Sat, 14 Mar 2026 09:31:43 +0000 (UTC) From: Birger Koblitz Date: Sat, 14 Mar 2026 10:31:40 +0100 Subject: [PATCH net-next 4/9] r8152: Add RTL8157 initialization 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: <20260314-rtl8157_next-v1-4-9ba77b428afd@birger-koblitz.de> References: <20260314-rtl8157_next-v1-0-9ba77b428afd@birger-koblitz.de> In-Reply-To: <20260314-rtl8157_next-v1-0-9ba77b428afd@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, Birger Koblitz X-Mailer: b4 0.14.2 Add RTL8157 by combining the existing RTL8156B and RTL8156 init functions and add RTL8157-specific functinality in order to improve code readability and maintainability. r8156_init() is now called with RTL_VER_10 and RTL_VER_11 for the RTL8156, with RTL_VER_12, RTL_VER_13 and RTL_VER_15 for the RTL8156B and with RTL_VER_16 for the RTL8157 and checks the version for chip-specific code. Also add USB power control functions for the RTL8157. Signed-off-by: Birger Koblitz --- drivers/net/usb/r8152.c | 239 +++++++++++++++++++-------------------------= ---- 1 file changed, 95 insertions(+), 144 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index c7f6566e87cfab2efa7c580ed71f0d708b3cf85d..d3943cde53d309adec1a4a3c1cb= 4a2cf63617eea 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -123,6 +123,7 @@ #define USB_CSR_DUMMY1 0xb464 #define USB_CSR_DUMMY2 0xb466 #define USB_DEV_STAT 0xb808 +#define USB_U2P3_V2_CTRL 0xc2c0 #define USB_CONNECT_TIMER 0xcbf8 #define USB_MSC_TIMER 0xcbfc #define USB_BURST_SIZE 0xcfc0 @@ -540,11 +541,15 @@ #define CDC_ECM_EN BIT(3) #define RX_AGG_DISABLE 0x0010 #define RX_ZERO_EN 0x0080 +#define RX_DESC_16B 0x0400 =20 /* USB_U2P3_CTRL */ #define U2P3_ENABLE 0x0001 #define RX_DETECT8 BIT(3) =20 +/* USB_U2P3_V2_CTRL */ +#define U2P3_V2_ENABLE BIT(29) + /* USB_POWER_CUT */ #define PWR_EN 0x0001 #define PHASE2_EN 0x0008 @@ -1646,6 +1651,22 @@ static void ocp_write_byte(struct r8152 *tp, u16 typ= e, u16 index, u32 data) generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); } =20 +static void ocp_byte_clr_bits(struct r8152 *tp, u16 type, u16 index, u32 b= its) +{ + u8 ocp_data =3D ocp_read_byte(tp, type, index); + + ocp_data &=3D ~bits; + ocp_write_byte(tp, type, index, ocp_data); +} + +static void ocp_byte_set_bits(struct r8152 *tp, u16 type, u16 index, u8 bi= ts) +{ + u8 ocp_data =3D ocp_read_byte(tp, type, index); + + ocp_data |=3D bits; + ocp_write_byte(tp, type, index, ocp_data); +} + static u16 ocp_reg_read(struct r8152 *tp, u16 addr) { u16 ocp_base, ocp_index; @@ -3928,6 +3949,14 @@ static void r8153_u2p3en(struct r8152 *tp, bool enab= le) ocp_write_word(tp, MCU_TYPE_USB, USB_U2P3_CTRL, ocp_data); } =20 +static int r8157_u2p3en(struct r8152 *tp, bool enable) +{ + if (enable) + return rtl_ip_set_bits(tp, USB_U2P3_V2_CTRL, U2P3_V2_ENABLE); + else + return rtl_ip_clr_bits(tp, USB_U2P3_V2_CTRL, U2P3_V2_ENABLE); +} + static void r8153b_ups_flags(struct r8152 *tp) { u32 ups_flags =3D 0; @@ -4281,9 +4310,7 @@ static void r8153_power_cut_en(struct r8152 *tp, bool= enable) ocp_data &=3D ~(PWR_EN | PHASE2_EN); ocp_write_word(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data); =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0); - ocp_data &=3D ~PCUT_STATUS; - ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data); + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_MISC_0, PCUT_STATUS); } =20 static void r8153b_power_cut_en(struct r8152 *tp, bool enable) @@ -4297,9 +4324,19 @@ static void r8153b_power_cut_en(struct r8152 *tp, bo= ol enable) ocp_data &=3D ~PWR_EN; ocp_write_word(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data); =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0); - ocp_data &=3D ~PCUT_STATUS; - ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data); + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_MISC_0, PCUT_STATUS); +} + +static void r8157_power_cut_en(struct r8152 *tp, bool enable) +{ + if (enable) { + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_POWER_CUT, PWR_EN | PHASE2_EN); + ocp_byte_set_bits(tp, MCU_TYPE_USB, USB_MISC_2, BIT(1)); + } else { + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_POWER_CUT, PWR_EN); + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_MISC_0, PCUT_STATUS); + ocp_byte_clr_bits(tp, MCU_TYPE_USB, USB_MISC_2, BIT(1)); + } } =20 static void r8153_queue_wake(struct r8152 *tp, bool enable) @@ -8702,121 +8739,27 @@ static void r8156_init(struct r8152 *tp) if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) return; =20 - ocp_data =3D ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP); - ocp_data &=3D ~EN_ALL_SPEED; - ocp_write_byte(tp, MCU_TYPE_USB, USB_ECM_OP, ocp_data); - - ocp_write_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION, 0); - - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_ECM_OPTION); - ocp_data |=3D BYPASS_MAC_RESET; - ocp_write_word(tp, MCU_TYPE_USB, USB_ECM_OPTION, ocp_data); - - r8153b_u1u2en(tp, false); - - for (i =3D 0; i < 500; i++) { - if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & - AUTOLOAD_DONE) - break; - - msleep(20); - if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) - return; - } - - data =3D r8153_phy_status(tp, 0); - if (data =3D=3D PHY_STAT_EXT_INIT) { - data =3D ocp_reg_read(tp, 0xa468); - data &=3D ~(BIT(3) | BIT(1)); - ocp_reg_write(tp, 0xa468, data); - } - - data =3D r8152_mdio_read(tp, MII_BMCR); - if (data & BMCR_PDOWN) { - data &=3D ~BMCR_PDOWN; - r8152_mdio_write(tp, MII_BMCR, data); + if (tp->version =3D=3D RTL_VER_16) { + ocp_byte_set_bits(tp, MCU_TYPE_USB, 0xcffe, BIT(3)); + ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xd3ca, BIT(0)); } =20 - data =3D r8153_phy_status(tp, PHY_STAT_LAN_ON); - WARN_ON_ONCE(data !=3D PHY_STAT_LAN_ON); - - r8153_u2p3en(tp, false); - - /* MSC timer =3D 0xfff * 8ms =3D 32760 ms */ - ocp_write_word(tp, MCU_TYPE_USB, USB_MSC_TIMER, 0x0fff); - - /* U1/U2/L1 idle timer. 500 us */ - ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500); - - r8153b_power_cut_en(tp, false); - r8156_ups_en(tp, false); - r8153_queue_wake(tp, false); - rtl_runtime_suspend_enable(tp, false); + ocp_byte_clr_bits(tp, MCU_TYPE_USB, USB_ECM_OP, EN_ALL_SPEED); =20 - if (tp->udev->speed >=3D USB_SPEED_SUPER) - r8153b_u1u2en(tp, true); + if (tp->version !=3D RTL_VER_16) + ocp_write_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION, 0); =20 - usb_enable_lpm(tp->udev); + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_ECM_OPTION, BYPASS_MAC_RESET); =20 - r8156_mac_clk_spd(tp, true); - - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); - ocp_data &=3D ~PLA_MCU_SPDWN_EN; - ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); - - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS); - if (rtl8152_get_speed(tp) & LINK_STATUS) - ocp_data |=3D CUR_LINK_OK; - else - ocp_data &=3D ~CUR_LINK_OK; - ocp_data |=3D POLL_LINK_CHG; - ocp_write_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, ocp_data); - - set_bit(GREEN_ETHERNET, &tp->flags); - - /* rx aggregation */ - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); - ocp_data &=3D ~(RX_AGG_DISABLE | RX_ZERO_EN); - ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); - - ocp_data =3D ocp_read_byte(tp, MCU_TYPE_USB, USB_BMU_CONFIG); - ocp_data |=3D ACT_ODMA; - ocp_write_byte(tp, MCU_TYPE_USB, USB_BMU_CONFIG, ocp_data); - - r8156_mdio_force_mode(tp); - rtl_tally_reset(tp); - - tp->coalesce =3D 15000; /* 15 us */ -} - -static void r8156b_init(struct r8152 *tp) -{ - u32 ocp_data; - u16 data; - int i; - - if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) - return; - - ocp_data =3D ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP); - ocp_data &=3D ~EN_ALL_SPEED; - ocp_write_byte(tp, MCU_TYPE_USB, USB_ECM_OP, ocp_data); - - ocp_write_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION, 0); - - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_ECM_OPTION); - ocp_data |=3D BYPASS_MAC_RESET; - ocp_write_word(tp, MCU_TYPE_USB, USB_ECM_OPTION, ocp_data); - - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_U2P3_CTRL); - ocp_data |=3D RX_DETECT8; - ocp_write_word(tp, MCU_TYPE_USB, USB_U2P3_CTRL, ocp_data); + if (tp->version >=3D RTL_VER_13 && tp->version <=3D RTL_VER_15) + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_U2P3_CTRL, RX_DETECT8); =20 r8153b_u1u2en(tp, false); =20 switch (tp->version) { case RTL_VER_13: case RTL_VER_15: + case RTL_VER_16: r8156b_wait_loading_flash(tp); break; default: @@ -8835,13 +8778,9 @@ static void r8156b_init(struct r8152 *tp) =20 data =3D r8153_phy_status(tp, 0); if (data =3D=3D PHY_STAT_EXT_INIT) { - data =3D ocp_reg_read(tp, 0xa468); - data &=3D ~(BIT(3) | BIT(1)); - ocp_reg_write(tp, 0xa468, data); - - data =3D ocp_reg_read(tp, 0xa466); - data &=3D ~BIT(0); - ocp_reg_write(tp, 0xa466, data); + ocp_reg_clr_bits(tp, 0xa468, BIT(3) | BIT(1)); + if (tp->version >=3D RTL_VER_13) + ocp_reg_clr_bits(tp, 0xa466, BIT(0)); } =20 data =3D r8152_mdio_read(tp, MII_BMCR); @@ -8852,7 +8791,10 @@ static void r8156b_init(struct r8152 *tp) =20 data =3D r8153_phy_status(tp, PHY_STAT_LAN_ON); =20 - r8153_u2p3en(tp, false); + if (tp->version =3D=3D RTL_VER_16) + r8157_u2p3en(tp, false); + else + r8153_u2p3en(tp, false); =20 /* MSC timer =3D 0xfff * 8ms =3D 32760 ms */ ocp_write_word(tp, MCU_TYPE_USB, USB_MSC_TIMER, 0x0fff); @@ -8860,7 +8802,11 @@ static void r8156b_init(struct r8152 *tp) /* U1/U2/L1 idle timer. 500 us */ ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500); =20 - r8153b_power_cut_en(tp, false); + if (tp->version =3D=3D RTL_VER_16) + r8157_power_cut_en(tp, false); + else + r8153b_power_cut_en(tp, false); + r8156_ups_en(tp, false); r8153_queue_wake(tp, false); rtl_runtime_suspend_enable(tp, false); @@ -8870,33 +8816,27 @@ static void r8156b_init(struct r8152 *tp) =20 usb_enable_lpm(tp->udev); =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_RCR); - ocp_data &=3D ~SLOT_EN; - ocp_write_word(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); + if (tp->version >=3D RTL_VER_13 && tp->version <=3D RTL_VER_15) { + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, SLOT_EN); =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_CPCR); - ocp_data |=3D FLOW_CTRL_EN; - ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data); + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_CPCR, FLOW_CTRL_EN); =20 - /* enable fc timer and set timer to 600 ms. */ - ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER, - CTRL_TIMER_EN | (600 / 8)); + /* enable fc timer and set timer to 600 ms. */ + ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER, CTRL_TIMER_EN | (600 / 8)= ); =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_FW_CTRL); - if (!(ocp_read_word(tp, MCU_TYPE_PLA, PLA_POL_GPIO_CTRL) & DACK_DET_EN)) - ocp_data |=3D FLOW_CTRL_PATCH_2; - ocp_data &=3D ~AUTO_SPEEDUP; - ocp_write_word(tp, MCU_TYPE_USB, USB_FW_CTRL, ocp_data); + ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_FW_CTRL); + if (!(ocp_read_word(tp, MCU_TYPE_PLA, PLA_POL_GPIO_CTRL) & DACK_DET_EN)) + ocp_data |=3D FLOW_CTRL_PATCH_2; + ocp_data &=3D ~AUTO_SPEEDUP; + ocp_write_word(tp, MCU_TYPE_USB, USB_FW_CTRL, ocp_data); =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_FW_TASK); - ocp_data |=3D FC_PATCH_TASK; - ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data); + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); + } =20 r8156_mac_clk_spd(tp, true); =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); - ocp_data &=3D ~PLA_MCU_SPDWN_EN; - ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); + if (tp->version !=3D RTL_VER_16) + ocp_byte_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); if (rtl8152_get_speed(tp) & LINK_STATUS) @@ -8908,10 +8848,21 @@ static void r8156b_init(struct r8152 *tp) =20 set_bit(GREEN_ETHERNET, &tp->flags); =20 - /* rx aggregation */ - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); - ocp_data &=3D ~(RX_AGG_DISABLE | RX_ZERO_EN); - ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); + /* rx aggregation / 16 bytes Rx descriptor */ + 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); + + if (tp->version < RTL_VER_13) + ocp_byte_set_bits(tp, MCU_TYPE_USB, USB_BMU_CONFIG, ACT_ODMA); + + if (tp->version =3D=3D RTL_VER_16) { + /* Disable Rx Zero Len */ + rtl_bmu_clr_bits(tp, 0x2300, BIT(3)); + /* TX descriptor Signature */ + ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xd4ae, BIT(1)); + } =20 r8156_mdio_force_mode(tp); rtl_tally_reset(tp); @@ -10171,7 +10122,7 @@ static int rtl_ops_init(struct r8152 *tp) tp->eee_en =3D true; tp->eee_adv =3D MDIO_EEE_1000T | MDIO_EEE_100TX; tp->eee_adv2 =3D MDIO_EEE_2_5GT; - ops->init =3D r8156b_init; + ops->init =3D r8156_init; ops->enable =3D rtl8156b_enable; ops->disable =3D rtl8153_disable; ops->up =3D rtl8156_up; --=20 2.47.3 From nobody Tue Apr 7 08:15:23 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 9850B14B977; Sat, 14 Mar 2026 09:31:52 +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=1773480713; cv=none; b=cz0+vAgxbeDJOPDgY5ggUOnATXDKO9LYguq47OoGCLQzGhqG2hThyDC/e2uqVR2G+1hkvlGieGwh+zZj6C8PwON8p9p6r91EUgmcpAx4JCAhSdLuTZPAUJ2D9Clt/U1h9Nn0lZylpEb2+ZZITv2eg78wj8LqS0NrmuTp+xYUu38= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773480713; c=relaxed/simple; bh=/apAhyWlx1BRp3H7HaqwvkLDFiJEWN4GwXhfZCBX31c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TXuWpo+XxnM+RS+QMRgm0jikqU4me0o/NkQbKYieV+jMPjHHH6ds+hgrZ9kVPrt5cJ7BqV9UrVZsuij5p4vpGYs7ZAyaRv3NktJiX/8cvXDvKNTMiq2KWCiKDCTzJEvd0d9Fi+WgN0AH0eDuaWfDEDXSoMkvzuz3R6XZ99VCtb8= 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=Jpl+hP7r; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=pxGlYGWz; 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="Jpl+hP7r"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="pxGlYGWz" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480707; bh=/apAhyWlx1BRp3H7HaqwvkLDFiJEWN4GwXhfZCBX31c=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Jpl+hP7rwh4qwu5WXtVWxLavHO4HzM5BN5IIg9OVjfTE1XxgG0m6SgBJO1M/PVdKr dumEpxB6ts9ZQ+xxmZSC//EcQbM69tC5agt0Av2XrP0EhqYQxhpo5zxPGHDvxWcO+f gxJipAia4TWuCQ4c3AaZ/ESvBVk1wZSd0fHyhsnK9Fk1lx0gca2XAGH8iIuAWb7zi6 KspbvQ9bbklupsHBZHjJKMQZAygAJo/kzb7hw2G5l8euoWzB/eQjTFx56wmdIAbayK HFfSVx4ItF8JMAx0PfmRdE66A4KzL/+x9tUmhz70kwjZc4nw19mqi++uCrJ+VkomIs jd7OK5EQDBTnQ== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id 932153FCBB; Sat, 14 Mar 2026 09:31:47 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480703; bh=/apAhyWlx1BRp3H7HaqwvkLDFiJEWN4GwXhfZCBX31c=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=pxGlYGWzW7j6zeVA24M4V4n5oNQt1C91L8edFUWVHINLSh46uk014HWCg19JrfDUS lJkrf+WzL39zO/a4gswFgRFvRzDk+3GZ/ZNxlluxJvtF7M6tfK86HDopS+iJCa54gE IuIYWIutziix3k7MaiS0WSVDoIvS+mYjJ3mT1y6TNghfckRMX1pu8p1ctwq6ddnLZb IBqWcG8atw1VI3XnAxddT5MAFwbhhIBaKk489VShcAGHpPbDdJ56EzVZrRgMosQNRm O3qpKzDAvfVBKWDrwKMK5Fr3liiQtL9+03eJTFxI6ebUEOD1b8T9Q38LV0cyL5pGLA bsJsi85gRkEWA== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id 6730A3FCC3; Sat, 14 Mar 2026 09:31:43 +0000 (UTC) From: Birger Koblitz Date: Sat, 14 Mar 2026 10:31:41 +0100 Subject: [PATCH net-next 5/9] r8152: Add RTL8157 startup 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: <20260314-rtl8157_next-v1-5-9ba77b428afd@birger-koblitz.de> References: <20260314-rtl8157_next-v1-0-9ba77b428afd@birger-koblitz.de> In-Reply-To: <20260314-rtl8157_next-v1-0-9ba77b428afd@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, Birger Koblitz X-Mailer: b4 0.14.2 Add RTL8157 support by combining the existing RTL8156B and RTL8156 enable functions and add RTL8157-specific functinality in order to improve code re= adability and maintainability. r8156_enable() is now called with RTL_VER_10 and RTL_VER_11 for the RTL8156, with RTL_VER_12, RTL_VER_13 and RTL_VER_15 for the RTL8156B and with RTL_VER_16 for the RTL8157. The function checks the version for chip-specif= ic code. Signed-off-by: Birger Koblitz --- drivers/net/usb/r8152.c | 78 ++++++++++++---------------------------------= ---- 1 file changed, 19 insertions(+), 59 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index d3943cde53d309adec1a4a3c1cb4a2cf63617eea..435ab6bbae6f2f3a5df59d20ba8= 838217bf0a841 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -6534,15 +6534,24 @@ static int rtl8156_enable(struct r8152 *tp) if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) return -ENODEV; =20 - r8156_fc_parameter(tp); + if (tp->version < RTL_VER_12) + r8156_fc_parameter(tp); + set_tx_qlen(tp); rtl_set_eee_plus(tp); + + if (tp->version >=3D RTL_VER_12 && tp->version <=3D RTL_VER_16) + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_RX_AGGR_NUM, RX_AGGR_NUM_MASK); + r8153_set_rx_early_timeout(tp); r8153_set_rx_early_size(tp); =20 speed =3D rtl8152_get_speed(tp); rtl_set_ifg(tp, speed); =20 + if (tp->version <=3D RTL_VER_16) + return rtl_enable(tp); + ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4); if (speed & _2500bps) ocp_data &=3D ~IDLE_SPDWN_EN; @@ -6550,10 +6559,12 @@ static int rtl8156_enable(struct r8152 *tp) ocp_data |=3D IDLE_SPDWN_EN; ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, ocp_data); =20 - if (speed & _1000bps) - ocp_write_word(tp, MCU_TYPE_PLA, PLA_EEE_TXTWSYS, 0x11); - else if (speed & _500bps) - ocp_write_word(tp, MCU_TYPE_PLA, PLA_EEE_TXTWSYS, 0x3d); + if (tp->version < RTL_VER_12) { + if (speed & _1000bps) + ocp_write_word(tp, MCU_TYPE_PLA, PLA_EEE_TXTWSYS, 0x11); + else if (speed & _500bps) + ocp_write_word(tp, MCU_TYPE_PLA, PLA_EEE_TXTWSYS, 0x3d); + } =20 if (tp->udev->speed =3D=3D USB_SPEED_HIGH) { /* USB 0xb45e[3:0] l1_nyet_hird */ @@ -6566,12 +6577,9 @@ static int rtl8156_enable(struct r8152 *tp) ocp_write_word(tp, MCU_TYPE_USB, USB_L1_CTRL, ocp_data); } =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_FW_TASK); - ocp_data &=3D ~FC_PATCH_TASK; - ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data); + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); usleep_range(1000, 2000); - ocp_data |=3D FC_PATCH_TASK; - ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data); + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); =20 return rtl_enable(tp); } @@ -6584,54 +6592,6 @@ static void rtl8156_disable(struct r8152 *tp) rtl8153_disable(tp); } =20 -static int rtl8156b_enable(struct r8152 *tp) -{ - u32 ocp_data; - u16 speed; - - if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) - return -ENODEV; - - set_tx_qlen(tp); - rtl_set_eee_plus(tp); - - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_RX_AGGR_NUM); - ocp_data &=3D ~RX_AGGR_NUM_MASK; - ocp_write_word(tp, MCU_TYPE_USB, USB_RX_AGGR_NUM, ocp_data); - - r8153_set_rx_early_timeout(tp); - r8153_set_rx_early_size(tp); - - speed =3D rtl8152_get_speed(tp); - rtl_set_ifg(tp, speed); - - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4); - if (speed & _2500bps) - ocp_data &=3D ~IDLE_SPDWN_EN; - else - ocp_data |=3D IDLE_SPDWN_EN; - ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, ocp_data); - - if (tp->udev->speed =3D=3D USB_SPEED_HIGH) { - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_L1_CTRL); - ocp_data &=3D ~0xf; - if (is_flow_control(speed)) - ocp_data |=3D 0xf; - else - ocp_data |=3D 0x1; - ocp_write_word(tp, MCU_TYPE_USB, USB_L1_CTRL, ocp_data); - } - - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_FW_TASK); - ocp_data &=3D ~FC_PATCH_TASK; - ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data); - usleep_range(1000, 2000); - ocp_data |=3D FC_PATCH_TASK; - ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data); - - return rtl_enable(tp); -} - static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u32 speed, u8 d= uplex, u32 advertising) { @@ -10123,7 +10083,7 @@ static int rtl_ops_init(struct r8152 *tp) tp->eee_adv =3D MDIO_EEE_1000T | MDIO_EEE_100TX; tp->eee_adv2 =3D MDIO_EEE_2_5GT; ops->init =3D r8156_init; - ops->enable =3D rtl8156b_enable; + ops->enable =3D rtl8156_enable; ops->disable =3D rtl8153_disable; ops->up =3D rtl8156_up; ops->down =3D rtl8156_down; --=20 2.47.3 From nobody Tue Apr 7 08:15:23 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 984CB54768; Sat, 14 Mar 2026 09:31:52 +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=1773480714; cv=none; b=ok9AaqvTQt/czx3L4c7Fq1bawRSalHH6JUMfIRl+IkY9CpujR5c463au2VfXa+t8HSp8TNLFON4bjSvjo00rIAuP4L7fvDbJDSH0pWJ7i0m4KPkA5p+RkbdAhuV+xIV7+7aSCp4jJ9E+6hikBALcOSr8rdW4OaB6qIiUo1UbYDc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773480714; c=relaxed/simple; bh=kg1M5KLfR5Qb64R4Q4qeIgsFHFjGRkixCYeT1nI+vj4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GuwIOywMCXp7jEowDkJJUHAbT0W8Rl0PReEhpWLOtNvc67FPW1H0xDO2rtxTapOWwblK5n32aAxMhzWC89TIUj6aAHDoGEqXYb681pzYVg9ScIcChM4j4w9X1wrtIxAEGayVlZqdYaZQDAtv6ElKbc9gmH5UpCbdYxnCRu06ZYE= 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=gD5GNwlN; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=NBOQjM5T; 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="gD5GNwlN"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="NBOQjM5T" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480708; bh=kg1M5KLfR5Qb64R4Q4qeIgsFHFjGRkixCYeT1nI+vj4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=gD5GNwlNXXqcTpXRYkq2EQsz6YXshvERChvfGl8buAhaBjIOt5V0uN+tFNUlrFPdL blThdTJeeRdUbTiJrYNMCfXehJI7fVOEGPqLikbleVKO6laLI5R6WxFL8Eazm+GCw1 X69B6fHDv4S1D6ZL6yT9jTTlnh5kP1XgL42dwWTo+AWe+uWLTzoGYRBjA2S3MZeq0M bS5Rlc5UHwjPtsMGi5wB/T/00ImSRnQyEvM7bnNyQRceCRQG+xp/IOVht9N0asyUwc 6S0YPBJ0wUrBJ4fwRYFsp9janNAkbO09qrSyHJQ107HTds/rHM3b0Xsdl1wMIR3ylZ eRGUMkX4in5mQ== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id 48DCB3FCDC; Sat, 14 Mar 2026 09:31:48 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480703; bh=kg1M5KLfR5Qb64R4Q4qeIgsFHFjGRkixCYeT1nI+vj4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NBOQjM5Tw2RdJozW1/QWjqX0lQwP+acBgEyl/rOe3PB25G1TiqxtWAd2y6r8nEQ0t JX4hgVXYagIkxQY/Y8TXtoECNS3tXJ9d++agqUfBHhu1ShI5I14G6QaZn8pFXw63mI ou7UGsocvgc7bBNf5+siE+Yn+06TxRa8jU6HVc7WOz6unDPzpzu/yOL1533C/Arno/ E1XcC4ZhP0mIvEIvz7dvMOGpuYgg7w95OYNpSRrJ0QWaErVAOkhkO2gNs5+It/PI7l vTb0vgl9hM+3uepUnsChS1nXQQTBIcvqJzsXAQB6JWur5ke8djGBADw0mDdlyfOt68 70zVNEwvCcYPw== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id A38993FCC8; Sat, 14 Mar 2026 09:31:43 +0000 (UTC) From: Birger Koblitz Date: Sat, 14 Mar 2026 10:31:42 +0100 Subject: [PATCH net-next 6/9] r8152: Add support for chip version RTL_VER_16 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: <20260314-rtl8157_next-v1-6-9ba77b428afd@birger-koblitz.de> References: <20260314-rtl8157_next-v1-0-9ba77b428afd@birger-koblitz.de> In-Reply-To: <20260314-rtl8157_next-v1-0-9ba77b428afd@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, Birger Koblitz X-Mailer: b4 0.14.2 The RTL8157 uses RTL_VER_16. Add support for this version in all remaining configuration functions for power management and RX/TX configuration. Signed-off-by: Birger Koblitz --- drivers/net/usb/r8152.c | 71 ++++++++++++++++++++++++++++-----------------= ---- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 435ab6bbae6f2f3a5df59d20ba8838217bf0a841..bef38211c3157b5774ceccbfd92= 3b227f285aaaf 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -3609,6 +3609,7 @@ static void r8153_set_rx_early_timeout(struct r8152 *= tp) case RTL_VER_12: case RTL_VER_13: case RTL_VER_15: + case RTL_VER_16: 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, @@ -3652,6 +3653,10 @@ static void r8153_set_rx_early_size(struct r8152 *tp) ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data / 8); break; + case RTL_VER_16: + ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, + ocp_data / 16); + break; default: WARN_ON_ONCE(1); break; @@ -3777,6 +3782,7 @@ static void rtl_rx_vlan_en(struct r8152 *tp, bool ena= ble) case RTL_VER_12: case RTL_VER_13: case RTL_VER_15: + case RTL_VER_16: default: ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_RCR1); if (enable) @@ -4468,6 +4474,14 @@ static void rtl8156_runtime_enable(struct r8152 *tp,= bool enable) } } =20 +static void rtl8157_runtime_enable(struct r8152 *tp, bool enable) +{ + r8153_queue_wake(tp, enable); + r8153b_u1u2en(tp, false); + r8157_u2p3en(tp, false); + rtl_runtime_suspend_enable(tp, enable); +} + static void r8153_teredo_off(struct r8152 *tp) { u32 ocp_data; @@ -4495,6 +4509,7 @@ static void r8153_teredo_off(struct r8152 *tp) case RTL_VER_13: case RTL_VER_14: case RTL_VER_15: + case RTL_VER_16: default: /* The bit 0 ~ 7 are relative with teredo settings. They are * W1C (write 1 to clear), so set all 1 to disable it. @@ -4551,6 +4566,7 @@ static void rtl_clear_bp(struct r8152 *tp, u16 type) bp_num =3D 8; break; case RTL_VER_14: + case RTL_VER_16: default: ocp_write_word(tp, type, USB_BP2_EN, 0); bp_num =3D 16; @@ -4666,6 +4682,7 @@ static bool rtl8152_is_fw_phy_speed_up_ok(struct r815= 2 *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: @@ -5831,6 +5848,7 @@ static void rtl_eee_enable(struct r8152 *tp, bool ena= ble) case RTL_VER_12: case RTL_VER_13: case RTL_VER_15: + case RTL_VER_16: if (enable) { r8156_eee_en(tp, true); ocp_reg_write(tp, OCP_EEE_ADV, tp->eee_adv); @@ -6967,26 +6985,24 @@ static void rtl8156_up(struct r8152 *tp) return; =20 r8153b_u1u2en(tp, false); - r8153_u2p3en(tp, false); + if (tp->version !=3D RTL_VER_16) + r8153_u2p3en(tp, false); r8153_aldps_en(tp, false); =20 rxdy_gated_en(tp, true); r8153_teredo_off(tp); =20 - ocp_data =3D ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR); - ocp_data &=3D ~RCR_ACPT_ALL; - ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, RCR_ACPT_ALL); =20 rtl8152_nic_reset(tp); rtl_reset_bmu(tp); =20 - ocp_data =3D ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); - ocp_data &=3D ~NOW_IS_OOB; - ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data); + ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, NOW_IS_OOB); =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7); - ocp_data &=3D ~MCU_BORW_EN; - ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data); + if (tp->version =3D=3D RTL_VER_16) + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR1, BIT(3)); + + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, MCU_BORW_EN); =20 rtl_rx_vlan_en(tp, tp->netdev->features & NETIF_F_HW_VLAN_CTAG_RX); =20 @@ -6996,9 +7012,7 @@ static void rtl8156_up(struct r8152 *tp) case RTL_TEST_01: case RTL_VER_10: case RTL_VER_11: - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_BMU_CONFIG); - ocp_data |=3D ACT_ODMA; - ocp_write_word(tp, MCU_TYPE_USB, USB_BMU_CONFIG, ocp_data); + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_BMU_CONFIG, ACT_ODMA); break; default: break; @@ -7010,13 +7024,11 @@ static void rtl8156_up(struct r8152 *tp) ocp_data |=3D 0x08; ocp_write_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_FULL, ocp_data); =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); - ocp_data &=3D ~PLA_MCU_SPDWN_EN; - ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); + 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_USB, USB_SPEED_OPTION); - ocp_data &=3D ~(RG_PWRDN_EN | ALL_SPEED_OFF); - ocp_write_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION, ocp_data); + if (tp->version !=3D RTL_VER_16) + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_SPEED_OPTION, + RG_PWRDN_EN | ALL_SPEED_OFF); =20 ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, 0x00600400); =20 @@ -7028,7 +7040,7 @@ static void rtl8156_up(struct r8152 *tp) r8153_aldps_en(tp, true); r8153_u2p3en(tp, true); =20 - if (tp->udev->speed >=3D USB_SPEED_SUPER) + if (tp->version !=3D RTL_VER_16 && tp->udev->speed >=3D USB_SPEED_SUPER) r8153b_u1u2en(tp, true); } =20 @@ -7041,13 +7053,13 @@ static void rtl8156_down(struct r8152 *tp) return; } =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); - ocp_data |=3D PLA_MCU_SPDWN_EN; - ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, PLA_MCU_SPDWN_EN); =20 r8153b_u1u2en(tp, false); - r8153_u2p3en(tp, false); - r8153b_power_cut_en(tp, false); + if (tp->version !=3D RTL_VER_16) { + r8153_u2p3en(tp, false); + r8153b_power_cut_en(tp, false); + } r8153_aldps_en(tp, false); =20 ocp_data =3D ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); @@ -7071,13 +7083,9 @@ static void rtl8156_down(struct r8152 *tp) */ ocp_write_word(tp, MCU_TYPE_PLA, PLA_TEREDO_WAKE_BASE, 0x00ff); =20 - ocp_data =3D ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); - ocp_data |=3D NOW_IS_OOB; - ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data); + ocp_byte_set_bits(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, NOW_IS_OOB); =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7); - ocp_data |=3D MCU_BORW_EN; - ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data); + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, MCU_BORW_EN); =20 rtl_rx_vlan_en(tp, true); rxdy_gated_en(tp, false); @@ -10418,6 +10426,7 @@ static int rtl8152_probe_once(struct usb_interface = *intf, case RTL_VER_12: case RTL_VER_13: case RTL_VER_15: + case RTL_VER_16: netdev->max_mtu =3D size_to_mtu(16 * 1024); break; case RTL_VER_01: --=20 2.47.3 From nobody Tue Apr 7 08:15:23 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 46B6F33BBD7; Sat, 14 Mar 2026 09:31:54 +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=1773480715; cv=none; b=R1LI3BWowWMh9Q42xi+4TRsZFoUBr82HlHxfIYut1hzU5bVwhJ4qIBsSg+uYnG1pJ2PpKTAOK6WcLK6AdE5rRIezntcv+IXP0LlNpdXdEnZJrDc3ftJo/8cVTddUG4/YnC6UuMYfJ03aUljCPSGyPN0GmFMsO1KMx9Ai9dQLuDk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773480715; c=relaxed/simple; bh=7ahNTLag8CqBDyorUoSHN0rIlNE+4LrcQBoVWiPbrfY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sYglxPqHdE5BEY8CidbTCWu46MSekgN4+5TPh6Y7UGpiBYFH9baX691bAUaBjwebE5P02AfbovdQYINqHeO7YQNwSKRWqNkGRqtrISNbf3rOVzetQOdVmW4A8NGRKZ4B72VBtEyDtnLGd69/NLkzjyHRa8H7IpTESFEM3l4Hjlw= 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=0UbRGwfp; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=KJwFy/8I; 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="0UbRGwfp"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="KJwFy/8I" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480709; bh=7ahNTLag8CqBDyorUoSHN0rIlNE+4LrcQBoVWiPbrfY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=0UbRGwfp4FdBg3EeozogzobI0ftBhSbCWVY4SqlaOKJB4r3nhT2/OfN+q5n/H/8Ro +XdPmVlYRpd6QB5J62I5EfZthMbWXbEvz4Q5kJO/0HRFu9K3+zBH9AUIFyCwlq/SLb Hpx/Hl/WKgHpRdpBuX3bY4ZysHbBVBnz/tLKTiC4lpD+QfSivU0kQFu2NvT1RvfZjY bn6SdBYxXb8utJoGWAdzS/FDm1RVXiPB5XQQ2j5i9tbrbRgb4nlI9wDq+nCfGHezr5 ouyR+udS4sdyKFfnRQwsXOkPISFXgOTFpFZ7LQJ3f1Ep65LK6R/5oUewZhN9VW5+H1 /2nTZTvIhZvHA== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id 682CB3FCDA; Sat, 14 Mar 2026 09:31:49 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480704; bh=7ahNTLag8CqBDyorUoSHN0rIlNE+4LrcQBoVWiPbrfY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=KJwFy/8IkG8qF2B6vz7TvW8XgCabaxLwBIHKFfZI7BGZ1pJWsZ9RfsiH3pi46gmho dttR+vCbCg8+LgWG+cPBEEIrDn6wC43LSAi1UH94QNjCOTMG9A8SBKMKyOJphbp2cV 4Ddwbqua7UUM6MtGKcHuCJ/oVNd1AVEs/Jdc7kcEL0OSOPR57L8kbPsoudsKIsHy1t n1/uRRig9nmpAXIU3KmCuHWRlPiOwVRcSQ2XNukn0GWV/zMjezNMeMQpRdEKzeWz2F XWAaqrZYyy7XybPULwsWB0rckVwpFPEXpWmxosmvqhC7Le+DiXM2W2MActsTtRxX/m c04zdwioLiTOA== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id E14093FCCB; Sat, 14 Mar 2026 09:31:43 +0000 (UTC) From: Birger Koblitz Date: Sat, 14 Mar 2026 10:31:43 +0100 Subject: [PATCH net-next 7/9] r8152: Add support for 5Gbit Link Speeds 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: <20260314-rtl8157_next-v1-7-9ba77b428afd@birger-koblitz.de> References: <20260314-rtl8157_next-v1-0-9ba77b428afd@birger-koblitz.de> In-Reply-To: <20260314-rtl8157_next-v1-0-9ba77b428afd@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, Birger Koblitz X-Mailer: b4 0.14.2 The RTL8157 supports 5GBit Link speeds. Add support for this speed in the setup and setting/getting through ethool. Signed-off-by: Birger Koblitz --- drivers/net/usb/r8152.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index bef38211c3157b5774ceccbfd923b227f285aaaf..f9498c39dc6ec8bf4605b17e2c8= 1bbe180b1b2d3 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -620,6 +620,7 @@ enum spd_duplex { FORCE_100M_FULL, FORCE_1000M_FULL, NWAY_2500M_FULL, + NWAY_5000M_FULL, }; =20 /* OCP_ALDPS_CONFIG */ @@ -741,6 +742,7 @@ enum spd_duplex { #define BP4_SUPER_ONLY 0x1578 /* RTL_VER_04 only */ =20 enum rtl_register_content { + _5000bps =3D BIT(12), _2500bps =3D BIT(10), _1250bps =3D BIT(9), _500bps =3D BIT(8), @@ -754,6 +756,7 @@ 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_flow_control(_speed) (((_speed) & (_tx_flow | _rx_flow)) =3D=3D= (_tx_flow | _rx_flow)) =20 #define RTL8152_MAX_TX 4 @@ -1004,6 +1007,7 @@ struct r8152 { unsigned int pipe_in, pipe_out, pipe_intr, pipe_ctrl_in, pipe_ctrl_out; =20 u32 support_2500full:1; + u32 support_5000full:1; u32 lenovo_macpassthru:1; u32 dell_tb_rx_agg_bug:1; u16 ocp_base; @@ -1255,6 +1259,7 @@ enum tx_csum_stat { #define RTL_ADVERTISED_1000_HALF BIT(4) #define RTL_ADVERTISED_1000_FULL BIT(5) #define RTL_ADVERTISED_2500_FULL BIT(6) +#define RTL_ADVERTISED_5000_FULL BIT(7) =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. @@ -6669,6 +6674,9 @@ static int rtl8152_set_speed(struct r8152 *tp, u8 aut= oneg, u32 speed, u8 duplex, =20 if (tp->support_2500full) support |=3D RTL_ADVERTISED_2500_FULL; + + if (tp->support_5000full) + support |=3D RTL_ADVERTISED_5000_FULL; } =20 if (!(advertising & support)) @@ -6714,15 +6722,20 @@ static int rtl8152_set_speed(struct r8152 *tp, u8 a= utoneg, u32 speed, u8 duplex, r8152_mdio_write(tp, MII_CTRL1000, new1); } =20 - if (tp->support_2500full) { + if (tp->support_2500full || tp->support_5000full) { orig =3D ocp_reg_read(tp, OCP_10GBT_CTRL); - new1 =3D orig & ~MDIO_AN_10GBT_CTRL_ADV2_5G; + new1 =3D orig & ~(MDIO_AN_10GBT_CTRL_ADV2_5G | MDIO_AN_10GBT_CTRL_ADV5G= ); =20 if (advertising & RTL_ADVERTISED_2500_FULL) { new1 |=3D MDIO_AN_10GBT_CTRL_ADV2_5G; tp->ups_info.speed_duplex =3D NWAY_2500M_FULL; } =20 + if (advertising & RTL_ADVERTISED_5000_FULL) { + new1 |=3D MDIO_AN_10GBT_CTRL_ADV5G; + tp->ups_info.speed_duplex =3D NWAY_5000M_FULL; + } + if (orig !=3D new1) ocp_reg_write(tp, OCP_10GBT_CTRL, new1); } @@ -9263,6 +9276,9 @@ int rtl8152_get_link_ksettings(struct net_device *net= dev, linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, cmd->link_modes.supported, tp->support_2500full); =20 + linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, + cmd->link_modes.supported, tp->support_5000full); + if (tp->support_2500full) { linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, cmd->link_modes.advertising, @@ -9276,6 +9292,19 @@ int rtl8152_get_link_ksettings(struct net_device *ne= tdev, cmd->base.speed =3D SPEED_2500; } =20 + if (tp->support_5000full) { + linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, + cmd->link_modes.advertising, + ocp_reg_read(tp, OCP_10GBT_CTRL) & MDIO_AN_10GBT_CTRL_ADV5G); + + linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, + cmd->link_modes.lp_advertising, + ocp_reg_read(tp, OCP_10GBT_STAT) & MDIO_AN_10GBT_STAT_LP5G); + + if (is_speed_5000(rtl8152_get_speed(tp))) + cmd->base.speed =3D SPEED_5000; + } + mutex_unlock(&tp->control); =20 usb_autopm_put_interface(tp->intf); @@ -9323,6 +9352,10 @@ static int rtl8152_set_link_ksettings(struct net_dev= ice *dev, cmd->link_modes.advertising)) advertising |=3D RTL_ADVERTISED_2500_FULL; =20 + if (test_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, + cmd->link_modes.advertising)) + advertising |=3D RTL_ADVERTISED_5000_FULL; + mutex_lock(&tp->control); =20 ret =3D rtl8152_set_speed(tp, cmd->base.autoneg, cmd->base.speed, @@ -10456,6 +10489,11 @@ static int rtl8152_probe_once(struct usb_interface= *intf, } else { tp->speed =3D SPEED_1000; } + if (tp->support_5000full && + tp->udev->speed >=3D USB_SPEED_SUPER) { + tp->speed =3D SPEED_5000; + tp->advertising |=3D RTL_ADVERTISED_5000_FULL; + } tp->advertising |=3D RTL_ADVERTISED_1000_FULL; } tp->duplex =3D DUPLEX_FULL; --=20 2.47.3 From nobody Tue Apr 7 08:15:23 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 46A6733B97F; Sat, 14 Mar 2026 09:31:54 +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=1773480717; cv=none; b=kX46xgcstotlpmHmmTO/4xBN4plv5naI5zVn39l07Y0TSHXX6VrUwyHKNQTojiZ6La3MHNaVCWZ0ys8ZZY4O2KqPildEw2PkxKVw9umrM4sWQBToScV4wvLqB1wJagGH764WrcJLLl9bG7wBeiTzMXI0HhryZegYsaoGlxqbzrM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773480717; c=relaxed/simple; bh=RKyQzshGVUa1z7B29iBMApIzTeMOOhOdYaPyb4r/zIw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Db1oeNHHpvMbaxWxESVKIjdA4sVahP8S80tlL1u3x+QeIe6XQQajMoxx7Tp3BzEPYYD2tzoK7KlkpRLmTyfj1sIDJ2Si83dieFP9Qy0VJ5XTYgdeAX/5QQrXcb62mU1KGjqBGi/6b5yc8Xfc0qZPTV65e437akHPp1rP47dQBOk= 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=fQlvGUCu; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=JPrT6dta; 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="fQlvGUCu"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="JPrT6dta" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480709; bh=RKyQzshGVUa1z7B29iBMApIzTeMOOhOdYaPyb4r/zIw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=fQlvGUCudHeCI2lGd0BNmy0VYVUynfluGxcidgVa5QEZ0LVguScCDstX8MLH1v09h /wS7p2MCKOWJiHP/pWEZMTCFHeUlKzWxb0iXp/M+oxdKWVyXStldZSPOt8AT+fOCJ2 4gxv8LaPfLKBHEtYABV3rjnuyJGNi4PACryPwSXCudarz0WIGDCw1Ppfeor+Jdh2I6 sGCdvlPMx9MleD5SA9d1+nWkrDOmtBkbAofEmgds9cmepI5ZVxZAzaB5KoO1Qi1q8k 4Fm/40bAfKsVC1Xt+VW58WSpFa0B99knRq0JRMSh57bcqav+p9tqTY87o83x0UpWty fmLJWVOs6vddA== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id 781793FCCB; Sat, 14 Mar 2026 09:31:49 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480704; bh=RKyQzshGVUa1z7B29iBMApIzTeMOOhOdYaPyb4r/zIw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JPrT6dta8VgPFGcPhFLhj0qlenSaO332HRM16QpuwTWSOZ+KSOh52DYbpzB8gprq/ 3eXsFXPehs8Sl4vbM4WpdE+TmCrH8NEAtou9hUHLm7K5Mlq1sW/rj9kb+gvHA0WszO Hn28yZLEmZha83wVGRKrlpGDSaPk7ro5JqQl72k8Jjan5/Ituk1vaLkOOdcb8MaCIr IK2s5lftHVfItJrQngiB9oepacOelPdzEaIyHnpAPBct+NLL+zL/xqQXDbv0i06FBB nQqqYTLDTChjfx3FJV3yDSEOsWpJ6un1fVJlOMyoYwSshD1H5MlDjf1PCjQzjt/qDa uq4z3INwgjVUw== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id 2BEA73FCCD; Sat, 14 Mar 2026 09:31:44 +0000 (UTC) From: Birger Koblitz Date: Sat, 14 Mar 2026 10:31:44 +0100 Subject: [PATCH net-next 8/9] r8152: Add support for 5GBit 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: <20260314-rtl8157_next-v1-8-9ba77b428afd@birger-koblitz.de> References: <20260314-rtl8157_next-v1-0-9ba77b428afd@birger-koblitz.de> In-Reply-To: <20260314-rtl8157_next-v1-0-9ba77b428afd@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, Birger Koblitz X-Mailer: b4 0.14.2 The RTL8157 supports 5GBit EEE. Add functionality for setup and ethtool get/set methods. Signed-off-by: Birger Koblitz --- drivers/net/usb/r8152.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index f9498c39dc6ec8bf4605b17e2c81bbe180b1b2d3..427a05d166ad98622a113df994b= 01a96ad6b2872 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -5815,6 +5815,11 @@ static void r8156_eee_en(struct r8152 *tp, bool enab= le) else config &=3D ~MDIO_EEE_2_5GT; =20 + if (enable && (tp->eee_adv2 & MDIO_EEE_5GT)) + config |=3D MDIO_EEE_5GT; + else + config &=3D ~MDIO_EEE_5GT; + ocp_reg_write(tp, OCP_EEE_ADV2, config); } =20 @@ -9473,7 +9478,7 @@ static int r8152_set_eee(struct r8152 *tp, struct eth= tool_keee *eee) =20 tp->eee_en =3D eee->eee_enabled; tp->eee_adv =3D val; - if (tp->support_2500full) { + if (tp->support_2500full || tp->support_5000full) { val =3D linkmode_to_mii_eee_cap2_t(eee->advertised); tp->eee_adv2 =3D val; } @@ -9510,6 +9515,13 @@ static int r8153_get_eee(struct r8152 *tp, struct et= htool_keee *eee) linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, common); } =20 + if (tp->support_5000full) { + linkmode_set_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, eee->supported); + + if (speed & _5000bps) + linkmode_set_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, common); + } + eee->eee_enabled =3D tp->eee_en; =20 if (speed & _1000bps) --=20 2.47.3 From nobody Tue Apr 7 08:15:23 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 46AF133BBBD; Sat, 14 Mar 2026 09:31:54 +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=1773480715; cv=none; b=F1Cb09H5+WT2YaXWHRhDSBRtv6jZzZumtS7g+0h9fHiIHCkHgAUd5UETHgbzKYvnuiQjF0zZpwKgfZlMUjuTs5wpmA5/vGzok919aSQg18O0YjywN141M9EFkkMsNfl2SrZyHe1ZfNI3S5dHNH8OX9zFtMys+De8m12RSSqZlWY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773480715; c=relaxed/simple; bh=pgDTvuXbxejoe5q8T5y5XzwAT+BjkglNndhC2uWcbQM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RkZANtHqffUb+8SS9WCprujWY9vF25XvD55rzRZVpXOMlbNlX4rXh2L154qA2zFEjjAzS+yyVePiJOkFfdx0URtwmafzI8eTF66PzrciVHOr+a3WDm5dg5wRUhPJ0vE/tAWMqYs8GxIsf4cEpIDwUTdVEJ7pJQr+Hrq0V5ie9Ug= 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=IoPz02Lu; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=kIpDSA1T; 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="IoPz02Lu"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="kIpDSA1T" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480709; bh=pgDTvuXbxejoe5q8T5y5XzwAT+BjkglNndhC2uWcbQM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=IoPz02LuPx+rvheyuzojKb7WnSa85R80atz2Ndg2EVpZ5+9l3aPeydy2bxypGeDIN PCRBswusdTOEQSfM6fVl2pUYhgv15Dq+k4wb2daTDy+7Db116yF1w33/v8r/aQwy0X xLg342422UPOE9M9ugkh+xgc3seQ3w7vX3G0zmMZSYcsc3ux5KU75LeYFe6yzSPJHX HiQnnfDw6H24qcBoATFHdWABx8dX6qQnqHlzqHgEgw26+n/zstCEt8XS/eE/vYSnp4 mkoHG9ylANpEeD/f/W/kUrCCbCpC6joPNTqFaHBq0uExGk6CO9qq2PuCPmTc6sDY7W r2KfXWGUZa5qg== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id 868073FC9A; Sat, 14 Mar 2026 09:31:49 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1773480704; bh=pgDTvuXbxejoe5q8T5y5XzwAT+BjkglNndhC2uWcbQM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=kIpDSA1Tk+0ei3lnjgUaBnt5cikRpjtzqHZYjPpHb1ckNLF7FfOfYGpVPUHoQIn7o /FoQkH4Tl4CPvuzfVQq5CgZcbuO8RVNvMHKmIv4/NszYYqP6XlyBAI+5/epvE/ZA0n cmVy5YrW92ZonGO9/tti++7O5W1bQndrctTnjoGy9rjPw/s4ogJUnJId0ZaCQGtZrU 83ciPjp62vNyw/F0ZcE0CIVKsF5u4i6UlU8YiaCKK7f8Xg+icw+cNfZLVPHaOPkkLn VhpUM0cBqgbMUYztbcVh80b5V1uU2R51M/svC4Fz+P9ULAXulcbnU8e0qHEFPdbYwc qAwOL91DyGqsw== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id 6A8A73FCDE; Sat, 14 Mar 2026 09:31:44 +0000 (UTC) From: Birger Koblitz Date: Sat, 14 Mar 2026 10:31:45 +0100 Subject: [PATCH net-next 9/9] r8152: Detect RTL8157 and setup 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: <20260314-rtl8157_next-v1-9-9ba77b428afd@birger-koblitz.de> References: <20260314-rtl8157_next-v1-0-9ba77b428afd@birger-koblitz.de> In-Reply-To: <20260314-rtl8157_next-v1-0-9ba77b428afd@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, Birger Koblitz X-Mailer: b4 0.14.2 Add support for the USB device ID of Realtek RTL8157-based adapters. Detect the RTL8157 as RTL_VER_16 and set it up. Signed-off-by: Birger Koblitz --- drivers/net/usb/r8152.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 427a05d166ad98622a113df994b01a96ad6b2872..fd913f09ffc0189ac6a84b19ef6= ae7b66700e100 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -10170,6 +10170,28 @@ static int rtl_ops_init(struct r8152 *tp) r8152_desc_init(tp); break; =20 + case RTL_VER_16: + tp->eee_en =3D true; + tp->eee_adv =3D MDIO_EEE_1000T | MDIO_EEE_100TX; + 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 32 * 1024; + tp->support_2500full =3D 1; + tp->support_5000full =3D 1; + r8157_desc_init(tp); + break; + default: ret =3D -ENODEV; dev_err(&tp->intf->dev, "Unknown Device\n"); @@ -10320,6 +10342,9 @@ static u8 __rtl_get_hw_ver(struct usb_device *udev) case 0x7420: version =3D RTL_VER_15; break; + case 0x1030: + version =3D RTL_VER_16; + break; default: version =3D RTL_VER_UNKNOWN; dev_info(&udev->dev, "Unknown version 0x%04x\n", ocp_data); @@ -10631,6 +10656,7 @@ static const struct usb_device_id rtl8152_table[] = =3D { { USB_DEVICE(VENDOR_ID_REALTEK, 0x8153) }, { USB_DEVICE(VENDOR_ID_REALTEK, 0x8155) }, { USB_DEVICE(VENDOR_ID_REALTEK, 0x8156) }, + { USB_DEVICE(VENDOR_ID_REALTEK, 0x8157) }, =20 /* Microsoft */ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab) }, --=20 2.47.3