From nobody Sat Sep 26 11:01:42 2026 Received: from rtits2.realtek.com.tw (rtits2.realtek.com [211.75.126.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF398403AE6; Wed, 2 Sep 2026 09:07:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=211.75.126.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340039; cv=none; b=oPbeBCPNj5ZjG62b0zumkzxrObL92d5L31RNeANY+D+CSo5m7bsHyaCJB2uShO+x/VYqyvocCTf/6mgmmA7N+a1sQiSE72BAPWKA0p4Jo2SFOQM7c/jrDMnOdfiUQ98gkD6k7bzuL0CLl17udoZURiSOttc4nKVXvrfLdDEZ2ig= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340039; c=relaxed/simple; bh=vTlXc27lZ80Fed9p8Ygxf4DjRviYOeZ8Wywm+0B4+2E=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cFlvQgefk3kSnb2pfpkwxh/+1EWfEUYsAu7HjD5K/FM00OclAGOLpBY6AltPT9jvIZnVWxjgOm0kFABvF3Vy23JMw0X8Bu32o8rFPWWkBiszO4kdD2EpVwD/fQzsF1xxSQSNlGNsiL41vscU+wf9QsMaE/IhIu775lWwRml2bPQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com; spf=pass smtp.mailfrom=realtek.com; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b=HtPePJzW; arc=none smtp.client-ip=211.75.126.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=realtek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b="HtPePJzW" X-SpamFilter-By: ArmorX SpamTrap 5.80 with qID 68296gWA22526929, This message is accepted by code: ctloc85258 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=realtek.com; s=dkim; t=1788340002; bh=ct093FtyWohlG7fpVxhw2kH2h3iUynPM40v2zS1tBLA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding:Content-Type; b=HtPePJzWaTJEl8e4mIY1JO+PuhDPWt+mGEbd2zSiGMPDl7Y0UNbN0WEnsjfvV6h9o 9/EZUm4KHVYmRdU1KGab76ShPIHA6EnseFYTUn70o7KhGWgFfOkmfMacOggavUn4hq 8aJHwsB6wb5EpIwk236UA2Etx74LYtPoFpxbLaIcmW14NOHxmmvmHabWDZ6/UzeEOq WTUfYfavfGIF0R0TMMDXBIGWEX+8FlHix2Pelhpb2dLBOX4fxhCCQQ/u2PwpjPajMo 9SCUOBmoxGyZfnpTuz78lneQk0vHCmWM7ZmjnZ8iH1093O9JIh/KZkws/JpyuQJc+e yOYjhHmK6pq6A== Received: from mail.realtek.com (rtkexhmbs02.realtek.com.tw[172.21.6.41]) by rtits2.realtek.com.tw (8.15.2/3.29/5.94) with ESMTPS id 68296gWA22526929 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 2 Sep 2026 17:06:42 +0800 Received: from RTKEXHMBS06.realtek.com.tw (10.21.1.56) by RTKEXHMBS02.realtek.com.tw (172.21.6.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.43; Wed, 2 Sep 2026 17:06:41 +0800 Received: from fc44.realtek.com.tw (172.22.241.7) by RTKEXHMBS06.realtek.com.tw (10.21.1.56) with Microsoft SMTP Server id 15.2.2562.43 via Frontend Transport; Wed, 2 Sep 2026 17:06:41 +0800 From: Chih Kai Hsu To: , CC: , , , , , , , , Subject: [PATCH net-next 1/8] r8152: refactor r8156_init Date: Wed, 2 Sep 2026 17:06:25 +0800 Message-ID: <20260902090632.41844-2-nic_swsd@realtek.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260902090632.41844-1-nic_swsd@realtek.com> References: <20260902090632.41844-1-nic_swsd@realtek.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Refactor r8156_init into four functions: - r8156_init() for RTL_VER_10/11 - r8156b_init() for RTL_VER_12/13/15 - r8157_init() for RTL_VER_16 - r8159_init() for RTL_VER_17 Signed-off-by: Chih Kai Hsu --- drivers/net/usb/r8152.c | 424 ++++++++++++++++++++++++++++++++-------- 1 file changed, 346 insertions(+), 78 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 57d04af6368c3..0a06c947e381a 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -78,6 +78,7 @@ #define PLA_EEE_TXTWSYS_2P5G 0xe058 #define PLA_EEEP_CR 0xe080 #define PLA_MAC_PWR_CTRL 0xe0c0 +#define PLA_RMT_WAKE 0xe0c8 #define PLA_MAC_PWR_CTRL2 0xe0ca #define PLA_MAC_PWR_CTRL3 0xe0cc #define PLA_MAC_PWR_CTRL4 0xe0ce @@ -371,6 +372,9 @@ #define MCU_CLK_RATIO_MASK 0x0f0f0f0f #define ALDPS_SPDWN_RATIO 0x0f87 =20 +/* PLA_RMT_WAKE */ +#define RMT_WAKE_EN BIT(0) + /* PLA_MAC_PWR_CTRL2 */ #define EEE_SPDWN_RATIO 0x8007 #define MAC_CLK_SPDWN_EN BIT(15) @@ -417,6 +421,7 @@ =20 /* PLA_INDICATE_FALG */ #define UPCOMING_RUNTIME_D3 BIT(0) +#define PREBOOT_OPTION BIT(1) =20 /* PLA_MACDBG_PRE and PLA_MACDBG_POST */ #define DEBUG_OE BIT(0) @@ -542,6 +547,7 @@ #define RX_AGG_DISABLE 0x0010 #define RX_ZERO_EN 0x0080 #define RX_DESC_16B 0x0400 +#define RX_END_TRANSFER_EN BIT(11) =20 /* USB_U2P3_CTRL */ #define U2P3_ENABLE 0x0001 @@ -8358,19 +8364,97 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) set_bit(PHY_RESET, &tp->flags); } =20 -static int r8159_wait_backup_restore(struct r8152 *tp) +static void r8156_init(struct r8152 *tp) { - u32 ocp_data; + u16 data; + int i; =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0); - if (!(ocp_data & PCUT_STATUS)) - return 0; + if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; =20 - return poll_timeout_us(ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_G= PHY_CTRL), - ocp_data & BACKUP_RESTRORE, 200, 20000, false); + ocp_byte_clr_bits(tp, MCU_TYPE_USB, USB_ECM_OP, EN_ALL_SPEED); + + ocp_write_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION, 0); + + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_ECM_OPTION, BYPASS_MAC_RESET); + + 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) + ocp_reg_clr_bits(tp, 0xa468, BIT(3) | BIT(1)); + + r8152_mdio_test_and_clr_bit(tp, MII_BMCR, BMCR_PDOWN); + + data =3D r8153_phy_status(tp, 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_PLA, PLA_INDICATE_FALG, PREBOOT_OPTION); + + ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_RMT_WAKE, RMT_WAKE_EN); + + if (tp->udev->speed >=3D USB_SPEED_SUPER) + r8153b_u1u2en(tp, true); + + usb_enable_lpm(tp->udev); + + r8156_mac_clk_spd(tp, true); + + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, + PLA_MCU_SPDWN_EN); + + if (rtl8152_get_speed(tp) & LINK_STATUS) + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, + CUR_LINK_OK | POLL_LINK_CHG); + else + ocp_word_w0w1(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, CUR_LINK_OK, + POLL_LINK_CHG); + + set_bit(GREEN_ETHERNET, &tp->flags); + + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL, + RX_AGG_DISABLE | RX_ZERO_EN); + + ocp_byte_set_bits(tp, MCU_TYPE_USB, USB_BMU_CONFIG, ACT_ODMA); + + r8156_mdio_force_mode(tp); + rtl_tally_reset(tp); + + tp->coalesce =3D 15000; /* 15 us */ } =20 -static void r8156_init(struct r8152 *tp) +static void r8156b_u2phy_backup(struct r8152 *tp) +{ + ocp_write_word(tp, MCU_TYPE_USB, 0xd3ce, 0x181b); + ocp_write_dword(tp, MCU_TYPE_USB, 0xd3d0, 0x616ccd99); + ocp_write_dword(tp, MCU_TYPE_USB, 0xd3d4, 0x08fc8101); + ocp_write_dword(tp, MCU_TYPE_USB, 0xd3d8, 0x159b1100); + ocp_write_word(tp, MCU_TYPE_USB, 0xd3dc, 0x0a00); +} + +static void r8156b_init(struct r8152 *tp) { u32 ocp_data; u16 data; @@ -8379,28 +8463,19 @@ static void r8156_init(struct r8152 *tp) if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) return; =20 - if (tp->version =3D=3D RTL_VER_16 || tp->version =3D=3D RTL_VER_17) { - ocp_byte_set_bits(tp, MCU_TYPE_USB, 0xcffe, BIT(3)); - ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xd3ca, BIT(0)); - } - ocp_byte_clr_bits(tp, MCU_TYPE_USB, USB_ECM_OP, EN_ALL_SPEED); =20 - if (tp->version < RTL_VER_16) - ocp_write_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION, 0); + ocp_write_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION, 0); =20 ocp_word_set_bits(tp, MCU_TYPE_USB, USB_ECM_OPTION, BYPASS_MAC_RESET); =20 - if (tp->version >=3D RTL_VER_12 && tp->version <=3D RTL_VER_15) - ocp_word_set_bits(tp, MCU_TYPE_USB, USB_U2P3_CTRL, RX_DETECT8); + 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: - case RTL_VER_17: r8156b_wait_loading_flash(tp); break; default: @@ -8417,31 +8492,20 @@ static void r8156_init(struct r8152 *tp) return; } =20 - if (tp->version =3D=3D RTL_VER_17 && r8159_wait_backup_restore(tp)) { - rtl_set_inaccessible(tp); - dev_err(&tp->intf->dev, "init failed, backup-restore timed out\n"); - return; - } - data =3D r8153_phy_status(tp, 0); if (data =3D=3D PHY_STAT_EXT_INIT) { ocp_reg_clr_bits(tp, 0xa468, BIT(3) | BIT(1)); - if (tp->version >=3D RTL_VER_12) - ocp_reg_clr_bits(tp, 0xa466, BIT(0)); + ocp_reg_clr_bits(tp, 0xa466, BIT(0)); } =20 - data =3D r8152_mdio_read(tp, MII_BMCR); - if (data & BMCR_PDOWN) { - data &=3D ~BMCR_PDOWN; - r8152_mdio_write(tp, MII_BMCR, data); - } + r8152_mdio_test_and_clr_bit(tp, MII_BMCR, BMCR_PDOWN); =20 data =3D r8153_phy_status(tp, PHY_STAT_LAN_ON); =20 - if (tp->version >=3D RTL_VER_16) - r8157_u2p3en(tp, false); - else - r8153_u2p3en(tp, false); + r8153_u2p3en(tp, false); + + /* Disable Auto Speed up */ + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, AUTO_SPEEDUP); =20 /* MSC timer =3D 0xfff * 8ms =3D 32760 ms */ ocp_write_word(tp, MCU_TYPE_USB, USB_MSC_TIMER, 0x0fff); @@ -8449,73 +8513,277 @@ static void r8156_init(struct r8152 *tp) /* U1/U2/L1 idle timer. 500 us */ ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500); =20 - if (tp->version >=3D RTL_VER_16) - r8157_power_cut_en(tp, false); - else - r8153b_power_cut_en(tp, false); + r8156b_u2phy_backup(tp); =20 + r8153b_power_cut_en(tp, false); r8156_ups_en(tp, false); r8153_queue_wake(tp, false); rtl_runtime_suspend_enable(tp, false); =20 + ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_INDICATE_FALG, PREBOOT_OPTION); + + ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_RMT_WAKE, RMT_WAKE_EN); + if (tp->udev->speed >=3D USB_SPEED_SUPER) r8153b_u1u2en(tp, true); =20 usb_enable_lpm(tp->udev); =20 - if (tp->version >=3D RTL_VER_12 && tp->version <=3D RTL_VER_15) { - ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, SLOT_EN); + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, SLOT_EN); =20 - ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_CPCR, FLOW_CTRL_EN); + 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_PLA, PLA_POL_GPIO_CTRL); + if (!(ocp_data & DACK_DET_EN)) + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, + FLOW_CTRL_PATCH_2); =20 - ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); - } + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); =20 r8156_mac_clk_spd(tp, true); =20 - if (tp->version < RTL_VER_16) - ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, PLA_MCU_SPDWN_EN); + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, + PLA_MCU_SPDWN_EN); =20 - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS); if (rtl8152_get_speed(tp) & LINK_STATUS) - ocp_data |=3D CUR_LINK_OK; + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, + CUR_LINK_OK | POLL_LINK_CHG); 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); + ocp_word_w0w1(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, + CUR_LINK_OK, POLL_LINK_CHG); =20 set_bit(GREEN_ETHERNET, &tp->flags); =20 - /* RX aggregation / 16 bytes RX descriptor - * BIT(11) is specific to RTL8159, with unknown meaning - */ - if (tp->version =3D=3D RTL_VER_17) - ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL, - RX_AGG_DISABLE | RX_DESC_16B | BIT(11)); - else if (tp->version =3D=3D RTL_VER_16) - ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL, RX_AGG_DISABLE | RX_DE= SC_16B); + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL, + RX_AGG_DISABLE | RX_ZERO_EN); + + r8156_mdio_force_mode(tp); + rtl_tally_reset(tp); + + tp->coalesce =3D 15000; /* 15 us */ +} + +static void r8157_init(struct r8152 *tp) +{ + u16 data; + int i; + + if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + /* Enable SW reset */ + ocp_byte_set_bits(tp, MCU_TYPE_USB, 0xcffe, BIT(3)); + ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xd3ca, BIT(0)); + + ocp_byte_clr_bits(tp, MCU_TYPE_USB, USB_ECM_OP, EN_ALL_SPEED); + + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_ECM_OPTION, BYPASS_MAC_RESET); + + 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; + } + + r8156b_wait_loading_flash(tp); + + data =3D r8153_phy_status(tp, 0); + if (data =3D=3D PHY_STAT_EXT_INIT) { + ocp_reg_clr_bits(tp, 0xa468, BIT(3) | BIT(1)); + ocp_reg_clr_bits(tp, 0xa466, BIT(0)); + } + + r8152_mdio_test_and_clr_bit(tp, MII_BMCR, BMCR_PDOWN); + + data =3D r8153_phy_status(tp, PHY_STAT_LAN_ON); + + r8157_u2p3en(tp, false); + + /* Disable Interrupt Mitigation */ + ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xcf04, + BIT(0) | BIT(1) | BIT(2) | BIT(7)); + + /* Disable Auto Speed up */ + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, AUTO_SPEEDUP); + + /* 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); + + r8157_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_PLA, PLA_INDICATE_FALG, PREBOOT_OPTION); + + ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_RMT_WAKE, RMT_WAKE_EN); + + /* Clear Warm RST / Bus RST event flag */ + ocp_word_clr_bits(tp, MCU_TYPE_USB, 0xcd06, BIT(11)); + + if (tp->udev->speed >=3D USB_SPEED_SUPER) + r8153b_u1u2en(tp, true); + + usb_enable_lpm(tp->udev); + + r8156_mac_clk_spd(tp, true); + + if (rtl8152_get_speed(tp) & LINK_STATUS) + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, + CUR_LINK_OK | POLL_LINK_CHG); else - ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL, RX_AGG_DISABLE | RX_ZE= RO_EN); + ocp_word_w0w1(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, + CUR_LINK_OK, POLL_LINK_CHG); =20 - if (tp->version < RTL_VER_12) - ocp_byte_set_bits(tp, MCU_TYPE_USB, USB_BMU_CONFIG, ACT_ODMA); + set_bit(GREEN_ETHERNET, &tp->flags); =20 - if (tp->version >=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)); + /* RX aggregation / 16 bytes RX descriptor / Bulk In End transfer */ + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL, + RX_AGG_DISABLE | RX_DESC_16B | RX_END_TRANSFER_EN); + + /* 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)); + + r8156_mdio_force_mode(tp); + rtl_tally_reset(tp); + + tp->coalesce =3D 15000; /* 15 us */ +} + +static int r8159_wait_backup_restore(struct r8152 *tp) +{ + u32 ocp_data; + + ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0); + if (!(ocp_data & PCUT_STATUS)) + return 0; + + return poll_timeout_us(ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_G= PHY_CTRL), + ocp_data & BACKUP_RESTRORE, 200, 20000, false); +} + +static void r8159_init(struct r8152 *tp) +{ + u16 data; + int i; + + if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + /* Enable SW reset */ + ocp_byte_set_bits(tp, MCU_TYPE_USB, 0xcffe, BIT(3)); + ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xd3ca, BIT(0)); + + ocp_byte_clr_bits(tp, MCU_TYPE_USB, USB_ECM_OP, EN_ALL_SPEED); + + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_ECM_OPTION, BYPASS_MAC_RESET); + + 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; } =20 + if (r8159_wait_backup_restore(tp)) { + rtl_set_inaccessible(tp); + dev_err(&tp->intf->dev, + "init failed, backup-restore timed out\n"); + return; + } + + r8156b_wait_loading_flash(tp); + + data =3D r8153_phy_status(tp, 0); + if (data =3D=3D PHY_STAT_EXT_INIT) { + ocp_reg_clr_bits(tp, 0xa468, BIT(3) | BIT(1)); + ocp_reg_clr_bits(tp, 0xa466, BIT(0)); + } + + r8152_mdio_test_and_clr_bit(tp, MII_BMCR, BMCR_PDOWN); + + data =3D r8153_phy_status(tp, PHY_STAT_LAN_ON); + + r8157_u2p3en(tp, false); + + /* Disable Interrupt Mitigation */ + ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xcf04, + BIT(0) | BIT(1) | BIT(2) | BIT(7)); + + /* Disable Auto Speed up */ + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, AUTO_SPEEDUP); + + /* 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); + + r8157_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_PLA, PLA_INDICATE_FALG, PREBOOT_OPTION); + + ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_RMT_WAKE, RMT_WAKE_EN); + + /* Clear Warm RST / Bus RST event flag */ + ocp_word_clr_bits(tp, MCU_TYPE_USB, 0xcd06, BIT(11)); + + /* Disable FW u1u2 patch option */ + ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xb9a6, BIT(0)); + + if (tp->udev->speed >=3D USB_SPEED_SUPER) + r8153b_u1u2en(tp, true); + + usb_enable_lpm(tp->udev); + + r8156_mac_clk_spd(tp, true); + + if (rtl8152_get_speed(tp) & LINK_STATUS) + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, + CUR_LINK_OK | POLL_LINK_CHG); + else + ocp_word_w0w1(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, + CUR_LINK_OK, POLL_LINK_CHG); + + set_bit(GREEN_ETHERNET, &tp->flags); + + /* RX aggregation / 16 bytes RX descriptor / Bulk In End transfer */ + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL, + RX_AGG_DISABLE | RX_DESC_16B | RX_END_TRANSFER_EN); + + /* 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)); + + /* Enable u3phy patch backup */ + ocp_write_word(tp, MCU_TYPE_USB, 0xb9a2, 0x0448); + r8156_mdio_force_mode(tp); rtl_tally_reset(tp); =20 @@ -9846,7 +10114,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 r8156_init; + ops->init =3D r8156b_init; ops->enable =3D rtl8156_enable; ops->disable =3D rtl8153_disable; ops->up =3D rtl8156_up; @@ -9885,7 +10153,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 | MDIO_EEE_5GT; - ops->init =3D r8156_init; + ops->init =3D r8157_init; ops->enable =3D rtl8156_enable; ops->disable =3D rtl8153_disable; ops->up =3D rtl8156_up; @@ -9907,7 +10175,7 @@ static int rtl_ops_init(struct r8152 *tp) tp->eee_en =3D true; tp->eee_adv =3D MDIO_EEE_100TX | MDIO_EEE_1000T | MDIO_EEE_10GT; tp->eee_adv2 =3D MDIO_EEE_2_5GT | MDIO_EEE_5GT; - ops->init =3D r8156_init; + ops->init =3D r8159_init; ops->enable =3D rtl8156_enable; ops->disable =3D rtl8153_disable; ops->up =3D rtl8156_up; --=20 2.34.1 From nobody Sat Sep 26 11:01:42 2026 Received: from rtits2.realtek.com.tw (rtits2.realtek.com [211.75.126.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 91E1F40912B; Wed, 2 Sep 2026 09:07:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=211.75.126.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340038; cv=none; b=jawx8Iud1F5hEdPJq8gTl0qGad5PfI3e/YEUU+mVNCrLCf8gndZgdMqNr7AZAzuQp0//8LHJgGyIFhDb0/Vw9mPgNg5F3zF4YQkIZK/8nRBWlx+kmCRktiXD46XYqwtheJRfppnUGIVsGU2cwOeTfjd+AKZPIoulHVbKQuNhKVU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340038; c=relaxed/simple; bh=E8307jUOlbjUHcDbmjG9L5Sn2qWGpGWkOLtdiqIytno=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=jYvyatymei6H2w7rQr6wOKObMm68VhkhG6/Wi/HHcLdoDNWhukDMm0UxxzmQYionIR2m4LvFLAPnxdAYf2/bVjjek8QKoH+qinL5dhelwovD8Od0eCU+nRZE98KmxOXX0DzM4r0iLXdONs+uIvLM7D4aINez+U3hetLR2rtABoY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com; spf=pass smtp.mailfrom=realtek.com; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b=YpdeVNVl; arc=none smtp.client-ip=211.75.126.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=realtek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b="YpdeVNVl" X-SpamFilter-By: ArmorX SpamTrap 5.80 with qID 68296luoE2527062, This message is accepted by code: ctloc85258 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=realtek.com; s=dkim; t=1788340007; bh=a+E9l+zwo/RzEHxfvPfK5Hg3nJfsmtSRtSE48sLrFwo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding:Content-Type; b=YpdeVNVlfKlRU7QbJzHScr/6j2S4A+4Th3GPE1oFYX9M6JYH/Gzn4eN2AMO2cdkjv UfaBMqnpSCXHw0QZvE8Swc8CdN4Fzc6b8hZtrGMZDrfIRN1Kp+DZx8vEuU8QTlq3+x LGVq3KQq2jfxBCFn+jIcrCukUcjc/ZB6X8brur53FMOtJrl/xrkqPFJWS2S8Xn78+r A0J+JM5AIk7yV8RTXBbj/GHq5lDfAzRF1MqIqSszm9uzvxT9fRTqdv1fs3wBhmjfYH WyIu3b+0QR6xestpV3o/+4Ywk+wigU0gHt9uEGGGnr+VLE1sr8p7SAEvMWrd+kPcTR k8S2OJDhJnlhQ== Received: from mail.realtek.com (rtkexhmbs02.realtek.com.tw[172.21.6.41]) by rtits2.realtek.com.tw (8.15.2/3.29/5.94) with ESMTPS id 68296luoE2527062 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 2 Sep 2026 17:06:47 +0800 Received: from RTKEXHMBS06.realtek.com.tw (10.21.1.56) by RTKEXHMBS02.realtek.com.tw (172.21.6.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.43; Wed, 2 Sep 2026 17:06:42 +0800 Received: from fc44.realtek.com.tw (172.22.241.7) by RTKEXHMBS06.realtek.com.tw (10.21.1.56) with Microsoft SMTP Server id 15.2.2562.43 via Frontend Transport; Wed, 2 Sep 2026 17:06:42 +0800 From: Chih Kai Hsu To: , CC: , , , , , , , , Subject: [PATCH net-next 2/8] r8152: support RTL8159 for different packages Date: Wed, 2 Sep 2026 17:06:26 +0800 Message-ID: <20260902090632.41844-3-nic_swsd@realtek.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260902090632.41844-1-nic_swsd@realtek.com> References: <20260902090632.41844-1-nic_swsd@realtek.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" RTL8159 has two different packages, QFN68 and QFN100. Therefore, split RTL_VER_17 into RTL_VER_17_QFN68 and RTL_VER_17_QFN100. Signed-off-by: Chih Kai Hsu --- drivers/net/usb/r8152.c | 93 ++++++++++++++++++++++++++++++++++------- 1 file changed, 78 insertions(+), 15 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 0a06c947e381a..38e78b0f20b30 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -64,6 +64,7 @@ #define PLA_MACDBG_POST 0xd38e /* RTL_VER_04 only */ #define PLA_EXTRA_STATUS 0xd398 #define PLA_GPHY_CTRL 0xd3ae +#define PLA_PKG_DET 0xdc48 #define PLA_POL_GPIO_CTRL 0xdc6a #define PLA_EFUSE_DATA 0xdd00 #define PLA_EFUSE_CMD 0xdd02 @@ -290,6 +291,9 @@ #define IFG_144NS BIT(9) #define IFG_96NS (BIT(9) | BIT(8)) =20 +/* PLA_PKG_DET */ +#define PKG_MASK 0x1e + /* PLA_MTPS */ #define MTPS_JUMBO (12 * 1024 / 64) #define MTPS_DEFAULT (6 * 1024 / 64) @@ -1254,7 +1258,8 @@ enum rtl_version { RTL_VER_14, RTL_VER_15, RTL_VER_16, - RTL_VER_17, + RTL_VER_17_QFN68, + RTL_VER_17_QFN100, =20 RTL_VER_MAX }; @@ -3446,7 +3451,8 @@ static void rtl8152_nic_reset(struct r8152 *tp) break; =20 case RTL_VER_16: - case RTL_VER_17: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_CR, CR_RE | CR_TE); break; =20 @@ -3486,7 +3492,7 @@ static void rtl_eee_plus_en(struct r8152 *tp, bool en= able) =20 static void rtl_set_eee_plus(struct r8152 *tp) { - if (tp->version =3D=3D RTL_VER_17) + if (tp->version =3D=3D RTL_VER_17_QFN68 || tp->version =3D=3D RTL_VER_17_= QFN100) return rtl_eee_plus_en(tp, false); =20 if (rtl8152_get_speed(tp) & _10bps) @@ -3674,7 +3680,8 @@ static void r8153_set_rx_early_timeout(struct r8152 *= tp) case RTL_VER_13: case RTL_VER_15: case RTL_VER_16: - case RTL_VER_17: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: 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, @@ -3719,7 +3726,8 @@ static void r8153_set_rx_early_size(struct r8152 *tp) ocp_data / 8); break; case RTL_VER_16: - case RTL_VER_17: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data / 16); break; @@ -3835,6 +3843,8 @@ static void rtl_rx_vlan_en(struct r8152 *tp, bool ena= ble) case RTL_VER_13: case RTL_VER_15: case RTL_VER_16: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: default: if (enable) ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_RCR1, @@ -4514,6 +4524,8 @@ static void r8153_teredo_off(struct r8152 *tp) case RTL_VER_14: case RTL_VER_15: case RTL_VER_16: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: default: /* The bit 0 ~ 7 are relative with teredo settings. They are * W1C (write 1 to clear), so set all 1 to disable it. @@ -4568,7 +4580,8 @@ static void rtl_clear_bp(struct r8152 *tp, u16 type) break; case RTL_VER_14: case RTL_VER_16: - case RTL_VER_17: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: default: ocp_write_word(tp, type, USB_BP2_EN, 0); bp_num =3D 16; @@ -4680,7 +4693,8 @@ static bool rtl8152_is_fw_phy_speed_up_ok(struct r815= 2 *tp, struct fw_phy_speed_ case RTL_VER_13: case RTL_VER_15: case RTL_VER_16: - case RTL_VER_17: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: default: break; } @@ -5840,7 +5854,8 @@ static void rtl_eee_enable(struct r8152 *tp, bool ena= ble) case RTL_VER_13: case RTL_VER_15: case RTL_VER_16: - case RTL_VER_17: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: if (enable) { r8156_eee_en(tp, true); ocp_reg_write(tp, OCP_EEE_ADV, tp->eee_adv); @@ -6431,8 +6446,15 @@ static int rtl8156_enable(struct r8152 *tp) set_tx_qlen(tp); rtl_set_eee_plus(tp); =20 - if (tp->version >=3D RTL_VER_12 && tp->version <=3D RTL_VER_17) - ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_RX_AGGR_NUM, RX_AGGR_NUM_MASK); + switch (tp->version) { + case RTL_VER_10: + case RTL_VER_11: + break; + default: + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_RX_AGGR_NUM, + RX_AGGR_NUM_MASK); + break; + } =20 r8153_set_rx_early_timeout(tp); r8153_set_rx_early_size(tp); @@ -8146,7 +8168,8 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) sram2_write_w0w1(tp, 0x809d, 0xff00, 0x5000); break; =20 - case RTL_VER_17: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: /* Disable bypass turn off clk in ALDPS */ ocp_byte_clr_bits(tp, MCU_TYPE_PLA, 0xd3c8, BIT(0)); =20 @@ -8781,6 +8804,10 @@ static void r8159_init(struct r8152 *tp) /* TX descriptor Signature */ ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xd4ae, BIT(1)); =20 + /* Enable u2phy backup restore patch */ + if (tp->version =3D=3D RTL_VER_17_QFN68) + ocp_byte_set_bits(tp, MCU_TYPE_USB, 0xb99c, BIT(0)); + /* Enable u3phy patch backup */ ocp_write_word(tp, MCU_TYPE_USB, 0xb9a2, 0x0448); =20 @@ -10171,7 +10198,8 @@ static int rtl_ops_init(struct r8152 *tp) r8157_desc_init(tp); break; =20 - case RTL_VER_17: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: tp->eee_en =3D true; tp->eee_adv =3D MDIO_EEE_100TX | MDIO_EEE_1000T | MDIO_EEE_10GT; tp->eee_adv2 =3D MDIO_EEE_2_5GT | MDIO_EEE_5GT; @@ -10263,7 +10291,8 @@ static int rtl_fw_init(struct r8152 *tp) case RTL_VER_16: rtl_fw->fw_name =3D FIRMWARE_8157_1; break; - case RTL_VER_17: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: rtl_fw->fw_name =3D FIRMWARE_8159_1; break; default: @@ -10273,9 +10302,33 @@ static int rtl_fw_init(struct r8152 *tp) return 0; } =20 +static u32 __rtl_get_pkg_det(struct usb_device *udev) +{ + u32 pkg_det =3D 0; + __le32 *tmp; + int ret, i; + + tmp =3D kmalloc_obj(*tmp); + if (!tmp) + return 0; + + for (i =3D 0, ret =3D 0; i < 3 && ret !=3D 4; i++) + ret =3D usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, + PLA_PKG_DET, MCU_TYPE_PLA, tmp, + sizeof(*tmp), USB_CTRL_GET_TIMEOUT); + + if (ret > 0) + pkg_det =3D __le32_to_cpu(*tmp) & PKG_MASK; + + kfree(tmp); + return pkg_det; +} + static u8 __rtl_get_hw_ver(struct usb_device *udev) { u32 ocp_data =3D 0; + u32 pkg_det =3D 0; __le32 *tmp; u8 version; int ret; @@ -10358,7 +10411,16 @@ static u8 __rtl_get_hw_ver(struct usb_device *udev) version =3D RTL_VER_16; break; case 0x2020: - version =3D RTL_VER_17; + pkg_det =3D __rtl_get_pkg_det(udev); + if (pkg_det =3D=3D 0x1e || pkg_det =3D=3D 0x1c) { + version =3D RTL_VER_17_QFN68; + } else if (pkg_det =3D=3D 0x18 || pkg_det =3D=3D 0x1a) { + version =3D RTL_VER_17_QFN100; + } else { + version =3D RTL_VER_UNKNOWN; + dev_info(&udev->dev, "Unknown package %#02x\n", + pkg_det); + } break; default: version =3D RTL_VER_UNKNOWN; @@ -10517,7 +10579,8 @@ static int rtl8152_probe_once(struct usb_interface = *intf, case RTL_VER_13: case RTL_VER_15: case RTL_VER_16: - case RTL_VER_17: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: netdev->max_mtu =3D size_to_mtu(16 * 1024); break; case RTL_VER_01: --=20 2.34.1 From nobody Sat Sep 26 11:01:42 2026 Received: from rtits2.realtek.com.tw (rtits2.realtek.com [211.75.126.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF2532BE051; Wed, 2 Sep 2026 09:07:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=211.75.126.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340039; cv=none; b=k9Lx53g2sRTqxBV8YYzbp1i5YZZSGGeSDZ878oA0VQ5H9mPlHAV2pxKseIKLnPC4GHy9qbYkDyjqLeCJwH+R2rNrAQDfFuiAcs++giic8WK1cJlOBhLprgGswI0BBGAlLxgG7mCe/euCDTwgG09VBdT4jcSF1flk2sAn4u1+6a0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340039; c=relaxed/simple; bh=9lgCrvi7RMOUrDe4iulHeeIjVWH6ay7NR6fmkh+shdI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Vy4GjnfGyAqe2no/Nfs5c1x6DUbIlSoTYku6o2xh8OLVqpNSgA88E0OqhfP5x+wxUpOZdk469pigFGDVXugdF3l8HdPQIy7N9Jh7C1IJ4YVY6okwKwYz0Z5Q/IREZc6uoe3C/ikxWv15RK9CEk2jVh3xRdmUn0kJ6ZQANS2TpvM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com; spf=pass smtp.mailfrom=realtek.com; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b=aFeJHPlH; arc=none smtp.client-ip=211.75.126.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=realtek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b="aFeJHPlH" X-SpamFilter-By: ArmorX SpamTrap 5.80 with qID 68296h7G22526937, This message is accepted by code: ctloc85258 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=realtek.com; s=dkim; t=1788340003; bh=MHPfgcMYhFTrknliraJ6QNZ6YXnda8VXdBW0J2BVbRM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding:Content-Type; b=aFeJHPlHUpSwfxnnJfq+Y7vmfGRna4i4q1cinV8aC03miqmAJreGnqg3Ux81ws/uI SmW8KL2w0m0htvBTlbP5YZ+XUlbzS3eBvNLNeAFOmPA7nz2V9gJB96ViSPHIX8p3lQ QeVaCw/JIeLCE/LoRXpKRryFLcxn5uGlqtqIh0tATTUL9szEJTKtAkNg5gvIfYFsDk uMGurRa60no8SmgWkSyxq2vRfHA9707/b4yFp6OtmCR6A9SD8YoS6daxJZdPqvDAAw g0ALP/k6879u2jMpSfuqtUYAeZPbjsUojUs/sePySJnJsErHL3fMKATHyH9j7kx0lx LYe/tlAmOm0Bg== Received: from mail.realtek.com (rtkexhmbs02.realtek.com.tw[172.21.6.41]) by rtits2.realtek.com.tw (8.15.2/3.29/5.94) with ESMTPS id 68296h7G22526937 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 2 Sep 2026 17:06:43 +0800 Received: from RTKEXHMBS06.realtek.com.tw (10.21.1.56) by RTKEXHMBS02.realtek.com.tw (172.21.6.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.43; Wed, 2 Sep 2026 17:06:43 +0800 Received: from fc44.realtek.com.tw (172.22.241.7) by RTKEXHMBS06.realtek.com.tw (10.21.1.56) with Microsoft SMTP Server id 15.2.2562.43 via Frontend Transport; Wed, 2 Sep 2026 17:06:43 +0800 From: Chih Kai Hsu To: , CC: , , , , , , , , Subject: [PATCH net-next 3/8] r8152: refactor rtl8156_enable, rtl8156_up, and rtl8156_down Date: Wed, 2 Sep 2026 17:06:27 +0800 Message-ID: <20260902090632.41844-4-nic_swsd@realtek.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260902090632.41844-1-nic_swsd@realtek.com> References: <20260902090632.41844-1-nic_swsd@realtek.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Chih Kai Hsu --- drivers/net/usb/r8152.c | 235 ++++++++++++++++++++++++++++++++-------- 1 file changed, 189 insertions(+), 46 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 38e78b0f20b30..53835453913c8 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -6440,31 +6440,16 @@ static int rtl8156_enable(struct r8152 *tp) if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) return -ENODEV; =20 - if (tp->version < RTL_VER_12) - r8156_fc_parameter(tp); - + r8156_fc_parameter(tp); set_tx_qlen(tp); rtl_set_eee_plus(tp); =20 - switch (tp->version) { - case RTL_VER_10: - case RTL_VER_11: - break; - default: - ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_RX_AGGR_NUM, - RX_AGGR_NUM_MASK); - break; - } - 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); - if (speed & _2500bps) ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, IDLE_SPDWN_EN); @@ -6472,12 +6457,10 @@ static int rtl8156_enable(struct r8152 *tp) ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, IDLE_SPDWN_EN); =20 - 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); - } + 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 */ @@ -6502,6 +6485,67 @@ static void rtl8156_disable(struct r8152 *tp) rtl8153_disable(tp); } =20 +static int rtl8156b_enable(struct r8152 *tp) +{ + u16 speed; + + if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + set_tx_qlen(tp); + rtl_set_eee_plus(tp); + + 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); + + speed =3D rtl8152_get_speed(tp); + rtl_set_ifg(tp, speed); + + if (speed & _2500bps) + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, + IDLE_SPDWN_EN); + else + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, + IDLE_SPDWN_EN); + + if (tp->udev->speed =3D=3D USB_SPEED_HIGH) { + /* USB 0xb45e[3:0] l1_nyet_hird */ + if (is_flow_control(speed)) + ocp_word_w0w1(tp, MCU_TYPE_USB, USB_L1_CTRL, 0xf, 0xf); + else + ocp_word_w0w1(tp, MCU_TYPE_USB, USB_L1_CTRL, 0xf, 0x1); + } + + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); + usleep_range(1000, 2000); + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); + + return rtl_enable(tp); +} + +static int rtl8157_enable(struct r8152 *tp) +{ + u16 speed; + + if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + set_tx_qlen(tp); + rtl_set_eee_plus(tp); + + 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); + + speed =3D rtl8152_get_speed(tp); + rtl_set_ifg(tp, speed); + + return rtl_enable(tp); +} + static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u32 speed, u8 d= uplex, u32 advertising) { @@ -6862,8 +6906,7 @@ static void rtl8156_up(struct r8152 *tp) return; =20 r8153b_u1u2en(tp, false); - if (tp->version < RTL_VER_16) - r8153_u2p3en(tp, false); + r8153_u2p3en(tp, false); r8153_aldps_en(tp, false); =20 rxdy_gated_en(tp, true); @@ -6876,8 +6919,7 @@ static void rtl8156_up(struct r8152 *tp) =20 ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, NOW_IS_OOB); =20 - if (tp->version >=3D RTL_VER_16) - ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR1, BIT(3)); + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR1, BIT(3)); =20 ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, MCU_BORW_EN); =20 @@ -6899,11 +6941,11 @@ static void rtl8156_up(struct r8152 *tp) ocp_word_w0w1(tp, MCU_TYPE_PLA, PLA_RXFIFO_FULL, RXFIFO_FULL_MASK, 0x08); =20 - ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, PLA_MCU_SPDWN_EN); + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, + PLA_MCU_SPDWN_EN); =20 - if (tp->version < RTL_VER_16) - ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_SPEED_OPTION, - RG_PWRDN_EN | ALL_SPEED_OFF); + 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 @@ -6913,10 +6955,19 @@ static void rtl8156_up(struct r8152 *tp) } =20 r8153_aldps_en(tp, true); - if (tp->version < RTL_VER_16) - r8153_u2p3en(tp, true); + r8153_u2p3en(tp, true); =20 - if (tp->version < RTL_VER_16 && tp->udev->speed >=3D USB_SPEED_SUPER) + switch (tp->version) { + case RTL_VER_13: + case RTL_VER_15: + /* Enable Clear_SDR */ + ocp_word_set_bits(tp, MCU_TYPE_USB, 0xd3ca, BIT(15)); + break; + default: + break; + } + + if (tp->udev->speed >=3D USB_SPEED_SUPER) r8153b_u1u2en(tp, true); } =20 @@ -6929,12 +6980,9 @@ static void rtl8156_down(struct r8152 *tp) =20 ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, PLA_MCU_SPDWN_EN); - r8153b_u1u2en(tp, false); - if (tp->version < RTL_VER_16) { - r8153_u2p3en(tp, false); - r8153b_power_cut_en(tp, false); - } + r8153_u2p3en(tp, false); + r8153b_power_cut_en(tp, false); r8153_aldps_en(tp, false); =20 ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, NOW_IS_OOB); @@ -6956,7 +7004,102 @@ static void rtl8156_down(struct r8152 *tp) */ ocp_write_word(tp, MCU_TYPE_PLA, PLA_TEREDO_WAKE_BASE, 0x00ff); =20 - ocp_byte_set_bits(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, NOW_IS_OOB); + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_BDC_CR, ALDPS_PROXY_MODE); + + ocp_byte_set_bits(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, + NOW_IS_OOB | DIS_MCU_CLROOB); + + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, MCU_BORW_EN); + + rtl_rx_vlan_en(tp, true); + rxdy_gated_en(tp, false); + + ocp_dword_set_bits(tp, MCU_TYPE_PLA, PLA_RCR, + RCR_APM | RCR_AM | RCR_AB); + + r8153_aldps_en(tp, true); +} + +static void rtl8157_up(struct r8152 *tp) +{ + if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_u1u2en(tp, false); + r8153_aldps_en(tp, false); + + rxdy_gated_en(tp, true); + r8153_teredo_off(tp); + + ocp_dword_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, RCR_ACPT_ALL); + + rtl8152_nic_reset(tp); + rtl_reset_bmu(tp); + + ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, NOW_IS_OOB); + + 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); + + rtl_rx_vlan_en(tp, tp->netdev->features & NETIF_F_HW_VLAN_CTAG_RX); + + rtl8156_change_mtu(tp); + + /* share FIFO settings */ + ocp_word_w0w1(tp, MCU_TYPE_PLA, PLA_RXFIFO_FULL, RXFIFO_FULL_MASK, + 0x08); + + ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_SPEED_OPTION, + RG_PWRDN_EN | ALL_SPEED_OFF); + + ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, 0x00600400); + + if (tp->saved_wolopts !=3D __rtl_get_wol(tp)) { + netif_warn(tp, ifup, tp->netdev, "wol setting is changed\n"); + __rtl_set_wol(tp, tp->saved_wolopts); + } + + r8153_aldps_en(tp, true); + + /* Clear_SDR */ + ocp_byte_set_bits(tp, MCU_TYPE_USB, 0xd378, BIT(7)); + ocp_word_clr_bits(tp, MCU_TYPE_USB, 0xcd06, BIT(15)); +} + +static void rtl8157_down(struct r8152 *tp) +{ + if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } + + r8153b_u1u2en(tp, false); + r8153_aldps_en(tp, false); + + ocp_byte_clr_bits(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, NOW_IS_OOB); + + /* RX FIFO settings for OOB */ + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_FULL, 64 / 16); + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_FULL, 1024 / 16); + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_EMPTY, 4096 / 16); + + rtl_disable(tp); + rtl_reset_bmu(tp); + + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, 1526); + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, 10 * 1024 / 64); + + /* Clear teredo wake event. bit[15:8] is the teredo wakeup + * type. Set it to zero. bits[7:0] are the W1C bits about + * the events. Set them to all 1 to clear them. + */ + ocp_write_word(tp, MCU_TYPE_PLA, PLA_TEREDO_WAKE_BASE, 0x00ff); + + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_BDC_CR, ALDPS_PROXY_MODE); + + ocp_byte_set_bits(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, + NOW_IS_OOB | DIS_MCU_CLROOB); =20 ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, MCU_BORW_EN); =20 @@ -10142,7 +10285,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 r8156b_init; - ops->enable =3D rtl8156_enable; + ops->enable =3D rtl8156b_enable; ops->disable =3D rtl8153_disable; ops->up =3D rtl8156_up; ops->down =3D rtl8156_down; @@ -10181,10 +10324,10 @@ 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 | MDIO_EEE_5GT; ops->init =3D r8157_init; - ops->enable =3D rtl8156_enable; + ops->enable =3D rtl8157_enable; ops->disable =3D rtl8153_disable; - ops->up =3D rtl8156_up; - ops->down =3D rtl8156_down; + ops->up =3D rtl8157_up; + ops->down =3D rtl8157_down; ops->unload =3D rtl8153_unload; ops->eee_get =3D r8153_get_eee; ops->eee_set =3D r8152_set_eee; @@ -10204,10 +10347,10 @@ static int rtl_ops_init(struct r8152 *tp) tp->eee_adv =3D MDIO_EEE_100TX | MDIO_EEE_1000T | MDIO_EEE_10GT; tp->eee_adv2 =3D MDIO_EEE_2_5GT | MDIO_EEE_5GT; ops->init =3D r8159_init; - ops->enable =3D rtl8156_enable; + ops->enable =3D rtl8157_enable; ops->disable =3D rtl8153_disable; - ops->up =3D rtl8156_up; - ops->down =3D rtl8156_down; + ops->up =3D rtl8157_up; + ops->down =3D rtl8157_down; ops->unload =3D rtl8153_unload; ops->eee_get =3D r8153_get_eee; ops->eee_set =3D r8152_set_eee; --=20 2.34.1 From nobody Sat Sep 26 11:01:42 2026 Received: from rtits2.realtek.com.tw (rtits2.realtek.com [211.75.126.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 462243AA1BA; Wed, 2 Sep 2026 09:07:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=211.75.126.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340038; cv=none; b=e3fsQDsFg4hTggK3ul+HXN2Pqdyia/4zFtEi/4VEuNOmZazc1ozRsK/FoAB5wfs3+wa+ke2x6Bpc5RL1L7e0ovEAghZ6wMExbZs93rR6pwJ3lmCQAed+jQy8rNOwsOC77x9maWO43TYgILNez2LWlKnF++tokOtnbuMzlA0h78Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340038; c=relaxed/simple; bh=OiXwn6J/u1isD3Rd/3NIi4HO84Dm0gCf7BdMCMOWrZ4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=VBKblF5/av5FS4/vx9klKFY5Ou/1loa2930ro/xq0U8SZiccIvm9+/CQGerE4U1soRBELkoVPOy4efytEl7C/wti9pEJD1VSYeb/ebRLGc3LW4ZrWMQ9iQXum4ZJOYIbmQnCN02fl0F+4KBTzCppSQzob1F6OrcRp4xe20eGFG0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com; spf=pass smtp.mailfrom=realtek.com; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b=bplBL1t1; arc=none smtp.client-ip=211.75.126.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=realtek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b="bplBL1t1" X-SpamFilter-By: ArmorX SpamTrap 5.80 with qID 68296iQF22526998, This message is accepted by code: ctloc85258 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=realtek.com; s=dkim; t=1788340004; bh=n+X/aO7jLdI6qb5aqduOCFysTjtYcbKdZpA1kYIeFsg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding:Content-Type; b=bplBL1t1DWrnEMlkr4e0iyiKX8Vz+9bGvYYwRXfdKpXFvJWUGqfRNM0c41kxfwubq EJFxRRktvWMk5Giybwf1DgckuWkmnnZWkrqfjPvys4NYoe5PGXSSnBDWobwS1CnYGh f5t1nJmvZB/WbSq5ELWkl2JIkXjRb2/lfOyVdvHmnObBUw/JJoahuTT4Rr+4HxS8dJ 8PWLJym4bWq2LvH7Cy4NM16X8zfeDBA/TkE4ygy9j2hYgXogzCAAfa7vCAGR8PH5Fu kBn3aDDfnWTRy9gRwHHtWxRyKLwQqe9WHJIt8trcweLHVGuFTEAtmUKnOdGKAWaotT O3JXIszNrYhQA== Received: from mail.realtek.com (rtkexhmbs02.realtek.com.tw[172.21.6.41]) by rtits2.realtek.com.tw (8.15.2/3.29/5.94) with ESMTPS id 68296iQF22526998 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 2 Sep 2026 17:06:44 +0800 Received: from RTKEXHMBS06.realtek.com.tw (10.21.1.56) by RTKEXHMBS02.realtek.com.tw (172.21.6.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.43; Wed, 2 Sep 2026 17:06:44 +0800 Received: from fc44.realtek.com.tw (172.22.241.7) by RTKEXHMBS06.realtek.com.tw (10.21.1.56) with Microsoft SMTP Server id 15.2.2562.43 via Frontend Transport; Wed, 2 Sep 2026 17:06:44 +0800 From: Chih Kai Hsu To: , CC: , , , , , , , , Subject: [PATCH net-next 4/8] r8152: refactor r8157_hw_phy_cfg Date: Wed, 2 Sep 2026 17:06:28 +0800 Message-ID: <20260902090632.41844-5-nic_swsd@realtek.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260902090632.41844-1-nic_swsd@realtek.com> References: <20260902090632.41844-1-nic_swsd@realtek.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Refactor r8157_hw_phy_cfg into two functions: - r8157_hw_phy_cfg - r8159_hw_phy_cfg Moreover, update PHY parameters for RTL8156B/57/59, and add two bitwise operation helpers for sram2. Signed-off-by: Chih Kai Hsu --- drivers/net/usb/r8152.c | 168 +++++++++++++++++++++++++++++++++------- 1 file changed, 139 insertions(+), 29 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 53835453913c8..90b628790a148 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -655,6 +655,7 @@ enum spd_duplex { /* OCP_POWER_CFG */ #define EEE_CLKDIV_EN 0x8000 #define EN_ALDPS 0x0004 +#define EN_ALDPS_PLLOFF 0x0002 #define EN_10M_PLLOFF 0x0001 =20 /* OCP_EEE_CONFIG1 */ @@ -1992,6 +1993,16 @@ static void sram2_write_w0w1(struct r8152 *tp, u16 a= ddr, u16 clear, u16 set) ocp_reg_write(tp, OCP_SRAM2_DATA, data); } =20 +static void sram2_set_bits(struct r8152 *tp, u16 addr, u16 set) +{ + sram2_write_w0w1(tp, addr, 0, set); +} + +static void sram2_clr_bits(struct r8152 *tp, u16 addr, u16 clear) +{ + sram2_write_w0w1(tp, addr, clear, 0); +} + static void r8152_mdio_clr_bit(struct r8152 *tp, u16 addr, u16 clear) { int data; @@ -8108,6 +8119,9 @@ static void r8156b_hw_phy_cfg(struct r8152 *tp) sram_write(tp, 0x8074, 0x2417); sram_write(tp, 0x807a, 0x2417); =20 + /* Nway DACONB parameters */ + ocp_reg_w0w1(tp, 0xa4ca, 0x6000, 0x0040); + /* XG PLL */ ocp_reg_w0w1(tp, 0xbf84, 0xe000, 0xa000); break; @@ -8184,11 +8198,14 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_PHY_PWR, PFM_PWM_SWITCH); =20 /* Advanced Power Saving parameter */ - ocp_reg_set_bits(tp, 0xa430, BIT(0) | BIT(1)); + ocp_reg_set_bits(tp, OCP_POWER_CFG, EN_10M_PLLOFF | EN_ALDPS_PLLOFF); =20 /* Disable ALDPS force mode */ ocp_reg_clr_bits(tp, 0xa44a, BIT(2)); =20 + /* Disable bypass_turn_off_clk_in_aldps */ + ocp_byte_clr_bits(tp, MCU_TYPE_PLA, 0xd3c8, BIT(0)); + switch (tp->version) { case RTL_VER_16: /* XG_INRX parameter */ @@ -8204,7 +8221,7 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) sram2_write_w0w1(tp, 0x8078, 0xff00, 0x3000); =20 /* green mode */ - sram2_write_w0w1(tp, 0x89e9, 0xff00, 0); + sram2_clr_bits(tp, 0x89e9, 0xff00); sram2_write_w0w1(tp, 0x8ffd, 0xff00, 0x0100); sram2_write_w0w1(tp, 0x8ffe, 0xff00, 0x0200); sram2_write_w0w1(tp, 0x8fff, 0xff00, 0x0400); @@ -8310,12 +8327,85 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) 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 r8159_hw_phy_cfg(struct r8152 *tp) +{ + u16 data; + + r8156b_wait_loading_flash(tp); + + ocp_word_test_and_clr_bits(tp, MCU_TYPE_USB, USB_MISC_0, PCUT_STATUS); + + data =3D r8153_phy_status(tp, 0); + switch (data) { + case PHY_STAT_EXT_INIT: + rtl8152_apply_firmware(tp, true); + ocp_reg_clr_bits(tp, 0xa466, BIT(0)); + ocp_reg_clr_bits(tp, 0xa468, BIT(3) | BIT(1)); + break; + case PHY_STAT_LAN_ON: + case PHY_STAT_PWRDN: + default: + rtl8152_apply_firmware(tp, false); + break; + } =20 + r8152_mdio_test_and_clr_bit(tp, MII_BMCR, BMCR_PDOWN); + + r8153_aldps_en(tp, false); + + data =3D r8153_phy_status(tp, PHY_STAT_LAN_ON); + WARN_ON_ONCE(data !=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, OCP_POWER_CFG, EN_10M_PLLOFF | EN_ALDPS_PLLOFF); + + /* Disable ALDPS force mode */ + ocp_reg_clr_bits(tp, 0xa44a, BIT(2)); + + /* Disable bypass_turn_off_clk_in_aldps */ + ocp_byte_clr_bits(tp, MCU_TYPE_PLA, 0xd3c8, BIT(0)); + + switch (tp->version) { case RTL_VER_17_QFN68: case RTL_VER_17_QFN100: - /* Disable bypass turn off clk in ALDPS */ - ocp_byte_clr_bits(tp, MCU_TYPE_PLA, 0xd3c8, BIT(0)); - /* Power level tuning * test mode power level */ @@ -8325,22 +8415,35 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) sram_write_w0w1(tp, 0x81ae, 0xff00, 0x0f00); sram_write_w0w1(tp, 0x81b9, 0xff00, 0xb900); /* normal link TX filter */ - sram2_write_w0w1(tp, 0x83b0, 0x0e00, 0); - sram2_write_w0w1(tp, 0x83c5, 0x0e00, 0); - sram2_write_w0w1(tp, 0x83da, 0x0e00, 0); - sram2_write_w0w1(tp, 0x83ef, 0x0e00, 0); + sram2_clr_bits(tp, 0x83b0, 0x0e00); + sram2_clr_bits(tp, 0x83c5, 0x0e00); + sram2_clr_bits(tp, 0x83da, 0x0e00); + sram2_clr_bits(tp, 0x83ef, 0x0e00); + + ocp_reg_w0w1(tp, 0xbf38, 0x01f0, 0x0160); + ocp_reg_w0w1(tp, 0xbf3a, 0x001f, 0x0014); + /* shorten CLKS latency */ + ocp_reg_clr_bits(tp, 0xbf28, BIT(14) | BIT(13)); + ocp_reg_clr_bits(tp, 0xbf2c, BIT(15) | BIT(14)); + /* CMP_Timer on MP_Timer=3D333 + * GPHY OCP 0xbf28 bit[0] =3D 0x1 + * GPHY OCP 0xbf28 bit[6:1] =3D 0x3 + * GPHY OCP 0xbf28 bit[12:7] =3D 0x3 + */ + ocp_reg_w0w1(tp, 0xbf28, 0x1fff, 0x0187); + ocp_reg_w0w1(tp, 0xbf2a, 0x3f, 0x03); =20 /* AFE power saving for 2.5G & 5G */ sram_write(tp, 0x8173, 0x8620); sram_write(tp, 0x8175, 0x8671); =20 - sram_write_w0w1(tp, 0x817c, 0, BIT(13)); - sram_write_w0w1(tp, 0x8187, 0, BIT(13)); - sram_write_w0w1(tp, 0x8192, 0, BIT(13)); - sram_write_w0w1(tp, 0x819d, 0, BIT(13)); - sram_write_w0w1(tp, 0x81a8, BIT(13), 0); - sram_write_w0w1(tp, 0x81b3, BIT(13), 0); - sram_write_w0w1(tp, 0x81be, 0, BIT(13)); + sram_set_bits(tp, 0x817c, BIT(13)); + sram_set_bits(tp, 0x8187, BIT(13)); + sram_set_bits(tp, 0x8192, BIT(13)); + sram_set_bits(tp, 0x819d, BIT(13)); + sram_clr_bits(tp, 0x81a8, BIT(13)); + sram_clr_bits(tp, 0x81b3, BIT(13)); + sram_set_bits(tp, 0x81be, BIT(13)); =20 sram_write_w0w1(tp, 0x817d, 0xff00, 0xa600); sram_write_w0w1(tp, 0x8188, 0xff00, 0xa600); @@ -8404,10 +8507,10 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) sram2_write_w0w1(tp, 0x84b2, 0xff00, 0x6000); /* Training AAGC PAR (with uc2 patch) */ sram2_write(tp, 0x8ffc, 0x6008); - sram2_write(tp, 0x8ffe, 0xf450); + sram2_write(tp, 0x8ffe, 0xf4ff); /* DAC BGK */ - sram2_write_w0w1(tp, 0x8015, 0, BIT(9)); - sram2_write_w0w1(tp, 0x8016, 0, BIT(11)); + sram2_set_bits(tp, 0x8015, BIT(9)); + sram2_set_bits(tp, 0x8016, BIT(11)); sram2_write_w0w1(tp, 0x8fe6, 0xff00, 0x0800); sram2_write(tp, 0x8fe4, 0x2114); /* 10G PBO table */ @@ -8416,14 +8519,14 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) sram2_write_w0w1(tp, 0x864b, 0xff00, 0xdc00); /* 2.5G ado power window size */ sram2_write_w0w1(tp, 0x8154, 0xc000, 0x4000); - sram2_write_w0w1(tp, 0x8158, 0xc000, 0); + sram2_clr_bits(tp, 0x8158, 0xc000); /* 10G lock far */ sram2_write(tp, 0x826c, 0xffff); sram2_write(tp, 0x826e, 0xffff); /* XG INRX parameter */ sram2_write_w0w1(tp, 0x8872, 0xff00, 0x0e00); - sram_write_w0w1(tp, 0x8012, 0, BIT(11)); - sram_write_w0w1(tp, 0x8012, 0, BIT(14)); + sram_set_bits(tp, 0x8012, BIT(11)); + sram_set_bits(tp, 0x8012, BIT(14)); ocp_reg_set_bits(tp, 0xb576, BIT(0)); sram_write_w0w1(tp, 0x834a, 0xff00, 0x0700); sram2_write_w0w1(tp, 0x8217, 0x3f00, 0x2a00); @@ -8434,7 +8537,7 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) /* improve UBE */ ocp_reg_set_bits(tp, 0xbf0c, 0x7 << 11); /* close Sparse NEC, improve connect 5EUU cable performance */ - sram2_write_w0w1(tp, 0x88de, 0xff00, 0); + sram2_clr_bits(tp, 0x88de, 0xff00); /* 5G slave compatibility issue */ sram2_write(tp, 0x80b4, 0x5195); =20 @@ -8493,8 +8596,15 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) sram2_write(tp, 0x8ff8, 0xaa5a); =20 sram2_write_w0w1(tp, 0x88d5, 0xff00, 0x0200); - break; =20 + /* spdchg_pga1_lpf_cap */ + sram_write_w0w1(tp, 0x84bb, 0xff00, 0x0a00); + sram_write_w0w1(tp, 0x84c0, 0xff00, 0x1600); + + /* ENET PLL jitter improvement */ + ocp_reg_w0w1(tp, 0xbf8a, 0xfc00, 0x2000); + ocp_reg_set_bits(tp, 0xbf88, BIT(2)); + break; default: break; } @@ -8504,9 +8614,9 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) =20 ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, EEE_SPDWN_EN); =20 - ocp_reg_w0w1(tp, OCP_DOWN_SPEED, EN_EEE_100 | EN_EEE_1000, EN_10M_CLKDIV); - - tp->ups_info._10m_ckdiv =3D true; + ocp_reg_clr_bits(tp, OCP_DOWN_SPEED, + EN_EEE_100 | EN_EEE_1000 | EN_10M_CLKDIV); + tp->ups_info._10m_ckdiv =3D false; tp->ups_info.eee_plloff_100 =3D false; tp->ups_info.eee_plloff_giga =3D false; =20 @@ -8518,7 +8628,7 @@ static void r8157_hw_phy_cfg(struct r8152 *tp) rtl_green_en(tp, test_bit(GREEN_ETHERNET, &tp->flags)); =20 ocp_reg_clr_bits(tp, 0xa428, BIT(9)); - ocp_reg_clr_bits(tp, 0xa5ea, BIT(0) | BIT(1)); + ocp_reg_clr_bits(tp, 0xa5ea, BIT(0) | BIT(1) | BIT(2)); tp->ups_info.lite_mode =3D 0; =20 if (tp->eee_en) @@ -10355,7 +10465,7 @@ static int rtl_ops_init(struct r8152 *tp) 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->hw_phy_cfg =3D r8159_hw_phy_cfg; ops->autosuspend_en =3D rtl8157_runtime_enable; ops->change_mtu =3D rtl8156_change_mtu; tp->rx_buf_sz =3D 48 * 1024; --=20 2.34.1 From nobody Sat Sep 26 11:01:42 2026 Received: from rtits2.realtek.com.tw (rtits2.realtek.com [211.75.126.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6CB6540911E; Wed, 2 Sep 2026 09:07:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=211.75.126.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340038; cv=none; b=Ht86dL6psqjwT6ykjunw99CkYn1OAJIrKgnyiTKJimtr75QKnDHPom/+6cZvFWH3dp5Xvtcl4rPykNFOJ5ddVo1D2pH4WEqrivR+2ZklPyGG6PvNtmaUjpW6quh/SYyelaymLpP/w7BXyx3qJJE+WwlnNMXJZzT9/scAyu8khzU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340038; c=relaxed/simple; bh=mOHDSgUhbYXp0qXFhhOqHlXOCRZ0j+8zGHc/eDk3rYM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=V9zSwCZ6jceX2WvRKI105DZyILOPzDAelmEwrXWpQ/OUOZ4+iS57/xFDRgg6teHYmMeWaymWebRaK4AzL0GbDrdvb+hOk92yrCuNJ7RZUtAoHvO8sFSNo00dCeDajLXNPMdOu1FsR6SDR6Di0qRbli+Z8SiifAl59Y0UKq0JCQM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com; spf=pass smtp.mailfrom=realtek.com; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b=LQDfk9HO; arc=none smtp.client-ip=211.75.126.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=realtek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b="LQDfk9HO" X-SpamFilter-By: ArmorX SpamTrap 5.80 with qID 68296jDC22527049, This message is accepted by code: ctloc85258 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=realtek.com; s=dkim; t=1788340005; bh=AQaNtWm2BTwuy9M16olyI6FrrwUYT6i5k4f0R1NvGAM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding:Content-Type; b=LQDfk9HOT0n/kMUMbcjw4HRaR5Jf+ZtNOWxR2qxcl3yAzqCogolqKmXS8xh0UdI/Z NLEtj89nRK1NThHd9G/eZIC/Z6GtdUVmxEOJUzm8II4lqTBoPQX9P8tl9ECjYyG/aD PyYIxQZprDveFOy4rdmuHLq+C5l24MwjagHuEo3I9sQrhaooBZyXunBaIeX+hnJA56 WWQsX0uLpc+L9Z4PFUsYuILt0Nd4G6QTUyQXbIz9RbVtrXwbk9wT6dGMJc/4YCI8IA xA2n66BFEft+lfsP8nH9CubA8FPPaF7ZyrY6UH539KNfMQKoG3y+2r6096ciVAn1tA tycgEzQbchfNA== Received: from mail.realtek.com (rtkexhmbs02.realtek.com.tw[172.21.6.41]) by rtits2.realtek.com.tw (8.15.2/3.29/5.94) with ESMTPS id 68296jDC22527049 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 2 Sep 2026 17:06:45 +0800 Received: from RTKEXHMBS06.realtek.com.tw (10.21.1.56) by RTKEXHMBS02.realtek.com.tw (172.21.6.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.43; Wed, 2 Sep 2026 17:06:45 +0800 Received: from fc44.realtek.com.tw (172.22.241.7) by RTKEXHMBS06.realtek.com.tw (10.21.1.56) with Microsoft SMTP Server id 15.2.2562.43 via Frontend Transport; Wed, 2 Sep 2026 17:06:45 +0800 From: Chih Kai Hsu To: , CC: , , , , , , , , Subject: [PATCH net-next 5/8] r8152: support rtl8157_unload and rtl8157_change_mtu Date: Wed, 2 Sep 2026 17:06:29 +0800 Message-ID: <20260902090632.41844-6-nic_swsd@realtek.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260902090632.41844-1-nic_swsd@realtek.com> References: <20260902090632.41844-1-nic_swsd@realtek.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce dedicated rtl_ops callbacks for RTL8157 and RTL8159: - rtl8157_unload: a dedicated unload callback for RTL8157 and RTL8159 - rtl8157_change_mtu: determines MTPS depending on the packet size, with the range of MTPS from 10K to 16K Signed-off-by: Chih Kai Hsu --- drivers/net/usb/r8152.c | 47 ++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 90b628790a148..0cc3e8cedb84d 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -7031,6 +7031,28 @@ static void rtl8156_down(struct r8152 *tp) r8153_aldps_en(tp, true); } =20 +static void rtl8157_change_mtu(struct r8152 *tp) +{ + u32 max_pkt_size =3D mtu_to_size(tp->netdev->mtu); + u32 ocp_data; + + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, max_pkt_size); + + /* Use at least 10K for MTPS */ + ocp_data =3D max_t(u32, max_pkt_size, 10 * 1024) / 64; + + /* 16 * 1024 / 64 =3D 0x100, so the max is 0xff for 8 bits data */ + ocp_data =3D min_t(u32, ocp_data, 0xff); + + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, ocp_data); + r8156_fc_parameter(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(max_pkt_size + tp->tx_desc.size, 1024) / 16); +} + static void rtl8157_up(struct r8152 *tp) { if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) @@ -7055,7 +7077,7 @@ static void rtl8157_up(struct r8152 *tp) =20 rtl_rx_vlan_en(tp, tp->netdev->features & NETIF_F_HW_VLAN_CTAG_RX); =20 - rtl8156_change_mtu(tp); + rtl8157_change_mtu(tp); =20 /* share FIFO settings */ ocp_word_w0w1(tp, MCU_TYPE_PLA, PLA_RXFIFO_FULL, RXFIFO_FULL_MASK, @@ -10245,11 +10267,6 @@ static void rtl8153_unload(struct r8152 *tp) return; =20 r8153_power_cut_en(tp, false); - - if (tp->version >=3D RTL_VER_16) { - /* Disable Interrupt Mitigation */ - ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xcf04, BIT(0) | BIT(1) | BIT(2) | B= IT(7)); - } } =20 static void rtl8153b_unload(struct r8152 *tp) @@ -10260,6 +10277,16 @@ static void rtl8153b_unload(struct r8152 *tp) r8153b_power_cut_en(tp, false); } =20 +static void rtl8157_unload(struct r8152 *tp) +{ + if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8157_power_cut_en(tp, false); + ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xcf04, + BIT(0) | BIT(1) | BIT(2) | BIT(7)); +} + static int r8152_desc_init(struct r8152 *tp) { tp->rx_desc.size =3D sizeof(struct rx_desc); @@ -10438,13 +10465,13 @@ static int rtl_ops_init(struct r8152 *tp) ops->disable =3D rtl8153_disable; ops->up =3D rtl8157_up; ops->down =3D rtl8157_down; - ops->unload =3D rtl8153_unload; + ops->unload =3D rtl8157_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; + ops->change_mtu =3D rtl8157_change_mtu; tp->rx_buf_sz =3D 32 * 1024; tp->support_2500full =3D 1; tp->support_5000full =3D 1; @@ -10461,13 +10488,13 @@ static int rtl_ops_init(struct r8152 *tp) ops->disable =3D rtl8153_disable; ops->up =3D rtl8157_up; ops->down =3D rtl8157_down; - ops->unload =3D rtl8153_unload; + ops->unload =3D rtl8157_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 r8159_hw_phy_cfg; ops->autosuspend_en =3D rtl8157_runtime_enable; - ops->change_mtu =3D rtl8156_change_mtu; + ops->change_mtu =3D rtl8157_change_mtu; tp->rx_buf_sz =3D 48 * 1024; tp->support_2500full =3D 1; tp->support_5000full =3D 1; --=20 2.34.1 From nobody Sat Sep 26 11:01:42 2026 Received: from rtits2.realtek.com.tw (rtits2.realtek.com [211.75.126.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C27F409102; Wed, 2 Sep 2026 09:07:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=211.75.126.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340038; cv=none; b=Sak8E7fvdV2omxtAZJhyl4WmV+W1sLaZGaNBEC3IN2bb7jovBm3WuQR79NTf3i71hoygCEW7ES95oWTNxRl13Rqbaz326HSkIuwdo7ggSgSCKTxE8RSgdAqmkXbAuFtN+m4RFgkwiyX0U0+Q1PN6hmX27gwnHEGFeG6pl48qkh4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340038; c=relaxed/simple; bh=LX9uOqlwBPrBe410G69vSQhjrQxsEBebTvxfKqOcK3E=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=apKEzm38oWmewMIF74ipZravgmdd2NN9nEITGtv5KPWSP6fbEtv3edBWSIa4HOW0clCXpmFoxqADYYkR0Ud0sOCFzlCfagLCeIx4tMRuQOKxn6f+U+e6WUYcfTBtCR+okp8g7ts3NjDsjifEmsCYpo8atkTABJxas6U5LWpF1vM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com; spf=pass smtp.mailfrom=realtek.com; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b=ezgSkWtH; arc=none smtp.client-ip=211.75.126.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=realtek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b="ezgSkWtH" X-SpamFilter-By: ArmorX SpamTrap 5.80 with qID 68296kA522527055, This message is accepted by code: ctloc85258 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=realtek.com; s=dkim; t=1788340006; bh=mrX9eFLbyMxwFNjKobw0vdtjacMxILk8uqsqVOGoSIg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding:Content-Type; b=ezgSkWtHM1NbA5pXS++UlzVImhTbvjh9YCndq4/bbB4x4jC43pqfluzqbXgzv0wXH 6s9zPhUlJuA/o4nRKMdxxkLIy79M/kEXlqPHte9fM32+8RClsAO6Cyv7YftxsuyoKU uJJ1Bcpd6BbBhpjCGVaEQguSNPgYccwqgytzwcu4VXZ20UhQkH7xgRByNh0pjoY5LJ gzmENycGO74eEgaXvblU01+GuD3oyLvAsMLoPlrTLrIWCtNZ4+QwZEbiqMz7AAKN5D 4aCEFVbi4E1qqW4rMHMLH0QVuqYDFOXqB7EZO8qobBYQ8xjCSbBliML7rMzW1DRqDt yOepiFZ/v/aTg== Received: from mail.realtek.com (rtkexhmbs02.realtek.com.tw[172.21.6.41]) by rtits2.realtek.com.tw (8.15.2/3.29/5.94) with ESMTPS id 68296kA522527055 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 2 Sep 2026 17:06:46 +0800 Received: from RTKEXHMBS06.realtek.com.tw (10.21.1.56) by RTKEXHMBS02.realtek.com.tw (172.21.6.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.43; Wed, 2 Sep 2026 17:06:46 +0800 Received: from fc44.realtek.com.tw (172.22.241.7) by RTKEXHMBS06.realtek.com.tw (10.21.1.56) with Microsoft SMTP Server id 15.2.2562.43 via Frontend Transport; Wed, 2 Sep 2026 17:06:46 +0800 From: Chih Kai Hsu To: , CC: , , , , , , , , Subject: [PATCH net-next 6/8] r8152: add TGPHY access support Date: Wed, 2 Sep 2026 17:06:30 +0800 Message-ID: <20260902090632.41844-7-nic_swsd@realtek.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260902090632.41844-1-nic_swsd@realtek.com> References: <20260902090632.41844-1-nic_swsd@realtek.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add TGPHY read/write support for RTL8157 and RTL8159. To dispatch the read/write helpers, add two new function pointers, phy_read and phy_write, in struct rtl_ops. Signed-off-by: Chih Kai Hsu --- drivers/net/usb/r8152.c | 94 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 2 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 0cc3e8cedb84d..b4c2cef0b9092 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -162,6 +162,9 @@ #define USB_ADV_ADDR 0xd5d6 #define USB_ADV_DATA 0xd5d8 #define USB_ADV_CMD 0xd5dc +#define USB_TGPHY_ADDR 0xd630 +#define USB_TGPHY_DATA 0xd632 +#define USB_TGPHY_CMD 0xd634 #define USB_UPS_CTRL 0xd800 #define USB_POWER_CUT 0xd80a #define USB_MISC_0 0xd81a @@ -511,6 +514,10 @@ #define ADV_CMD_WR BIT(1) #define ADV_CMD_IP BIT(2) =20 +/* USB_TGPHY_CMD */ +#define TGPHY_CMD_BUSY BIT(0) +#define TGPHY_CMD_WR BIT(1) + /* USB_UPS_CTRL */ #define POWER_CUT 0x0100 =20 @@ -960,6 +967,8 @@ struct r8152 { void (*hw_phy_cfg)(struct r8152 *tp); void (*autosuspend_en)(struct r8152 *tp, bool enable); void (*change_mtu)(struct r8152 *tp); + u16 (*phy_read)(struct r8152 *tp, u16 addr); + void (*phy_write)(struct r8152 *tp, u16 addr, u16 data); } rtl_ops; =20 struct ups_info { @@ -1666,7 +1675,7 @@ static void ocp_write_byte(struct r8152 *tp, u16 type= , u16 index, u32 data) generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); } =20 -static u16 ocp_reg_read(struct r8152 *tp, u16 addr) +static u16 r8152_phy_read(struct r8152 *tp, u16 addr) { u16 ocp_base, ocp_index; =20 @@ -1680,7 +1689,7 @@ static u16 ocp_reg_read(struct r8152 *tp, u16 addr) return ocp_read_word(tp, MCU_TYPE_PLA, ocp_index); } =20 -static void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data) +static void r8152_phy_write(struct r8152 *tp, u16 addr, u16 data) { u16 ocp_base, ocp_index; =20 @@ -1694,6 +1703,16 @@ static void ocp_reg_write(struct r8152 *tp, u16 addr= , u16 data) ocp_write_word(tp, MCU_TYPE_PLA, ocp_index, data); } =20 +static u16 ocp_reg_read(struct r8152 *tp, u16 addr) +{ + return tp->rtl_ops.phy_read(tp, addr); +} + +static void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data) +{ + tp->rtl_ops.phy_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); @@ -2030,6 +2049,61 @@ static int r8152_mdio_test_and_clr_bit(struct r8152 = *tp, u16 addr, u16 clear) return data & clear; } =20 +static int wait_tgphy_cmd_ready(struct r8152 *tp) +{ + u16 ocp_data; + + return poll_timeout_us(ocp_data =3D ocp_read_word(tp, MCU_TYPE_USB, + USB_TGPHY_CMD), + !(ocp_data & TGPHY_CMD_BUSY), 2000, 20000, + false); +} + +static int rtl_tgphy_access(struct r8152 *tp, u16 addr, u16 *data, bool wr= ite) +{ + u16 cmd =3D 0; + int ret; + + ret =3D wait_tgphy_cmd_ready(tp); + if (ret < 0) + goto out; + + if (write) { + cmd |=3D TGPHY_CMD_WR; + ocp_write_word(tp, MCU_TYPE_USB, USB_TGPHY_DATA, *data); + } + + ocp_write_word(tp, MCU_TYPE_USB, USB_TGPHY_ADDR, addr); + + cmd |=3D TGPHY_CMD_BUSY; + ocp_write_word(tp, MCU_TYPE_USB, USB_TGPHY_CMD, cmd); + + if (!write) { + ret =3D wait_tgphy_cmd_ready(tp); + if (ret < 0) + goto out; + + *data =3D ocp_read_word(tp, MCU_TYPE_USB, USB_TGPHY_DATA); + } + +out: + return ret; +} + +static u16 r8157_phy_read(struct r8152 *tp, u16 addr) +{ + u16 data =3D 0; + + rtl_tgphy_access(tp, addr, &data, false); + + return data; +} + +static void r8157_phy_write(struct r8152 *tp, u16 addr, u16 data) +{ + rtl_tgphy_access(tp, addr, &data, true); +} + static int r8152_submit_rx(struct r8152 *tp, struct rx_agg *agg, gfp_t mem_flags); =20 @@ -10339,6 +10413,8 @@ static int rtl_ops_init(struct r8152 *tp) ops->in_nway =3D rtl8152_in_nway; ops->hw_phy_cfg =3D r8152b_hw_phy_cfg; ops->autosuspend_en =3D rtl_runtime_suspend_enable; + ops->phy_read =3D r8152_phy_read; + ops->phy_write =3D r8152_phy_write; tp->rx_buf_sz =3D 16 * 1024; tp->eee_en =3D true; tp->eee_adv =3D MDIO_EEE_100TX; @@ -10361,6 +10437,8 @@ static int rtl_ops_init(struct r8152 *tp) ops->hw_phy_cfg =3D r8153_hw_phy_cfg; ops->autosuspend_en =3D rtl8153_runtime_enable; ops->change_mtu =3D rtl8153_change_mtu; + ops->phy_read =3D r8152_phy_read; + ops->phy_write =3D r8152_phy_write; if (tp->udev->speed < USB_SPEED_SUPER) tp->rx_buf_sz =3D 16 * 1024; else @@ -10384,6 +10462,8 @@ static int rtl_ops_init(struct r8152 *tp) ops->hw_phy_cfg =3D r8153b_hw_phy_cfg; ops->autosuspend_en =3D rtl8153b_runtime_enable; ops->change_mtu =3D rtl8153_change_mtu; + ops->phy_read =3D r8152_phy_read; + ops->phy_write =3D r8152_phy_write; tp->rx_buf_sz =3D 32 * 1024; tp->eee_en =3D true; tp->eee_adv =3D MDIO_EEE_1000T | MDIO_EEE_100TX; @@ -10408,6 +10488,8 @@ static int rtl_ops_init(struct r8152 *tp) ops->hw_phy_cfg =3D r8156_hw_phy_cfg; ops->autosuspend_en =3D rtl8156_runtime_enable; ops->change_mtu =3D rtl8156_change_mtu; + ops->phy_read =3D r8152_phy_read; + ops->phy_write =3D r8152_phy_write; tp->rx_buf_sz =3D 48 * 1024; tp->support_2500full =3D 1; r8152_desc_init(tp); @@ -10433,6 +10515,8 @@ static int rtl_ops_init(struct r8152 *tp) ops->hw_phy_cfg =3D r8156b_hw_phy_cfg; ops->autosuspend_en =3D rtl8156_runtime_enable; ops->change_mtu =3D rtl8156_change_mtu; + ops->phy_read =3D r8152_phy_read; + ops->phy_write =3D r8152_phy_write; tp->rx_buf_sz =3D 48 * 1024; r8152_desc_init(tp); break; @@ -10450,6 +10534,8 @@ static int rtl_ops_init(struct r8152 *tp) ops->hw_phy_cfg =3D r8153c_hw_phy_cfg; ops->autosuspend_en =3D rtl8153c_runtime_enable; ops->change_mtu =3D rtl8153c_change_mtu; + ops->phy_read =3D r8152_phy_read; + ops->phy_write =3D r8152_phy_write; tp->rx_buf_sz =3D 32 * 1024; tp->eee_en =3D true; tp->eee_adv =3D MDIO_EEE_1000T | MDIO_EEE_100TX; @@ -10472,6 +10558,8 @@ static int rtl_ops_init(struct r8152 *tp) ops->hw_phy_cfg =3D r8157_hw_phy_cfg; ops->autosuspend_en =3D rtl8157_runtime_enable; ops->change_mtu =3D rtl8157_change_mtu; + ops->phy_read =3D r8157_phy_read; + ops->phy_write =3D r8157_phy_write; tp->rx_buf_sz =3D 32 * 1024; tp->support_2500full =3D 1; tp->support_5000full =3D 1; @@ -10495,6 +10583,8 @@ static int rtl_ops_init(struct r8152 *tp) ops->hw_phy_cfg =3D r8159_hw_phy_cfg; ops->autosuspend_en =3D rtl8157_runtime_enable; ops->change_mtu =3D rtl8157_change_mtu; + ops->phy_read =3D r8157_phy_read; + ops->phy_write =3D r8157_phy_write; tp->rx_buf_sz =3D 48 * 1024; tp->support_2500full =3D 1; tp->support_5000full =3D 1; --=20 2.34.1 From nobody Sat Sep 26 11:01:42 2026 Received: from rtits2.realtek.com.tw (rtits2.realtek.com [211.75.126.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 462CB40862C; Wed, 2 Sep 2026 09:07:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=211.75.126.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340038; cv=none; b=WNH8205Fn9SZabvG8h/st4v9aH3GhQO8Tsf+ATvgp17tH8VZHKVS1jk9NfABVTA8y3J0G6YASjLaSnZQ/XUn2gAxVKKtSV5POgG0NGliUrncItu+WNGT3aj243f6ui3y4oGzsA1XwNhzFddmZofwU8YfQrptvQS9ydRi/v20RGs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340038; c=relaxed/simple; bh=ZgwMiCRMiQRoUedHJi1pBIY7n65L2/cMrQkdHgYvU2A=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Q1e2Ca3auvaCzblu/YU9FPvdeEymBXAk1R4RKcwnobQRdZPHk8cwVNgSYNlbJuaxc1ZO774V/QnOscgJnAOgIaNkbImLDw3nbPsr2uGFRHj0ClcnXnOjYWZTNlEXzUWfTbTL0O/8dqV2XAwt/IEi+0zdC1eS+o3tR6ElWTTW5U8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com; spf=pass smtp.mailfrom=realtek.com; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b=HjLhwMwF; arc=none smtp.client-ip=211.75.126.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=realtek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b="HjLhwMwF" X-SpamFilter-By: ArmorX SpamTrap 5.80 with qID 68296ludE2527063, This message is accepted by code: ctloc85258 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=realtek.com; s=dkim; t=1788340007; bh=G5xsiccBkEHfnRpkRmHfVI11EGDnUIqijPdpM/xlsuY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding:Content-Type; b=HjLhwMwFjJQuq0X+LfBs3P7o7nMpotaM92kFzv3FN2c/MaEJCK6W503An2dXDTxzN TizQYk48vgB9hkCmLtdn0TEYBMIEBm0cE9MzeUBGDBaifipTrG8ZVkYGd2G3A/9SQ4 C9g2q4g4BftVBEZTliGmMsvse0u9XXBWPPRmqXfNbT/5A75PVkItNaphXRs74Jh89R 6xb2mQbXEusbJMaNhtMkD8Fiep5SRZQKXdaIirgmpD6k+MP/dktMGAgvqwk8yrdK4v neWnW7u8fmgwqULwrqJMZ03ritjiqBJj81eukN5R0CHqIYyMGKbVZUjRnY15/2hINJ SHGQcf0XZvKFg== Received: from mail.realtek.com (rtkexhmbs03.realtek.com.tw[10.21.1.53]) by rtits2.realtek.com.tw (8.15.2/3.29/5.94) with ESMTPS id 68296ludE2527063 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 2 Sep 2026 17:06:47 +0800 Received: from RTKEXHMBS06.realtek.com.tw (10.21.1.56) by RTKEXHMBS03.realtek.com.tw (10.21.1.53) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.43; Wed, 2 Sep 2026 17:06:47 +0800 Received: from fc44.realtek.com.tw (172.22.241.7) by RTKEXHMBS06.realtek.com.tw (10.21.1.56) with Microsoft SMTP Server id 15.2.2562.43 via Frontend Transport; Wed, 2 Sep 2026 17:06:47 +0800 From: Chih Kai Hsu To: , CC: , , , , , , , , Subject: [PATCH net-next 7/8] r8152: support rtl_fc_pause_pkt_en() Date: Wed, 2 Sep 2026 17:06:31 +0800 Message-ID: <20260902090632.41844-8-nic_swsd@realtek.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260902090632.41844-1-nic_swsd@realtek.com> References: <20260902090632.41844-1-nic_swsd@realtek.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Refactor the flow control patch as the function rtl_fc_pause_pkt_en(). Moreover, support flow control patch for RTL8156, RTL8157 and RTL8159. Signed-off-by: Chih Kai Hsu --- drivers/net/usb/r8152.c | 112 ++++++++++++++++++++++++++++++++++------ 1 file changed, 97 insertions(+), 15 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index b4c2cef0b9092..b809317de74f7 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -89,6 +89,7 @@ #define PLA_MTPS 0xe615 #define PLA_TXFIFO_CTRL 0xe618 #define PLA_TXFIFO_FULL 0xe61a +#define PLA_PAUSE_LIMIT 0xe61e #define PLA_RSTTALLY 0xe800 #define PLA_CR 0xe813 #define PLA_CRWECR 0xe81c @@ -301,6 +302,10 @@ #define MTPS_JUMBO (12 * 1024 / 64) #define MTPS_DEFAULT (6 * 1024 / 64) =20 +/* PLA_PAUSE_LIMIT */ +#define PAUSE_LIMIT_EN BIT(3) +#define PAUSE_LIMIT_MASK 0xf0 + /* PLA_RSTTALLY */ #define TALLY_RESET 0x0001 =20 @@ -6095,6 +6100,93 @@ static void r8152b_enter_oob(struct r8152 *tp) RCR_APM | RCR_AM | RCR_AB); } =20 +static void rtl_fc_pause_pkt_en(struct r8152 *tp, u16 speed) +{ + int log2_ratio, ratio; + u16 num_pause_pkts; + u32 ocp_data; + + switch (tp->version) { + case RTL_VER_10: + case RTL_VER_11: + ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER, + CTRL_TIMER_EN | (1000 / 8)); + + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, + FLOW_CTRL_PATCH_OPT); + + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); + break; + case RTL_VER_12: + case RTL_VER_13: + case RTL_VER_15: + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, SLOT_EN); + + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_CPCR, FLOW_CTRL_EN); + + /* enable fc timer and set timer to 600 ms. */ + ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER, + CTRL_TIMER_EN | (600 / 8)); + + ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_POL_GPIO_CTRL); + if (!(ocp_data & DACK_DET_EN)) + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, + FLOW_CTRL_PATCH_2); + + ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); + break; + case RTL_VER_16: + case RTL_VER_17_QFN68: + case RTL_VER_17_QFN100: + ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, SLOT_EN); + + num_pause_pkts =3D 0xa; + ratio =3D 10000; + + if (!(speed & LINK_STATUS)) { + dev_dbg(&tp->intf->dev, "No link\n"); + goto no_link; + } else if (speed & _10bps) { + ratio /=3D 10; + } else if (speed & _100bps) { + ratio /=3D 100; + } else if (speed & _1000bps) { + ratio /=3D 1000; + } else if (speed & _2500bps) { + ratio /=3D 2500; + } else if (speed & _5000bps) { + ratio /=3D 5000; + } else if (speed & _10000bps) { + ratio /=3D 10000; + } else { + dev_err(&tp->intf->dev, "Unknown link speed\n"); + goto no_link; + } + + log2_ratio =3D ilog2(ratio); + num_pause_pkts -=3D log2_ratio; + + /* Round up if ratio is more than halfway to the next power of 2. + * Floating-point is avoided by rewriting + * ratio > 1.5 * 2^log2_ratio as + * 2 * ratio > 3 * 2^log2_ratio + */ + if (2 * ratio > 3 * (1 << log2_ratio)) + num_pause_pkts--; + +no_link: + ocp_word_w0w1(tp, MCU_TYPE_PLA, PLA_PAUSE_LIMIT, + PAUSE_LIMIT_MASK | PAUSE_LIMIT_EN, + num_pause_pkts << 4); + + ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_PAUSE_LIMIT, + PAUSE_LIMIT_EN); + break; + default: + break; + } +} + static int r8153_pre_firmware_1(struct r8152 *tp) { int i; @@ -6626,6 +6718,8 @@ static int rtl8157_enable(struct r8152 *tp) r8153_set_rx_early_size(tp); =20 speed =3D rtl8152_get_speed(tp); + rtl_fc_pause_pkt_en(tp, speed); + rtl_set_ifg(tp, speed); =20 return rtl_enable(tp); @@ -8792,6 +8886,8 @@ static void r8156_init(struct r8152 *tp) =20 usb_enable_lpm(tp->udev); =20 + rtl_fc_pause_pkt_en(tp, 0); + r8156_mac_clk_spd(tp, true); =20 ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, @@ -8828,7 +8924,6 @@ static void r8156b_u2phy_backup(struct r8152 *tp) =20 static void r8156b_init(struct r8152 *tp) { - u32 ocp_data; u16 data; int i; =20 @@ -8901,20 +8996,7 @@ static void r8156b_init(struct r8152 *tp) =20 usb_enable_lpm(tp->udev); =20 - ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, SLOT_EN); - - ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_CPCR, FLOW_CTRL_EN); - - /* enable fc timer and set timer to 600 ms. */ - ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER, - CTRL_TIMER_EN | (600 / 8)); - - ocp_data =3D ocp_read_word(tp, MCU_TYPE_PLA, PLA_POL_GPIO_CTRL); - if (!(ocp_data & DACK_DET_EN)) - ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, - FLOW_CTRL_PATCH_2); - - ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); + rtl_fc_pause_pkt_en(tp, 0); =20 r8156_mac_clk_spd(tp, true); =20 --=20 2.34.1 From nobody Sat Sep 26 11:01:42 2026 Received: from rtits2.realtek.com.tw (rtits2.realtek.com [211.75.126.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF2F43822BB; Wed, 2 Sep 2026 09:07:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=211.75.126.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340037; cv=none; b=a+rSO6WkRZ9kfuX0+y2wJBszE9A5KOCKPUhPIIjqIeBDE8MfEcREpl8Yg43VbO9PxGoX6RrmSuHISCV9EtmEDL9lf2CypIbAL6bjam9CiSTttIfq+lZqKJKB4kfLOxkhmQvwcF5ZRe3xIHEBIMEeiR5ZGy2NSI/H3sJutYVZrNU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340037; c=relaxed/simple; bh=vM7Mok+kM5Cp8FnsoGm4tNwkN1GSHIBuKR4c8Qrz74U=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=KXoHoJoYkYYC0vBYIS0/+k2+RZwGSZh4KDic2rlQ7AM8SztZPPuYIegA/Ehnk97e0G46G6R+RA4i9sinmcULqux0tBUiHxyRe9cpnsxEj+l6VlZRwpMEgtfCZt4qM4oTvTkPkt/Py5YGA84ZAsgdLyHiEngNAmIilQCOowJKvJY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com; spf=pass smtp.mailfrom=realtek.com; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b=d+aeO8XG; arc=none smtp.client-ip=211.75.126.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=realtek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=realtek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=realtek.com header.i=@realtek.com header.b="d+aeO8XG" X-SpamFilter-By: ArmorX SpamTrap 5.80 with qID 68296maE62527097, This message is accepted by code: ctloc85258 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=realtek.com; s=dkim; t=1788340008; bh=GuHBDrUObMAmNecOtLtM0QoW0Xym/BAGIwJifrJ755Y=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding:Content-Type; b=d+aeO8XGiAQLJssCNImtBs39bgChlB6pNiNq/s1tiRYqppeecIUkQv/d+YaxEkBTO JNqV9qvNkjGRAKGDxWCQ7WD3OLF0CNTlpbW+Y+7vz1tL+c4hehR6kLTUkKxE5BBL9Q V1nXb1HxsXTKAddeNdAZ8uMA2vhcFJE9/pJo0LE2HfGhqdsJmmKMb70FN7rInj7TdC 8tJZtL3LX0DdOMUM8xJGhaMOOQjEsv3aAPIppMmFBcNmQ8v+HeYX7TNN2CDprb1pDN hoHg6niMzNHnD+/Illw5l2mADQtp/O/o3X+w62n7f8nhxcU1gFIGLZMfGgraxyrH5u 8907MODop7L0g== Received: from mail.realtek.com (rtkexhmbs03.realtek.com.tw[10.21.1.53]) by rtits2.realtek.com.tw (8.15.2/3.29/5.94) with ESMTPS id 68296maE62527097 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 2 Sep 2026 17:06:48 +0800 Received: from RTKEXHMBS06.realtek.com.tw (10.21.1.56) by RTKEXHMBS03.realtek.com.tw (10.21.1.53) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.43; Wed, 2 Sep 2026 17:06:48 +0800 Received: from fc44.realtek.com.tw (172.22.241.7) by RTKEXHMBS06.realtek.com.tw (10.21.1.56) with Microsoft SMTP Server id 15.2.2562.43 via Frontend Transport; Wed, 2 Sep 2026 17:06:48 +0800 From: Chih Kai Hsu To: , CC: , , , , , , , , Subject: [PATCH net-next 8/8] r8152: support UPS for RTL8157 and RTL8159 Date: Wed, 2 Sep 2026 17:06:32 +0800 Message-ID: <20260902090632.41844-9-nic_swsd@realtek.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260902090632.41844-1-nic_swsd@realtek.com> References: <20260902090632.41844-1-nic_swsd@realtek.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a new function, r8157_ups_en(), to support UPS for RTL8157 and RTL8159, and also extend r8156_ups_flags(). Signed-off-by: Chih Kai Hsu --- drivers/net/usb/r8152.c | 109 +++++++++++++++++++++++++++++++++++----- 1 file changed, 97 insertions(+), 12 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index b809317de74f7..96abd0447741a 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -619,6 +619,11 @@ #define UPS_FLAGS_250M_CKDIV BIT(2) #define UPS_FLAGS_EN_ALDPS BIT(3) #define UPS_FLAGS_CTAP_SHORT_DIS BIT(4) +#define UPS_FLAGS_EN_100M_EEE BIT(9) +#define UPS_FLAGS_EN_1000M_EEE BIT(10) +#define UPS_FLAGS_EN_2500M_EEE BIT(11) +#define UPS_FLAGS_EN_5000M_EEE BIT(12) +#define UPS_FLAGS_EN_10G_EEE BIT(13) #define UPS_FLAGS_SPEED_MASK (0xf << 16) #define ups_flags_speed(x) ((x) << 16) #define UPS_FLAGS_EN_EEE BIT(20) @@ -4185,8 +4190,27 @@ static void r8156_ups_flags(struct r8152 *tp) if (tp->ups_info.aldps) ups_flags |=3D UPS_FLAGS_EN_ALDPS; =20 - if (tp->ups_info.eee) - ups_flags |=3D UPS_FLAGS_EN_EEE; + if (tp->ups_info.eee) { + switch (tp->version) { + case RTL_VER_17_QFN68: + if (tp->eee_adv & MDIO_EEE_10GT) + ups_flags |=3D UPS_FLAGS_EN_10G_EEE; + fallthrough; + case RTL_VER_16: + if (tp->eee_adv & MDIO_EEE_100TX) + ups_flags |=3D UPS_FLAGS_EN_100M_EEE; + if (tp->eee_adv & MDIO_EEE_1000T) + ups_flags |=3D UPS_FLAGS_EN_1000M_EEE; + if (tp->eee_adv2 & MDIO_EEE_2_5GT) + ups_flags |=3D UPS_FLAGS_EN_2500M_EEE; + if (tp->eee_adv2 & MDIO_EEE_5GT) + ups_flags |=3D UPS_FLAGS_EN_5000M_EEE; + break; + default: + ups_flags |=3D UPS_FLAGS_EN_EEE; + break; + } + } =20 if (tp->ups_info.flow_control) ups_flags |=3D UPS_FLAGS_EN_FLOW_CTR; @@ -4237,20 +4261,33 @@ static void r8156_ups_flags(struct r8152 *tp) case NWAY_2500M_FULL: ups_flags |=3D ups_flags_speed(9); break; + case NWAY_5000M_FULL: + ups_flags |=3D ups_flags_speed(10); + break; + case NWAY_10000M_FULL: + ups_flags |=3D ups_flags_speed(11); + break; default: break; } =20 - switch (tp->ups_info.lite_mode) { - case 1: - ups_flags |=3D 0 << 5; - break; - case 2: - ups_flags |=3D 2 << 5; + switch (tp->version) { + case RTL_VER_16: + case RTL_VER_17_QFN68: break; - case 0: default: - ups_flags |=3D 1 << 5; + switch (tp->ups_info.lite_mode) { + case 1: + ups_flags |=3D 0 << 5; + break; + case 2: + ups_flags |=3D 2 << 5; + break; + case 0: + default: + ups_flags |=3D 1 << 5; + break; + } break; } =20 @@ -4422,6 +4459,35 @@ static void r8156_ups_en(struct r8152 *tp, bool enab= le) } } =20 +static void r8157_ups_en(struct r8152 *tp, bool enable) +{ + if (enable) { + r8156_ups_flags(tp); + + ocp_byte_set_bits(tp, MCU_TYPE_USB, USB_POWER_CUT, + UPS_EN | USP_PREWAKE | PHASE2_EN); + + ocp_byte_set_bits(tp, MCU_TYPE_USB, USB_MISC_2, + UPS_FORCE_PWR_DOWN); + } else { + ocp_byte_clr_bits(tp, MCU_TYPE_USB, USB_POWER_CUT, + UPS_EN | USP_PREWAKE); + + ocp_byte_clr_bits(tp, MCU_TYPE_USB, USB_MISC_2, + UPS_FORCE_PWR_DOWN); + + if (ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0) & PCUT_STATUS) { + /* clear USB fw_ver_reg */ + ocp_write_byte(tp, MCU_TYPE_USB, 0xcf07, 0); + + tp->rtl_ops.hw_phy_cfg(tp); + + rtl8152_set_speed(tp, tp->autoneg, tp->speed, + tp->duplex, tp->advertising); + } + } +} + static void r8153_power_cut_en(struct r8152 *tp, bool enable) { if (enable) @@ -4580,9 +4646,28 @@ static void rtl8157_runtime_enable(struct r8152 *tp,= bool enable) r8153b_u1u2en(tp, false); r8157_u2p3en(tp, false); rtl_runtime_suspend_enable(tp, true); + + switch (tp->version) { + case RTL_VER_16: + case RTL_VER_17_QFN68: + r8157_ups_en(tp, true); + break; + default: + break; + } } else { r8153_queue_wake(tp, false); rtl_runtime_suspend_enable(tp, false); + + switch (tp->version) { + case RTL_VER_16: + case RTL_VER_17_QFN68: + r8157_ups_en(tp, false); + break; + default: + break; + } + r8157_u2p3en(tp, true); if (tp->udev->speed >=3D USB_SPEED_SUPER) r8153b_u1u2en(tp, true); @@ -9077,7 +9162,7 @@ static void r8157_init(struct r8152 *tp) ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500); =20 r8157_power_cut_en(tp, false); - r8156_ups_en(tp, false); + r8157_ups_en(tp, false); r8153_queue_wake(tp, false); rtl_runtime_suspend_enable(tp, false); =20 @@ -9195,7 +9280,7 @@ static void r8159_init(struct r8152 *tp) ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500); =20 r8157_power_cut_en(tp, false); - r8156_ups_en(tp, false); + r8157_ups_en(tp, false); r8153_queue_wake(tp, false); rtl_runtime_suspend_enable(tp, false); =20 --=20 2.34.1