lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Thu, 17 Jan 2019 17:13:47 +0000
From:   "S-k, Shyam-sundar" <Shyam-sundar.S-k@....com>
To:     "Lendacky, Thomas" <Thomas.Lendacky@....com>,
        "netdev@...r.kernel.org" <netdev@...r.kernel.org>
CC:     David Miller <davem@...emloft.net>
Subject: Re: [PATCH] amd-xgbe: Fix mdio access for non-zero ports and clause
 45 PHYs

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.lendacky@....com>
Tested-by: Shyam Sundar S K <Shyam-sundar.S-k@....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;
>

Powered by blists - more mailing lists