On 1/17/2019 7:50 PM, Lendacky, Thomas wrote:
> 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.lenda...@amd.com>
Tested-by: Shyam Sundar S K <shyam-sundar....@amd.com>
> ---
>
> Please queue this patch up for stable, 4.14 and higher.
>
>  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;
>

Reply via email to