[openwrt/openwrt] siflower: 6.12: drop upstreamed patches
LEDE Commits
lede-commits at lists.infradead.org
Wed Nov 19 11:57:42 PST 2025
ansuel pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/11565a298e20cca0f9ec072e165b979937cc15f0
commit 11565a298e20cca0f9ec072e165b979937cc15f0
Author: Zhu Yujie <libriunc at gmail.com>
AuthorDate: Fri Nov 14 14:57:36 2025 +0800
siflower: 6.12: drop upstreamed patches
Drop patches from the 6.12 patchset that have been merged into the
mainline Linux kernel since the previous version.
Dropped patches:
001-net-phy-c45-add-genphy_c45_pma_read_ext_abilities-fu.patch
002-net-phy-Optimize-phy-speed-mask-to-be-compatible-to-.patch
003-net-phy-Add-driver-for-Motorcomm-yt8821-2.5G-etherne.patch
014-riscv-add-an-option-for-efficient-unaligned-access.patch
Signed-off-by: Zhu Yujie <libriunc at gmail.com>
Link: https://github.com/openwrt/openwrt/pull/20555
Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
---
...-add-genphy_c45_pma_read_ext_abilities-fu.patch | 180 -----
...imize-phy-speed-mask-to-be-compatible-to-.patch | 49 --
...-driver-for-Motorcomm-yt8821-2.5G-etherne.patch | 753 ---------------------
...-an-option-for-efficient-unaligned-access.patch | 46 --
4 files changed, 1028 deletions(-)
diff --git a/target/linux/siflower/patches-6.12/001-net-phy-c45-add-genphy_c45_pma_read_ext_abilities-fu.patch b/target/linux/siflower/patches-6.12/001-net-phy-c45-add-genphy_c45_pma_read_ext_abilities-fu.patch
deleted file mode 100644
index e693e95cb0..0000000000
--- a/target/linux/siflower/patches-6.12/001-net-phy-c45-add-genphy_c45_pma_read_ext_abilities-fu.patch
+++ /dev/null
@@ -1,180 +0,0 @@
-From: Oleksij Rempel <o.rempel at pengutronix.de>
-Date: Tue, 12 Dec 2023 06:41:43 +0100
-Subject: [PATCH 01/20] net: phy: c45: add genphy_c45_pma_read_ext_abilities()
- function
-
-Move part of the genphy_c45_pma_read_abilities() code to a separate
-function.
-
-Some PHYs do not implement PMA/PMD status 2 register (Register 1.8) but
-do implement PMA/PMD extended ability register (Register 1.11). To make
-use of it, we need to be able to access this part of code separately.
-
-Signed-off-by: Oleksij Rempel <o.rempel at pengutronix.de>
-Reviewed-by: Andrew Lunn <andrew at lunn.ch>
-Reviewed-by: Russell King (Oracle) <rmk+kernel at armlinux.org.uk>
-Link: https://lore.kernel.org/r/20231212054144.87527-2-o.rempel@pengutronix.de
-Signed-off-by: Jakub Kicinski <kuba at kernel.org>
-(cherry picked from commit 0c476157085fe2ad13b9bec70ea672e86647fa1a)
----
- drivers/net/phy/phy-c45.c | 129 ++++++++++++++++++++++----------------
- include/linux/phy.h | 1 +
- 2 files changed, 75 insertions(+), 55 deletions(-)
-
---- a/drivers/net/phy/phy-c45.c
-+++ b/drivers/net/phy/phy-c45.c
-@@ -920,6 +920,79 @@ int genphy_c45_pma_baset1_read_abilities
- EXPORT_SYMBOL_GPL(genphy_c45_pma_baset1_read_abilities);
-
- /**
-+ * genphy_c45_pma_read_ext_abilities - read supported link modes from PMA
-+ * @phydev: target phy_device struct
-+ *
-+ * Read the supported link modes from the PMA/PMD extended ability register
-+ * (Register 1.11).
-+ */
-+int genphy_c45_pma_read_ext_abilities(struct phy_device *phydev)
-+{
-+ int val;
-+
-+ val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_EXTABLE);
-+ if (val < 0)
-+ return val;
-+
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_EXTABLE_10GBLRM);
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_EXTABLE_10GBT);
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_EXTABLE_10GBKX4);
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_EXTABLE_10GBKR);
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_EXTABLE_1000BT);
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_EXTABLE_1000BKX);
-+
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_EXTABLE_100BTX);
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_EXTABLE_100BTX);
-+
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_EXTABLE_10BT);
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_EXTABLE_10BT);
-+
-+ if (val & MDIO_PMA_EXTABLE_NBT) {
-+ val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
-+ MDIO_PMA_NG_EXTABLE);
-+ if (val < 0)
-+ return val;
-+
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_NG_EXTABLE_2_5GBT);
-+
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
-+ phydev->supported,
-+ val & MDIO_PMA_NG_EXTABLE_5GBT);
-+ }
-+
-+ if (val & MDIO_PMA_EXTABLE_BT1) {
-+ val = genphy_c45_pma_baset1_read_abilities(phydev);
-+ if (val < 0)
-+ return val;
-+ }
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(genphy_c45_pma_read_ext_abilities);
-+
-+/**
- * genphy_c45_pma_read_abilities - read supported link modes from PMA
- * @phydev: target phy_device struct
- *
-@@ -962,63 +1035,9 @@ int genphy_c45_pma_read_abilities(struct
- val & MDIO_PMA_STAT2_10GBER);
-
- if (val & MDIO_PMA_STAT2_EXTABLE) {
-- val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_EXTABLE);
-+ val = genphy_c45_pma_read_ext_abilities(phydev);
- if (val < 0)
- return val;
--
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT,
-- phydev->supported,
-- val & MDIO_PMA_EXTABLE_10GBLRM);
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
-- phydev->supported,
-- val & MDIO_PMA_EXTABLE_10GBT);
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT,
-- phydev->supported,
-- val & MDIO_PMA_EXTABLE_10GBKX4);
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
-- phydev->supported,
-- val & MDIO_PMA_EXTABLE_10GBKR);
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
-- phydev->supported,
-- val & MDIO_PMA_EXTABLE_1000BT);
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseKX_Full_BIT,
-- phydev->supported,
-- val & MDIO_PMA_EXTABLE_1000BKX);
--
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
-- phydev->supported,
-- val & MDIO_PMA_EXTABLE_100BTX);
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
-- phydev->supported,
-- val & MDIO_PMA_EXTABLE_100BTX);
--
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
-- phydev->supported,
-- val & MDIO_PMA_EXTABLE_10BT);
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
-- phydev->supported,
-- val & MDIO_PMA_EXTABLE_10BT);
--
-- if (val & MDIO_PMA_EXTABLE_NBT) {
-- val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
-- MDIO_PMA_NG_EXTABLE);
-- if (val < 0)
-- return val;
--
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
-- phydev->supported,
-- val & MDIO_PMA_NG_EXTABLE_2_5GBT);
--
-- linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
-- phydev->supported,
-- val & MDIO_PMA_NG_EXTABLE_5GBT);
-- }
--
-- if (val & MDIO_PMA_EXTABLE_BT1) {
-- val = genphy_c45_pma_baset1_read_abilities(phydev);
-- if (val < 0)
-- return val;
-- }
- }
-
- /* This is optional functionality. If not supported, we may get an error
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -1931,6 +1931,7 @@ int genphy_c45_an_config_aneg(struct phy
- int genphy_c45_an_disable_aneg(struct phy_device *phydev);
- int genphy_c45_read_mdix(struct phy_device *phydev);
- int genphy_c45_pma_read_abilities(struct phy_device *phydev);
-+int genphy_c45_pma_read_ext_abilities(struct phy_device *phydev);
- int genphy_c45_pma_baset1_read_abilities(struct phy_device *phydev);
- int genphy_c45_read_eee_abilities(struct phy_device *phydev);
- int genphy_c45_pma_baset1_read_master_slave(struct phy_device *phydev);
diff --git a/target/linux/siflower/patches-6.12/002-net-phy-Optimize-phy-speed-mask-to-be-compatible-to-.patch b/target/linux/siflower/patches-6.12/002-net-phy-Optimize-phy-speed-mask-to-be-compatible-to-.patch
deleted file mode 100644
index 68368b1668..0000000000
--- a/target/linux/siflower/patches-6.12/002-net-phy-Optimize-phy-speed-mask-to-be-compatible-to-.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From: Frank Sae <Frank.Sae at motor-comm.com>
-Date: Sun, 1 Sep 2024 01:35:25 -0700
-Subject: [PATCH 02/20] net: phy: Optimize phy speed mask to be compatible to
- yt8821
-
-yt8521 and yt8531s as Gigabit transceiver use bit15:14(bit9 reserved
-default 0) as phy speed mask, yt8821 as 2.5G transceiver uses bit9 bit15:14
-as phy speed mask.
-
-Be compatible to yt8821, reform phy speed mask and phy speed macro.
-
-Reviewed-by: Andrew Lunn <andrew at lunn.ch>
-Signed-off-by: Frank Sae <Frank.Sae at motor-comm.com>
-Signed-off-by: Paolo Abeni <pabeni at redhat.com>
-
-(cherry picked from commit 8d878c87b5c45ae64b0aecd4aac71e210d19173f)
----
- drivers/net/phy/motorcomm.c | 13 +++++--------
- 1 file changed, 5 insertions(+), 8 deletions(-)
-
---- a/drivers/net/phy/motorcomm.c
-+++ b/drivers/net/phy/motorcomm.c
-@@ -47,12 +47,10 @@
-
- /* Specific Status Register */
- #define YTPHY_SPECIFIC_STATUS_REG 0x11
--#define YTPHY_SSR_SPEED_MODE_OFFSET 14
--
--#define YTPHY_SSR_SPEED_MODE_MASK (BIT(15) | BIT(14))
--#define YTPHY_SSR_SPEED_10M 0x0
--#define YTPHY_SSR_SPEED_100M 0x1
--#define YTPHY_SSR_SPEED_1000M 0x2
-+#define YTPHY_SSR_SPEED_MASK ((0x3 << 14) | BIT(9))
-+#define YTPHY_SSR_SPEED_10M ((0x0 << 14))
-+#define YTPHY_SSR_SPEED_100M ((0x1 << 14))
-+#define YTPHY_SSR_SPEED_1000M ((0x2 << 14))
- #define YTPHY_SSR_DUPLEX_OFFSET 13
- #define YTPHY_SSR_DUPLEX BIT(13)
- #define YTPHY_SSR_PAGE_RECEIVED BIT(12)
-@@ -1188,8 +1186,7 @@ static int yt8521_adjust_status(struct p
- else
- duplex = DUPLEX_FULL; /* for fiber, it always DUPLEX_FULL */
-
-- speed_mode = (status & YTPHY_SSR_SPEED_MODE_MASK) >>
-- YTPHY_SSR_SPEED_MODE_OFFSET;
-+ speed_mode = status & YTPHY_SSR_SPEED_MASK;
-
- switch (speed_mode) {
- case YTPHY_SSR_SPEED_10M:
diff --git a/target/linux/siflower/patches-6.12/003-net-phy-Add-driver-for-Motorcomm-yt8821-2.5G-etherne.patch b/target/linux/siflower/patches-6.12/003-net-phy-Add-driver-for-Motorcomm-yt8821-2.5G-etherne.patch
deleted file mode 100644
index 6778f008c5..0000000000
--- a/target/linux/siflower/patches-6.12/003-net-phy-Add-driver-for-Motorcomm-yt8821-2.5G-etherne.patch
+++ /dev/null
@@ -1,753 +0,0 @@
-From: Frank Sae <Frank.Sae at motor-comm.com>
-Date: Sun, 1 Sep 2024 01:35:26 -0700
-Subject: [PATCH 03/20] net: phy: Add driver for Motorcomm yt8821 2.5G ethernet
- phy
-
-Add a driver for the motorcomm yt8821 2.5G ethernet phy. Verified the
-driver on BPI-R3(with MediaTek MT7986(Filogic 830) SoC) development board,
-which is developed by Guangdong Bipai Technology Co., Ltd..
-
-yt8821 2.5G ethernet phy works in AUTO_BX2500_SGMII or FORCE_BX2500
-interface, supports 2.5G/1000M/100M/10M speeds, and wol(magic package).
-
-Signed-off-by: Frank Sae <Frank.Sae at motor-comm.com>
-Reviewed-by: Sai Krishna <saikrishnag at marvell.com>
-Reviewed-by: Andrew Lunn <andrew at lunn.ch>
-Signed-off-by: Paolo Abeni <pabeni at redhat.com>
-
-(cherry picked from commit b671105b88c3bb9acc1fb61a3ee2ca0ece60cb8d)
----
- drivers/net/phy/motorcomm.c | 671 +++++++++++++++++++++++++++++++++++-
- 1 file changed, 667 insertions(+), 4 deletions(-)
-
---- a/drivers/net/phy/motorcomm.c
-+++ b/drivers/net/phy/motorcomm.c
-@@ -1,6 +1,6 @@
- // SPDX-License-Identifier: GPL-2.0+
- /*
-- * Motorcomm 8511/8521/8531/8531S PHY driver.
-+ * Motorcomm 8511/8521/8531/8531S/8821 PHY driver.
- *
- * Author: Peter Geis <pgwipeout at gmail.com>
- * Author: Frank <Frank.Sae at motor-comm.com>
-@@ -17,8 +17,8 @@
- #define PHY_ID_YT8521 0x0000011a
- #define PHY_ID_YT8531 0x4f51e91b
- #define PHY_ID_YT8531S 0x4f51e91a
--
--/* YT8521/YT8531S Register Overview
-+#define PHY_ID_YT8821 0x4f51ea19
-+/* YT8521/YT8531S/YT8821 Register Overview
- * UTP Register space | FIBER Register space
- * ------------------------------------------------------------
- * | UTP MII | FIBER MII |
-@@ -51,6 +51,8 @@
- #define YTPHY_SSR_SPEED_10M ((0x0 << 14))
- #define YTPHY_SSR_SPEED_100M ((0x1 << 14))
- #define YTPHY_SSR_SPEED_1000M ((0x2 << 14))
-+#define YTPHY_SSR_SPEED_10G ((0x3 << 14))
-+#define YTPHY_SSR_SPEED_2500M ((0x0 << 14) | BIT(9))
- #define YTPHY_SSR_DUPLEX_OFFSET 13
- #define YTPHY_SSR_DUPLEX BIT(13)
- #define YTPHY_SSR_PAGE_RECEIVED BIT(12)
-@@ -269,12 +271,89 @@
- #define YT8531_SCR_CLK_SRC_REF_25M 4
- #define YT8531_SCR_CLK_SRC_SSC_25M 5
-
-+#define YT8821_SDS_EXT_CSR_CTRL_REG 0x23
-+#define YT8821_SDS_EXT_CSR_VCO_LDO_EN BIT(15)
-+#define YT8821_SDS_EXT_CSR_VCO_BIAS_LPF_EN BIT(8)
-+
-+#define YT8821_UTP_EXT_PI_CTRL_REG 0x56
-+#define YT8821_UTP_EXT_PI_RST_N_FIFO BIT(5)
-+#define YT8821_UTP_EXT_PI_TX_CLK_SEL_AFE BIT(4)
-+#define YT8821_UTP_EXT_PI_RX_CLK_3_SEL_AFE BIT(3)
-+#define YT8821_UTP_EXT_PI_RX_CLK_2_SEL_AFE BIT(2)
-+#define YT8821_UTP_EXT_PI_RX_CLK_1_SEL_AFE BIT(1)
-+#define YT8821_UTP_EXT_PI_RX_CLK_0_SEL_AFE BIT(0)
-+
-+#define YT8821_UTP_EXT_VCT_CFG6_CTRL_REG 0x97
-+#define YT8821_UTP_EXT_FECHO_AMP_TH_HUGE GENMASK(15, 8)
-+
-+#define YT8821_UTP_EXT_ECHO_CTRL_REG 0x336
-+#define YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000 GENMASK(14, 8)
-+
-+#define YT8821_UTP_EXT_GAIN_CTRL_REG 0x340
-+#define YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000 GENMASK(6, 0)
-+
-+#define YT8821_UTP_EXT_RPDN_CTRL_REG 0x34E
-+#define YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 BIT(15)
-+#define YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500 BIT(7)
-+#define YT8821_UTP_EXT_RPDN_IPR_SHT_2500 GENMASK(6, 0)
-+
-+#define YT8821_UTP_EXT_TH_20DB_2500_CTRL_REG 0x36A
-+#define YT8821_UTP_EXT_TH_20DB_2500 GENMASK(15, 0)
-+
-+#define YT8821_UTP_EXT_TRACE_CTRL_REG 0x372
-+#define YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500 GENMASK(14, 8)
-+#define YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500 GENMASK(6, 0)
-+
-+#define YT8821_UTP_EXT_ALPHA_IPR_CTRL_REG 0x374
-+#define YT8821_UTP_EXT_ALPHA_SHT_2500 GENMASK(14, 8)
-+#define YT8821_UTP_EXT_IPR_LNG_2500 GENMASK(6, 0)
-+
-+#define YT8821_UTP_EXT_PLL_CTRL_REG 0x450
-+#define YT8821_UTP_EXT_PLL_SPARE_CFG GENMASK(7, 0)
-+
-+#define YT8821_UTP_EXT_DAC_IMID_CH_2_3_CTRL_REG 0x466
-+#define YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG GENMASK(14, 8)
-+#define YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG GENMASK(6, 0)
-+
-+#define YT8821_UTP_EXT_DAC_IMID_CH_0_1_CTRL_REG 0x467
-+#define YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG GENMASK(14, 8)
-+#define YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG GENMASK(6, 0)
-+
-+#define YT8821_UTP_EXT_DAC_IMSB_CH_2_3_CTRL_REG 0x468
-+#define YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG GENMASK(14, 8)
-+#define YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG GENMASK(6, 0)
-+
-+#define YT8821_UTP_EXT_DAC_IMSB_CH_0_1_CTRL_REG 0x469
-+#define YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG GENMASK(14, 8)
-+#define YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG GENMASK(6, 0)
-+
-+#define YT8821_UTP_EXT_MU_COARSE_FR_CTRL_REG 0x4B3
-+#define YT8821_UTP_EXT_MU_COARSE_FR_F_FFE GENMASK(14, 12)
-+#define YT8821_UTP_EXT_MU_COARSE_FR_F_FBE GENMASK(10, 8)
-+
-+#define YT8821_UTP_EXT_MU_FINE_FR_CTRL_REG 0x4B5
-+#define YT8821_UTP_EXT_MU_FINE_FR_F_FFE GENMASK(14, 12)
-+#define YT8821_UTP_EXT_MU_FINE_FR_F_FBE GENMASK(10, 8)
-+
-+#define YT8821_UTP_EXT_VGA_LPF1_CAP_CTRL_REG 0x4D2
-+#define YT8821_UTP_EXT_VGA_LPF1_CAP_OTHER GENMASK(7, 4)
-+#define YT8821_UTP_EXT_VGA_LPF1_CAP_2500 GENMASK(3, 0)
-+
-+#define YT8821_UTP_EXT_VGA_LPF2_CAP_CTRL_REG 0x4D3
-+#define YT8821_UTP_EXT_VGA_LPF2_CAP_OTHER GENMASK(7, 4)
-+#define YT8821_UTP_EXT_VGA_LPF2_CAP_2500 GENMASK(3, 0)
-+
-+#define YT8821_UTP_EXT_TXGE_NFR_FR_THP_CTRL_REG 0x660
-+#define YT8821_UTP_EXT_NFR_TX_ABILITY BIT(3)
- /* Extended Register end */
-
- #define YTPHY_DTS_OUTPUT_CLK_DIS 0
- #define YTPHY_DTS_OUTPUT_CLK_25M 25000000
- #define YTPHY_DTS_OUTPUT_CLK_125M 125000000
-
-+#define YT8821_CHIP_MODE_AUTO_BX2500_SGMII 0
-+#define YT8821_CHIP_MODE_FORCE_BX2500 1
-+
- struct yt8521_priv {
- /* combo_advertising is used for case of YT8521 in combo mode,
- * this means that yt8521 may work in utp or fiber mode which depends
-@@ -2250,6 +2329,572 @@ static int yt8521_get_features(struct ph
- return ret;
- }
-
-+/**
-+ * yt8821_get_features - read mmd register to get 2.5G capability
-+ * @phydev: target phy_device struct
-+ *
-+ * Returns: 0 or negative errno code
-+ */
-+static int yt8821_get_features(struct phy_device *phydev)
-+{
-+ int ret;
-+
-+ ret = genphy_c45_pma_read_ext_abilities(phydev);
-+ if (ret < 0)
-+ return ret;
-+
-+ return genphy_read_abilities(phydev);
-+}
-+
-+/**
-+ * yt8821_get_rate_matching - read register to get phy chip mode
-+ * @phydev: target phy_device struct
-+ * @iface: PHY data interface type
-+ *
-+ * Returns: rate matching type or negative errno code
-+ */
-+static int yt8821_get_rate_matching(struct phy_device *phydev,
-+ phy_interface_t iface)
-+{
-+ int val;
-+
-+ val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
-+ if (val < 0)
-+ return val;
-+
-+ if (FIELD_GET(YT8521_CCR_MODE_SEL_MASK, val) ==
-+ YT8821_CHIP_MODE_FORCE_BX2500)
-+ return RATE_MATCH_PAUSE;
-+
-+ return RATE_MATCH_NONE;
-+}
-+
-+/**
-+ * yt8821_aneg_done() - determines the auto negotiation result
-+ * @phydev: a pointer to a &struct phy_device
-+ *
-+ * Returns: 0(no link)or 1(utp link) or negative errno code
-+ */
-+static int yt8821_aneg_done(struct phy_device *phydev)
-+{
-+ return yt8521_aneg_done_paged(phydev, YT8521_RSSR_UTP_SPACE);
-+}
-+
-+/**
-+ * yt8821_serdes_init() - serdes init
-+ * @phydev: a pointer to a &struct phy_device
-+ *
-+ * Returns: 0 or negative errno code
-+ */
-+static int yt8821_serdes_init(struct phy_device *phydev)
-+{
-+ int old_page;
-+ int ret = 0;
-+ u16 mask;
-+ u16 set;
-+
-+ old_page = phy_select_page(phydev, YT8521_RSSR_FIBER_SPACE);
-+ if (old_page < 0) {
-+ phydev_err(phydev, "Failed to select page: %d\n",
-+ old_page);
-+ goto err_restore_page;
-+ }
-+
-+ ret = __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_SDS_EXT_CSR_VCO_LDO_EN |
-+ YT8821_SDS_EXT_CSR_VCO_BIAS_LPF_EN;
-+ set = YT8821_SDS_EXT_CSR_VCO_LDO_EN;
-+ ret = ytphy_modify_ext(phydev, YT8821_SDS_EXT_CSR_CTRL_REG, mask,
-+ set);
-+
-+err_restore_page:
-+ return phy_restore_page(phydev, old_page, ret);
-+}
-+
-+/**
-+ * yt8821_utp_init() - utp init
-+ * @phydev: a pointer to a &struct phy_device
-+ *
-+ * Returns: 0 or negative errno code
-+ */
-+static int yt8821_utp_init(struct phy_device *phydev)
-+{
-+ int old_page;
-+ int ret = 0;
-+ u16 mask;
-+ u16 save;
-+ u16 set;
-+
-+ old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
-+ if (old_page < 0) {
-+ phydev_err(phydev, "Failed to select page: %d\n",
-+ old_page);
-+ goto err_restore_page;
-+ }
-+
-+ mask = YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 |
-+ YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500 |
-+ YT8821_UTP_EXT_RPDN_IPR_SHT_2500;
-+ set = YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 |
-+ YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500;
-+ ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_RPDN_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_VGA_LPF1_CAP_OTHER |
-+ YT8821_UTP_EXT_VGA_LPF1_CAP_2500;
-+ ret = ytphy_modify_ext(phydev,
-+ YT8821_UTP_EXT_VGA_LPF1_CAP_CTRL_REG,
-+ mask, 0);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_VGA_LPF2_CAP_OTHER |
-+ YT8821_UTP_EXT_VGA_LPF2_CAP_2500;
-+ ret = ytphy_modify_ext(phydev,
-+ YT8821_UTP_EXT_VGA_LPF2_CAP_CTRL_REG,
-+ mask, 0);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500 |
-+ YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500;
-+ set = FIELD_PREP(YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500, 0x5a) |
-+ FIELD_PREP(YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500, 0x3c);
-+ ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_TRACE_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_IPR_LNG_2500;
-+ set = FIELD_PREP(YT8821_UTP_EXT_IPR_LNG_2500, 0x6c);
-+ ret = ytphy_modify_ext(phydev,
-+ YT8821_UTP_EXT_ALPHA_IPR_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000;
-+ set = FIELD_PREP(YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000, 0x2a);
-+ ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_ECHO_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000;
-+ set = FIELD_PREP(YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000, 0x22);
-+ ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_GAIN_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_TH_20DB_2500;
-+ set = FIELD_PREP(YT8821_UTP_EXT_TH_20DB_2500, 0x8000);
-+ ret = ytphy_modify_ext(phydev,
-+ YT8821_UTP_EXT_TH_20DB_2500_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_MU_COARSE_FR_F_FFE |
-+ YT8821_UTP_EXT_MU_COARSE_FR_F_FBE;
-+ set = FIELD_PREP(YT8821_UTP_EXT_MU_COARSE_FR_F_FFE, 0x7) |
-+ FIELD_PREP(YT8821_UTP_EXT_MU_COARSE_FR_F_FBE, 0x7);
-+ ret = ytphy_modify_ext(phydev,
-+ YT8821_UTP_EXT_MU_COARSE_FR_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_MU_FINE_FR_F_FFE |
-+ YT8821_UTP_EXT_MU_FINE_FR_F_FBE;
-+ set = FIELD_PREP(YT8821_UTP_EXT_MU_FINE_FR_F_FFE, 0x2) |
-+ FIELD_PREP(YT8821_UTP_EXT_MU_FINE_FR_F_FBE, 0x2);
-+ ret = ytphy_modify_ext(phydev,
-+ YT8821_UTP_EXT_MU_FINE_FR_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ /* save YT8821_UTP_EXT_PI_CTRL_REG's val for use later */
-+ ret = ytphy_read_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ save = ret;
-+
-+ mask = YT8821_UTP_EXT_PI_TX_CLK_SEL_AFE |
-+ YT8821_UTP_EXT_PI_RX_CLK_3_SEL_AFE |
-+ YT8821_UTP_EXT_PI_RX_CLK_2_SEL_AFE |
-+ YT8821_UTP_EXT_PI_RX_CLK_1_SEL_AFE |
-+ YT8821_UTP_EXT_PI_RX_CLK_0_SEL_AFE;
-+ ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG,
-+ mask, 0);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ /* restore YT8821_UTP_EXT_PI_CTRL_REG's val */
-+ ret = ytphy_write_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG, save);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_FECHO_AMP_TH_HUGE;
-+ set = FIELD_PREP(YT8821_UTP_EXT_FECHO_AMP_TH_HUGE, 0x38);
-+ ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_VCT_CFG6_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_NFR_TX_ABILITY;
-+ set = YT8821_UTP_EXT_NFR_TX_ABILITY;
-+ ret = ytphy_modify_ext(phydev,
-+ YT8821_UTP_EXT_TXGE_NFR_FR_THP_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_PLL_SPARE_CFG;
-+ set = FIELD_PREP(YT8821_UTP_EXT_PLL_SPARE_CFG, 0xe9);
-+ ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_PLL_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG |
-+ YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG;
-+ set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG, 0x64) |
-+ FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG, 0x64);
-+ ret = ytphy_modify_ext(phydev,
-+ YT8821_UTP_EXT_DAC_IMID_CH_2_3_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG |
-+ YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG;
-+ set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG, 0x64) |
-+ FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG, 0x64);
-+ ret = ytphy_modify_ext(phydev,
-+ YT8821_UTP_EXT_DAC_IMID_CH_0_1_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG |
-+ YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG;
-+ set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG, 0x64) |
-+ FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG, 0x64);
-+ ret = ytphy_modify_ext(phydev,
-+ YT8821_UTP_EXT_DAC_IMSB_CH_2_3_CTRL_REG,
-+ mask, set);
-+ if (ret < 0)
-+ goto err_restore_page;
-+
-+ mask = YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG |
-+ YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG;
-+ set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG, 0x64) |
-+ FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG, 0x64);
-+ ret = ytphy_modify_ext(phydev,
-+ YT8821_UTP_EXT_DAC_IMSB_CH_0_1_CTRL_REG,
-+ mask, set);
-+
-+err_restore_page:
-+ return phy_restore_page(phydev, old_page, ret);
-+}
-+
-+/**
-+ * yt8821_auto_sleep_config() - phy auto sleep config
-+ * @phydev: a pointer to a &struct phy_device
-+ * @enable: true enable auto sleep, false disable auto sleep
-+ *
-+ * Returns: 0 or negative errno code
-+ */
-+static int yt8821_auto_sleep_config(struct phy_device *phydev,
-+ bool enable)
-+{
-+ int old_page;
-+ int ret = 0;
-+
-+ old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
-+ if (old_page < 0) {
-+ phydev_err(phydev, "Failed to select page: %d\n",
-+ old_page);
-+ goto err_restore_page;
-+ }
-+
-+ ret = ytphy_modify_ext(phydev,
-+ YT8521_EXTREG_SLEEP_CONTROL1_REG,
-+ YT8521_ESC1R_SLEEP_SW,
-+ enable ? 1 : 0);
-+
-+err_restore_page:
-+ return phy_restore_page(phydev, old_page, ret);
-+}
-+
-+/**
-+ * yt8821_soft_reset() - soft reset utp and serdes
-+ * @phydev: a pointer to a &struct phy_device
-+ *
-+ * Returns: 0 or negative errno code
-+ */
-+static int yt8821_soft_reset(struct phy_device *phydev)
-+{
-+ return ytphy_modify_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG,
-+ YT8521_CCR_SW_RST, 0);
-+}
-+
-+/**
-+ * yt8821_config_init() - phy initializatioin
-+ * @phydev: a pointer to a &struct phy_device
-+ *
-+ * Returns: 0 or negative errno code
-+ */
-+static int yt8821_config_init(struct phy_device *phydev)
-+{
-+ u8 mode = YT8821_CHIP_MODE_AUTO_BX2500_SGMII;
-+ int ret;
-+ u16 set;
-+
-+ if (phydev->interface == PHY_INTERFACE_MODE_2500BASEX)
-+ mode = YT8821_CHIP_MODE_FORCE_BX2500;
-+
-+ set = FIELD_PREP(YT8521_CCR_MODE_SEL_MASK, mode);
-+ ret = ytphy_modify_ext_with_lock(phydev,
-+ YT8521_CHIP_CONFIG_REG,
-+ YT8521_CCR_MODE_SEL_MASK,
-+ set);
-+ if (ret < 0)
-+ return ret;
-+
-+ __set_bit(PHY_INTERFACE_MODE_2500BASEX,
-+ phydev->possible_interfaces);
-+
-+ if (mode == YT8821_CHIP_MODE_AUTO_BX2500_SGMII) {
-+ __set_bit(PHY_INTERFACE_MODE_SGMII,
-+ phydev->possible_interfaces);
-+
-+ phydev->rate_matching = RATE_MATCH_NONE;
-+ } else if (mode == YT8821_CHIP_MODE_FORCE_BX2500) {
-+ phydev->rate_matching = RATE_MATCH_PAUSE;
-+ }
-+
-+ ret = yt8821_serdes_init(phydev);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = yt8821_utp_init(phydev);
-+ if (ret < 0)
-+ return ret;
-+
-+ /* disable auto sleep */
-+ ret = yt8821_auto_sleep_config(phydev, false);
-+ if (ret < 0)
-+ return ret;
-+
-+ /* soft reset */
-+ return yt8821_soft_reset(phydev);
-+}
-+
-+/**
-+ * yt8821_adjust_status() - update speed and duplex to phydev
-+ * @phydev: a pointer to a &struct phy_device
-+ * @val: read from YTPHY_SPECIFIC_STATUS_REG
-+ */
-+static void yt8821_adjust_status(struct phy_device *phydev, int val)
-+{
-+ int speed, duplex;
-+ int speed_mode;
-+
-+ duplex = FIELD_GET(YTPHY_SSR_DUPLEX, val);
-+ speed_mode = val & YTPHY_SSR_SPEED_MASK;
-+ switch (speed_mode) {
-+ case YTPHY_SSR_SPEED_10M:
-+ speed = SPEED_10;
-+ break;
-+ case YTPHY_SSR_SPEED_100M:
-+ speed = SPEED_100;
-+ break;
-+ case YTPHY_SSR_SPEED_1000M:
-+ speed = SPEED_1000;
-+ break;
-+ case YTPHY_SSR_SPEED_2500M:
-+ speed = SPEED_2500;
-+ break;
-+ default:
-+ speed = SPEED_UNKNOWN;
-+ break;
-+ }
-+
-+ phydev->speed = speed;
-+ phydev->duplex = duplex;
-+}
-+
-+/**
-+ * yt8821_update_interface() - update interface per current speed
-+ * @phydev: a pointer to a &struct phy_device
-+ */
-+static void yt8821_update_interface(struct phy_device *phydev)
-+{
-+ if (!phydev->link)
-+ return;
-+
-+ switch (phydev->speed) {
-+ case SPEED_2500:
-+ phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
-+ break;
-+ case SPEED_1000:
-+ case SPEED_100:
-+ case SPEED_10:
-+ phydev->interface = PHY_INTERFACE_MODE_SGMII;
-+ break;
-+ default:
-+ phydev_warn(phydev, "phy speed err :%d\n", phydev->speed);
-+ break;
-+ }
-+}
-+
-+/**
-+ * yt8821_read_status() - determines the negotiated speed and duplex
-+ * @phydev: a pointer to a &struct phy_device
-+ *
-+ * Returns: 0 or negative errno code
-+ */
-+static int yt8821_read_status(struct phy_device *phydev)
-+{
-+ int link;
-+ int ret;
-+ int val;
-+
-+ ret = ytphy_write_ext_with_lock(phydev,
-+ YT8521_REG_SPACE_SELECT_REG,
-+ YT8521_RSSR_UTP_SPACE);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = genphy_read_status(phydev);
-+ if (ret < 0)
-+ return ret;
-+
-+ if (phydev->autoneg_complete) {
-+ ret = genphy_c45_read_lpa(phydev);
-+ if (ret < 0)
-+ return ret;
-+ }
-+
-+ ret = phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
-+ if (ret < 0)
-+ return ret;
-+
-+ val = ret;
-+
-+ link = val & YTPHY_SSR_LINK;
-+ if (link)
-+ yt8821_adjust_status(phydev, val);
-+
-+ if (link) {
-+ if (phydev->link == 0)
-+ phydev_dbg(phydev,
-+ "%s, phy addr: %d, link up\n",
-+ __func__, phydev->mdio.addr);
-+ phydev->link = 1;
-+ } else {
-+ if (phydev->link == 1)
-+ phydev_dbg(phydev,
-+ "%s, phy addr: %d, link down\n",
-+ __func__, phydev->mdio.addr);
-+ phydev->link = 0;
-+ }
-+
-+ val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
-+ if (val < 0)
-+ return val;
-+
-+ if (FIELD_GET(YT8521_CCR_MODE_SEL_MASK, val) ==
-+ YT8821_CHIP_MODE_AUTO_BX2500_SGMII)
-+ yt8821_update_interface(phydev);
-+
-+ return 0;
-+}
-+
-+/**
-+ * yt8821_modify_utp_fiber_bmcr - bits modify a PHY's BMCR register
-+ * @phydev: the phy_device struct
-+ * @mask: bit mask of bits to clear
-+ * @set: bit mask of bits to set
-+ *
-+ * NOTE: Convenience function which allows a PHY's BMCR register to be
-+ * modified as new register value = (old register value & ~mask) | set.
-+ *
-+ * Returns: 0 or negative errno code
-+ */
-+static int yt8821_modify_utp_fiber_bmcr(struct phy_device *phydev,
-+ u16 mask, u16 set)
-+{
-+ int ret;
-+
-+ ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE,
-+ mask, set);
-+ if (ret < 0)
-+ return ret;
-+
-+ return yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE,
-+ mask, set);
-+}
-+
-+/**
-+ * yt8821_suspend() - suspend the hardware
-+ * @phydev: a pointer to a &struct phy_device
-+ *
-+ * Returns: 0 or negative errno code
-+ */
-+static int yt8821_suspend(struct phy_device *phydev)
-+{
-+ int wol_config;
-+
-+ wol_config = ytphy_read_ext_with_lock(phydev,
-+ YTPHY_WOL_CONFIG_REG);
-+ if (wol_config < 0)
-+ return wol_config;
-+
-+ /* if wol enable, do nothing */
-+ if (wol_config & YTPHY_WCR_ENABLE)
-+ return 0;
-+
-+ return yt8821_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN);
-+}
-+
-+/**
-+ * yt8821_resume() - resume the hardware
-+ * @phydev: a pointer to a &struct phy_device
-+ *
-+ * Returns: 0 or negative errno code
-+ */
-+static int yt8821_resume(struct phy_device *phydev)
-+{
-+ int wol_config;
-+ int ret;
-+
-+ /* disable auto sleep */
-+ ret = yt8821_auto_sleep_config(phydev, false);
-+ if (ret < 0)
-+ return ret;
-+
-+ wol_config = ytphy_read_ext_with_lock(phydev,
-+ YTPHY_WOL_CONFIG_REG);
-+ if (wol_config < 0)
-+ return wol_config;
-+
-+ /* if wol enable, do nothing */
-+ if (wol_config & YTPHY_WCR_ENABLE)
-+ return 0;
-+
-+ return yt8821_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0);
-+}
-+
- static struct phy_driver motorcomm_phy_drvs[] = {
- {
- PHY_ID_MATCH_EXACT(PHY_ID_YT8511),
-@@ -2305,11 +2950,28 @@ static struct phy_driver motorcomm_phy_d
- .suspend = yt8521_suspend,
- .resume = yt8521_resume,
- },
-+ {
-+ PHY_ID_MATCH_EXACT(PHY_ID_YT8821),
-+ .name = "YT8821 2.5Gbps PHY",
-+ .get_features = yt8821_get_features,
-+ .read_page = yt8521_read_page,
-+ .write_page = yt8521_write_page,
-+ .get_wol = ytphy_get_wol,
-+ .set_wol = ytphy_set_wol,
-+ .config_aneg = genphy_config_aneg,
-+ .aneg_done = yt8821_aneg_done,
-+ .config_init = yt8821_config_init,
-+ .get_rate_matching = yt8821_get_rate_matching,
-+ .read_status = yt8821_read_status,
-+ .soft_reset = yt8821_soft_reset,
-+ .suspend = yt8821_suspend,
-+ .resume = yt8821_resume,
-+ },
- };
-
- module_phy_driver(motorcomm_phy_drvs);
-
--MODULE_DESCRIPTION("Motorcomm 8511/8521/8531/8531S PHY driver");
-+MODULE_DESCRIPTION("Motorcomm 8511/8521/8531/8531S/8821 PHY driver");
- MODULE_AUTHOR("Peter Geis");
- MODULE_AUTHOR("Frank");
- MODULE_LICENSE("GPL");
-@@ -2319,6 +2981,7 @@ static const struct mdio_device_id __may
- { PHY_ID_MATCH_EXACT(PHY_ID_YT8521) },
- { PHY_ID_MATCH_EXACT(PHY_ID_YT8531) },
- { PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) },
-+ { PHY_ID_MATCH_EXACT(PHY_ID_YT8821) },
- { /* sentinel */ }
- };
-
diff --git a/target/linux/siflower/patches-6.12/014-riscv-add-an-option-for-efficient-unaligned-access.patch b/target/linux/siflower/patches-6.12/014-riscv-add-an-option-for-efficient-unaligned-access.patch
deleted file mode 100644
index df11d0238a..0000000000
--- a/target/linux/siflower/patches-6.12/014-riscv-add-an-option-for-efficient-unaligned-access.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From: Qingfang Deng <qingfang.deng at siflower.com.cn>
-Date: Sat, 14 Sep 2024 12:00:59 +0800
-Subject: [PATCH 14/20] riscv: add an option for efficient unaligned access
-
-Some riscv cpus like T-Head C908 allows unaligned memory access,
-and we don't need to force an alignment on compiler level.
-Add an option for that.
-
-Signed-off-by: Chuanhong Guo <gch981213 at gmail.com>
----
- arch/riscv/Kconfig | 11 +++++++++++
- arch/riscv/Makefile | 2 ++
- 2 files changed, 13 insertions(+)
-
---- a/arch/riscv/Kconfig
-+++ b/arch/riscv/Kconfig
-@@ -639,6 +639,17 @@ config THREAD_SIZE_ORDER
- Specify the Pages of thread stack size (from 4KB to 64KB), which also
- affects irq stack size, which is equal to thread stack size.
-
-+config RISCV_EFFICIENT_UNALIGNED_ACCESS
-+ bool "Assume the system supports fast unaligned memory accesses"
-+ depends on NONPORTABLE
-+ select HAVE_EFFICIENT_UNALIGNED_ACCESS
-+ help
-+ Assume that the system supports fast unaligned memory accesses. When
-+ enabled, this option improves the performance of the kernel on such
-+ systems. However, the kernel and userspace programs will run much more
-+ slowly, or will not be able to run at all, on systems that do not
-+ support efficient unaligned memory accesses.
-+
- endmenu # "Platform type"
-
- menu "Kernel features"
---- a/arch/riscv/Makefile
-+++ b/arch/riscv/Makefile
-@@ -104,7 +104,9 @@ KBUILD_AFLAGS_MODULE += $(call as-option
- # unaligned accesses. While unaligned accesses are explicitly allowed in the
- # RISC-V ISA, they're emulated by machine mode traps on all extant
- # architectures. It's faster to have GCC emit only aligned accesses.
-+ifneq ($(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS),y)
- KBUILD_CFLAGS += $(call cc-option,-mstrict-align)
-+endif
-
- ifeq ($(CONFIG_STACKPROTECTOR_PER_TASK),y)
- prepare: stack_protector_prepare
More information about the lede-commits
mailing list