lkml.org 
[lkml]   [2018]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 22/41] net: phy: broadcom: Fix bcm_write_exp()
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Florian Fainelli <f.fainelli@gmail.com>

    [ Upstream commit 79fb218d97980d4fee9a64f4c8ff05289364ba25 ]

    On newer PHYs, we need to select the expansion register to write with
    setting bits [11:8] to 0xf. This was done correctly by bcm7xxx.c prior
    to being migrated to generic code under bcm-phy-lib.c which
    unfortunately used the older implementation from the BCM54xx days.

    Fix this by creating an inline stub: bcm_write_exp_sel() which adds the
    correct value (MII_BCM54XX_EXP_SEL_ER) and update both the Cygnus PHY
    and BCM7xxx PHY drivers which require setting these bits.

    broadcom.c is unchanged because some PHYs even use a different selector
    method, so let them specify it directly (e.g: SerDes secondary selector).

    Fixes: a1cba5613edf ("net: phy: Add Broadcom phy library for common interfaces")
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/phy/bcm-cygnus.c | 6 +++---
    drivers/net/phy/bcm-phy-lib.h | 7 +++++++
    drivers/net/phy/bcm7xxx.c | 4 ++--
    3 files changed, 12 insertions(+), 5 deletions(-)

    --- a/drivers/net/phy/bcm-cygnus.c
    +++ b/drivers/net/phy/bcm-cygnus.c
    @@ -61,17 +61,17 @@ static int bcm_cygnus_afe_config(struct
    return rc;

    /* make rcal=100, since rdb default is 000 */
    - rc = bcm_phy_write_exp(phydev, MII_BRCM_CORE_EXPB1, 0x10);
    + rc = bcm_phy_write_exp_sel(phydev, MII_BRCM_CORE_EXPB1, 0x10);
    if (rc < 0)
    return rc;

    /* CORE_EXPB0, Reset R_CAL/RC_CAL Engine */
    - rc = bcm_phy_write_exp(phydev, MII_BRCM_CORE_EXPB0, 0x10);
    + rc = bcm_phy_write_exp_sel(phydev, MII_BRCM_CORE_EXPB0, 0x10);
    if (rc < 0)
    return rc;

    /* CORE_EXPB0, Disable Reset R_CAL/RC_CAL Engine */
    - rc = bcm_phy_write_exp(phydev, MII_BRCM_CORE_EXPB0, 0x00);
    + rc = bcm_phy_write_exp_sel(phydev, MII_BRCM_CORE_EXPB0, 0x00);

    return 0;
    }
    --- a/drivers/net/phy/bcm-phy-lib.h
    +++ b/drivers/net/phy/bcm-phy-lib.h
    @@ -14,11 +14,18 @@
    #ifndef _LINUX_BCM_PHY_LIB_H
    #define _LINUX_BCM_PHY_LIB_H

    +#include <linux/brcmphy.h>
    #include <linux/phy.h>

    int bcm_phy_write_exp(struct phy_device *phydev, u16 reg, u16 val);
    int bcm_phy_read_exp(struct phy_device *phydev, u16 reg);

    +static inline int bcm_phy_write_exp_sel(struct phy_device *phydev,
    + u16 reg, u16 val)
    +{
    + return bcm_phy_write_exp(phydev, reg | MII_BCM54XX_EXP_SEL_ER, val);
    +}
    +
    int bcm54xx_auxctl_write(struct phy_device *phydev, u16 regnum, u16 val);
    int bcm54xx_auxctl_read(struct phy_device *phydev, u16 regnum);

    --- a/drivers/net/phy/bcm7xxx.c
    +++ b/drivers/net/phy/bcm7xxx.c
    @@ -65,10 +65,10 @@ struct bcm7xxx_phy_priv {
    static void r_rc_cal_reset(struct phy_device *phydev)
    {
    /* Reset R_CAL/RC_CAL Engine */
    - bcm_phy_write_exp(phydev, 0x00b0, 0x0010);
    + bcm_phy_write_exp_sel(phydev, 0x00b0, 0x0010);

    /* Disable Reset R_AL/RC_CAL Engine */
    - bcm_phy_write_exp(phydev, 0x00b0, 0x0000);
    + bcm_phy_write_exp_sel(phydev, 0x00b0, 0x0000);
    }

    static int bcm7xxx_28nm_b0_afe_config_init(struct phy_device *phydev)

    \
     
     \ /
      Last update: 2018-06-09 17:35    [W:2.738 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site