lkml.org 
[lkml]   [2022]   [Apr]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 085/219] net: ethernet: stmmac: fix altr_tse_pcs function when using a fixed-link
    Date
    From: Dinh Nguyen <dinguyen@kernel.org>

    [ Upstream commit a6aaa00324240967272b451bfa772547bd576ee6 ]

    When using a fixed-link, the altr_tse_pcs driver crashes
    due to null-pointer dereference as no phy_device is provided to
    tse_pcs_fix_mac_speed function. Fix this by adding a check for
    phy_dev before calling the tse_pcs_fix_mac_speed() function.

    Also clean up the tse_pcs_fix_mac_speed function a bit. There is
    no need to check for splitter_base and sgmii_adapter_base
    because the driver will fail if these 2 variables are not
    derived from the device tree.

    Fixes: fb3bbdb85989 ("net: ethernet: Add TSE PCS support to dwmac-socfpga")
    Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c | 8 --------
    drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h | 4 ++++
    drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 13 +++++--------
    3 files changed, 9 insertions(+), 16 deletions(-)

    diff --git a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
    index cd478d2cd871..00f6d347eaf7 100644
    --- a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
    +++ b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
    @@ -57,10 +57,6 @@
    #define TSE_PCS_USE_SGMII_ENA BIT(0)
    #define TSE_PCS_IF_USE_SGMII 0x03

    -#define SGMII_ADAPTER_CTRL_REG 0x00
    -#define SGMII_ADAPTER_DISABLE 0x0001
    -#define SGMII_ADAPTER_ENABLE 0x0000
    -
    #define AUTONEGO_LINK_TIMER 20

    static int tse_pcs_reset(void __iomem *base, struct tse_pcs *pcs)
    @@ -202,12 +198,8 @@ void tse_pcs_fix_mac_speed(struct tse_pcs *pcs, struct phy_device *phy_dev,
    unsigned int speed)
    {
    void __iomem *tse_pcs_base = pcs->tse_pcs_base;
    - void __iomem *sgmii_adapter_base = pcs->sgmii_adapter_base;
    u32 val;

    - writew(SGMII_ADAPTER_ENABLE,
    - sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
    -
    pcs->autoneg = phy_dev->autoneg;

    if (phy_dev->autoneg == AUTONEG_ENABLE) {
    diff --git a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
    index 442812c0a4bd..694ac25ef426 100644
    --- a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
    +++ b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
    @@ -10,6 +10,10 @@
    #include <linux/phy.h>
    #include <linux/timer.h>

    +#define SGMII_ADAPTER_CTRL_REG 0x00
    +#define SGMII_ADAPTER_ENABLE 0x0000
    +#define SGMII_ADAPTER_DISABLE 0x0001
    +
    struct tse_pcs {
    struct device *dev;
    void __iomem *tse_pcs_base;
    diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
    index b7c2579c963b..ac9e6c7a33b5 100644
    --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
    +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
    @@ -18,9 +18,6 @@

    #include "altr_tse_pcs.h"

    -#define SGMII_ADAPTER_CTRL_REG 0x00
    -#define SGMII_ADAPTER_DISABLE 0x0001
    -
    #define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII 0x0
    #define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII 0x1
    #define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII 0x2
    @@ -62,16 +59,14 @@ static void socfpga_dwmac_fix_mac_speed(void *priv, unsigned int speed)
    {
    struct socfpga_dwmac *dwmac = (struct socfpga_dwmac *)priv;
    void __iomem *splitter_base = dwmac->splitter_base;
    - void __iomem *tse_pcs_base = dwmac->pcs.tse_pcs_base;
    void __iomem *sgmii_adapter_base = dwmac->pcs.sgmii_adapter_base;
    struct device *dev = dwmac->dev;
    struct net_device *ndev = dev_get_drvdata(dev);
    struct phy_device *phy_dev = ndev->phydev;
    u32 val;

    - if ((tse_pcs_base) && (sgmii_adapter_base))
    - writew(SGMII_ADAPTER_DISABLE,
    - sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
    + writew(SGMII_ADAPTER_DISABLE,
    + sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);

    if (splitter_base) {
    val = readl(splitter_base + EMAC_SPLITTER_CTRL_REG);
    @@ -93,7 +88,9 @@ static void socfpga_dwmac_fix_mac_speed(void *priv, unsigned int speed)
    writel(val, splitter_base + EMAC_SPLITTER_CTRL_REG);
    }

    - if (tse_pcs_base && sgmii_adapter_base)
    + writew(SGMII_ADAPTER_ENABLE,
    + sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
    + if (phy_dev)
    tse_pcs_fix_mac_speed(&dwmac->pcs, phy_dev, speed);
    }

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-04-18 14:25    [W:4.650 / U:0.284 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site