lkml.org 
[lkml]   [2021]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 029/171] net: dsa: mv88e6xxx: fix "dont use PHY_DETECT on internal PHYs"
    Date
    From: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>

    commit 2b29cb9e3f7f038c7f50ad2583b47caf5cb1eaf2 upstream.

    This commit fixes a misunderstanding in commit 4a3e0aeddf09 ("net: dsa:
    mv88e6xxx: don't use PHY_DETECT on internal PHY's").

    For Marvell DSA switches with the PHY_DETECT bit (for non-6250 family
    devices), controls whether the PPU polls the PHY to retrieve the link,
    speed, duplex and pause status to update the port configuration. This
    applies for both internal and external PHYs.

    For some switches such as 88E6352 and 88E6390X, PHY_DETECT has an
    additional function of enabling auto-media mode between the internal
    PHY and SERDES blocks depending on which first gains link.

    The original intention of commit 5d5b231da7ac (net: dsa: mv88e6xxx: use
    PHY_DETECT in mac_link_up/mac_link_down) was to allow this bit to be
    used to detect when this propagation is enabled, and allow software to
    update the port configuration. This has found to be necessary for some
    switches which do not automatically propagate status from the SERDES to
    the port, which includes the 88E6390. However, commit 4a3e0aeddf09
    ("net: dsa: mv88e6xxx: don't use PHY_DETECT on internal PHY's") breaks
    this assumption.

    Maarten Zanders has confirmed that the issue he was addressing was for
    an 88E6250 switch, which does not have a PHY_DETECT bit in bit 12, but
    instead a link status bit. Therefore, mv88e6xxx_port_ppu_updates() does
    not report correctly.

    This patch resolves the above issues by reverting Maarten's change and
    instead making mv88e6xxx_port_ppu_updates() indicate whether the port
    is internal for the 88E6250 family of switches.

    Yes, you're right, I'm targeting the 6250 family. And yes, your
    suggestion would solve my case and is a better implementation for
    the other devices (as far as I can see).

    Fixes: 4a3e0aeddf09 ("net: dsa: mv88e6xxx: don't use PHY_DETECT on internal PHY's")
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Tested-by: Maarten Zanders <maarten.zanders@mind.be>
    Link: https://lore.kernel.org/r/E1muXm7-00EwJB-7n@rmk-PC.armlinux.org.uk
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/dsa/mv88e6xxx/chip.c | 21 +++++++++++++--------
    1 file changed, 13 insertions(+), 8 deletions(-)

    --- a/drivers/net/dsa/mv88e6xxx/chip.c
    +++ b/drivers/net/dsa/mv88e6xxx/chip.c
    @@ -471,6 +471,12 @@ static int mv88e6xxx_port_ppu_updates(st
    u16 reg;
    int err;

    + /* The 88e6250 family does not have the PHY detect bit. Instead,
    + * report whether the port is internal.
    + */
    + if (chip->info->family == MV88E6XXX_FAMILY_6250)
    + return port < chip->info->num_internal_phys;
    +
    err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &reg);
    if (err) {
    dev_err(chip->dev,
    @@ -753,11 +759,10 @@ static void mv88e6xxx_mac_link_down(stru
    ops = chip->info->ops;

    mv88e6xxx_reg_lock(chip);
    - /* Internal PHYs propagate their configuration directly to the MAC.
    - * External PHYs depend on whether the PPU is enabled for this port.
    + /* Force the link down if we know the port may not be automatically
    + * updated by the switch or if we are using fixed-link mode.
    */
    - if (((!mv88e6xxx_phy_is_internal(ds, port) &&
    - !mv88e6xxx_port_ppu_updates(chip, port)) ||
    + if ((!mv88e6xxx_port_ppu_updates(chip, port) ||
    mode == MLO_AN_FIXED) && ops->port_sync_link)
    err = ops->port_sync_link(chip, port, mode, false);
    mv88e6xxx_reg_unlock(chip);
    @@ -780,11 +785,11 @@ static void mv88e6xxx_mac_link_up(struct
    ops = chip->info->ops;

    mv88e6xxx_reg_lock(chip);
    - /* Internal PHYs propagate their configuration directly to the MAC.
    - * External PHYs depend on whether the PPU is enabled for this port.
    + /* Configure and force the link up if we know that the port may not
    + * automatically updated by the switch or if we are using fixed-link
    + * mode.
    */
    - if ((!mv88e6xxx_phy_is_internal(ds, port) &&
    - !mv88e6xxx_port_ppu_updates(chip, port)) ||
    + if (!mv88e6xxx_port_ppu_updates(chip, port) ||
    mode == MLO_AN_FIXED) {
    /* FIXME: for an automedia port, should we force the link
    * down here - what if the link comes up due to "other" media

    \
     
     \ /
      Last update: 2021-12-13 11:25    [W:4.104 / U:1.336 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site