From nobody Tue Apr 7 09:48:24 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