diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0610-amd-xgbe-Fix-mdio-access-for-non-zero-ports-and-clau.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/0610-amd-xgbe-Fix-mdio-access-for-non-zero-ports-and-clau.patch | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0610-amd-xgbe-Fix-mdio-access-for-non-zero-ports-and-clau.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0610-amd-xgbe-Fix-mdio-access-for-non-zero-ports-and-clau.patch new file mode 100644 index 00000000..35a72fb3 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0610-amd-xgbe-Fix-mdio-access-for-non-zero-ports-and-clau.patch @@ -0,0 +1,94 @@ +From 884f5411755977307f87fd69e3d735b26ce55823 Mon Sep 17 00:00:00 2001 +From: "Lendacky, Thomas" <Thomas.Lendacky@amd.com> +Date: Thu, 17 Jan 2019 14:20:14 +0000 +Subject: [PATCH 0610/2940] amd-xgbe: Fix mdio access for non-zero ports and + clause 45 PHYs + +The XGBE hardware has support for performing MDIO operations using an +MDIO command request. The driver mistakenly uses the mdio port address +as the MDIO command request device address instead of the MDIO command +request port address. Additionally, the driver does not properly check +for and create a clause 45 MDIO command. + +Check the supplied MDIO register to determine if the request is a clause +45 operation (MII_ADDR_C45). For a clause 45 operation, extract the device +address and register number from the supplied MDIO register and use them +to set the MDIO command request device address and register number fields. +For a clause 22 operation, the MDIO request device address is set to zero +and the MDIO command request register number is set to the supplied MDIO +register. In either case, the supplied MDIO port address is used as the +MDIO command request port address. + +Fixes: 732f2ab7afb9 ("amd-xgbe: Add support for MDIO attached PHYs") +Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> +Tested-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com> +--- + drivers/net/ethernet/amd/xgbe/xgbe-common.h | 2 -- + drivers/net/ethernet/amd/xgbe/xgbe-dev.c | 22 +++++++++++++++------ + 2 files changed, 16 insertions(+), 8 deletions(-) + +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h +index d272dc6984ac..b40d4377cc71 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h +@@ -431,8 +431,6 @@ + #define MAC_MDIOSCAR_PA_WIDTH 5 + #define MAC_MDIOSCAR_RA_INDEX 0 + #define MAC_MDIOSCAR_RA_WIDTH 16 +-#define MAC_MDIOSCAR_REG_INDEX 0 +-#define MAC_MDIOSCAR_REG_WIDTH 21 + #define MAC_MDIOSCCDR_BUSY_INDEX 22 + #define MAC_MDIOSCCDR_BUSY_WIDTH 1 + #define MAC_MDIOSCCDR_CMD_INDEX 16 +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +index 1e929a1e4ca7..4666084eda16 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +@@ -1284,6 +1284,20 @@ static void xgbe_write_mmd_regs(struct xgbe_prv_data *pdata, int prtad, + } + } + ++static unsigned int xgbe_create_mdio_sca(int port, int reg) ++{ ++ unsigned int mdio_sca, da; ++ ++ da = (reg & MII_ADDR_C45) ? reg >> 16 : 0; ++ ++ mdio_sca = 0; ++ XGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, RA, reg); ++ XGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, PA, port); ++ XGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, DA, da); ++ ++ return mdio_sca; ++} ++ + static int xgbe_write_ext_mii_regs(struct xgbe_prv_data *pdata, int addr, + int reg, u16 val) + { +@@ -1291,9 +1305,7 @@ static int xgbe_write_ext_mii_regs(struct xgbe_prv_data *pdata, int addr, + + reinit_completion(&pdata->mdio_complete); + +- mdio_sca = 0; +- XGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, REG, reg); +- XGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, DA, addr); ++ mdio_sca = xgbe_create_mdio_sca(addr, reg); + XGMAC_IOWRITE(pdata, MAC_MDIOSCAR, mdio_sca); + + mdio_sccd = 0; +@@ -1317,9 +1329,7 @@ static int xgbe_read_ext_mii_regs(struct xgbe_prv_data *pdata, int addr, + + reinit_completion(&pdata->mdio_complete); + +- mdio_sca = 0; +- XGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, REG, reg); +- XGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, DA, addr); ++ mdio_sca = xgbe_create_mdio_sca(addr, reg); + XGMAC_IOWRITE(pdata, MAC_MDIOSCAR, mdio_sca); + + mdio_sccd = 0; +-- +2.17.1 + |